Install any skill in seconds. Free to start, no credit card required.
Get Started Free →LLM-compiled knowledge base manager. Activates when user works with wiki directories, mentions knowledge base management, asks knowledge questions in a project with a wiki, wants to ingest/import/compile/query/lint/audit knowledge, collect/catalog discoverable artifacts and examples, track inventory, manage source queues, candidates, corpora, entities, watch lists, dataset manifests, large datasets, or data that is too big for the wiki, archive old topic wikis, capture or rehydrate agent session
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | 440% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 982% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 1209% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 499% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 132% | 0% |
You manage an LLM-compiled knowledge base. Source documents are ingested into raw/, then incrementally compiled into a wiki of interconnected markdown articles. OpenCode is both the compiler and the query engine.
This skill is loaded as an instruction file. OpenCode does not have Claude-style /wiki:* slash commands or Codex-style @wiki invocations. Treat any /wiki:* references in this skill and its references as shorthand for the equivalent natural-language request. For example, /wiki:compile means the user is asking you to compile the wiki.
OpenCode's built-in tools (read, write, edit, glob, grep, bash, webfetch, websearch) map directly to the tools this skill requires. Web search requires OPENCODE_ENABLE_EXA=1 in the environment.
Permissions: OpenCode sandboxes file access to the project directory. The wiki hub at ~/wiki/ is external. Add external_directory permissions in opencode.json to allow access: { "permission": { "external_directory": { "~/wiki/**": "allow", "~/.config/llm-wiki/**": "allow" } } }. If your configured hub uses another absolute path (for example iCloud Drive), add that path too. Alternatively, use --local mode to keep everything in .wiki/ inside the project.
Resolution: At the start of every operation, resolve HUB by reading ~/.config/llm-wiki/config.json first. Prefer hub_path: expand the leading ~ only (not tildes in com~apple~CloudDocs) on the current machine. Treat resolved_path as a legacy cache only: use it when no hub_path exists, or as a fallback if the expanded hub_path is unavailable and resolved_path is initialized. Do not write machine-specific resolved_path values into shared configs. If no config file exists, try ~/wiki/_index.md as a fallback. If stat/existence checks succeed but reading wikis.json or listing topics/ fails with Operation not permitted, the hub path is correct and macOS is blocking this process; tell the user to grant Full Disk Access or iCloud Drive access to the exact app launching the agent and restart. Do not switch to ~/wiki or resolved_path for that error. See references/hub-resolution.md for the full protocol.
The config file looks like:
json{ "hub_path": "~/Library/Mobile Documents/com~apple~CloudDocs/wiki" }
If no config exists and ~/wiki/ has _index.md, that works too. But config is checked first — in sandboxed environments ~/wiki/ may not be accessible. All references to ~/wiki/ below mean HUB.
Topic sub-wikis are the default. HUB is a hub — content lives in HUB/topics/<name>/. Each topic gets isolated indexes, sources, and articles. This keeps queries focused and prevents unrelated topics from polluting each other's search space.
For collection families that will grow across subjects, prefer kind-first topic slugs such as memes-bitcoin, memes-ethereum, tools-bitcoin, or examples-seedqr. Use subject-first slugs when the subject is the primary research area and the collection is only one artifact within that topic.
Resolution order:
--local flag → .wiki/ in current project--wiki <name> flag → named wiki from HUB/wikis.json; resolve registry paths as <HUB>, ~, absolute, or relative to HUB, and fall back to HUB/topics/<name> if a registry path is stale.wiki/ → use itWhen a command targets the hub and the hub has no content, suggest creating a topic sub-wiki instead.
See references/wiki-structure.md for the complete directory layout and all file format conventions.
.md files and their YAML frontmatter are the source of truth. _index.md files are a cached view rebuilt on read when stale. Always read indexes first for navigation — but before trusting one, stale-check it (file count vs row count). See references/indexing.md for the Derived Index Protocol.scripts/llm-wiki retract; content, archives, and sessions cannot veto it.[[wikilink]] (for Obsidian graph view) and standard markdown [text](path) (for OpenCode navigation) on the same line: [[slug|Name]] ([Name](../category/slug.md)). Bidirectional when it makes sense..md file has YAML frontmatter with title, summary, tags, dates. This makes the wiki searchable without full-text scans.--full).HUB/wikis.json) for relevant overlap. Flag connections but never merge content across wikis.HUB/topics/.archive/<slug>/ and are hidden from normal semantic workflows. They remain structurally maintainable through explicit archive/lint operations. Deep queries may surface archived index matches separately, but archived content must not influence new synthesis unless the user explicitly includes it.
HUB/.sessions/ or .wiki/.sessions/, not in topic raw/ by default. Automated hooks may capture redacted checkpoints, but promotion into topic wikis is explicit and user-directed.
and plan-acceptance signals may be captured as redacted candidates under HUB/.sessions/feedback/, but generic acknowledgements are ignored and durable wiki promotion remains explicit.
When this skill activates outside of an explicit wiki-related request:
HUB/_index.md or .wiki/_index.md exists_index.md to assess if the wiki might cover the user's question_index.md — do not read full articles unless the user asks. Skip archived sibling wikis by default; in deep mode, archived index matches may be reported separately.When giving any boot, resume, or "where you left off" briefing, start with the active wiki identity: <wiki-name> booted from <wiki-root-path>. Prefer the config.md title; for local .wiki/ projects, fall back to the parent directory name; for HUB/topics/<slug>/, fall back to the slug. Include this line even when there is nothing in flight to resume.
If the user asks whether they can trust a wiki artifact, requests an audit, mentions provenance or drift, or asks for content verification beyond a normal query, use the Audit workflow instead of treating it as plain Q&A.
See references/ingestion.md. Flow: Source (URL/file/text/tweet/inbox) → fetch/read → extract metadata → write to raw/{type}/ → update indexes → suggest compile if many uncompiled.
See references/ingestion.md § Collection Ingestion. Flow: structured upstream collection (Git repo, BIP-style proposal set, MediaWiki dump/API) → upstream item inventory → write a raw/repos/ manifest plus immutable child sources → rebuild raw indexes → optionally compile synthesized clusters. Use /wiki:ingest-collection for bulk imports; never recursively crawl HTML.
See references/inventory.md. Flow: Run an inventory fit check → track durable wiki-adjacent things (items, Ideas, ingest candidates, entities, corpora, questions, tasks, watch items) as markdown records under inventory/ → answer list requests from indexes/frontmatter as compact chat tables or bullets → optionally save derived views under inventory/views/ → optionally convert legacy queue-like outputs through explicit dry-run-first migration. Inventory migration is additive and human-gated. Be explicit when something is too small for inventory, too large and should be a dataset/collection, or outside wiki scope.
See references/ideas.md. Flow: capture in inventory/ideas/ → research/shape → require approval → freeze BRIEF.md and promote. The Idea keeps lineage; the Project owns delivery.
See references/inventory.md and references/research-infrastructure.md. Flow: Scope a bounded catalog request → infer scale and media policy → search for candidate artifacts, examples, resources, entities, tools, media, or memes → fetch only promising context pages → deduplicate aliases/reposts/rehosts → record found_in_context provenance and media metadata → save a type: collection output under output/collect-<slug>-YYYY-MM-DD.md → optionally create inventory records when the list is small and durable enough, or one corpus record when it is medium/large. Collect outputs are useful to the LLM as a staging layer before promotion into raw/, wiki/, inventory, or datasets; they do not replace raw sources for factual claims. Download and hash bounded public binary media into output/assets/collect-<slug>/ by default for media-bearing collections, never store binaries in raw/, and use defensive download settings: timeouts, file-size caps, content-type checks, and IPv4 retry (curl -4) when media hosts hang on IPv6. Do not pretend that "all" means exhaustive beyond the stated strategy and limit.
See references/datasets.md. Flow: Keep large or external datasets out of the wiki while indexing them through datasets/<slug>/MANIFEST.md → store locations, schema notes, small samples, profiles, and query recipes → answer list requests from datasets/_index.md plus manifest frontmatter only → optionally convert legacy dataset outputs through explicit dry-run-first migration. Dataset migration is additive and never copies the underlying data into the wiki.
See references/archive.md. Flow: Move whole topic wikis from HUB/topics/<slug>/ to HUB/topics/.archive/<slug>/ → mark wikis.json with status: archived → hide them from normal query/compile/research/collect/output/maintenance context → restore by moving the folder back and setting status: active. Do not archive individual raw sources or compiled articles in v1.
See references/compilation.md. Flow: Survey uncompiled sources → plan articles → classify (concept/topic/reference) → write/update articles with cross-references → update all indexes.
Flow: Read _index.md → identify relevant articles by summary/tag → read articles → follow See Also links → Grep for additional matches → synthesize answer with citations → note gaps → peek active sibling wikis. Supports --resume to reload context after a session break — reads session files, recent log entries, wiki stats, and last-updated articles to produce a "where you left off" briefing. Deep queries may peek archived sibling indexes in a separate Archived Matches section; full archived reads require explicit user intent.
See references/linting.md. Flow: Check structure → indexes → links → content → coverage → report → optionally auto-fix. Default lint keeps active material healthy and reports archived topics as skipped. Use --include-archived or --archived-only for explicit archived structural maintenance.
See references/librarian.md. Flow: Scan the active topic's compiled wiki/ layer → score staleness, quality, source-chain integrity, and link health → write .librarian/scan-results.json and .librarian/REPORT.md → recommend ranked next actions. Optional --passes conventions (or legacy schema) may write a proposal output for topic-guide improvements. Topic guides are default for new topic wikis; older wikis can adopt one with llm-wiki schema adopt or llm-wiki lint --fix. Librarian must not rewrite schema.md without explicit user acceptance. Librarian is the article-health advisor; it does not replace lint's structural checks or audit's broader trust review.
See references/audit.md. Flow: Run or reuse the librarian pass → inspect artifact dependency chains across output/, wiki/, and raw/ → escalate with fresh source checks and targeted research until trust verdicts converge → write .audit/REPORT.md.
Flow: Scan indexes for summary/tag matches → Grep full-text → rank results → present.
Inventory is first-class operational state, not a silo. Other workflows should notice it without treating it as factual evidence:
a source is too large/ambiguous, suggest an inventory record. When an inventory candidate is ingested, link the resulting raw or collection manifest from the record.
about next actions, priority, acceptance state, or why the corpus matters.
actions, but cite raw/wiki sources for factual claims.
records only for small durable lists; use one corpus record for medium/large, unstable, or media-heavy collections.
records for durable follow-ups, stale items, source queues, or watch lists, but show a sample before creating a larger backlog.
See references/sessions.md. Flow: Opt in with session enable → harness hooks append redacted events under HUB/.sessions/queue/ → session state and markdown digests update at tool-count, compaction, stop/session-end, or manual checkpoints → session rehydrate returns a compact context block → session promote explicitly copies the distilled digest into a topic raw/notes/ note. Automated capture is allowed; automated promotion is not.
See references/feedback.md. Flow: trusted user-prompt hooks or feedback capture classify high-signal user corrections, preferences, approvals, and plan-acceptance turns → append redacted candidates under HUB/.sessions/feedback/ → feedback list/show review them → feedback promote explicitly writes selected candidates into topic raw/notes/. Ignore generic acknowledgements unless manually captured.
Flow: Gather relevant articles → generate artifact (summary/report/slides/etc) → save to output/ → update indexes.
Flow: Scan session for error→fix patterns, corrections, discoveries → extract structured lessons → write to raw/notes/ with type: lessons-learned → optionally update relevant articles → optionally suggest CLAUDE.md rules.
Terminal links break when they wrap to a second line. Rules for all wiki operations:
~, HUB, and all relative segments. Relative paths are not clickable.[short text](url), never bare long URLs that wrap and break. Saved to: /Users/name/wiki/topics/my-topic/output/report-2026-04-08.md
See references/research-infrastructure.md § Agent Prompt Templates for examples. Applies to ingest, compile, collect, research, output, assess.
Every wiki operation appends to log.md in the wiki root. Format: ## [YYYY-MM-DD] operation | Description. See references/wiki-structure.md for full format. Never edit or delete existing log entries — append only.
Wiki articles include a confidence field in frontmatter: high, medium, or low.
When answering queries, note confidence levels. When linting, flag low confidence articles for review.
Track uncompiled sources by comparing raw/_index.md ingestion dates against the last compile date in _index.md. If 5+ uncompiled sources exist after an ingestion, suggest: "You have N uncompiled sources. Ask me to compile them."
Automatically run a quick structural check when any of these triggers occur:
_index.md)commands/wiki.md § "If no wiki exists".wikis.json, _index.md, log.md, topics/, and optional .sessions/. If raw/, wiki/, inventory/, datasets/, output/, inbox/, or config.md exist at the hub level → warn, do not delete. These may hold user data from an older wiki layout. Suggest running the lint --fix workflow, which will move contents to the appropriate topic wiki, repair archive registry drift, or quarantine to inbox/.unknown/ per C11/C12/C16/C17/C19 in references/linting.md.raw/, wiki/, inventory/, and datasets/ subdirectories against the rows in their _index.md. Ignore maintenance/report areas such as .librarian/ and .audit/. If mismatched → auto-fix by regenerating the affected directory index from frontmatter and removing dead entries..md files exist in wiki directories but are not listed in any _index.md. If found → add them to the index.raw/articles/, raw/papers/, wiki/concepts/, wiki/references/, output/, etc.). If missing → create them with empty _index.md. Treat inventory/ and datasets/ as lazy optional layers: repair their indexes if they already exist, but do not create completely absent optional trees unless the current inventory or dataset workflow needs them. For older compiled articles, lint --fix may infer category, summary, dates, and volatility from the file location and existing body/frontmatter, and may rewrite fuzzy raw-source refs to exact raw/...md paths when the match is unambiguous.HUB/topics/ are registered in wikis.json. Store hub-owned topic paths as portable relative paths (topics/<slug>), not /Users/<name>/... absolute paths. If a directory exists but isn't registered → add it. If a registered path is stale but HUB/topics/<name> exists → repair the path. If registered but no matching directory exists → remove the entry.Archived topic sub-wikis under HUB/topics/.archive/ should be registered with path: topics/.archive/<slug> and status: archived. Do not include them in active status/query/compile defaults.
log.md exists in the active wiki and at the hub. If missing → create it.Multiple OpenCode sessions can safely read and write to the same wiki simultaneously. No locks are needed.
See references/indexing.md for the Derived Index Protocol.
When a --min-time research or thesis session is active, the wiki root contains a .research-session.json or .thesis-session.json file.
Durable provenance should also live in the wiki root:
.session-events.jsonl — append-only event log for replayable history.session-checkpoint.json — latest compact summary for resume briefings and auditsThe session registry files are ephemeral crash-recovery state. The event log and checkpoint are the durable provenance trail.
Structural Guardian behavior:
status: "in_progress" and start_time > 7 days ago → warn: "Stale research session found. Resume or rerun the research workflow, or delete it manually.".session-events.jsonl and .session-checkpoint.json should normally be preserved after completion so /wiki:audit can classify provenance as replayable instead of partialAutomated Codex/Claude/OpenCode/Gemini session capture uses HUB/.sessions/ (or .wiki/.sessions/ for local wikis). This is a hidden operational layer for redacted hook events, state JSON, derived indexes, and markdown session digests. It is not topic evidence until explicitly promoted.
See references/sessions.md for the storage layout, config modes, hook adapter contract, rehydration behavior, and promotion rules.
Other measured skills in the registry, with their headline benchmark lift.