30 lines
2.2 KiB
Bash
30 lines
2.2 KiB
Bash
#!/usr/bin/env bash
|
||
# SessionStart hook: проверяет, подключена ли обвязка к проекту в cwd.
|
||
# Всё на месте — молчит. Чего-то нет — пишет в контекст сессии инструкцию агенту.
|
||
# HARNESS_AUTO_ADOPT=1 в окружении → агенту велено подключать без вопроса.
|
||
set -uo pipefail
|
||
input=$(cat)
|
||
cwd=$(printf '%s' "$input" | python3 -c 'import sys,json; print(json.load(sys.stdin).get("cwd",""))' 2>/dev/null)
|
||
[ -n "$cwd" ] || exit 0
|
||
git -C "$cwd" rev-parse --is-inside-work-tree >/dev/null 2>&1 || exit 0
|
||
root=$(git -C "$cwd" rev-parse --show-toplevel)
|
||
missing=()
|
||
[ -d "$root/openspec" ] || missing+=("openspec/")
|
||
[ -d "$root/.codegraph" ] || missing+=(".codegraph/")
|
||
grep -qs '^## OpenSpec и superpowers' "$root/CLAUDE.md" || missing+=("секция «OpenSpec и superpowers» в CLAUDE.md")
|
||
[ ${#missing[@]} -eq 0 ] && exit 0
|
||
if [ -n "$(git -C "$root" status --porcelain)" ]; then
|
||
dirty=" Рабочее дерево не чистое — скрипт откажется; сначала попроси пользователя закоммитить или спрятать изменения."
|
||
else dirty=""; fi
|
||
if [ "${HARNESS_AUTO_ADOPT:-0}" = "1" ]; then
|
||
mode="Выполни это сейчас, до любых других действий, без вопроса, и одной строкой сообщи пользователю, что сделано."
|
||
else
|
||
mode="Прежде чем что-либо делать, спроси пользователя одним вопросом, подключить ли обвязку, и по «да» выполни."
|
||
fi
|
||
cat <<MSG
|
||
[claude-harness] В проекте $root не подключена обвязка: нет: $(printf '%s; ' "${missing[@]}" | sed 's/; $//').
|
||
Подключение: \`bash "$HOME/.claude/harness/adopt-project.sh" "$root"\` — скрипт сам делает ветку chore/harness-init, бутстрап, коммит и ff-merge; хук guard-main его пропускает.$dirty
|
||
$mode После этого продолжай с запросом пользователя.
|
||
MSG
|
||
exit 0
|