LLM Wiki
lewislulu/llm-wiki-skill
Build and maintain a Karpathy-style LLM knowledge base — a self-compiling Obsidian markdown wiki where an Agent ingests raw sources, compiles cross-linked concept/entity/summary pages, answers…
Search and synthesize answers from the compiled Obsidian wiki, including cited and multi-hop answers.
$ npx skills add Ar9av/obsidian-wiki --skill wiki-query -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Ar9av/obsidian-wiki wiki-query --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Ar9av/obsidian-wiki.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.skills/wiki-query .claude/skills/wiki-query && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "wiki-query" agent skill from https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/wiki-query into .claude/skills/wiki-query/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "wiki-query", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/wiki-queryType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Ar9av/obsidian-wiki --skill wiki-query -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Ar9av/obsidian-wiki wiki-query --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Ar9av/obsidian-wiki.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.skills/wiki-query .agents/skills/wiki-query && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "wiki-query" agent skill from https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/wiki-query into .agents/skills/wiki-query/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "wiki-query", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Ar9av/obsidian-wiki --skill wiki-query -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Ar9av/obsidian-wiki wiki-query --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Ar9av/obsidian-wiki.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.skills/wiki-query .cursor/skills/wiki-query && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "wiki-query" agent skill from https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/wiki-query into .cursor/skills/wiki-query/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "wiki-query", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Ar9av/obsidian-wiki.git --path .skills/wiki-query--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Ar9av/obsidian-wiki --skill wiki-query -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Ar9av/obsidian-wiki wiki-query --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Ar9av/obsidian-wiki.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.skills/wiki-query .gemini/skills/wiki-query && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "wiki-query" agent skill from https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/wiki-query into .gemini/skills/wiki-query/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "wiki-query", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Ar9av/obsidian-wiki wiki-queryInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Ar9av/obsidian-wiki --skill wiki-query -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Ar9av/obsidian-wiki.git skills-src && mkdir -p .github/skills && cp -r skills-src/.skills/wiki-query .github/skills/wiki-query && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "wiki-query" agent skill from https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/wiki-query into .github/skills/wiki-query/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "wiki-query", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Ar9av/obsidian-wiki --skill wiki-query -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Ar9av/obsidian-wiki wiki-query --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Ar9av/obsidian-wiki.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.skills/wiki-query .opencode/skills/wiki-query && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "wiki-query" agent skill from https://github.com/Ar9av/obsidian-wiki/tree/main/.skills/wiki-query into .opencode/skills/wiki-query/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "wiki-query", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
wiki-querySearch and synthesize answers from the compiled Obsidian wiki, including cited and multi-hop answers.
Wiki Query is an agent skill from Ar9av/obsidian-wiki. Search and synthesize answers from the compiled Obsidian wiki, including cited and multi-hop answers. Use for questions about existing wiki knowledge or fast index-only lookups. Supports named-vault routing such as wiki-query @work; not for ingesting new sources.
Its SKILL.md is about 6.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Knowledge Management, covering LLM wikis. It works with Obsidian. The repository describes itself as: Framework for AI agents to build and maintain a digital brain through Obsidian wiki | Memory System for Agents. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 709727e. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are bash).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Wiki Query loads about 6.3k tokens when it runs. Until then it costs about 69 tokens; SKILL.md has 3,356 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
line `@name` override → walk up CWD for `.env` → global config → prompt setup). For cross-project queries without `@nameAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Ar9av/obsidian-wiki at commit 709727e, republished under its MIT licence (© Ar9av). 3,356 words, ~6,276 tokens.
.claude/skills/wiki-query/SKILL.md (or your agent's skills folder).You are answering questions against a compiled Obsidian wiki, not raw source documents. The wiki contains pre-synthesized, cross-referenced knowledge.
wiki-query answers questions. It MUST NOT create or modify any wiki content. The ONLY write it may perform is the single Step 6 append to log.md.
Never, even when a change seems obviously helpful:
concepts/, entities/, skills/, references/, synthesis/, journal/, or projects/index.md, hot.md, _insights.md, or .manifest.jsonIf the user's message contains a new finding, an action request ("save this", "ban X", "record that"), or anything implying a change, do not perform it. Answer the question, PROPOSE the change, and route the user to the right skill:
wiki-capture --quickwiki-capturewiki-updatellm-wiki/SKILL.md (inline @name override → walk up CWD for .env → global config → prompt setup). For cross-project queries without @name, prefer the global config when present, even if it is a symlink to the vault .env. This gives OBSIDIAN_VAULT_PATH and any QMD variables. Works from any project directory.QMD_WIKI_COLLECTION is set, treat QMD as available subject only to transport/tool checks below. If it is empty or unset, say briefly why QMD is being skipped before using grep/page reads.$OBSIDIAN_VAULT_PATH/hot.md exists, read it first — it gives you instant context on recent activity. If the user's question is about something ingested recently, hot.md may answer it before you even open index.md.$OBSIDIAN_VAULT_PATH/index.md to understand the wiki's scope and structureBy default, all pages are returned regardless of visibility tags. This preserves existing behavior — nothing changes unless the user asks for it.
If the user's query includes phrases like "public only", "user-facing", "no internal content", "as a user would see it", or "exclude internal", activate filtered mode:
{visibility/internal, visibility/pii}Pages with no visibility/ tag, or tagged visibility/public, are always included.
In filtered mode, note the filter in the Step 6 log entry: mode=filtered.
Follow the Retrieval Primitives table in llm-wiki/SKILL.md. Reading is the dominant cost of this skill — use the cheapest primitive that answers the question and escalate only when it can't. Never jump straight to full-page reads.
Before opening any pages, query the compiled graph index:
obsidian-wiki graph-query "$OBSIDIAN_VAULT_PATH" "<question>" --prettyOutput fields:
answer_type: direct | path | list | gap | impact | bridges | hubs | clusters | surprising — shapes what to do next. The last five are structural intents: the question is about the shape of the vault, and the answer comes back fully computed in graph (see below) with no page reads at all.graph: present only for structural intents — the computed answer. null otherwise.candidates: top-ranked pages by title/tag/summary match + degree, with scores and summariesshould_read: the pages most worth opening — start here instead of speculatively reading many filespath: for multi-hop queries, the shortest wikilink path between the two conceptsgod_nodes_relevant: hub pages related to your query terms — always useful contextindex_only: if true, the top candidate's summary already answers the question — skip page readstemporal: as_of, retrievable, excluded_historical — how many pages the event-time filter held back (see below)Structural intents — these are answered entirely from the graph. The user's phrasing routes automatically:
| The user asks | answer_type | graph contains |
|---|---|---|
| "what breaks if I delete X" / "what depends on X" / "what links to X" | impact | direct_dependents, transitive_dependents, total |
| "which pages bridge my clusters" / "what would fragment my vault" | bridges | pages by betweenness, with label and connects_labels |
| "what's central" / "top hubs" / "my main topics" | hubs | pages by degree, with in/out split |
| "what clusters do I have" / "how is my wiki organised" | clusters | each cluster's label, size, cohesion, fragmented |
| "surprising connections" / "unexpected links" | surprising | cross-cluster links, rarest first |
Report the graph payload directly — do not re-derive it by reading pages. If a structural question names a page that can't be resolved, the CLI falls back to direct and graph is null.
Decision tree:
graph is non-null → the structural answer is complete. Report it and stop; no page reads.index_only: true → answer directly from candidates[0].summary. Skip Steps 1–4, go to Step 5.answer_type == "path" and path is non-empty → the connection is in path. Read only those pages.should_read pages (not all candidates). This replaces the speculative 5–10 page reads the old flow required.The graph used here excludes vault bookkeeping files (
index.md,log.md,hot.md,_insights.md). They link to nearly every page, so including them made any two pages look ~2 hops apart and produced meaninglessA → index → Bpaths.
Event time. Pages may carry valid_from / valid_until / superseded_by
frontmatter. A page whose valid_until has passed is historical: it stays in
the vault and in the graph, but drops out of candidates by default, so "which X
do we use?" answers with what is true now rather than whatever was written first.
temporal.excluded_historical is non-zero, say so if it is material to the
answer — the user may be asking about the superseded state.--as-of YYYY-MM-DD to retrieve what held then.--include-historical when the user explicitly wants the whole history, or
when you are tracing how a decision changed.superseded_by names its replacement — follow it
rather than reporting the stale claim as current.obsidian-wiki graph-query "$OBSIDIAN_VAULT_PATH" "<question>" --as-of 2025-06-01 --pretty
obsidian-wiki graph-query "$OBSIDIAN_VAULT_PATH" "<question>" --include-historical --prettyThe structural intents ignore this filter on purpose: deleting a page still breaks the historical pages that link to it, so a blast radius must not shrink just because a dependent is no longer current.
Fallback (if obsidian-wiki is not installed): proceed with Step 1 as normal using grep and index.md.
Classify the query type:
relationships: frontmatter blocks for typed edgesAlso decide the mode:
index.md only.Build a candidate set without opening any page bodies:
index.md above — use it as the first filter. It lists every page with a one-line description and tags.Grep to scan page frontmatter only for title, tag, alias, and summary matches. A pattern like ^(title|tags|aliases|summary): scoped to vault .md files is far cheaper than content grep.index.md entry contains the query termtier: core over tier: supporting over tier: peripheral. Read the tier: frontmatter field with the same cheap grep as other fields. Pages without a tier: field are treated as supporting.Track retrieval counts as you go (for the transparency report in Step 5/6):
candidates_seen — total distinct pages that matched any rank criterion above, before trimming to the top 5–10.candidates_used — how many of those you actually carried forward into Steps 3/4.dropped — candidates_seen − candidates_used, i.e. matches that existed but were never read. If this is non-zero, name the dropped pages (or the count if there are many) so the user knows retrieval wasn't exhaustive — this is not an error, just an honest accounting of what was left out.If you're in index-only mode, stop here. Answer from summary: fields, titles, and index.md descriptions only. Label the answer clearly: "(index-only answer — page bodies not read; facts below are from page summaries and may miss nuance)". Then skip to Step 5.
QMD_WIKI_COLLECTION in resolved config)GUARD: If $QMD_WIKI_COLLECTION is empty or unset after config resolution, skip this entire step and proceed to Step 3. Mention the missing variable in your working update.
No QMD? Skip to Step 3 and use
Grepdirectly on the vault. QMD is faster and concept-aware but the grep path is fully functional. See.env.examplefor setup.
If QMD_WIKI_COLLECTION is set, run QMD before reaching for Grep unless the question is already fully answered by hot.md or index.md metadata. QMD is especially preferred when the question is semantic, project-specific, asks for related context, or uses terms that may not appear verbatim in titles/frontmatter.
Choose the QMD transport from $QMD_TRANSPORT:
mcp (default): use the QMD MCP tool configured in the agent.cli: run the local qmd CLI. Use $QMD_CLI if set; otherwise use qmd.For detailed CLI command selection, maintenance, and VM caveats, use the local
$qmd-cli skill when it is installed.
If the selected transport is unavailable (no MCP tool, qmd not on PATH, or the command errors), skip QMD and continue with Step 3.
For MCP transport:
mcp__qmd__query:
collection: <QMD_WIKI_COLLECTION> # e.g. "knowledge-base-wiki"
intent: <the user's question>
searches:
- type: lex # keyword match — good for exact names, file paths, error messages
query: <key terms>
- type: vec # semantic match — good for concepts, patterns, "what is X like"
query: <question rephrased as a description>For CLI transport, pick the command from $QMD_CLI_SEARCH_MODE:
Keep operator-like or punctuation-heavy tokens such as no-sudo, ansible_become=false, and ~/.local/bin in the lex: line. Rewrite the vec: line as plain natural language without hyphenated -term words; QMD treats -term as negation, and negation is not supported in vec/hyde queries.
quality (default): best relevance; slower on CPU.${QMD_CLI:-qmd} query $'lex: <key terms>\nvec: <question rephrased as a description>' -c "$QMD_WIKI_COLLECTION" -n 8 --filesbalanced: hybrid search without LLM reranking; use when quality is too slow.${QMD_CLI:-qmd} query $'lex: <key terms>\nvec: <question rephrased as a description>' -c "$QMD_WIKI_COLLECTION" -n 8 --no-rerank --filesfast: semantic-only recall, or search instead when exact names, file paths, or error messages matter.${QMD_CLI:-qmd} vsearch "<question rephrased as a description>" -c "$QMD_WIKI_COLLECTION" -n 8 --filesUse ${QMD_CLI:-qmd} get "#docid" to retrieve a ranked document by docid when CLI output provides one.
The returned snippets or ranked files act as pre-read section summaries. If they answer the question fully, skip Step 3 and go straight to Step 4 (reading only the pages QMD ranked highest). If not, use the ranked file list to guide which files to grep or read in Step 3.
Fold QMD hits into the same candidates_seen count from Step 2 (dedupe by path — a page found by both frontmatter grep and QMD counts once).
Defensive filter: drop any _raw/ path from wiki-collection results. The wiki collection is supposed to index only compiled pages, but a misconfigured collection (see .env.example) can end up indexing _raw/ — including stale drafts sitting in _raw/_archived/ that were already superseded by a promoted page. Before using a QMD hit from $QMD_WIKI_COLLECTION, check its path: if it contains _raw/, discard it from the wiki-collection result set (it may still surface legitimately via $QMD_PAPERS_COLLECTION, cited as a raw source). This keeps a misconfigured collection degrading to "missing recall" rather than "silently citing a superseded draft as compiled knowledge." If you see _raw/ paths coming back from the wiki collection, mention it in your working update so the user knows their collection scope needs fixing (see .env.example QMD section).
Also search papers when the question may have source material in _raw/:
If QMD_PAPERS_COLLECTION is set and the user is asking about a topic likely covered by ingested papers (research, theory, background), run a parallel search against the papers collection. Cite raw sources separately from compiled wiki pages in your answer.
For each of the top candidates, pull the relevant section without reading the whole page:
Grep -A 10 -B 2 "<query-term>" <candidate-file> to get just the lines around the match.Only when Steps 2 and 3 don't answer the question:
Read the top 3 candidates in full. When choosing which 3 to read, apply tier ordering: read core pages before supporting, and skip peripheral pages unless they are the only match.[[wikilinks]] from those pages if the answer requires cross-references.relationships: frontmatter block of the candidate pages. Each entry gives a typed, directional edge (extends, implements, contradicts, derived_from, uses, replaces, related_to). Surface these explicitly in your answer — "Page A contradicts Page B (typed edge)" is more useful than "Page A links to Page B".Plain retrieval surfaces pages that mention the query terms. It cannot answer path / multi-hop queries — "How is X connected to Y?", "What does X depend on transitively?", "Trace the chain from X to Z" — when X and Y never appear on the same page. The answer lives in the shape of the typed-edge graph, not in any single page body. This is the step that walks it.
Run this step only for path/multi-hop queries (or when a relationship query returns no direct edge between the two pages). It is built entirely from frontmatter — never read page bodies here.
Build the typed-edge adjacency (cheap). Grep every page's relationships: block in one pass — Grep -A 20 "^relationships:" <vault>/**/*.md (frontmatter only). Each entry yields a directed, typed edge source —type→ target. Add the reverse direction as a traversable edge too (mark it (reverse)), since "connected to" is symmetric even though the typed assertion is directional. Plain body [[wikilinks]] count as untyped related_to edges only if you need them to complete a path — prefer typed edges first.
Locate the endpoints. Resolve X (and Y, if the query names two) to page paths using the registry from Step 2. If an endpoint is ambiguous, pick the tier: core candidate and note the assumption.
Bounded BFS. If obsidian-wiki is installed, let the CLI do the walk over the wikilink graph first — it is exact and instant:
obsidian-wiki graph-analyse "$OBSIDIAN_VAULT_PATH" --path "<X>" "<Y>" # two-endpoint: shortest chain + hop count
obsidian-wiki graph-analyse "$OBSIDIAN_VAULT_PATH" --around "<X>" --depth 3 [--direction out|in] # one-endpoint: reachable pages by hop--path follows links in either direction unless --direction out; --around --direction in answers "what depends on X" (its blast radius). Then decorate the returned chain with the typed edges from step 1 (the CLI sees [[wikilinks]], not relationship types). Otherwise, or to find alternate paths, walk manually:
Report the path(s) with edge types. Show the chain, not just the endpoints — the typed edges are the answer:
[[concepts/transformers]] —uses→ [[concepts/attention]] —derived_from→ [[concepts/rnn-seq2seq]] —contradicts (reverse)→ [[concepts/lstm]]State the hop count and whether any hop is a (reverse) traversal or an untyped related_to fallback (those chains are weaker — flag them). If no path exists within the depth limit, say so explicitly: "No typed-edge path from X to Y within 3 hops — they are in disconnected regions of the graph." That is itself a useful finding (a graph gap).
Cost guard: this step reads only frontmatter via grep. If the adjacency grep returns nothing (no page uses relationships: yet), report that the graph has no typed edges to traverse and suggest running cross-linker to populate them, then fall back to ordinary one-hop retrieval.
Compose your answer from wiki content:
[[page-name]] notationPage trust annotations: For every page cited in your answer, check its lifecycle frontmatter and compute is_stale = (today − updated) > 90 days. Annotate risky pages inline so the user knows which citations to verify:
| Condition | Annotation |
|---|---|
lifecycle: archived | (ARCHIVED: superseded by [[target]]) — use the successor instead |
lifecycle: disputed | (DISPUTED, marked <lifecycle_changed>: <lifecycle_reason or "reason unspecified">) |
is_stale + lifecycle: verified | (VERIFIED but stale: last updated <updated>) — reader should re-verify before relying |
is_stale (other lifecycle) | (stale: last updated <updated>) |
Examples in a synthesized answer:
[[concept-page]] (stale: last updated 2026-01-15) — Original claim was X.
[[verified-page]] (VERIFIED but stale: last updated 2025-09-10) — Reader should reverify before relying.
[[disputed-page]] (DISPUTED, marked 2026-04-30: contradicted by [[new-source]]) — Earlier said Y, now uncertain.
[[old-page]] (ARCHIVED: superseded by [[new-page]]) — Use the successor.Pages with no lifecycle field (legacy pages predating the schema) are treated the same as draft — annotate if stale, skip otherwise. Never fabricate a lifecycle_reason; if the field is absent, omit the reason from the annotation.
Surface the project source location (project-scoped queries). When the cited pages are project-scoped — their path is under projects/<name>/..., or their frontmatter carries a source_path/source_repo field — resolve where the actual code lives so a proposed fix can name real files and a follow-up turn can edit them:
$OBSIDIAN_VAULT_PATH/.manifest.json and look up .projects.<name>.source_repo — this is the authoritative, machine-independent identity (e.g. github.com/owner/name). It is what you report..projects.<name>.source_cwd_hint (a ~-relative hint), then a legacy .projects.<name>.source_cwd (an absolute path, older manifests only), then the page's source_path frontmatter. Expand ~ in any candidate and confirm the directory actually exists before using it. A legacy absolute path is used only as a local convenience — never reported as the project's identity.Report the Source code: line using source_repo. When a local checkout resolved in step 2, append the concrete path so the reader can act on it (e.g. <repo> — local checkout at ~/code/name/public/lib/anticheat.js). When the query implies a code fix is wanted and a local checkout exists, name the specific files to edit and offer to implement it as an explicit, separate next step — but never edit during the query itself (see the READ-ONLY guard above). If no local checkout resolves, report the repo and say the code is not checked out on this machine.
This is the only write this skill performs — do not edit anything else, and do not append to log.md by hand:
obsidian-wiki memory log QUERY \
query="the user's question" result_pages=<N> \
mode=<normal|index_only|filtered> escalated=<true|false> \
candidates_seen=<N> candidates_used=<N> dropped=<N>The command takes the memory lock and appends one parseable line; it never touches index.md or hot.md.
Use the counts tracked since Step 2. If a count wasn't tracked (e.g. index-only mode never built a full candidate set), write 0 rather than omitting the field — the log format should stay parseable.
Structure answers like this:
Based on the wiki:
[Your synthesized answer with [[wikilinks]] to source pages]
Pages consulted: [[page-a]], [[page-b]], [[page-c]]
Gaps: [What the wiki doesn't cover that might be relevant]
Retrieval: N candidates seen, M read, D dropped (untouched matches, if any: [[page-d]], [[page-e]])
Source code:
<source_repo>(local checkout at~/code/<name>) — to implement, the relevant files are…. (Say the word and I'll switch out of query mode to make the change.)
The Source code line is optional — include it only for project-scoped queries where you resolved a source_repo (see Step 5). Report the repository, not a machine absolute path; add the local checkout path only when it actually exists on this machine.
The Retrieval line is always included — it's the transparency report from the counts tracked since Step 2 (mirrors the candidates_seen/candidates_used/dropped fields logged in Step 6). In index-only mode, report the counts from the frontmatter scan; if D is 0, drop the parenthetical rather than writing an empty list.
© Ar9av, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .skills/wiki-query of Ar9av/obsidian-wiki.
Open the folder on GitHubat commit 709727e
Wiki Query next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Wiki Query this skillAr9av/obsidian-wiki | 3.5k | — | ~6.3k | Automated safety check: Notes | MIT | |
| LLM Wikilewislulu/llm-wiki-skill | 655 | — | ~3.7k | Automated safety check: Pass | None | |
| Obsidian CLI Read TransportAgriciDaniel/claude-obsidian | 15k | 1 repos | ~762 | Automated safety check: Pass | MIT | |
| LLM Wikizosmaai/pi-llm-wiki | 606 | — | ~4.4k | Automated safety check: Pass | MIT | |
| LLM Wikipraneybehl/llm-wiki-plugin | 118 | — | ~5.7k | Automated safety check: Pass | MIT | |
| Karpathy WikiSherwinQ/karpathy-wiki | 113 | — | ~967 | Automated safety check: Pass | MIT |
lewislulu/llm-wiki-skill
Build and maintain a Karpathy-style LLM knowledge base — a self-compiling Obsidian markdown wiki where an Agent ingests raw sources, compiles cross-linked concept/entity/summary pages, answers…
AgriciDaniel/claude-obsidian
Detects and uses the official Obsidian command-line interface for read-only vault access, falling back to direct file reads, while all mutations stay on a separate transaction core.
zosmaai/pi-llm-wiki
Build and maintain a persistent, interlinked Obsidian-compatible markdown wiki using Karpathy's LLM Wiki pattern.
praneybehl/llm-wiki-plugin
Build and maintain an LLM-curated knowledge base from papers, articles, transcripts, notes and project findings.
SherwinQ/karpathy-wiki
A skill your agent uses when building or maintaining a personal knowledge base with LLM assistance.
MartinLwx/dotfiles
Provides access to the user's personal wiki, including notes, research, project documentation, decisions, and archived knowledge.
Ar9av/obsidian-wiki
Ingest Hermes agent history into Obsidian as distilled knowledge.
Ar9av/obsidian-wiki
Ingest Codex CLI conversation/session history into Obsidian as distilled knowledge.
Ar9av/obsidian-wiki
Ingest GitHub Copilot CLI/session history into Obsidian as distilled knowledge.
Ar9av/obsidian-wiki
Adjust the user's Obsidian visual layout with CSS snippets. An agent skill from Ar9av/obsidian-wiki.
Ar9av/obsidian-wiki
Ingest OpenClaw session/history data into Obsidian as distilled knowledge.
Ar9av/obsidian-wiki
Turn the current conversation or finding into a structured permanent wiki note.
Works with
Categories
Search and synthesize answers from the compiled Obsidian wiki, including cited and multi-hop answers. Wiki Query is an agent skill from Ar9av/obsidian-wiki. Search and synthesize answers from the compiled Obsidian wiki, including cited and multi-hop answers.
Wiki Query fits situations like: questions about existing wiki knowledge; fast index-only lookups.
Run `npx skills add Ar9av/obsidian-wiki --skill wiki-query -a claude-code`. Or copy the skill folder (.skills/wiki-query in Ar9av/obsidian-wiki) into .claude/skills/wiki-query in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Ar9av/obsidian-wiki --skill wiki-query -a codex`. Or copy the skill folder (.skills/wiki-query in Ar9av/obsidian-wiki) into .agents/skills/wiki-query in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Ar9av/obsidian-wiki --skill wiki-query -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/wiki-query, .gemini/skills/wiki-query, .github/skills/wiki-query and .opencode/skills/wiki-query in your project.
SKILL.md names no scripts, command-line tools or credentials: Wiki Query is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Wiki Query is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.3k tokens (SKILL.md is roughly 25k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Wiki Query: LLM Wiki (lewislulu/llm-wiki-skill, 655 stars), Obsidian CLI Read Transport (AgriciDaniel/claude-obsidian, 15k stars), LLM Wiki (zosmaai/pi-llm-wiki, 606 stars) and LLM Wiki (praneybehl/llm-wiki-plugin, 118 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Ar9av (a GitHub user) maintains it in Ar9av/obsidian-wiki, which has 3,532 GitHub stars. The repository holds 39 skills in this directory. The repository was last updated on October 7, 2026.
Source: Ar9av/obsidian-wiki on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.