mcpField
W
wiki-agent

wiki-agent

github.com/ar9avAgent 工作流3.6k2.4k 次安装1 天前更新
代码仓库

关于 wiki-agent

wiki-agent 可按查询搜索单个 AI Agent 的对话历史,将相关内容整理进 Obsidian wiki,并返回归纳结果。它支持 Claude、Codex、Hermes、OpenClaw、Copilot 和 Pi 的历史记录。

主要功能

  1. 01按查询搜索历史
  2. 02支持六种 Agent 历史
  3. 03按相关度和时间排序会话
  4. 04按主题更新 wiki
  5. 05根据历史生成归纳答案

适用场景

  1. 01查找在其他 Agent 中讨论过的解决方案
  2. 02不提供查询时回顾近期会话
  3. 03比较多个 Agent 历史中的处理方案

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/ar9av/obsidian-wiki --skill wiki-agent

安装后在 Claude Code 中输入/wiki-agent确认已加载。

详细介绍

Wiki Agent — 定向跨 Agent 历史搜索与摄取

你正在从某个特定 AI Agent 的原始对话历史中进行由查询驱动的定向摄取。用户通常正在使用另一个 Agent,并希望调取其他 Agent 过往会话中的上下文。

这不是批量摄取。你需要找到关于特定主题的会话,提取相关内容,将其提炼到 wiki 中,并返回一份用户可以立即采取行动的综合答复。

命令路由

解析调用,确定目标 Agent 和可选查询:

命令目标示例
/wiki-claude [query]Claude Code 历史记录/wiki-claude "how did I set up auth middleware"
/wiki-codex [query]Codex CLI 历史记录/wiki-codex "rust ownership patterns"
/wiki-hermes [query]Hermes Agent 历史记录/wiki-hermes "memory architecture"
/wiki-openclaw [query]OpenClaw 历史记录/wiki-openclaw "project planning approach"
/wiki-copilot [query]Copilot 聊天记录/wiki-copilot "test strategy for API routes"
/wiki-pi [query]Pi Agent 历史记录/wiki-pi "how did I refactor the auth module"

如果没有提供查询,默认进入近期会话模式:摄取该 Agent 最近 5 个尚未处理的会话,并返回发现内容的摘要。这相当于仅针对该 Agent 执行一次聚焦的 wiki-history-ingest。

开始之前

写作规范: 在起草或改写自然语言 Markdown 之前,请阅读并遵循 llm-wiki/SKILL.md 中的 Writing Profile Resolution 部分。框架架构、来源信息、安全性及特定操作要求优先。 WRITING.md 中的偏好仅适用于新起草或改写的自然语言 Markdown;保留源内容和结构化记录。

  1. 解析配置 — 遵循 llm-wiki/SKILL.md 中的 Config Resolution Protocol(内联 @name 覆盖 → 向上遍历 CWD 查找 .env → 全局配置 → 提示设置)。由此获取 OBSIDIAN_VAULT_PATH。
  2. 读取 $OBSIDIAN_VAULT_PATH/.manifest.json → 确认已摄取的内容。
  3. 如果 $OBSIDIAN_VAULT_PATH/hot.md 存在,则读取 → 获取近期 wiki 活动的上下文。

步骤 1:定位 Agent 的历史记录根目录

Agent默认路径配置覆盖项
claude~/.claude + ~/Library/Application Support/Claude/local-agent-mode-sessions/.env 中的 CLAUDE_HISTORY_PATH
codex~/.codex.env 中的 CODEX_HISTORY_PATH
hermes~/.hermes环境变量或 .env 中的 HERMES_HOME
openclaw~/.openclaw.env 中的 OPENCLAW_HOME
copilot~/.copilot.env 中的 COPILOT_HISTORY_PATH
pi~/.pi/agent/sessions.env 中的 PI_HISTORY_PATH

如果历史记录根目录不存在,请停止并告知用户:“在 <path> 未找到 <agent> 历史记录。你是否在这台机器上运行过 <agent>?你可以在 .env 中通过 <CONFIG_VAR> 设置自定义路径。”


步骤 2:建立会话清单

对每个 Agent 使用成本最低的索引来源——在确定哪些会话相关之前,不要打开会话文件。

Claude
Primary index:   ~/.claude/projects/  (directories = projects, files = sessions)
Session files:   ~/.claude/projects/*/*.jsonl
Desktop index:   find ~/Library/Application Support/Claude/local-agent-mode-sessions -name "local_*.json"
Signal fields:   sessionId, cwd, startedAt, title (in local_*.json)

建立会话列表:{path, project_dir, modified_at, already_ingested}。

Codex
Primary index:   ~/.codex/session_index.jsonl
Session files:   ~/.codex/sessions/**/rollout-*.jsonl
Signal fields:   thread_id, name/title, updated_at (in session_index.jsonl)

将 session_index.jsonl 作为清单读取。每行包含:{thread_id, name, updated_at}。通过匹配目录名,将线程 ID 映射到 rollout 文件。

Hermes
Primary index:   ~/.hermes/memories/*.md  (fast to scan)
Session files:   ~/.hermes/sessions/**/*.jsonl
Signal fields:   file names, memory titles, first 3 lines of each memory

先扫描记忆文件名(这些文件名通常带有主题标题)。如有需要,再回退到会话列表。

OpenClaw
Primary index:   ~/.openclaw/workspace/memory/MEMORY.md  (structured long-term memory)
Daily notes:     ~/.openclaw/workspace/memory/YYYY-MM-DD.md
Session index:   ~/.openclaw/agents/*/sessions/sessions.json
Session files:   ~/.openclaw/agents/*/sessions/*.jsonl

先读取 MEMORY.md 各部分——它是所有内容的预编译摘要。每日笔记可用于判断近期性。

Copilot
Primary index:   session filenames / directory listing
Session files:   varies by client (VS Code: ~/.copilot/sessions/*.jsonl or similar)
Signal fields:   session timestamps, file names
Pi
Primary index:   ~/.pi/agent/sessions/--<cwd>--/ directories
Session files:   ~/.pi/agent/sessions/--<cwd>--/<timestamp>_<uuid>.jsonl
Signal fields:   cwd (decoded from dir name), session_info.name, timestamp in filename

先扫描会话目录。解码 --<cwd>-- 以获取工作目录。读取第一行(会话标头)和任何 session_info 条目,以确定会话名称。没有单独的索引文件——文件系统就是索引。


步骤 3:根据查询为会话评分

如果提供了查询,请在不打开完整会话文件的情况下,为清单中的每个会话评分:

  1. 名称/标题匹配 — 会话名称或线程标题是否包含查询词?评分:+3

  2. CWD/项目匹配 — 工作目录是否表明这是正确的项目?评分:+2

  3. 时间新近度 — 采用 90 天半衰期的指数时间衰减,将其作为匹配分数的乘数,而非额外加分:

    base  = name_match(3) + cwd_match(2)
    score = base * (0.35 + 0.65 * 0.5 ** (age_days / 90))
    

    0.35 的下限是经过刻意设计的:与查询完全匹配的旧会话仍必须排在与查询几乎不匹配的新会话之前,否则该技能永远无法回答“我最初是怎么解决这个问题的?”。这与 session-brain 使用的衰减方式相同,因此两个技能的排序保持一致。

  4. 是否已摄取 — 如果此会话之前已摄取,且 wiki 页面已涵盖此查询(检查 hot.md + index.md),则标记为“已涵盖”,但仍在结果中显示

按分数选出排名前 3–5 的会话。如果未提供查询,则选出最近的 5 个未处理会话。


步骤 4:提取相关内容片段

打开每个选定的会话文件,仅提取与查询相关的内容。如果会话很大,不要通读全文——使用定向提取。

各 Agent 的提取策略

Claude(JSONL 对话):

  • 每行格式:{role, content, timestamp, ...}
  • 使用以下命令搜索:rg -i "<query terms>" <session.jsonl>,查找相关行
  • 提取:每个匹配项前 10 行、后 20 行的对话窗口
  • 特殊信号:工具调用(Read/Write/Bash/Edit)可揭示实际执行的操作——如果这些调用位于相关窗口中,即使没有匹配关键词,也要提取

Codex(rollout JSONL):

  • 每行格式:{type: "session_meta|turn_context|event_msg|response_item", ...}
  • 筛选 type: "event_msg"(用户轮次)和 type: "response_item"(模型输出)
  • 使用以下命令搜索:rg -i "<query terms>" <rollout.jsonl>
  • 提取:匹配的轮次及其父级上下文(匹配项之前的 turn_context)
  • 跳过:session_meta 事件(运行元数据,不包含知识)

Hermes(记忆文件 + 会话 JSONL):

  • 对于记忆文件:读取完整文件(文件较短——通常每个少于 500 个单词)
  • 对于会话 JSONL:使用 rg -i "<query terms>" + 周边窗口
  • 标题匹配的记忆文件 → 完整读取;其他文件 → 仅使用 grep 搜索

OpenClaw(MEMORY.md + 每日笔记 + 会话 JSONL):

  • MEMORY.md:搜索标题包含查询词的章节 → 提取该章节
  • 每日笔记:搜索最近 30 天的内容,查找查询词 → 提取匹配的段落
  • 会话 JSONL:采用与 Claude 相同的 grep 窗口方式
  • 优先使用 MEMORY.md/每日笔记,而非会话 JSONL(前者已预先综合)

Copilot(会话 JSONL):

  • 采用与 Claude 相同的 grep 窗口方式
  • 如果有检查点文件(已预先总结),请查找这些文件

Pi(采用树形布局的结构化 JSONL):

  • 每行是一个树条目:{type, id, parentId, timestamp, message?, ...}
  • 构建活动分支:按 id 映射条目,找到叶节点(最后一个没有子节点的条目),沿 parentId 回溯到根节点
  • 使用以下命令搜索:rg -i "<query terms>" <session.jsonl>,查找匹配条目
  • 提取:匹配条目及其在活动分支上的祖先条目(沿父级链追溯)
  • 特殊信号:助手消息中的 toolCall 块可揭示实际执行的操作——如果这些内容位于相关窗口中,即使没有匹配关键词,也要提取
  • 如果有 compaction 和 branch_summary 条目,请优先使用(这些是预先综合的摘要)
  • 跳过:thinking 内容块(噪声)以及 model_change / thinking_level_change 条目

步骤 5:将信息块提炼为 Wiki 页面

针对每个提取的信息块,确定它应归入 Wiki 的哪个位置:

  1. 检查是否已有 Wiki 页面涵盖该内容——在 index.md 和页面的 frontmatter 中搜索相关主题。如果有,请更新现有页面,而不是新建页面。
  2. 按标准规则确定类别(参见 llm-wiki/SKILL.md):
    • 技巧 / 操作指南 → skills/
    • 抽象概念 / 模式 → concepts/
    • 工具 / 库 / 人员 → entities/
    • 跨领域见解 → synthesis/
  3. 编写或更新页面,并添加必需的 frontmatter:
    ---
    title: <topic>
    category: skill|concept|entity|synthesis
    tags: [tag1, tag2]
    sources: [<agent>://<path/to/session>]
    created: <date>
    updated: <date>
    confidence: high|medium|low
    lifecycle: stable|draft
    ---
    
    在 sources 中设置 Agent 前缀,以便 memory-bridge 日后查找。
  4. 添加交叉链接,指向 index.md 中找到的相关 Wiki 页面。

提炼规则(与所有导入技能相同):

  • 提取经久有效的知识,而非运行遥测数据
  • 每个概念对应一个 Wiki 页面,而非每个会话对应一个页面
  • 合并到现有页面,而不是重复创建
  • 保留关键信息:已做出的决策、发现的模式、奏效的技巧,以及得到解释的 Bug

步骤 6:返回综合答案

导入后,立即根据新导入的内容与现有 Wiki 内容综合并返回答案:

## From <agent> history: "<query>"

**Found in:** <N> sessions (<session names/titles>)

**Key insights:**
<Synthesized answer — 3–5 bullet points of the most useful knowledge>

**Wiki pages updated/created:**
- [[page-name]] — <what was added>
- [[page-name]] — <what was added>

**Sessions ingested:**
| Session | Date | Relevance |
|---------|------|-----------|
| <name>  | <date> | <one-line why it was selected> |

**Gaps:** <What the sessions didn't cover that might be relevant>

如果提供了查询,但未找到相关会话,请明确说明:“在 <agent> 历史记录中未找到关于‘’的会话。最近的会话涉及:<最近 3 个会话的主题列表>。”


步骤 7:更新跟踪文件

为每个已处理的会话文件更新 .manifest.json:

{
  "<path>": {
    "ingested_at": "<now>",
    "source_type": "<agent>_conversation",
    "modified_at": "<file mtime>",
    "pages_created": [...],
    "pages_updated": [...]
  }
}

一次加锁调用即可更新日志、索引和热缓存:

obsidian-wiki memory sync WIKI-AGENT \
  agent=<agent> query="<query>" \
  sessions_searched=<N> sessions_ingested=<M> \
  pages_created=<X> pages_updated=<Y> \
  --takeaways "<one line: what was pulled in and what it changes>"

切勿手动编辑 index.md、log.md 或 hot.md——该命令会加锁,防止并行写入者丢失你的更新。

完整流程请参阅 .skills/llm-wiki/references/MEMORY.md。


跨 Agent 使用模式

以下是此技能旨在支持的主要用例:

“我在 Codex 上。我在 Claude 中对 X 有什么发现?” → /wiki-claude "X" — 查找关于 X 的 Claude 会话,将其导入并返回答案

“我上周在 Hermes 中修复了一个 Bug。现在我需要在 Claude Code 中用到相关上下文。” → /wiki-hermes "bug description" — 找出并导入 Hermes 会话

“我在所有工具中都尝试过哪些关于 X 的方法?” → 依次运行 /wiki-claude "X"、/wiki-codex "X"、/wiki-hermes "X"——每次都会导入对应部分,Wiki 会逐步汇总跨 Agent 的全貌,然后运行 /memory-bridge diff,查看各工具分别提供了哪些独有内容

不提供查询,只是想“了解一下近期的 Codex 工作” → /wiki-codex — 导入最近 5 个 Codex 会话并返回摘要

“我在 Claude Code 上。我在 Pi 中对 X 有什么发现?” → /wiki-pi "X" — 查找关于 X 的 Pi 会话,将其导入并返回答案

不提供查询,只是想“了解一下近期的 Pi 工作” → /wiki-pi — 导入最近 5 个 Pi 会话并返回摘要

写入知识库后刷新 QMD

QMD 是搜索索引,而非事实来源。如果 $QMD_WIKI_COLLECTION 为空或未设置,请跳过此步骤。仅当此技能已写入或重写知识库 Markdown 文件后才运行。如果 QMD 刷新失败,不要回滚知识库更改;请单独报告 QMD 状态。

如果已设置 $QMD_CLI,则使用它;否则使用 qmd。

${QMD_CLI:-qmd} update

如果输出提示需要向量或嵌入可能已过时,请运行:

${QMD_CLI:-qmd} embed

通过以下任一方式验证集合:

${QMD_CLI:-qmd} ls "$QMD_WIKI_COLLECTION"

或者,在已知特定页面路径时:

${QMD_CLI:-qmd} get "qmd://$QMD_WIKI_COLLECTION/<page>.md" -l 5

记录以下其中一项:

  • QMD 已刷新:已更新、已嵌入并通过验证
  • QMD 已刷新:仅已更新并通过验证
  • QMD 已跳过:未设置 QMD_WIKI_COLLECTION
  • QMD 已跳过:qmd CLI 不可用
  • QMD 失败:<简短错误摘要>

评论

支持 Markdown