Ваше первое настоящее руководство
Восемь шагов от репозитория, который вы никогда не читали, до плана изменений, который можно применить — с дешёвыми контрольными точками в правильных местах.
Это полный цикл на настоящем репозитории. Он написан так, чтобы его выполняли по порядку, и бесплатные проверки в нём намеренно стоят раньше дорогих.
alias handbook="node $(pwd)/packages/cli/dist/main.js"
export REPO=~/code/myrepo
export WORK=work/myrepoШаг 1 — Семь раз отмерь
handbook analyze --source $REPO --work $WORK{
"language": "multi",
"files": 412,
"functions": 3187,
"edgesKept": 9042,
"edgesDropped": 611,
"filesUnparsed": 3
}Это бесплатно, и это ваш дымовой тест. Без LLM, без ключа, без токенов.
Прочитайте эти числа, прежде чем идти дальше
filesнамного меньше ожидаемого? Пропускается целый язык, либо ваш корень исходников указан неверно. Посмотрите журнал сканирования с-v. -filesнамного больше? Вы анализируетеnode_modules,vendorили каталог сборки. Типичные каталоги пропускаются автоматически; если ваш — нет, направьте--sourceна настоящий корень исходников, а не на корень репозитория. -edgesDroppedогромен относительноedgesKept? Нормально для динамических языков. Загляните вphase1/dropped-calls.json— каждый неразрешённый вызов там категоризирован, а не спрятан. -filesUnparsedне ноль? Эти файлы поимённо названы вphase1/scan-coverage.jsonс указанием причины. Файлы сunreadableиunparsableне дают ничего и не получают страницы, так что собранное сейчас руководство будет с дырой ровно в этом месте — её стоит закрыть до того, как вы заплатите за прозу.
Исправьте всё перечисленное сейчас. Каждая проблема на этом шаге позже становится более дорогой проблемой.
Шаг 2 — Сгенерируйте руководство
Это шаг, который стоит токенов. На репозитории среднего размера рассчитывайте на минуты.
Начните с дешёвого:
handbook generate --source $REPO --work $WORKЭто --detail brief и --synth-mode oneshot: короткая карточка на файл и скелет за один
проход. Это самый быстрый способ увидеть, верна ли сама форма руководства.
Посмотрите на $WORK/phase2/skeleton.yaml. Похож ли список этапов на вашу систему? Если
да — углубляйте:
handbook generate --source $REPO --work $WORK \
--phase 2a --detail deep --resume--phase 2a --resume углубляет только карточки, пропуская файлы, у которых уже есть
полная. Скелет, который вы уже проверили, остаётся.
Если скелет неправильный, перезапустите 2b с циклом «актор–критик»:
handbook generate --source $REPO --work $WORK --phase 2b,2c,3 --synth-mode doctorЭто возобновляемо, отменяемо и кешируется
Карточки записываются по мере готовности. Ctrl-C безопасен. --resume продолжает с места остановки,
--llm-cache делает повторные запуски почти бесплатными, а run-manifest.json фиксирует, сколько токенов
стоил последний успешный запуск.
Шаг 3 — Отрендерите его
handbook render --work $WORK --title "MyRepo Handbook" \
--html --html-single --agent-site --llms-txtБез LLM. Запускайте сколько угодно — в CI, на каждом коммите.
Добавьте --source-base-url https://github.com/me/myrepo/blob/main, чтобы каждый путь к
файлу в руководстве стал ссылкой на настоящий файл. Без него вывод вообще не содержит
внешних URL — что важно для приватной кодовой базы.
Откройте $WORK/handbook/html/overview.html и прочитайте его. Это момент, когда нужно
судить, хорошо ли получилось руководство.
Шаг 4 — Упакуйте его для вашего агента
handbook skill --handbook $WORK/handbook --out skills/myrepo \
--name myrepo --project "MyRepo" \
--work $WORK --source $REPO \
--agent-dir $WORK/handbook/agent--work + --source вместе порождают coverage.json: хеш содержимого для каждого
файла. Именно это делает дрейф руководства обнаружимым, а не молча неверным позже.
--agent-dir включает в пакет индекс для агента и его таблицы фактов и даёт протоколу
маршрутизации SKILL grep-рецепты — так что агент превращает имя символа в
path:startLine-endLine одной командой, вместо того чтобы читать прозу и догадываться.
Шаг 5 — Провалидируйте его
handbook validate --skill skills/myrepo --source $REPOПроверяет структуру, контракт frontmatter, согласованность «индекс ↔ страницы этапов» и
заново хеширует исходники, чтобы сообщить об отставших страницах. Завершается с кодом
2 при неудаче, поэтому именно эту команду стоит поставить в CI.
Шаг 6 — Спланируйте настоящее изменение
handbook plan --source $REPO --handbook skills/myrepo/references \
--request "Retry failed uploads three times before giving up" \
--out plan.mdАгентный цикл только для чтения: он листает, читает и делает grep — инструмента
записи у него нет вовсе, — маршрутизируется по руководству, сверяется с настоящими
исходниками и записывает plan.md.
Прочитайте план. Действительно прочитайте. Он заканчивается машиночитаемым блоком деклараций:
### 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": [] }
```Планировщик, который сдался, завершается ненулевым кодом
Если он не смог выдать пригодный план — постоянно выдумывал содержимое файлов или исчерпал ходы, — он громко
падает, вместо того чтобы записать извинение в plan.md, которое скрипт затем радостно скормит в apply.
Шаг 7 — Примените его, оставив путь назад
handbook apply --source $REPO --plan plan.md --dry-run # verify only, never writes
handbook apply --source $REPO --plan plan.md # for realПробный прогон по духу не является необязательным. Он разрешает каждый якорь по текущему содержимому файлов и говорит вам ровно, какие правки лягут.
Применение печатает каталог резервной копии. Скопируйте его куда-нибудь до того, как он понадобится:
handbook rollback --backup $REPO/.handbook-patches/2026-08-08T14-05-11-204ZОткат отказывается трогать любой файл, изменившийся после патча, если не передан
--force, — потому что его восстановление молча уничтожило бы эту работу. Все четыре
правила безопасности — в Применении изменений.
Шаг 8 — Прокатите руководство вперёд
Код сдвинулся. Не перегенерируйте — сделайте resync.
Кейс — это каталог, который вы собираете сами:
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 заново анализирует изменённое дерево, сравнивает старый граф с новым и
перегенерирует только то, что изменилось. Уже отрендеренные результаты в
$WORK/handbook обновляются автоматически.
Нет под рукой конечной точки? --no-llm обновляет структурные факты и помечает прозу
устаревшей, вместо того чтобы делать вид, что она актуальна.
Если ваш репозиторий очень большой
| Симптом | Что делать |
|---|---|
| Тысячи файлов | Начните с --detail brief. Позже углубите отдельные фазы через --phase 2a --detail deep --resume. |
| Запуск идёт медленно | Поднимите --read-workers / --assign-workers / --narrate-workers — все в пределах --llm-concurrency. |
| Лимиты частоты запросов | Понизьте --llm-concurrency. Поднимите --llm-retries и --llm-retry-backoff. |
| Огромные сгенерированные файлы | --max-chars-per-file 20000 усекает то, что отправляется на каждый файл. |
| Вас интересует только одна подсистема | Направьте --source на этот подкаталог. Граф строится из того, что сканируется. |
| Повторные запуски во время итераций | --llm-cache, а также --refresh, когда вы намеренно хотите проигнорировать кеши. |
Подробнее — в Стоимости и производительности.