Was ist Handbooks?
Eine Codebasis rein, zwei Handbücher raus — eine erzählte Doku-Site für dein Team und ein Orts-Index, mit dem dein Coding-Agent navigiert. Aus derselben geparsten Karte, immer aktuell zum Code.
Eine Codebasis rein. Zwei Handbücher raus.
Handbooks schreibt dieselbe Karte deines Codes zweimal auf, denn es hat zwei sehr unterschiedliche Leser:
📖 Das Handbuch für Menschen
Eine erzählte, etappenweise Doku-Site — Suche, Theme, Deep-Links — aus deinem Code generiert, direkt per file:// zu öffnen. Dieses liest du.
🤖 Das Handbuch für die KI
Ein maschinengerechter Orts-Index: Datei→Etappe-Routing-Tabellen, Aufruf-Fakten je Funktion, llms.txt und ein installierbares SKILL-Paket. Dieses liest dein Coding-Agent.
Darunter liegen dieselben Fakten — ein vom Parser gebauter Aufrufgraph — die beiden können sich also nie widersprechen. Eines ist auf Erzählung und Navigation optimiert, das andere auf Routing und Veraltungs-Erkennung.
Das Problem, klar benannt
Da ist ein Repository. Es ist zu groß, um es im Kopf zu behalten, und zu groß für ein Kontextfenster.
Wer einen Coding-Agenten bittet, „fehlgeschlagene Uploads dreimal zu wiederholen“, bekommt selbstbewusst die eine gefundene Upload-Funktion gepatcht — und verpasst die Konstante mit der Retry-Policy, die gespiegelte Implementierung im Batch-Worker, die Metrik, die die Versuche zählt, und den Test, der das alte Verhalten festschreibt.
Das ist kein Denkfehler. Es ist ein Routing-Fehler. Der Agent hat nie eine Karte gesehen.
Die Ein-Satz-Version
Handbooks liest den Code mit einem echten Parser, baut daraus eine Karte, übergibt diese Karte dem Agenten als Ortsindex — nicht als Zusammenfassung — und hält die Karte aktuell, während sich der Code weiterbewegt.
Erst ausprobieren, dann weiterlesen
Alles Weitere ist bedeutungslos, wenn es nicht läuft. Das hier dauert etwa dreißig Sekunden, verbraucht null Tokens und braucht keinen API-Schlüssel:
git clone <this repo> && cd handbooks
pnpm install && pnpm build
pnpm demopnpm demo lässt die gesamte Toolchain gegen ein mitgeliefertes Beispielprojekt laufen,
mit einem mitgelieferten Mock-LLM-Server. Am Ende liegen ein gerendertes Handbuch, eine
HTML-Site, ein Agenten-Locator-Index und ein validiertes SKILL-Paket auf der Platte.
Die drei Ideen dahinter
1. Fakten kommen aus einem Parser, nicht aus einem Modell
Handbooks parst jede Quelldatei mit tree-sitter und
baut einen typisierten Aufrufgraphen: Funktionen, Methoden, über
self/Attribute/Parameter/Imports aufgelöste Aufrufkanten, Aufrufe, die den eigenen Code
verlassen, und Aufrufe, die nicht aufgelöst werden konnten — in eine eigene Datei in
Quarantäne gestellt, niemals geraten.
Dateien, die es gar nicht lesen oder parsen konnte, landen genauso in Quarantäne — eine Lücke, die sich aufzählen lässt, statt einer, die stillschweigend verschwindet.
Diese Schicht berührt nie ein LLM. Zweimal ausführen, zweimal denselben Graphen bekommen.
2. Prosa liegt über den Fakten — und ist als solche gekennzeichnet
Ein LLM schreibt den menschenlesbaren Teil: wozu eine Datei da ist, wie ein Subsystem zusammenhängt, welcher Zustand über welche Etappen fließt. Die Prosa ist immer im Graphen verankert, und wo sie scheitert, wird die Struktur trotzdem ausgeliefert — mit leerer Beschreibung.
Ein fehlender Satz ist besser als ein erfundener.
3. Die Karte ist zum Routen gebaut, nicht zum Lesen
Die Ausgabe ist keine Zusammenfassung des Codes. Sie ist ein Index, der die Frage beantwortet: „Welche Dateien, Funktionen und Zustände muss diese Änderung anfassen?“ — einschließlich der verstreuten, nicht offensichtlichen. Der Planner nutzt anschließend diesen Index, liest an jeder gefundenen Adresse den echten Quelltext und erzeugt einen Änderungsplan, der byte-genau genug ist, um mechanisch angewendet zu werden.
Was ein Lauf liefert
| Ausgabe | Für wen |
|---|---|
| Markdown-Handbuch — Überblick, Etappenindex, eine Seite pro Etappe, Zustandsregister-Tabelle | Menschen |
Mehrseitige HTML-Site — Sticky-Inhaltsverzeichnis, Breadcrumbs, Theme-Umschalter, funktioniert über file:// | Menschen |
| Eine eigenständige HTML-Seite, die sich per E-Mail verschicken lässt | Menschen |
Agenten-Index — Symbol → path:line-line, Datei- und Aufruftabellen, grep-Rezepte | Agenten |
llms.txt + llms-full.txt | Agenten |
| Ein SKILL-Paket mit einem Content-Hash pro Datei, damit Drift erkennbar ist | Agenten |
Für wen das ist
| Wer… | Bekommt… |
|---|---|
| Gerade einen Service mit 200k Zeilen geerbt | Einen Etappe-für-Etappe-Rundgang, der sich tatsächlich lesen lässt, plus eine HTML-Site zum Teilen |
| Betreibt einen Coding-Agenten auf einem großen Repo | Ein SKILL-Paket, das den Agenten davon abhält zu raten, wo die Dinge liegen |
| Teamlead beim Onboarding | Dokumentation, die sich neu generiert, statt zu verrotten |
| Pflegt ein polyglottes Monorepo | Einen Durchlauf über 18 Sprachen, mit pro Sprache offengelegter Analysetreue |
Was es kostet
- Node.js ≥ 20.11 und pnpm. Das ist die ganze Installation. Keine native Kompilierung,
kein Python, kein
node-gyp— die Parser sind WebAssembly. - Ein OpenAI-kompatibler Endpunkt für die LLM-Phasen. Gehostetes OpenAI, Azure, vLLM,
Ollama, LiteLLM, ein interner Proxy — alles, was
/v1/chat/completionsspricht. Auch ein Modell auf der eigenen Maschine. - Gar nichts für
handbook analyze— der Befehl, der zuerst laufen sollte.
Verlässt mein Code das Haus?
Phase 1 ist vollständig lokal. Die Phasen 2 und 3 senden Dateiinhalte an den Endpunkt, der selbst
konfiguriert wurde — das kann localhost sein. Sonst verlässt nichts die Maschine, und --max-chars-per-file
begrenzt, wie viel von einer einzelnen Datei je gesendet wird. Siehe das
Vertrauensmodell.
Wohin als Nächstes
Warum es das gibt
Das Routing-Problem, und warum eine Zusammenfassung der Codebasis es nicht löst.
Wie die Generierung funktioniert
Fünf Phasen, was jede kostet und was degradiert, wenn eine fehlschlägt.
Konfiguration
Flags, Umgebungsvariablen, .env-Kaskaden und handbook.config.yaml — eine Registry.
Fehlerbehebung
Die Dinge, die wirklich schiefgehen, und was dann zu tun ist.