#!/bin/bash # regression-scope.sh — 動到某一站的東西 → 告訴你要重考哪些題(JDD 規則 J7) # # 掛 PostToolUse(Write|Edit|MultiEdit)。**只提醒,不阻擋**(exit 0)。 # # ── 為什麼只提醒 ──────────────────────────────── # 重考範圍是判斷題不是是非題——擋下來只會讓人為了繼續工作而亂填。 # 它要消滅的失敗模式只有一個:**改完東西,忘了它會弄壞哪幾站**。 # (「S3 安裝流程變了 → 後面 S4~S9 全部要重考」這種事, # 不查索引表沒有人會自己想到。) # # ── 判斷「動到哪一站」怎麼做 ───────────────────── # 靠 journeys.md 的**站點索引**。索引裡若有登記關聯路徑就用它; # 沒有登記時退回一個誠實的作法:只要動到 code,就把索引整份摘要推一次, # 讓人自己對——**不猜**。猜錯的重考範圍比沒有更危險(會讓人以為已經涵蓋了)。 set -uo pipefail HOOK_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" . "$HOOK_DIR/lib/role-lib.sh" 2>/dev/null || exit 0 INPUT="$(cat)" FILE_PATH="$(sdt_file_path "$INPUT")" [ -z "$FILE_PATH" ] && exit 0 REL="$(sdt_rel_path "$FILE_PATH")" # 只對「實作變動」出聲;改文件不必每次都喊 case "$REL" in src/*|*/src/*|*.py|*.ts|*.tsx|*.js|*.go|*.rs|*.sh|*.java|*.rb|*.vue|*.svelte) ;; *) exit 0 ;; esac ROOT="$(sdt_repo_root)" JOURNEYS="" for cand in "$ROOT/system-dev/docs/journeys.md" "$ROOT/../system-dev/docs/journeys.md"; do [ -f "$cand" ] && JOURNEYS="$cand" && break done [ -z "$JOURNEYS" ] && exit 0 # 沒有 PM 軌文件(多數成員 repo)→ 安靜 # 取站點索引段(「附:站點索引」以下) INDEX="$(awk '/^##[[:space:]]*附.*站點索引/{f=1} f' "$JOURNEYS" 2>/dev/null | head -60)" [ -z "$INDEX" ] && exit 0 echo "════════════════════════════════════════════════" echo "🔁 回歸考提醒(J7):你動了實作,查一下要重考哪幾題" echo "════════════════════════════════════════════════" echo " 剛動的:$REL" echo "" printf '%s\n' "$INDEX" | sed 's/^/ /' echo "" echo " ⚠️ 這份索引是「站 → 被哪些旅程經過 → 改動時重考什麼」。" echo " 對照你剛改的東西屬於哪一站,把**下游**也一起重考——" echo " 安裝那類的站一變,後面全部都要重來。" exit 0