По итогам разбора собственной работы. jellybit-review-code не запускался нигде: charter обещал «проход профиля quick», а quick состоял из стадий 0, 1, 5. Проход, который нельзя запустить, нельзя и откалибровать. Теперь он стадия 1 рядом с review-specs — оба applicative, у обоих критерий записан, различаются источники (дельта-спека и конвенции). review-context.sh больше не выгружает go doc -short по всему модулю: это было 264 строки из 458 при том, что граф зависимостей — единственное, чего агент не восстановит сам, — занимает 21. Публичную поверхность он вытянет go doc по нужному месту. Из calibration.md убрана секция дополнительных метрик: precision, корреляция и стоимость прогона вручную никем не считаются, а набор показателей, который не собирают, изображает измеряемость вместо того, чтобы её давать. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
76 lines
3.1 KiB
Bash
Executable File
76 lines
3.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Вход для архитектурного прохода ревью: то, чего нет в диффе.
|
|
#
|
|
# Агент, видящий только `git diff`, физически не может судить об архитектуре —
|
|
# он не знает, какие понятия в проекте уже есть и как они называются. Скрипт
|
|
# собирает дерево пакетов с назначением, граф внутренних зависимостей и
|
|
# инвентарь существующих концепций.
|
|
#
|
|
# Публичную поверхность пакетов намеренно НЕ выгружаем: дамп `go doc -short` по
|
|
# всему модулю занимал больше половины вывода, а агент вытянет `go doc` по
|
|
# нужному пакету сам. Здесь — только то, что иначе не восстановить.
|
|
#
|
|
# Использование: scripts/review-context.sh [> tmp/review-context.md]
|
|
|
|
set -eu
|
|
|
|
MOD="$(awk '/^module /{print $2}' go.mod)"
|
|
PKGS="$(go list ./... | grep -v '/migrations$')"
|
|
|
|
echo "# Контекст проекта для архитектурного ревью"
|
|
echo
|
|
echo "Сгенерировано \`scripts/review-context.sh\`. Модуль: \`$MOD\`."
|
|
echo
|
|
|
|
echo "## Пакеты и назначение"
|
|
echo
|
|
echo '```'
|
|
go list -f '{{.ImportPath}}|{{.Doc}}' ./... | sed "s|^$MOD/||" |
|
|
awk -F'|' '{printf "%-34s %s\n", $1, ($2 == "" ? "— (нет doc-комментария пакета)" : $2)}'
|
|
echo '```'
|
|
echo
|
|
|
|
echo "## Граф внутренних зависимостей"
|
|
echo
|
|
echo "Только импорты внутри модуля. Стрелка A -> B означает «A зависит от B»."
|
|
echo
|
|
echo '```'
|
|
for p in $PKGS; do
|
|
deps="$(go list -f '{{range .Imports}}{{.}}
|
|
{{end}}' "$p" | grep "^$MOD/" | sed "s|^$MOD/||" | sort -u | tr '\n' ' ')"
|
|
[ -n "$deps" ] && echo "${p#"$MOD"/} -> $deps"
|
|
done
|
|
echo '```'
|
|
echo
|
|
|
|
echo "## Инвентарь концепций"
|
|
echo
|
|
echo "Как в проекте уже называются вещи. Новое понятие вводим, только убедившись,"
|
|
echo "что его нельзя выразить существующими."
|
|
echo
|
|
echo "### Доменные ошибки (sentinel)"
|
|
echo '```'
|
|
grep -rhn "^var Err[A-Za-z]* = errors.New" --include='*.go' internal/ |
|
|
sed 's/^[0-9]*://' | sort -u
|
|
echo '```'
|
|
echo
|
|
echo "### Состояния загрузки"
|
|
echo '```'
|
|
grep -rh "State[A-Za-z]* *State *= " --include='*.go' internal/store/ | sed 's/^\s*//' | sort -u
|
|
echo '```'
|
|
echo
|
|
echo "### Секции конфигурации"
|
|
echo '```'
|
|
grep -rh 'toml:"' --include='*.go' internal/config/ | sed 's/^\s*//' | sort -u
|
|
echo '```'
|
|
echo
|
|
echo "### Публичные команды воркера (вызываются транспортами)"
|
|
echo '```'
|
|
grep -rhn "^func (w \*Worker) [A-Z]" --include='*.go' internal/worker/ | sed 's/^[0-9]*://' | sort -u
|
|
echo '```'
|
|
echo
|
|
echo "### Capabilities OpenSpec"
|
|
echo '```'
|
|
ls openspec/specs/
|
|
echo '```'
|