agentleFS
Ar9avAr9av/obsidian-wiki/skills/wiki-agent/SKILL.md

wiki-agent

Skill3.7k starsChanged 8 days agoMITView on GitHub

Search one AI agent's raw history for a specific topic, ingest only matching sessions, and return a synthesized answer. Use for targeted cross-agent recall; use wiki-history-ingest for bulk archival ingestion.

  • Reads credentials

1 other project uses a version of this, 1 of them edited.

Adopted by

Steady: 0 new projects took it in the last 4 weeks, none the 4 weeks before.thin data

Week of Sep 13: 0 new projectsWeek of Sep 20: 0 new projectsWeek of Sep 27: 0 new projectsWeek of Oct 4: 0 new projectsWeek of Oct 11: 0 new projectsWeek of Oct 18: 0 new projectsWeek of Oct 25: 0 new projectsWeek of Nov 1: 0 new projects
Sep 2026Oct 2026Nov 2026
New projects taking a version of this file each week, over the 8 weeks our latest run read: only 0 in all, so this is a hint, not a trend.

Most recently taken up by

Who's talking about Ar9av/obsidian-wiki

The biggest 5 of 27 mentions linking to the repository that our crawl found. Each line is their own headline.

See all 27

Talked about on GitHub and Bluesky (27 times).

On GitHub · 25

20 more on GitHub

On Bluesky · 2

The file

Show its rules and text

We split this skill into the rules it gives an agent

22 rules. About 0 are common, 8 are distinctive, and 14 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈8

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 14

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    If no query is given, default to recent sessions mode: ingest the last 5 unprocessed sessions from that agent and return a summary of what …

    line 26
  2. Very specific:

    Writing profile: Before drafting or rewriting natural-language Markdown, read and apply the Writing Profile Resolution section in …

    line 30
  3. Very specific:

    Read $OBSIDIAN_VAULT_PATH/.manifest.json → know what's already ingested.

    line 34
  4. Very specific:

    Read $OBSIDIAN_VAULT_PATH/hot.md if it exists → warm context on recent wiki activity.

    line 35
  5. Very specific:

    If the history root doesn't exist, stop and tell the user: "No <agent> history found at <path>.

    line 50
  6. Distinctive:

    Use the cheapest index source for each agent — don't open session files until you know which ones are relevant.

    line 56
  7. Very specific:

    Read session_index.jsonl as the inventory.

    line 73
  8. Very specific:

    Read MEMORY.md sections first — it's the pre-compiled summary of everything.

    line 90
  9. Distinctive:

    If a query was given, score each session in the inventory without opening full session files:

    line 111
  10. Very specific:

    Search with: rg -i "<query terms>" <session.jsonl> to find the relevant lines

    line 137
  11. Distinctive:

    Prefer MEMORY.md/daily notes over session JSONL (they're pre-synthesized)

    line 157
  12. Distinctive:

    Look for checkpoint files if available (pre-summarized)

    line 161
  13. Very specific:

    Search with: rg -i "<query terms>" <session.jsonl> to find matching entries

    line 166
  14. Very specific:

    Prefer compaction and branch_summary entries when available — they're pre-synthesized summaries

    line 169
  15. Distinctive:

    Keep the signal: decisions made, patterns discovered, techniques that worked, bugs explained

    line 204
  16. Distinctive:

    After ingesting, immediately synthesize and return an answer from the newly ingested + existing wiki content:

    line 210
  17. Very specific:

    If a query was given but no relevant sessions were found, say so explicitly: "No sessions about '<query>' found in <agent> history.

    line 232
  18. Very specific:

    Update .manifest.json for each session file processed:

    line 238
  19. Very specific:

    Never hand-edit index.md, log.md, or hot.md — the command takes the lock that keeps a parallel writer from dropping your update.

    line 261
  20. Very specific:

    Use $QMD_CLI if set; otherwise use qmd.

    line 293
  21. Distinctive:

    If the output says vectors are needed or embeddings may be stale, run:

    line 299
  22. Distinctive:

    Verify the collection with either:

    line 305

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Wiki Agent — Targeted Cross-Agent History Search + Ingest

You are doing a query-driven targeted ingest from one specific AI agent's raw conversation history. The user is typically working in a different agent right now and wants to pull in context from another agent's past sessions.

This is not bulk ingest. You find sessions about a specific topic, extract the relevant blobs, distill them into the wiki, and return a synthesized answer the user can act on immediately.

Command Routing

Parse the invocation to determine the target agent and optional query:

CommandTargetExample
/wiki-claude [query]Claude Code history/wiki-claude "how did I set up auth middleware"
/wiki-codex [query]Codex CLI history/wiki-codex "rust ownership patterns"
/wiki-hermes [query]Hermes agent history/wiki-hermes "memory architecture"
/wiki-openclaw [query]OpenClaw history/wiki-openclaw "project planning approach"
/wiki-copilot [query]Copilot chat history/wiki-copilot "test strategy for API routes"
/wiki-pi [query]Pi agent history/wiki-pi "how did I refactor the auth module"

If no query is given, default to recent sessions mode: ingest the last 5 unprocessed sessions from that agent and return a summary of what was found. This is equivalent to a focused wiki-history-ingest for that agent only.

Before You Start

Writing profile: Before drafting or rewriting natural-language Markdown, read and apply the Writing Profile Resolution section in llm-wiki/SKILL.md. Framework schema, provenance, safety, and operation-specific requirements take precedence. WRITING.md preferences apply only to newly drafted or rewritten natural-language Markdown; preserve source content and structured records.

  1. Resolve config — follow the Config Resolution Protocol in llm-wiki/SKILL.md (inline @name override → walk up CWD for .env → global config → prompt setup). This gives OBSIDIAN_VAULT_PATH.
  2. Read $OBSIDIAN_VAULT_PATH/.manifest.json → know what's already ingested.
  3. Read $OBSIDIAN_VAULT_PATH/hot.md if it exists → warm context on recent wiki activity.

Step 1: Locate the Agent's History Root

AgentDefault pathConfig override
claude~/.claude + ~/Library/Application Support/Claude/local-agent-mode-sessions/CLAUDE_HISTORY_PATH in .env
codex~/.codexCODEX_HISTORY_PATH in .env
hermes~/.hermesHERMES_HOME in env or .env
openclaw~/.openclawOPENCLAW_HOME in .env
copilot~/.copilotCOPILOT_HISTORY_PATH in .env
pi~/.pi/agent/sessionsPI_HISTORY_PATH in .env

If the history root doesn't exist, stop and tell the user: "No <agent> history found at <path>. Have you run <agent> on this machine? You can set a custom path with <CONFIG_VAR> in .env."


Step 2: Build Session Inventory

Use the cheapest index source for each agent — don't open session files until you know which ones are relevant.

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)

Build a list of sessions: {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)

Read session_index.jsonl as the inventory. Each line: {thread_id, name, updated_at}. Map thread IDs to rollout files by matching directory names.

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

Scan memory filenames first (they're often titled by topic). Fall back to session listing.

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

Read MEMORY.md sections first — it's the pre-compiled summary of everything. Daily notes give recency signal.

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

Scan session directories first. Decode --<cwd>-- to get the working directory. Read the first line (session header) and any session_info entries for the session name. No separate index file — the filesystem is the index.


Step 3: Score Sessions Against the Query

If a query was given, score each session in the inventory without opening full session files:

  1. Name/title match — does the session name or thread title contain the query terms? Score: +3
  2. CWD/project match — does the working directory suggest the right project? Score: +2
  3. Recency — apply exponential time decay with a 90-day half-life, as a multiplier on the match score rather than a bonus added to it:

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

    The 0.35 floor is deliberate: an old session that matches the query exactly must still outrank a recent one that barely matches, or the skill can never answer "how did I first solve this?". This is the same decay session-brain uses, so the two skills rank consistently.

  4. Already ingested — if this session was previously ingested and the wiki page already covers the query (check hot.md + index.md), flag as "covered" but still show in results

Select the top 3–5 sessions by score. If no query was given, select the 5 most recent unprocessed sessions.


Step 4: Extract the Relevant Blob

Open each selected session file and extract only the content relevant to the query. Do not read the full session if it's large — use targeted extraction.

Per-Agent Extraction Strategy

Claude (JSONL conversation):

  • Each line: {role, content, timestamp, ...}
  • Search with: rg -i "<query terms>" <session.jsonl> to find the relevant lines
  • Extract: the surrounding conversation window (10 lines before + 20 lines after each hit)
  • Special signal: tool calls (Read/Write/Bash/Edit) reveal what was actually done — extract these even without keyword matches if they're in the relevant window

Codex (rollout JSONL):

  • Each line: {type: "session_meta|turn_context|event_msg|response_item", ...}
  • Filter to type: "event_msg" (user turns) and type: "response_item" (model output)
  • Search with: rg -i "<query terms>" <rollout.jsonl>
  • Extract: matching turns + their parent context (the turn_context preceding the match)
  • Skip: session_meta events (operational metadata, not knowledge)

Hermes (memory files + session JSONL):

  • For memory files: read the full file (they're short — typically <500 words each)
  • For session JSONL: rg -i "<query terms>" + surrounding window
  • Memory files with title matches → read fully; others → grep only

OpenClaw (MEMORY.md + daily notes + session JSONL):

  • MEMORY.md: grep for section headers containing query terms → extract that section
  • Daily notes: grep most recent 30 days for query terms → extract matching paragraphs
  • Session JSONL: same grep-window approach as Claude
  • Prefer MEMORY.md/daily notes over session JSONL (they're pre-synthesized)

Copilot (session JSONL):

  • Same grep-window approach as Claude
  • Look for checkpoint files if available (pre-summarized)

Pi (structured JSONL with tree layout):

  • Each line is a tree entry: {type, id, parentId, timestamp, message?, ...}
  • Build the active branch: map entries by id, find leaf (last entry with no children), walk parentId to root
  • Search with: rg -i "<query terms>" <session.jsonl> to find matching entries
  • Extract: the matching entries + their ancestors on the active branch (follow parent chain)
  • Special signal: toolCall blocks inside assistant messages reveal what was actually done — extract these even without keyword matches if they're in the relevant window
  • Prefer compaction and branch_summary entries when available — they're pre-synthesized summaries
  • Skip thinking content blocks (noise) and model_change / thinking_level_change entries

Step 5: Distill Blobs into Wiki Pages

For each extracted blob, determine where it belongs in the wiki:

  1. Check if a wiki page already covers this — grep index.md and page frontmatter for the topic. If yes, update the existing page rather than creating a new one.
  2. Determine category using standard rules (from llm-wiki/SKILL.md):
    • Technique / how-to → skills/
    • Abstract concept / pattern → concepts/
    • Tool / library / person → entities/
    • Cross-cutting insight → synthesis/
  3. Write or update the page with required 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
    ---
    Set sources with the agent prefix so memory-bridge can find it later.
  4. Add cross-links to related wiki pages found in index.md.

Distillation rules (same as all ingest skills):

  • Extract durable knowledge, not operational telemetry
  • One wiki page per concept, not one per session
  • Merge into existing pages rather than duplicating
  • Keep the signal: decisions made, patterns discovered, techniques that worked, bugs explained

Step 6: Return Synthesized Answer

After ingesting, immediately synthesize and return an answer from the newly ingested + existing wiki content:

## 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>

If a query was given but no relevant sessions were found, say so explicitly: "No sessions about '<query>' found in <agent> history. The most recent sessions covered: <list topics from last 3 sessions>."


Step 7: Update Tracking Files

Update .manifest.json for each session file processed:

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

One locked call updates the log, the index, and the hot cache:

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>"

Never hand-edit index.md, log.md, or hot.md — the command takes the lock that keeps a parallel writer from dropping your update.

See skills/llm-wiki/references/MEMORY.md for the full procedure.


Cross-Agent Use Patterns

These are the primary use cases this skill is designed for:

"I'm on Codex. What did I figure out about X in Claude?" → /wiki-claude "X" — finds Claude sessions about X, ingests them, returns the answer

"I solved a bug in Hermes last week. I need that context now in Claude Code." → /wiki-hermes "bug description" — surfaces and ingests the Hermes session

"What are all the approaches I've tried for X across all my tools?" → Run /wiki-claude "X", /wiki-codex "X", /wiki-hermes "X" in sequence — each ingests its slice, the wiki accumulates the cross-agent picture, then /memory-bridge diff shows what each tool uniquely contributed

No query — just "catch me up on recent Codex work" → /wiki-codex — ingests last 5 Codex sessions and returns a summary

"I'm on Claude Code. What did I figure out about X in Pi?" → /wiki-pi "X" — finds Pi sessions about X, ingests them, returns the answer

No query — just "catch me up on recent Pi work" → /wiki-pi — ingests last 5 Pi sessions and returns a summary

QMD Refresh After Vault Writes

QMD is a search index, not the source of truth. If $QMD_WIKI_COLLECTION is empty or unset, skip this step. Run it only after this skill has written or rewritten vault markdown. If QMD refresh fails, do not roll back the vault changes; report the QMD status separately.

Use $QMD_CLI if set; otherwise use qmd.

${QMD_CLI:-qmd} update

If the output says vectors are needed or embeddings may be stale, run:

${QMD_CLI:-qmd} embed

Verify the collection with either:

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

or, when a specific page path is known:

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

Record one of:

  • QMD refreshed: update + embed + verified
  • QMD refreshed: update only + verified
  • QMD skipped: QMD_WIKI_COLLECTION unset
  • QMD skipped: qmd CLI unavailable
  • QMD failed: <short error summary>

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.