Install
openclaw skills install @dexio/dexio-wiki-lintCheck an LLM wiki's health and fix what it finds: broken links, leaked credentials, orphaned and unreferenced pages, missing frontmatter or descriptions, stale pages, oversized pages and duplicate titles. Ships a zero-dependency Python checker for markdown folders ([[wikilinks]] and relative links, Obsidian-compatible). Use on a schedule, before committing or merging wiki changes, after a refactor, or when an agent reports it cannot find a page.
openclaw skills install @dexio/dexio-wiki-lintA wiki kept by agents decays in predictable ways: links point at pages that were renamed or never written, new pages nobody links to, summaries that fall behind the pages they summarize, and pages that grow until nobody reads them. Linting finds these mechanically so the fixing can be deliberate.
Two findings are defects: a broken link and a credential-shaped string. Everything else in the report is information that needs a judgment call, not an automatic fix.
Markdown folder (Obsidian vault, git repo, any directory of .md files):
python3 scripts/wiki_lint.py path/to/wiki # readable report
python3 scripts/wiki_lint.py path/to/wiki --json # for you to parse
scripts/ is inside this skill's folder. Python 3.8 or later, no packages. Options:
--stale-days 90, --max-lines 200, --strict (also fail on frontmatter problems),
--today 2026-09-28 (measure ages from that date instead of the system clock).
Hosted wiki over MCP: call the host's health tool instead (on Dexio, wiki_health). It
reports the same categories.
Exit status 1 means at least one broken link or possible secret, so the same command works as a pre-commit hook or a CI step.
.env"), and tell a person: the value is still in history, so the credential has to be
rotated. A placeholder or an example key the checker flags can be reworded so it no longer
looks like one.wanted, ranked by how many pages link to it. A
target wanted by three or more pages usually deserves a real page; write it with
wiki-record.description (one line saying what the page answers or
holds, not the question that started it), title, or a valid updated date. The
description is what makes the catalog useful, so write it for someone deciding whether to
open the page.wiki-refactor). If it is a passing mention, fold its content
into the page that covers the topic and archive it.updated and say in the change note that you rechecked it. If not, fix it or
record the conflict (wiki-conflicts). A page past its own stale_after date must be
rechecked before anyone relies on it.wiki-refactor). Long pages are where
contradictions hide, because nobody rereads the whole thing before appending.wiki-refactor), or retitle one so each title says what is different.Then run the check again and confirm zero broken links and zero secrets before you finish.
python3 scripts/wiki_lint.py path/to/wiki --catalog # every page and its description
python3 scripts/wiki_lint.py path/to/wiki --links-to concepts/llm-wiki # before a rename
python3 scripts/wiki_lint.py path/to/wiki --verify-queue 10 # what to fact-check next
--catalog prints the catalog from page descriptions, grouped by folder. Generate it when
you need an index instead of keeping index.md by hand, which drifts out of sync and is the
file every parallel writer collides on. --verify-queue ranks pages for wiki-verify.
Pre-commit hook in a git-backed wiki (.git/hooks/pre-commit, made executable):
#!/bin/sh
python3 path/to/wiki_lint.py . >/dev/null || { python3 path/to/wiki_lint.py .; exit 1; }
GitHub Actions:
- uses: actions/checkout@v4
- run: python3 skills/wiki-lint/scripts/wiki_lint.py wiki
A scheduled agent run is better than either for the judgment calls: run the check weekly, fix broken links and frontmatter, and report orphans, stale pages and long pages to a person rather than deleting anything.
updated on a stale page without rereading it. That turns a warning into a
false claim that the page was checked.