# install.sh: новые файлы ставятся, повторный запуск не дублирует хуки, --check их видит. TH="$TMP/home"; CLAUDE_CONFIG_DIR="$TH/.claude"; mkdir -p "$CLAUDE_CONFIG_DIR" echo '{"hooks":{"SessionStart":[{"matcher":"startup","hooks":[{"type":"command","command":"\"$HOME/.claude/hooks/harness-check.sh\""}]}]}}' > "$CLAUDE_CONFIG_DIR/settings.json" HOME="$TH" CLAUDE_CONFIG_DIR="$CLAUDE_CONFIG_DIR" bash "$ROOT/install.sh" >/dev/null 2>&1; HOME="$TH" CLAUDE_CONFIG_DIR="$CLAUDE_CONFIG_DIR" bash "$ROOT/install.sh" >/dev/null 2>&1 CC="$CLAUDE_CONFIG_DIR" for r in dev admin analyst qa; do assert_file "roles/$r.md установлен" "$CC/roles/$r.md"; done assert_file "skills/role/SKILL.md установлен" "$CC/skills/role/SKILL.md" assert_file "agents/briefing.md установлен" "$CC/agents/briefing.md" assert_file "hooks/role-hint.sh установлен" "$CC/hooks/role-hint.sh" assert_eq "hooks/role-hint.sh исполняемый" "$([ -x "$CC/hooks/role-hint.sh" ] && echo x)" "x" assert_file "hooks/harness_target.py установлен" "$CC/hooks/harness_target.py" assert_file "корпус хуков установлен" "$CC/skills/harness-doctor/fixtures/hook-cases.jsonl" assert_file "skills/aura-design/SKILL.md установлен" "$CC/skills/aura-design/SKILL.md" assert_file "aura-design: набор kit установлен" "$CC/skills/aura-design/kit/styles/tokens.css" assert_file "раннер корпуса установлен" "$CC/skills/harness-doctor/scripts/hook_corpus.py" assert_file "harness/link-roles.sh установлен" "$CC/harness/link-roles.sh" assert_file "harness/project-template/workspace" "$CC/harness/project-template/workspace/CLAUDE.md" assert_file "harness/project-template/role-repo" "$CC/harness/project-template/role-repo/ROLE.md" cnt=$(python3 -c "import json,sys; s=json.load(open(sys.argv[1])); print(sum(1 for e in s['hooks']['SessionStart'] for h in e.get('hooks',[]) if 'role-hint.sh' in h['command']))" "$CC/settings.json") assert_eq "role-hint.sh в settings.json один раз после двух установок" "$cnt" "1" cnt=$(python3 -c "import json,sys; s=json.load(open(sys.argv[1])); print(sum(1 for e in s['hooks']['SessionStart'] for h in e.get('hooks',[]) if 'harness-check.sh' in h['command']))" "$CC/settings.json") assert_eq "harness-check.sh в settings.json один раз" "$cnt" "1" out=$(HOME="$TH" CLAUDE_CONFIG_DIR="$CLAUDE_CONFIG_DIR" bash "$ROOT/install.sh" --check 2>&1) assert_grep "--check: roles" 'roles/' <(printf '%s' "$out") assert_grep "--check: skill role" 'skills/role' <(printf '%s' "$out") assert_grep "--check: agent briefing" 'agents/briefing' <(printf '%s' "$out") assert_grep "--check: skill aura-design" 'skills/aura-design' <(printf '%s' "$out") assert_grep "--check: harness_target.py" 'ok +hooks/harness_target\.py' <(printf '%s' "$out") rm "$CC/agents/briefing.md" out=$(HOME="$TH" CLAUDE_CONFIG_DIR="$CLAUDE_CONFIG_DIR" bash "$ROOT/install.sh" --check 2>&1) assert_grep "--check: MISS briefing" 'MISS +.*briefing' <(printf '%s' "$out")