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/
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file wikifier-4.6.12.tar.gz.
File metadata
- Download URL: wikifier-4.6.12.tar.gz
- Upload date:
- Size: 389.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bc928a260a216d8a6b40b1cdc982e4219bb1514ffc234d7b1b78b658ba87be0a
|
|
| MD5 |
3b3bd6c4148d5910b77c54261d314ab1
|
|
| BLAKE2b-256 |
3b4ff16a308c8e388979633c93dd15f779452a2f86d4e899681e3394ad8c51e9
|
Provenance
The following attestation bundles were made for wikifier-4.6.12.tar.gz:
Publisher:
publish.yml on IronAdamant/wikifier
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wikifier-4.6.12.tar.gz -
Subject digest:
bc928a260a216d8a6b40b1cdc982e4219bb1514ffc234d7b1b78b658ba87be0a - Sigstore transparency entry: 2449020244
- Sigstore integration time:
-
Permalink:
IronAdamant/wikifier@80c5ac7b7557f8e63d8bf6d2f16f54cfc93d91b2 -
Branch / Tag:
refs/tags/v4.6.12 - Owner: https://github.com/IronAdamant
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@80c5ac7b7557f8e63d8bf6d2f16f54cfc93d91b2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file wikifier-4.6.12-py3-none-any.whl.
File metadata
- Download URL: wikifier-4.6.12-py3-none-any.whl
- Upload date:
- Size: 350.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
93c9ef3d29305ad08a97dd4abec40e421d02776d609b53666094ccf77f6e05f9
|
|
| MD5 |
e5b061c0831cf34d8033bdf7edd0bd63
|
|
| BLAKE2b-256 |
87feb8895bbfeff4ae6c58abe6b99b8834bf002dfdffb7249ff0a0161bf81309
|
Provenance
The following attestation bundles were made for wikifier-4.6.12-py3-none-any.whl:
Publisher:
publish.yml on IronAdamant/wikifier
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wikifier-4.6.12-py3-none-any.whl -
Subject digest:
93c9ef3d29305ad08a97dd4abec40e421d02776d609b53666094ccf77f6e05f9 - Sigstore transparency entry: 2449020282
- Sigstore integration time:
-
Permalink:
IronAdamant/wikifier@80c5ac7b7557f8e63d8bf6d2f16f54cfc93d91b2 -
Branch / Tag:
refs/tags/v4.6.12 - Owner: https://github.com/IronAdamant
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@80c5ac7b7557f8e63d8bf6d2f16f54cfc93d91b2 -
Trigger Event:
push
-
Statement type: