wiki-lint
Skill4 starsChanged 5 months agoMITView on GitHub
Use to validate the knowledge wiki — frontmatter completeness, broken wikilinks, orphaned pages, status consistency. Wraps `scripts/lint-wiki.py` from the research project template. Required before drafting and before finishing.
42 other projects use a version of this.
Adopted by
Most recently taken up by
- Ar9av/obsidian-wikitheir own version, first seen Nov 8, 2026
- ggoosen/Digital-Workforcetheir own version, first seen Nov 8, 2026
- barakgut/llm-wikitheir own version, first seen Nov 1, 2026
- chobizzy/llm-wikitheir own version, first seen Nov 1, 2026
- wareagledusty/wiki-federation-starter-kittheir own version, first seen Nov 1, 2026
- ProduktEntdecker/enterprise-memory-startertheir own version, first seen Nov 1, 2026
Used with
Projects with it also use wiki-capture, wiki-status and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
jehrhardtSkillwiki-capture
Quickly capture raw thoughts, links, images, or notes to today's Obsidian daily note from anywhere in Pi. Use when the user wants to jot something down for later wiki processing.
Also in 6 projects that use this
nexuschainsSkillwiki-status
Reports the current state of the wiki vault — page counts, category breakdown, hub pages, orphans, stale entries, and a delta showing what has changed since the last ingest. Use this skill when the operator asks "what's the status", "wiki dashboard", "how many pages", "what's stale", "what's been ingested", "show me the delta", or "wiki health overview". Also surfaces structural insights (top hubs, fragmented clusters, bridge pages) when the operator asks "wiki insights", "what's central", or "show me the hubs". Read-only: this skill reports and recommends; it does not modify any files.
Also in 5 projects that use this
nexuschainsSkillcross-linker
Scans the wiki vault and adds missing [[wikilinks]] between pages that are related but not yet connected. Use this skill when the operator says "link my pages", "find missing links", "cross-reference the wiki", "connect my wiki", "add wikilinks", or after any large ingest to weave new pages into the existing knowledge graph. Also trigger when orphaned pages need connecting or when wiki-lint reports fragmented tag clusters. This is a write-heavy skill — it modifies page files to insert links, unlike wiki-lint which only reports.
Also in 4 projects that use this
Ivy-Chen1999Skillwiki-synthesize
Systematically discover synthesis opportunities across the Obsidian wiki — pairs or clusters of concepts that co-occur frequently across pages but have no synthesis page connecting them. Creates new synthesis/ pages that draw explicit cross-cutting conclusions. Use when the user says "synthesize my wiki", "find connections", "what concepts keep coming up together", "/wiki-synthesize", or after a large ingest when the vault has grown significantly.
Also in 4 projects that use this
Ivy-Chen1999Skillwiki-setup
Initialize a new Obsidian wiki vault with the correct structure, special files, and configuration. Use this skill when the user wants to set up a new wiki from scratch, initialize the vault structure, create the .env file, or says things like "set up my wiki", "initialize obsidian", "create a new vault", "get started with the wiki". Also use when the user needs to reconfigure their existing vault or fix a broken setup.
Also in 5 projects that use this
bozhouDevSkillwiki-init
Use when bootstrapping a new personal wiki for any knowledge domain — research, codebase documentation, reading notes, competitive analysis, or any long-term knowledge accumulation project.
Also in 7 projects that use this
- +1 more from nexuschains
- +4 more from Ivy-Chen1999
Other versions42 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 42
- AgriciDaniel/claude-obsidian★ 16ksame name
- Ar9av/obsidian-wiki★ 3.7ksame name
- kfchou/wiki-skills★ 189same name
- IssacW228/student-llm-wiki★ 173same name
- vanillaflava/llm-wiki-skills★ 65same name
- cookyman74/llmwiki-harness★ 34same name
- Ivy-Chen1999/llm-wiki-kit★ 21same name
- schub-tech/llm-ideation-wiki★ 11same name
- CarbeneAI/Forge★ 9same name
- CodePhobiia/claude-roblox-game-studio★ 9same name
32 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository16 other files it gives its agents.
- acquire-sourcesSkill
- add-to-librarySkill
- brainstorming-researchSkill
- drafting-manuscriptSkill
- drift-reportSkill
- executing-research-planSkill
- finishing-a-research-projectSkill
- grant-finderSkill
- ingest-sourceSkill
- literature-reviewSkill
- requesting-peer-reviewSkill
- scaffold-research-projectSkill
- semantic-wiki-reviewSkill
- using-research-powersSkill
- wiki-graphSkill
- writing-research-planSkill
The file
We split this skill into the rules it gives an agent
12 rules. 0 are common, 2 are distinctive, and 10 are very specific to this project.
0
Common
Most of the 33 edited versions we read keep these.
2
Distinctive
This author's own choices. Worth a look.
10
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- could be automatic: a setting could enforce it
- Very specific: line 19
Run the wiki linter and act on its findings.
- Very specific: line 24
Before transitioning to drafting-manuscript or finishing-a-research-project: (1) scripts/lint-wiki.py exits 0
- Very specific: line 27
If not met: tell the user which classes of issues remain (errors / warnings / orphans), ask for a short reason to proceed anyway (e.g.
- Very specific: line 36
Before drafting-manuscript (soft gate)
- Very specific: line 38
After ingest-source batch runs (≥ 3 new sources)
- Distinctive: line 39
When user says "clean up the wiki", "lint", "check the wiki"
- Very specific: line 73
Read schema/knowledge-frontmatter.schema.json from the project root.
- Very specific: line 81
if type: source, then bibkey is present
- Very specific: line 82
if wikidata_qid is present, it matches ^Q\d+$
- Very specific: line 95
If those checks are needed and Python isn't an option, dispatch the wiki-linter subagent (agents/wiki-linter.md) — it has a fresh context …
- Distinctive: line 138
No duplicate page titles within a section
- Very specific: line 144
every source page's bibkey has a PDF at <library>/pdf/<bibkey>.pdf
“Common” is measured: kept by at least 6 in 10 of the 33 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Wiki Lint
Run the wiki linter and act on its findings. Mandatory gate before drafting-manuscript and finishing-a-research-project; useful after bulk ingest or whenever the wiki has grown.
Announce at start: "Using wiki-lint to validate the knowledge tree."
<SOFT-GATE>
Before transitioning to `drafting-manuscript` or `finishing-a-research-project`:
(1) `scripts/lint-wiki.py` exits 0If not met: tell the user which classes of issues remain (errors / warnings /
orphans), ask for a short reason to proceed anyway (e.g. "orphan is intentional
— it's the index page"), and write the reason into
knowledge/_meta/gate-overrides.log. Errors should as a rule be fixed rather
than overridden — the override is an audit trail, not a substitute.
</SOFT-GATE>
When to use
- Before
drafting-manuscript(soft gate) - Before
finishing-a-research-project(soft gate) - After
ingest-sourcebatch runs (≥ 3 new sources) - When user says "clean up the wiki", "lint", "check the wiki"
- Periodically when the project is long-running
Checklist
- Locate the lint script —
scripts/lint-wiki.pyin the project root (from template) - Run it —
python scripts/lint-wiki.py. If Python or PyYAML or the script itself is missing, take the Python-free fallback path below. - Parse output into categories: errors, warnings, orphans
- Fix errors inline (missing frontmatter fields, broken wikilinks, invalid
typevalues) - Assess warnings — stale pages, status inconsistency, empty sections — decide with user: fix / defer / ignore
- Review the open review flags — the
=== Review flags ===section lists openreview_flags(content findings fromsemantic-wiki-review). These do not fail the exit code, but they gate drafting (seedrafting-manuscript): decide with the user per flag — fix the underlying issue and setstate: resolved, or leave it open and let drafting log an override. Do not clear a flag by deleting it. - Check authority-ID coverage — the
=== Authority-ID coverage (entities) ===section reports how many entities carry agnd_id/idai_gazetteer_id/wikidata_qidand lists the untagged (--verbose). Advisory only. For persons and places, resolve and add the ID (viadao-paper-searchresolve_author/resolve_site) — it is the join key for cross-project linkage (wiki-global-graph.py overlap); datasets / methods / software may legitimately have none. Work the untagged list rather than letting it accumulate. - Handle orphans — pages with no incoming wikilinks: decide link-in, delete, or mark as root
- Re-run lint until exit 0 on errors
- Log the run in
knowledge/_meta/log.mdwith summary (N errors fixed, N warnings deferred, N open flags) - Dispatch
wiki-lintersubagent (optional) for large wikis — seeagents/wiki-linter.md
See also: scripts/wiki-to-graph.py is the sibling tool for structure analysis (not validation) — it exports the wiki as a graph (graph.json / graph.graphml) and reports god_nodes (most-connected pages) and bridges (entities joining otherwise-unconnected sources). Useful after a lint pass to spot hubs and weak links; it reads the same relations frontmatter the linter validates.
Python-free fallback
For users on Cowork or any environment without a shell — or any project where python3 / pyyaml / scripts/lint-wiki.py are simply not available — the skill performs frontmatter validation inline.
Trigger the fallback automatically when:
scripts/lint-wiki.pydoes not exist in the project, OR- the Bash tool is not available, OR
- running the script returns a "command not found" error for
python3orpython, OR - the user explicitly says "lint without Python" or "use the inline check"
Tell the user upfront:
"Running wiki-lint in fallback mode (no Python). This checks frontmatter but skips wikilink resolution and orphan detection — those would cost too many tokens on a full wiki scan. For a complete check, install Python+PyYAML and use the
scripts/lint-wiki.pyscript. Recommended for projects above ~20 pages."
Fallback procedure:
- Read
schema/knowledge-frontmatter.schema.jsonfrom the project root. If absent, read the plugin's copy (the plugin ships one). - List every
knowledge/**/*.mdfile (excluding files prefixed_example-). - For each file: parse the YAML frontmatter (the block between the first two
---lines) and validate against:requiredfields exist and are non-emptytypeis one ofentity | concept | source | synthesisstatusis one ofdraft | review | stableauthoris one ofhuman | llm | mixedcreatedandupdatedmatch the ISO date pattern^\d{4}-\d{2}-\d{2}$- if
type: source, thenbibkeyis present - if
wikidata_qidis present, it matches^Q\d+$ - if
idai_gazetteer_idis present, it matches^\d+$
- Report any failures in the same format as the Python script:
MISSING: <path> — required field '<field>' is missing/INVALID: <path> — <field>='<value>' (allowed: …). - Print a status summary: total pages, draft/review/stable distribution.
- Surface open
review_flags— these live in frontmatter, so the fallback can list them cheaply (page,kind,detail). Report count + list, exactly as the script's=== Review flags ===section does; they are advisory (gate drafting, not this check). - Explicitly skip wikilink resolution and orphan detection. State this in the output so the user knows what's not covered.
What the fallback does NOT do:
- Broken-wikilink detection (would need to read every page's body, then cross-reference — O(N²) in tokens).
- Orphan-page detection (same reason).
- Gate-override-rate reporting (the override log lives in the project; the fallback could read it but the Python script's output format is more concise).
If those checks are needed and Python isn't an option, dispatch the wiki-linter subagent (agents/wiki-linter.md) — it has a fresh context budget and can afford the full scan once per session.
Process Flow
digraph lint {
"Locate lint script" [shape=box];
"Run lint-wiki.py" [shape=box];
"Parse output" [shape=box];
"Errors present?" [shape=diamond];
"Fix errors inline" [shape=box];
"Warnings: fix / defer / ignore" [shape=box];
"Orphans: link / delete / mark root" [shape=box];
"Re-run lint" [shape=box];
"Exit 0 on errors?" [shape=diamond];
"Log run summary" [shape=box];
"Done" [shape=doublecircle];
"Locate lint script" -> "Run lint-wiki.py";
"Run lint-wiki.py" -> "Parse output";
"Parse output" -> "Errors present?";
"Errors present?" -> "Fix errors inline" [label="yes"];
"Errors present?" -> "Warnings: fix / defer / ignore" [label="no"];
"Fix errors inline" -> "Warnings: fix / defer / ignore";
"Warnings: fix / defer / ignore" -> "Orphans: link / delete / mark root";
"Orphans: link / delete / mark root" -> "Re-run lint";
"Re-run lint" -> "Exit 0 on errors?";
"Exit 0 on errors?" -> "Fix errors inline" [label="no"];
"Exit 0 on errors?" -> "Log run summary" [label="yes"];
"Log run summary" -> "Done";
}What lint-wiki.py Checks
(per the template's scripts/lint-wiki.py)
- Frontmatter present + required fields (
title,type,created,updated,status,author) type∈ {entity, concept, source, synthesis}status∈ {draft, review, stable}author∈ {human, llm, mixed}- Dates are ISO (
YYYY-MM-DD) - Wikilinks
[[...]]resolve to existing files - No duplicate page titles within a section
- Orphan detection (pages with zero incoming wikilinks)
- Structured
relationsblocks resolve + the inference-rate (share ofinferred/ambiguousedges) - Open
review_flags(content findings fromsemantic-wiki-review) — surfaced only: advisory, they gatedrafting-manuscript, not the lint exit code - Citekeys and bibliography — every citekey matches the
surname-year-shorttitleconvention (it is a cross-project join key); no key defined twice; everybibkey:and every@citationresolves to a real entry; everybibliography:path a manuscript declares exists (Quarto renders a dead bibliography as???and still exits 0) - The shared library, both directions — advisory, and skipped when no library is configured (CI has none):
- every source page's
bibkeyhas a PDF at<library>/pdf/<bibkey>.pdf - every acquired PDF has a source page — "acquired but NOT ingested". A source that was searched for, downloaded and then forgotten is invisible to every other check: the wiki looks healthy, and drafting has nothing to reach back into. Across 17 live wikis this was true of 146 sources; one project had 48 of its 55 PDFs never ingested. The fix is
ingest-source— the PDFs are already there.
- every source page's
Common Fixes
| Error | Fix |
missing frontmatter field: status | Add status: draft (or proper value) |
broken wikilink: [[finkelstein-2003]] | Either create knowledge/sources/finkelstein-2003.md via ingest-source, or correct the slug |
invalid type: Person | Change to entity (types are: entity, concept, source, synthesis) |
created is not ISO date | Reformat to YYYY-MM-DD |
orphan: knowledge/entities/foo.md | Add an incoming link from a relevant source/synthesis page |
Red Flags
| Thought | Reality |
| "Lint is bureaucracy, skip it" | SOFT-GATE before drafting and finishing. The override gets logged. |
| "I'd notice broken wikilinks while reading" | No — when rendered they vanish silently. They're only visible to the linter. |
| "Orphans are fine, just internal notes" | Orphan means unreachable. Link them in or delete them. |
| "I can ignore all warnings" | Every warning needs a decision, not silence. |
Key Principles
- Fail loud, fix fast — errors block, warnings demand a decision
- One lint run = one log entry — traceability
- Orphans are a smell — often a sign of missing synthesis
- Lint BEFORE draft — never after the fact
- Subagent for bulk fixes — don't burn the main context on large wikis
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
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.

