wiki-agent — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited wiki-agent (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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.
Parse the invocation to determine the target agent and optional query:
| Command | Target | Example |
|---|---|---|
/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.
llm-wiki/SKILL.md (walk up CWD for .env → ~/.obsidian-wiki/config → prompt setup). This gives OBSIDIAN_VAULT_PATH.$OBSIDIAN_VAULT_PATH/.manifest.json → know what's already ingested.$OBSIDIAN_VAULT_PATH/hot.md if it exists → warm context on recent wiki activity.| Agent | Default path | Config override |
|---|---|---|
claude | ~/.claude + ~/Library/Application Support/Claude/local-agent-mode-sessions/ | CLAUDE_HISTORY_PATH in .env |
codex | ~/.codex | CODEX_HISTORY_PATH in .env |
hermes | ~/.hermes | HERMES_HOME in env or .env |
openclaw | ~/.openclaw | OPENCLAW_HOME in .env |
copilot | ~/.copilot | COPILOT_HISTORY_PATH in .env |
pi | ~/.pi/agent/sessions | PI_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."
Use the cheapest index source for each agent — don't open session files until you know which ones are relevant.
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}.
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.
Primary index: ~/.hermes/memories/*.md (fast to scan)
Session files: ~/.hermes/sessions/**/*.jsonl
Signal fields: file names, memory titles, first 3 lines of each memoryScan memory filenames first (they're often titled by topic). Fall back to session listing.
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/*.jsonlRead MEMORY.md sections first — it's the pre-compiled summary of everything. Daily notes give recency signal.
Primary index: session filenames / directory listing
Session files: varies by client (VS Code: ~/.copilot/sessions/*.jsonl or similar)
Signal fields: session timestamps, file namesPrimary 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 filenameScan 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.
If a query was given, score each session in the inventory without opening full session files:
hot.md + index.md), flag as "covered" but still show in resultsSelect the top 3–5 sessions by score. If no query was given, select the 5 most recent unprocessed sessions.
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.
Claude (JSONL conversation):
{role, content, timestamp, ...}grep -i "<query terms>" <session.jsonl> to find the relevant linesCodex (rollout JSONL):
{type: "session_meta|turn_context|event_msg|response_item", ...}type: "event_msg" (user turns) and type: "response_item" (model output)grep -i "<query terms>" <rollout.jsonl>turn_context preceding the match)session_meta events (operational metadata, not knowledge)Hermes (memory files + session JSONL):
grep -i "<query terms>" + surrounding windowOpenClaw (MEMORY.md + daily notes + session JSONL):
MEMORY.md: grep for section headers containing query terms → extract that sectionCopilot (session JSONL):
Pi (structured JSONL with tree layout):
{type, id, parentId, timestamp, message?, ...}id, find leaf (last entry with no children), walk parentId to rootgrep -i "<query terms>" <session.jsonl> to find matching entriestoolCall blocks inside assistant messages reveal what was actually done — extract these even without keyword matches if they're in the relevant windowcompaction and branch_summary entries when available — they're pre-synthesized summariesthinking content blocks (noise) and model_change / thinking_level_change entriesFor each extracted blob, determine where it belongs in the wiki:
index.md and page frontmatter for the topic. If yes, update the existing page rather than creating a new one.llm-wiki/SKILL.md):skills/concepts/entities/synthesis/ ---
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.
index.md.Distillation rules (same as all ingest skills):
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>."
Update .manifest.json for each session file processed:
{
"<path>": {
"ingested_at": "<now>",
"source_type": "<agent>_conversation",
"modified_at": "<file mtime>",
"pages_created": [...],
"pages_updated": [...]
}
}Append to log.md:
- [TIMESTAMP] WIKI-AGENT agent=<agent> query="<query>" sessions_searched=N sessions_ingested=M pages_created=X pages_updated=YUpdate hot.md with a one-line summary of what was ingested.
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 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} updateIf the output says vectors are needed or embeddings may be stale, run:
${QMD_CLI:-qmd} embedVerify 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 5Record one of:
QMD refreshed: update + embed + verifiedQMD refreshed: update only + verifiedQMD skipped: QMD_WIKI_COLLECTION unsetQMD skipped: qmd CLI unavailableQMD failed: <short error summary>~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.