Wikifier
A zero-dependency codebase wiki for AI agents — token-efficient maps so LLMs look things up instead of re-reading full sources.
Wikifier is an agent-to-agent tool: it builds a living map of a project (health matrix, dependency graph, short file summaries) and agents keep that map current as they work. Humans can peek via a small dashboard; the product is the agent loop, not a general docs site or IDE.
Works from small scripts to large monorepos. Deep import/include maps (zero-dep regex parsers):
| Language | Extensions | Notes |
|---|---|---|
| Python | .py |
full ACS/CDIA path |
| JavaScript / TypeScript | .js .ts .jsx .tsx |
barrels (BREE), dynamic/CDIA |
| Rust | .rs |
use / mod / extern crate |
| Go | .go |
import / import blocks |
| C / C++ | .c .h .cpp .cc .cxx .hpp .hh |
#include (local + system) |
| C# | .cs |
using namespaces |
| Java | .java |
import / import static |
Health/journal still work for any monitored path. Parsers are pragmatic regex (not full cargo/go.mod/classpath/-I resolution). On huge monorepos, split scope deliberately:
| File | Surface |
|---|---|
map_paths.txt |
Package roots for import maps (update-maps walk). Prefer package dirs (src/, packages/foo/) — not a wiki-only file list. |
monitored_paths.txt |
Wiki / health watch list (can be individual .md files). Does not define the map. |
Or pass --directory=pkg/ / --max-files=N per run. Raise dirty cap with WIKIFIER_CHECK_CHANGES_MAX (default 2000) only when needed. Never set project_root to a multi-repo parent of clones.
Why
Context windows are finite. Re-reading a large file to answer “what is this and who depends on it?” wastes tokens.
| Artifact | Role |
|---|---|
file_health.md |
🟢 / 🟡 / 🔴 matrix — what to trust, what to fix first |
library.md |
File tree, Mermaid dependency map, import tables, cycles + confidence |
*.wiki.md |
Short per-file “what this is for” notes (agent-maintained prose) |
journal/ + pending_updates.md |
Semantic why trail + work queue (audit, not a full issue tracker) |
Map first, wiki depth second: update-maps builds the structural map automatically. Rich per-file wiki text is filled by agents as they work — not a free full-repo “understand everything” pass on init.
First run (bootstrap the map)
pip install wikifier # pure Python stdlib core — no runtime deps
pip install wikifier[mcp] # optional Model Context Protocol (MCP) server
cd /path/to/your/project
wikifier init # seeds index.html + lean path-list templates
# Edit monitored_paths.txt + map_paths.txt to package roots (not bare ".") on real trees
wikifier update-maps # full structural map → library.md + import cache
wikifier health --summary # matrix counts
wikifier suggest-next # or MCP suggest_next_actions — 🔴/🟡 only
Always set an explicit root for external trees: WIKIFIER_PROJECT_ROOT=/abs/path wikifier …
MCP session_bootstrap → readiness: blocked? That means lean scope and/or the map are missing (often bare . monitor + never ran update-maps) — not a broken install. Fix: write lean monitored_paths.txt / map_paths.txt, then update-maps. Agent contract: skills/run.md § Readiness blocked; dogfood: Findings/readiness-blocked-bare-monitor-2026-07.md.
Steady state (only touch what needs it)
Full protocol: skills/run.md (Agent Protocol v0.6 — package 4.6.x).
wikifier session-bootstrap # one-shot: root, health, attention, actions[]
wikifier check-changes # content-honest dirty; red ghosts (missing paths)
# prioritize 🔴 then *actionable* 🟡 — do NOT re-wiki 🟢 Green files
wikifier prepare-edit path/file.py # wiki + status + deps/dependents preflight
# ... edit only those sources ...
wikifier record-change "path/file.py" "why this changed" # required
# ... refresh that file’s wiki summary only ...
wikifier mark-green "path/file.py"
wikifier update-maps # only if imports/structure changed (warm 0-dirty is cheap)
# removals:
wikifier record-deletion "path/gone.py" "why removed"
Core 6 (prefer every session — MCP or library/CLI):
session_bootstrap → check_changes → prepare_edit → suggest_next_actions (json actions[]) → record_change → mark_green.
Advanced intel as needed: get_dependencies, get_dependents, get_cycles, barrels/diagnostics. Always pass project_root= / WIKIFIER_PROJECT_ROOT for external trees. Never point project_root at a multi-repo parent folder (e.g. a directory of clones).
What you get
- Import analysis — Python, JS/TS (ESM/CJS, barrels), Rust (
use/mod+ best-effortcrate::paths), Go, C/C++ includes, C# usings; per-edge confidence; barrel expansion for TS/JS - Incremental pipeline — pure-Python
update-maps: dirty parse → import cache → reverse deps → cycles →library.md - Warm agent maps (4.6.3–4.6.7) — zero-dirty + index-first candidates (re-list only when fingerprint / map-scoped index / live count disagree); MapScope keeps collect, live count, index filter, and prune aligned; stdlib SQLite; content-hash dirty
- Two path lists —
map_paths.txt= map package roots;monitored_paths.txt= wiki/health watch (independent — wiki file lists never collapse the map) - Partial-map honesty —
map_coverageonupdate_maps/ bootstrap /suggest_next;update_maps_until_completewhen incomplete - Cache ops —
wikifier cache-status; JSON dual-write deprecated default-off (WIKIFIER_CACHE_JSON=1opt-in); dual-read for migrate - Selective agent work — health + suggest bias to 🔴/actionable 🟡 only; ACS v1.3
reason_code/agent_signal; preferactionable_low_conf_edges+ reason codes — never rawlow_conf_edgesaverages alone - Scale — reverse index + barrel invalidation so one edit doesn’t re-scan the monorepo
- MCP tools — optional server for Claude, Cursor, Cline, and other MCP clients
- Zero core dependencies — stdlib only; forks can add their own stack on top
- Agent navigability — short AGENT MAP docstrings on core modules; self-tests under
tests/(not buried in parsers)
Performance (measured)
Full / heavy runs (historical order-of-magnitude):
| Project | Scale | Full / heavy update-maps |
|---|---|---|
| llama_index | ~3.8k Python files | ~8.5s class full |
| Babylon.js | ~3.9k TS files, barrel-heavy | minutes full; scoped re-runs tens of seconds |
| Large trees (e.g. LLVM-scale) | tens of thousands of files | map_paths / --directory / --max-files — never unscoped one-shot |
Warm 0-dirty re-runs after 4.6.7 (same machine class; scoped; candidates reused — agent session path):
| Project | Scope | Warm update-maps |
n |
|---|---|---|---|
| Wikifier (self) | map_paths: wikifier/ + tests/ |
~30 ms | 50 |
| llama_index | llama-index-core |
~76 ms | 724 |
| rust | library/std |
~79 ms | 719 |
| airflow | airflow-core |
~180 ms | 1920 |
| Babylon.js | packages |
~400 ms | 3895 |
Residual floor on large scopes is mtime/stat + live count under MapScope (not full JSON re-walk). Sub-100ms is not a hard SLA on every 1k+ tree.
Tests: python -m unittest discover tests (stdlib only; 125 cases including MapScope / index-first / dual-write).
Commands
| Command | Purpose |
|---|---|
wikifier init [--target DIR] |
Bootstrap project + human index.html |
wikifier session-bootstrap |
Session start: health, attention, dispatchable actions[] |
wikifier check-changes |
Content-honest scan → health / pending |
wikifier prepare-edit <file> |
Preflight: status, wiki snippet, deps, dependents |
wikifier record-change <file> "reason" |
Log why (required after edits) |
wikifier mark-green <file> |
Mark wiki current + source content-hash baseline |
wikifier record-deletion <file> "reason" |
Mark removed paths 🔴 + prune barrel refs |
wikifier suggest-next |
Next actions (🔴/actionable 🟡 only; --json for actions[]) |
wikifier update-maps [--directory=src/] [--max-files=N] |
Rebuild graph + library.md (warm 0-dirty is fast; honors map_paths.txt) |
wikifier cache-status |
SQLite/JSON backend, dual-write policy, coverage snapshot (no full pair load) |
wikifier health [--summary|--json] |
Health matrix (machine-friendly flags) |
wikifier validate |
Missing wiki rows + ghost paths |
wikifier cycles |
Circular deps + break hints |
wikifier monitor / daemon |
Background maintenance (WIKIFIER_DAEMON_MAPS=0 for check-only) |
wikifier serve |
Localhost dashboard with Run/Stop |
Library: from wikifier import session_bootstrap, prepare_edit, check_changes, record_change, mark_green, suggest_next_actions, update_maps, health, list_core_tools.
MCP
WIKIFIER_PROJECT_ROOT=/abs/path/to/project wikifier-mcp
# or: python3 -m wikifier.mcp.server
Setup and tool list: wikifier/mcp/README.md.
Human dashboard (secondary)

wikifier init drops a single index.html. Prefer wikifier serve (e.g. http://localhost:8787/index.html) — file:// can’t load project files. The markdown artifacts and CLI/MCP tools stay the source of truth; the UI is a read-only window.
Scope
In: agent-maintained codebase wiki, dependency intelligence, token-saving lookup for LLMs and coding agents.
Out: general human documentation systems, IDE plugins, “docs for everyone” product growth.
Agent navigability: Prefer protocol (skills/run.md) + MCP Core 6 over reading 20k LOC of parsers/cache. Production modules carry a short AGENT MAP docstring; self-tests live under tests/ and tests/selftest/, not inline at the bottom of parsers.
Links
- PyPI · GitHub
- Agent protocol:
skills/run.md - Changelog:
CHANGELOG.md - Dogfood notes:
Findings/
No comments yet
Be the first to share your take.