Агент, который правит обвязку, должен видеть мод частью проекта: - tests/test-feature-plugin.sh — манифест, README и `claude plugin test` /`validate` мода в составе bash tests/run.sh; без claude в PATH — пропуск с пометкой. Правка формата ledger/Findings/Decisions без правки мода теперь роняет набор (проверено: испорченное ожидание → FAIL). - .claude/code-paths: plugins/ — правки мода под require-plan, как hooks/ и skills/. - CLAUDE.md: команды тестов мода и запуск из worktree (--plugin-dir), правило «меняешь формат — правь мод в том же PR». bash tests/run.sh — 162/162. Refs #7 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
21 lines
1.5 KiB
Bash
21 lines
1.5 KiB
Bash
# Мод /feature (plugins/feature): его тесты и проверка манифеста — часть набора обвязки.
|
||
# Мод читает форматы обвязки (ledger, ## Findings, Decisions в design.md, планы): правка формата
|
||
# без правки мода должна ронять этот набор. Нужен `claude` в PATH; без него — пропуск с пометкой.
|
||
P="$ROOT/plugins/feature"
|
||
assert_file "мод: манифест" "$P/.claude-plugin/plugin.json"
|
||
assert_grep "мод: имя feature" '"name": "feature"' "$P/.claude-plugin/plugin.json"
|
||
assert_file "мод: README с контрактом" "$P/README.md"
|
||
if command -v claude >/dev/null 2>&1; then
|
||
# claude читает свою конфигурацию из настоящего HOME, не из временного
|
||
out=$(HOME="$REAL_HOME" claude plugin test "$P" 2>&1); code=$?
|
||
if [ "$code" = 0 ] && printf '%s' "$out" | grep -qE '(^| )0 fail'; then
|
||
ok "мод: claude plugin test ($(printf '%s' "$out" | grep -oE '[0-9]+ pass' | head -1))"
|
||
else
|
||
fail "мод: claude plugin test" "exit $code; $(printf '%s' "$out" | grep -E 'fail|Error' | head -3 | tr '\n' ' ')"
|
||
fi
|
||
out=$(HOME="$REAL_HOME" claude plugin validate "$P" 2>&1); code=$?
|
||
[ "$code" = 0 ] && ok "мод: claude plugin validate" || fail "мод: claude plugin validate" "exit $code; $(printf '%s' "$out" | tail -3 | tr '\n' ' ')"
|
||
else
|
||
printf ' skip мод: claude не найден в PATH — тесты мода не запускались\n'
|
||
fi
|