diff --git a/.claude/rules/hooks-cross-platform.md b/.claude/rules/hooks-cross-platform.md index e667613..b9c2d77 100644 --- a/.claude/rules/hooks-cross-platform.md +++ b/.claude/rules/hooks-cross-platform.md @@ -10,6 +10,7 @@ - **Windows / macOS / Linux の全てでフックが動作し,`.claude/hooks/tests` が全件通ること**を完成条件とする.手元の OS だけで通った状態は未完成として扱う - 3 OS での実行は GitHub Actions のワークフロー `.github/workflows/hooks-ci.yml`(`windows-latest` / `macos-latest` / `ubuntu-latest` のマトリクス)が行う.PR の CI が 3 OS とも緑であることを確認してからマージする +- このワークフローはテンプレートリポジトリにだけ置き,`/sync-template` で派生プロジェクトには配布しない.派生プロジェクトでフックの不具合を見つけた場合は,テンプレートリポジトリ側で修正して CI で 3 OS を確認し,`/sync-template` で取り込む - 手元での確認はホスト OS で `python -B -m unittest discover -s .claude/hooks/tests`(`python` が無い環境では `python3`)を実行する.Windows ホストで WSL が使える場合は,リポジトリを WSL 側の一時ディレクトリ以外の場所に複製して `python3 -B -m unittest discover -s .claude/hooks/tests` を実行すると Linux の挙動も事前に確認できる - Python 3.7 以上で動く書き方を守る(`run_python.sh` が拾う Python は環境により古い場合がある.`TestPython37Compat` が検査する) diff --git a/.claude/skills/sync-template/SKILL.md b/.claude/skills/sync-template/SKILL.md index 21b7eaa..ba92cad 100644 --- a/.claude/skills/sync-template/SKILL.md +++ b/.claude/skills/sync-template/SKILL.md @@ -62,6 +62,7 @@ | --- | --- | --- | | `README.md` | テンプレートの README は GitHub の repo ページ向けのテンプレート紹介用.各プロジェクトは独自の README を持つべき | プロジェクト側にコピー・上書きしない.テンプレート側の追加・変更・削除も無視する | | `.claude/tests/`(配下すべて) | テンプレート自身のメタテスト(skill・エージェント定義・README 等がテンプレートとして整合しているかを検証する).テンプレート固有の内容を前提とするため派生プロジェクトでは必ず失敗する | 同上 | +| `.github/workflows/hooks-ci.yml` | テンプレートのフック(`.claude/hooks/`)を 3 OS で検証する CI.フックの修正はテンプレート側で行い,この CI で確認してから派生プロジェクトへ同期する運用のため,派生プロジェクトの CI には含めない | 同上 | 判定はステップ 5.3 のループ内でマージ必須ファイル判定より先に行う.`SKIP_FILES` の末尾が `/` の項目はディレクトリ指定で,配下のすべてのパスに前方一致で適用する(`reference.md`「変数・判定ヘルパー」). diff --git a/.claude/skills/sync-template/reference.md b/.claude/skills/sync-template/reference.md index d56f7ae..7b56984 100644 --- a/.claude/skills/sync-template/reference.md +++ b/.claude/skills/sync-template/reference.md @@ -15,7 +15,7 @@ ```bash MERGE_FILES=(".gitignore" "CLAUDE.md" "docs/PROGRESS.md" ".gitattributes" ".claude/settings.json" ".claude/template-overrides.md") -SKIP_FILES=("README.md" ".claude/tests/") # 末尾 / はディレクトリ配下すべてを対象にする +SKIP_FILES=("README.md" ".claude/tests/" ".github/workflows/hooks-ci.yml") # 末尾 / はディレクトリ配下すべてを対象にする TEAM_LAYER_FILES=( "docs/01_GUIDE/GUIDE_03_チーム開発ルール.md" ".claude/hooks/check_sync.sh" diff --git a/.claude/tests/test_mode_layers.py b/.claude/tests/test_mode_layers.py index f9fcbc0..224981d 100644 --- a/.claude/tests/test_mode_layers.py +++ b/.claude/tests/test_mode_layers.py @@ -176,6 +176,13 @@ "test_hooks.py が team 層扱いになっている: " + entry, ) + def test_hooks_ci_is_not_synced(self): + """フックの 3 OS CI(hooks-ci.yml)はテンプレート専用で,同期対象外として仕様の 2 箇所に載っている.""" + skip_files = re.search(r"SKIP_FILES=\((.*?)\)", read(SYNC_REFERENCE), flags=re.DOTALL) + self.assertIsNotNone(skip_files, "reference.md に SKIP_FILES の定義が見つからない") + self.assertIn(".github/workflows/hooks-ci.yml", re.findall(r'"([^"]+)"', skip_files.group(1))) + self.assertRegex(read(SYNC_SKILL), r"\|\s*`\.github/workflows/hooks-ci\.yml`\s*\|") + # --------------------------------------------------------------------------- # 本体: solo(team 層無し)では skip,team(有り)では実行される