claude-harness/tests/test-roles.sh
andrey.epifantsev 00b496d6da feat: worktree в <repo>/.claude/worktrees/ через EnterWorktree, вход без подтверждения (#25, 0.5.1)
С Claude Code 2.1.206 вход в worktree вне .claude/worktrees/ спрашивает
подтверждение при любых allow-правилах. EnterWorktree с именем создаёт
worktree в <repo>/.claude/worktrees/<slug> на ветке worktree-<slug> от
origin/main и входит без вопроса; ветка переименовывается в
feat/<id>-<slug>.

- roles/dev.md: «Исполнение» — EnterWorktree с именем; п. 1 закрытия —
  archive-<id>; п. 4 — ExitWorktree (keep) снимает блокировку сессии,
  затем git worktree remove и branch -D.
- .claude/worktrees/ в .gitignore: adopt-project.sh, project-template,
  этот репозиторий; doctor.sh — WARN, если не игнорируется.
- Спека hook-guards: сценарии «worktree внутри репозитория» для
  guard-main и require-plan; тесты закрепляют уже верное поведение.
- HARNESS.md (шаг 4, п. 4, подтверждения), SKILL.md, CHANGELOG 0.5.1,
  CLAUDE.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:20:35 +04:00

24 lines
2.3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Формат файлов ролей (спека 3.1), одинаковый для общего и проектного слоя.
check_role_file(){ # $1 = путь, $2 = ожидаемое имя роли
local f="$1" r="$2" h
assert_file "$f существует" "$f" || return
assert_eq "$f: строка 1" "$(sed -n '1p' "$f" | sed -E 's/^(# Роль: [a-z]+) — .*/\1/')" "# Роль: $r"
assert_eq "$f: строка 2" "$(sed -n '2p' "$f")" "Эта роль заменяет предыдущую роль сессии целиком."
h=$(grep -E '^## ' "$f" | tr '\n' '|')
assert_eq "$f: четыре раздела по порядку" "$h" "## Процесс|## Читать на старте|## Не делать|## Делегировать|"
}
for r in dev admin analyst qa; do check_role_file "$ROOT/roles/$r.md" "$r"; done
assert_grep "dev: чеклист закрытия перенесён" 'openspec archive' "$ROOT/roles/dev.md"
assert_grep "dev: архив всегда отдельным PR" 'всегда отдельным PR' "$ROOT/roles/dev.md"
assert_grep "dev: worktree — EnterWorktree в .claude/worktrees/ (#25)" 'EnterWorktree.*\.claude/worktrees/' "$ROOT/roles/dev.md"
assert_grep "repo .gitignore: .claude/worktrees/ (#25)" '^\.claude/worktrees/$' "$ROOT/.gitignore"
assert_grep "dev: п. 4 — строку allow печатают adopt/new-project, наличие показывает doctor (B3)" 'new-project\.sh.*doctor\.sh' "$ROOT/roles/dev.md"
assert_grep "dev: п. 4 — worktree remove раньше branch -D" 'git worktree remove`.*`git branch -D' "$ROOT/roles/dev.md"
assert_grep "dev: не cd при фоновом контроллере" 'cd' "$ROOT/roles/dev.md"
assert_grep "dev: bounded обновляет спеку при смене API" 'спека .*обновляется в том же PR' "$ROOT/roles/dev.md"
assert_grep "dev: маркировка R-n" 'R-n' "$ROOT/roles/dev.md"
assert_grep "admin: Jira вместо Gitea" 'Jira' "$ROOT/roles/admin.md"
assert_grep "analyst: код не пишется" 'не пиш' "$ROOT/roles/analyst.md"
assert_grep "qa: код не меняется" 'не меня' "$ROOT/roles/qa.md"
for r in dev admin analyst qa; do assert_grep "$r: есть строка brief:" '^- brief:' "$ROOT/roles/$r.md"; done