#!/usr/bin/env bash # Stop hook — ヘルプ/更新履歴の更新もれを知らせる(警告のみ・非ブロック)。 # # フィーチャーブランチに「ユーザー向けのコード変更」が commit 済みなのに、 # ヘルプ (ui/src/content/help/) と更新履歴 (00-changelog.md) が未更新のとき、 # 目に見える警告を 1 つ出すだけ。作業はブロックしない(更新するかは開発者が判断)。 # # 設計メモ: # - main/master では何もしない(トランク自体には enforce しない) # - 判定は base ブランチとの "commit 済み差分" のみ。編集途中(未コミット)では黙る # - ヒューリスティックなので、内部リファクタ等で誤検知したら無視してよい # `set -e` は使わない([ ... ] && exit の評価で意図せず抜けるのを避けるため)。 ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." 2>/dev/null && pwd)" [ -n "$ROOT" ] || exit 0 cd "$ROOT" 2>/dev/null || exit 0 git rev-parse --is-inside-work-tree >/dev/null 2>&1 || exit 0 BRANCH="$(git rev-parse --abbrev-ref HEAD 2>/dev/null)" case "$BRANCH" in main|master|HEAD|"") exit 0 ;; esac # 差分の基準ブランチを決める。 BASE="" for ref in origin/main main origin/master master; do if git rev-parse --verify --quiet "$ref" >/dev/null 2>&1; then BASE="$ref" break fi done [ -n "$BASE" ] || exit 0 # このブランチが base に対して触ったファイル(commit 済みのみ)。 CHANGED="$(git diff --name-only "$BASE"...HEAD 2>/dev/null)" [ -n "$CHANGED" ] || exit 0 CHANGELOG="ui/src/content/help/00-changelog.md" changelog_touched=0 user_facing=0 while IFS= read -r f; do [ -n "$f" ] || continue case "$f" in "$CHANGELOG") changelog_touched=1 ;; esac case "$f" in *.test.ts|*.test.tsx|*.spec.ts) ;; # テストは対象外 ui/src/content/help/*) ;; # ヘルプ本文そのものは対象外 ui/src/i18n/*) ;; # 文言だけの変更は対象外 ui/src/*|src/*|pieces/*) user_facing=1 ;; # ユーザーに影響しうるコード esac done <<< "$CHANGED" # ユーザー向け変更が無い、または更新履歴を既に更新済みなら何も言わない。 [ "$user_facing" -eq 1 ] || exit 0 [ "$changelog_touched" -eq 0 ] || exit 0 MSG="📝 ヘルプ未更新のお知らせ: ブランチ '${BRANCH}' に機能コードの変更がありますが、更新履歴 (${CHANGELOG}) は未更新です。ユーザー向けの変更なら、該当するヘルプ (ui/src/content/help/*.md) と更新履歴に追記してください。内部リファクタ等で不要なら無視して構いません。" # 可視の警告として出すだけ(decision を設定しないので stop はブロックしない)。 # Stop フックは stdout の JSON `systemMessage` のみを画面に出す(stderr は出ない)ため、 # 必ず stdout に JSON を書く。 if command -v python3 >/dev/null 2>&1; then printf '{"systemMessage": %s}\n' "$(MSG="$MSG" python3 -c 'import json,os; print(json.dumps(os.environ["MSG"]))')" else # python3 が無い環境向けフォールバック。" と \ を手でエスケープして stdout に出す。 esc="$(printf '%s' "$MSG" | sed 's/\\/\\\\/g; s/"/\\"/g')" printf '{"systemMessage": "%s"}\n' "$esc" fi exit 0