26 lines
1.8 KiB
Bash
26 lines
1.8 KiB
Bash
#!/usr/bin/env bash
|
|
# 会话结束收口检查:工作区相对会话开始有改动(status 行或 diff 内容任一变化)、
|
|
# 且 active.md 内容哈希未变(本会话内未真更新——mtime 不可信,touch 也算未登记)时,
|
|
# 以 exit 2 阻止停止并经 stderr 注入登记提醒(每会话至多一次)
|
|
# 2026-09-18 强判据升级:active.md 由 mtime 比对改内容哈希比对
|
|
proj="${ZCODE_PROJECT_DIR:-$PWD}"
|
|
sid="${CLAUDE_SESSION_ID:-default}"
|
|
state="/tmp/zcode-active-md-guard"
|
|
snap="$state/$sid.snap"
|
|
active_md="$proj/production/session-state/active.md"
|
|
[ -f "$snap" ] || exit 0
|
|
[ -f "$state/$sid.reminded" ] && exit 0
|
|
start_status=$(sed -n 2p "$snap")
|
|
start_diff=$(sed -n 3p "$snap")
|
|
start_content=$(sed -n 4p "$snap")
|
|
now_status=$(git -C "$proj" status --porcelain 2>/dev/null | sort | sha1sum | cut -d' ' -f1)
|
|
now_diff=$(git -C "$proj" diff HEAD 2>/dev/null | sha1sum | cut -d' ' -f1)
|
|
[ "$now_status" = "$start_status" ] && [ "$now_diff" = "$start_diff" ] && exit 0
|
|
now_content=$(sha1sum "$active_md" 2>/dev/null | cut -d' ' -f1 || echo 0)
|
|
[ "$now_content" = "$start_content" ] || exit 0
|
|
touch "$state/$sid.reminded"
|
|
cat >&2 <<'MSG'
|
|
[会话收口检查] 本会话产生了工作区改动,但 production/session-state/active.md 内容未变(本会话内未真更新)。若本会话包含实质工作(代码/文档/数值/设计拍板/缺陷修复),请:① 先更新 active.md 顶部「当前状态快照」节(在飞/可做/阻塞/锚点/下一步——先改快照再记账);② 再在 active.md 末尾追加一条编号批次条目(做了什么·拍板了什么·验证结果·遗留与下一步)。完成后结束;若本次确无可登记事项(纯问答、只读核查),忽略本提醒直接结束。另:待办事项登记 design/gdd/06-待办清单.md(裁决后改状态列留痕),不要写进 active.md 条目表。
|
|
MSG
|
|
exit 2
|