Das erste echte Handbuch
Acht Schritte von einem nie gelesenen Repository zu einem anwendbaren Änderungsplan — mit den günstigen Kontrollpunkten an den richtigen Stellen.
Das ist die volle Schleife auf einem echten Repository. Sie ist zum Befolgen in Reihenfolge geschrieben und stellt die kostenlosen Prüfungen mit Absicht vor die teuren.
alias handbook="node $(pwd)/packages/cli/dist/main.js"
export REPO=~/code/myrepo
export WORK=work/myrepoSchritt 1 — Erst schauen, dann springen
handbook analyze --source $REPO --work $WORK{
"language": "multi",
"files": 412,
"functions": 3187,
"edgesKept": 9042,
"edgesDropped": 611,
"filesUnparsed": 3
}Das kostet nichts und ist der Smoke-Test. Kein LLM, kein Schlüssel, keine Tokens.
Diese Zahlen lesen, bevor es weitergeht
filesdeutlich niedriger als erwartet? Eine ganze Sprache wird übersprungen, oder die Quellwurzel ist falsch. Das Scan-Log mit-vprüfen. -filesdeutlich höher? Es wirdnode_modules,vendoroder ein Build-Verzeichnis analysiert. Die üblichen werden automatisch übersprungen; andernfalls--sourceauf die echte Quellwurzel statt auf die Repo-Wurzel zeigen lassen. -edgesDroppedriesig im Verhältnis zuedgesKept? Normal bei dynamischen Sprachen. Ein Blick inphase1/dropped-calls.jsonlohnt — jeder unaufgelöste Aufruf ist dort kategorisiert, nicht versteckt. -filesUnparsednicht null? Diese Dateien stehen mit einem Grund inphase1/scan-coverage.json. Die mitunreadableoderunparsablesteuern nichts bei und bekommen keine Seite — ein jetzt gebautes Handbuch hat genau dort ein Loch, und das lohnt sich zu stopfen, bevor Prosa bezahlt wird.
Diese Punkte jetzt beheben. Jedes Problem hier wird später ein teureres Problem.
Schritt 2 — Das Handbuch generieren
Dieser Schritt kostet Tokens. Bei einem mittelgroßen Repository sind Minuten zu erwarten.
Günstig anfangen:
handbook generate --source $REPO --work $WORKDas entspricht --detail brief und --synth-mode oneshot: eine kurze Karte pro Datei
und ein Skelett in einem Durchgang. So zeigt sich am schnellsten, ob die Form des
Handbuchs stimmt.
Einen Blick in $WORK/phase2/skeleton.yaml werfen. Sieht die Etappenliste nach dem
eigenen System aus? Falls ja, aufrüsten:
handbook generate --source $REPO --work $WORK \
--phase 2a --detail deep --resume--phase 2a --resume vertieft nur die Karten und überspringt Dateien, die bereits
eine vollständige haben. Das bereits geprüfte Skelett bleibt erhalten.
Ist das Skelett falsch, stattdessen 2b mit der Actor-Critic-Schleife erneut ausführen:
handbook generate --source $REPO --work $WORK --phase 2b,2c,3 --synth-mode doctorFortsetzbar, abbrechbar und gecacht
Karten werden geschrieben, sobald sie fertig sind. Ctrl-C ist sicher. --resume macht dort weiter, wo
abgebrochen wurde, --llm-cache macht Wiederholungsläufe fast kostenlos, und run-manifest.json hält fest,
was der letzte gute Lauf an Tokens gekostet hat.
Schritt 3 — Rendern
handbook render --work $WORK --title "MyRepo Handbook" \
--html --html-single --agent-site --llms-txtKein LLM. Beliebig oft ausführen — in CI, bei jedem Commit.
Mit --source-base-url https://github.com/me/myrepo/blob/main wird jeder Dateipfad im
Handbuch zu einem Link auf die echte Datei. Ohne dieses Flag enthält die Ausgabe
überhaupt keine externen URLs — was bei einer privaten Codebasis zählt.
$WORK/handbook/html/overview.html öffnen und lesen. Das ist der Moment, um zu
beurteilen, ob das Handbuch etwas taugt.
Schritt 4 — Für den Agenten paketieren
handbook skill --handbook $WORK/handbook --out skills/myrepo \
--name myrepo --project "MyRepo" \
--work $WORK --source $REPO \
--agent-dir $WORK/handbook/agent--work + --source zusammen erzeugen coverage.json: einen Content-Hash pro Datei.
Genau das macht Handbuch-Drift erkennbar, statt später stillschweigend falsch zu sein.
--agent-dir liefert den Agenten-Index und seine Faktentabellen mit und gibt dem
Routing-Protokoll des SKILLs seine grep-Rezepte — der Agent macht aus einem Symbolnamen so
mit einem Befehl ein path:startLine-endLine, statt Prosa zu lesen und zu raten.
Schritt 5 — Validieren
handbook validate --skill skills/myrepo --source $REPOPrüft die Struktur, den Frontmatter-Vertrag, die Konsistenz zwischen Index und
Etappenseiten und re-hasht die Quellen, um zurückgefallene Seiten zu melden. Beendet
sich bei Fehlschlag mit 2 — das ist also der Befehl für die CI.
Schritt 6 — Eine echte Änderung planen
handbook plan --source $REPO --handbook skills/myrepo/references \
--request "Retry failed uploads three times before giving up" \
--out plan.mdEine rein lesende Agentenschleife: Sie listet, liest und greppt — ein
Schreibwerkzeug hat sie gar nicht —, routet mit dem Handbuch, verifiziert gegen den
echten Quelltext und schreibt plan.md.
Den Plan lesen. Wirklich lesen. Er endet mit einem maschinenlesbaren Deklarationsblock:
### EDIT 1
- file: `src/upload.py`
- where: `Uploader.send (~88)` — wrap the request in the retry helper
```old
response = self._client.put(url, data)
```
```new
response = self._retry(lambda: self._client.put(url, data), attempts=3)
```
```json
{ "will_modify": ["Uploader.send"], "will_add": ["Uploader._retry"], "will_remove": [] }
```Ein Planner, der aufgibt, beendet sich mit Exit-Code ungleich null
Kann er keinen brauchbaren Plan erzeugen — weil er immer wieder Dateiinhalte erfunden hat oder die Züge
ausgingen —, scheitert er laut, statt eine Entschuldigung in plan.md zu schreiben, die ein Skript dann
arglos an apply verfüttern würde.
Schritt 7 — Anwenden, mit Rückweg
handbook apply --source $REPO --plan plan.md --dry-run # verify only, never writes
handbook apply --source $REPO --plan plan.md # for realDer Probelauf ist dem Geiste nach nicht optional. Er löst jeden Anker gegen den aktuellen Dateiinhalt auf und sagt genau, welche Änderungen landen würden.
Beim Anwenden wird das Backup-Verzeichnis ausgegeben. Am besten gleich beiseitekopieren, bevor es gebraucht wird:
handbook rollback --backup $REPO/.handbook-patches/2026-08-08T14-05-11-204ZRollback verweigert jede Datei, die sich nach dem Patch geändert hat, außer mit
--force — denn ihre Wiederherstellung würde diese Arbeit stillschweigend zerstören.
Alle vier Sicherheitsregeln stehen in
Änderungen anwenden.
Schritt 8 — Das Handbuch nachziehen
Der Code hat sich bewegt. Nicht neu generieren — resyncen.
Ein Case ist ein selbst zusammengestelltes Verzeichnis:
cases/upload-retry/
edited/ copy of the repo after the change (required)
plan.md the plan from step 6 (optional — sharpens scope)
change.diff unified diff of the change (optional — widens scope)mkdir -p cases/upload-retry
cp -R $REPO cases/upload-retry/edited
cp plan.md cases/upload-retry/
handbook resync --case cases/upload-retry --work $WORKResync analysiert den editierten Baum neu, vergleicht alten und neuen Graphen und
regeneriert nur, was sich geändert hat. Bereits gerenderte Ausgaben unter
$WORK/handbook werden automatisch aufgefrischt.
Kein Endpunkt zur Hand? --no-llm frischt die strukturellen Fakten auf und markiert die
Prosa als veraltet, statt so zu tun, als wäre sie aktuell.
Wenn das Repository sehr groß ist
| Symptom | Was tun |
|---|---|
| Tausende Dateien | Mit --detail brief beginnen. Ausgewählte Phasen später mit --phase 2a --detail deep --resume vertiefen. |
| Der Lauf ist langsam | --read-workers / --assign-workers / --narrate-workers erhöhen, alle unterhalb von --llm-concurrency. |
| Rate-Limits | --llm-concurrency senken. --llm-retries und --llm-retry-backoff erhöhen. |
| Riesige generierte Dateien | --max-chars-per-file 20000 kürzt, was pro Datei gesendet wird. |
| Nur ein Subsystem interessiert | --source auf dieses Unterverzeichnis zeigen lassen. Der Graph entsteht aus dem, was gescannt wird. |
| Wiederholte Läufe beim Iterieren | --llm-cache, und --refresh, wenn Caches bewusst ignoriert werden sollen. |
Mehr dazu in Kosten und Performance.
Weiter
Schnellstart
Die gesamte Toolchain in rund dreißig Sekunden von Anfang bis Ende — offline, ohne API-Schlüssel und ohne einen einzigen Token.
Das Vokabular
Etappe, Karte, Register, Arbeitsverzeichnis, Case, Skill, Plan — jedes Wort, das dieses Projekt in einem bestimmten Sinn verwendet, einmal definiert.