# Мод /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