spec-runner 1.1.13 → 1.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/package.json +1 -1
  2. package/spec-runner/templates/.claude/agents/design-reviewer.md +8 -8
  3. package/spec-runner/templates/.claude/agents/impact-analyzer.md +35 -11
  4. package/spec-runner/templates/.claude/rules/coding.md +11 -0
  5. package/spec-runner/templates/.claude/rules/design-docs.md +33 -16
  6. package/spec-runner/templates/.claude/rules/harness-formats.md +90 -0
  7. package/spec-runner/templates/.claude/settings.json +15 -0
  8. package/spec-runner/templates/.claude/skills/architecture-definition/SKILL.md +3 -3
  9. package/spec-runner/templates/.claude/skills/architecture-skill-development/SKILL.md +12 -7
  10. package/spec-runner/templates/.claude/skills/design-change/SKILL.md +13 -12
  11. package/spec-runner/templates/.claude/skills/docs-driven-seed/SKILL.md +140 -0
  12. package/spec-runner/templates/.claude/skills/docs-driven-seed/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/01_/343/203/211/343/203/241/343/202/244/343/203/263/{/343/203/211/343/203/241/343/202/244/343/203/263/345/220/215}.md +39 -0
  13. package/spec-runner/templates/.claude/skills/docs-driven-seed/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/02_/343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271/UC-{/346/227/245/346/234/254/350/252/236/345/220/215}.md +55 -0
  14. package/spec-runner/templates/.claude/skills/existing-project-to-docs/SKILL.md +12 -9
  15. package/spec-runner/templates/.claude/skills/harness-engineering/SKILL.md +4 -0
  16. package/spec-runner/templates/.claude/skills/test-driven-development/SKILL.md +104 -7
  17. package/spec-runner/templates/.github/agents/design-reviewer.agent.md +8 -8
  18. package/spec-runner/templates/.github/agents/impact-analyzer.agent.md +35 -11
  19. package/spec-runner/templates/.github/instructions/coding.instructions.md +11 -0
  20. package/spec-runner/templates/.github/instructions/design-docs.instructions.md +33 -16
  21. package/spec-runner/templates/.github/instructions/harness-formats.instructions.md +84 -0
  22. package/spec-runner/templates/.github/skills/architecture-definition/SKILL.md +3 -3
  23. package/spec-runner/templates/.github/skills/architecture-skill-development/SKILL.md +12 -7
  24. package/spec-runner/templates/.github/skills/design-change/SKILL.md +13 -12
  25. package/spec-runner/templates/.github/skills/docs-driven-seed/SKILL.md +140 -0
  26. package/spec-runner/templates/.github/skills/docs-driven-seed/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/01_/343/203/211/343/203/241/343/202/244/343/203/263/{/343/203/211/343/203/241/343/202/244/343/203/263/345/220/215}.md +39 -0
  27. package/spec-runner/templates/.github/skills/docs-driven-seed/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/02_/343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271/UC-{/346/227/245/346/234/254/350/252/236/345/220/215}.md +55 -0
  28. package/spec-runner/templates/.github/skills/existing-project-to-docs/SKILL.md +12 -9
  29. package/spec-runner/templates/.github/skills/harness-engineering/SKILL.md +4 -0
  30. package/spec-runner/templates/.github/skills/test-driven-development/SKILL.md +104 -7
  31. package/spec-runner/templates/.spec-runner/scripts/scan.js +156 -0
  32. package/spec-runner/templates/.claude/skills/plugin-development/SKILL.md +0 -173
  33. package/spec-runner/templates/.claude/skills/plugin-development/templates/01_/350/246/201/344/273/266/345/256/232/347/276/251//346/246/202/350/246/201/343/203/206/343/203/263/343/203/227/343/203/254/343/203/274/343/203/210.md +0 -88
  34. package/spec-runner/templates/.claude/skills/plugin-development/templates/02_/346/246/202/350/246/201/350/250/255/350/250/210/90_ADR/ADR/343/203/206/343/203/263/343/203/227/343/203/254/343/203/274/343/203/210.md +0 -81
  35. package/spec-runner/templates/.claude/skills/plugin-development/templates/02_/346/246/202/350/246/201/350/250/255/350/250/210//343/202/267/343/202/271/343/203/206/343/203/240/345/205/250/344/275/223/344/277/257/347/236/260/343/203/206/343/203/263/343/203/227/343/203/254/343/203/274/343/203/210.md +0 -80
  36. package/spec-runner/templates/.claude/skills/plugin-development/templates/02_/346/246/202/350/246/201/350/250/255/350/250/210//343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271/344/270/200/350/246/247/343/203/206/343/203/263/343/203/227/343/203/254/343/203/274/343/203/210.md +0 -57
  37. package/spec-runner/templates/.claude/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/infrastructure/aws.md +0 -53
  38. package/spec-runner/templates/.claude/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/infrastructure/database.md +0 -54
  39. package/spec-runner/templates/.claude/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/infrastructure/schema.dbml +0 -25
  40. package/spec-runner/templates/.claude/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/infrastructure/sequence//343/202/267/343/203/274/343/202/261/343/203/263/343/202/271/345/233/263/343/203/206/343/203/263/343/203/227/343/203/254/343/203/274/343/203/210.md +0 -28
  41. package/spec-runner/templates/.claude/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/src/agents/{agent_name}/agent.md +0 -56
  42. package/spec-runner/templates/.claude/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/src/agents/{agent_name}/config.md +0 -47
  43. package/spec-runner/templates/.claude/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/src/agents/{agent_name}/domain.md +0 -67
  44. package/spec-runner/templates/.claude/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/src/agents/{agent_name}/prompts.md +0 -72
  45. package/spec-runner/templates/.claude/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/src/plugins/skills/{skill_name}/skill.md +0 -53
  46. package/spec-runner/templates/.claude/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/src/plugins/tools/{tool_name}/tool.md +0 -51
  47. package/spec-runner/templates/.github/skills/plugin-development/SKILL.md +0 -173
  48. package/spec-runner/templates/.github/skills/plugin-development/templates/01_/350/246/201/344/273/266/345/256/232/347/276/251//346/246/202/350/246/201/343/203/206/343/203/263/343/203/227/343/203/254/343/203/274/343/203/210.md +0 -88
  49. package/spec-runner/templates/.github/skills/plugin-development/templates/02_/346/246/202/350/246/201/350/250/255/350/250/210/90_ADR/ADR/343/203/206/343/203/263/343/203/227/343/203/254/343/203/274/343/203/210.md +0 -81
  50. package/spec-runner/templates/.github/skills/plugin-development/templates/02_/346/246/202/350/246/201/350/250/255/350/250/210//343/202/267/343/202/271/343/203/206/343/203/240/345/205/250/344/275/223/344/277/257/347/236/260/343/203/206/343/203/263/343/203/227/343/203/254/343/203/274/343/203/210.md +0 -80
  51. package/spec-runner/templates/.github/skills/plugin-development/templates/02_/346/246/202/350/246/201/350/250/255/350/250/210//343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271/344/270/200/350/246/247/343/203/206/343/203/263/343/203/227/343/203/254/343/203/274/343/203/210.md +0 -57
  52. package/spec-runner/templates/.github/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/infrastructure/aws.md +0 -53
  53. package/spec-runner/templates/.github/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/infrastructure/database.md +0 -54
  54. package/spec-runner/templates/.github/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/infrastructure/schema.dbml +0 -25
  55. package/spec-runner/templates/.github/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/infrastructure/sequence//343/202/267/343/203/274/343/202/261/343/203/263/343/202/271/345/233/263/343/203/206/343/203/263/343/203/227/343/203/254/343/203/274/343/203/210.md +0 -28
  56. package/spec-runner/templates/.github/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/src/agents/{agent_name}/agent.md +0 -56
  57. package/spec-runner/templates/.github/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/src/agents/{agent_name}/config.md +0 -47
  58. package/spec-runner/templates/.github/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/src/agents/{agent_name}/domain.md +0 -67
  59. package/spec-runner/templates/.github/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/src/agents/{agent_name}/prompts.md +0 -72
  60. package/spec-runner/templates/.github/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/src/plugins/skills/{skill_name}/skill.md +0 -53
  61. package/spec-runner/templates/.github/skills/plugin-development/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/src/plugins/tools/{tool_name}/tool.md +0 -51
@@ -0,0 +1,55 @@
1
+ ---
2
+ spec_runner:
3
+ node_id: detail.usecase.{UC名}
4
+ kind: detailed_design
5
+ depends_on:
6
+ - overview.use_case_list
7
+ - detail.domain.{ドメイン名}
8
+ maps_to:
9
+ - src/application/{uc_name}/
10
+ - tests/application/{uc_name}/
11
+ ---
12
+
13
+ # UC-{UC名} 詳細設計
14
+
15
+ ## 概要
16
+
17
+ - 使用するドメイン: {ドメイン名}
18
+ - トリガー: {何がこのUCを呼び出すか}
19
+ - 事前条件: {UCが成立するために必要な状態}
20
+ - 事後条件: {UC完了後の状態}
21
+
22
+ ## 入出力
23
+
24
+ | 種別 | 名前 | 型 | 説明 |
25
+ |------|------|----|------|
26
+ | 入力 | {入力名} | {型} | {説明} |
27
+ | 出力 | {出力名} | {型} | {説明} |
28
+
29
+ ## 主要フロー
30
+
31
+ ```mermaid
32
+ sequenceDiagram
33
+ {シーケンス図}
34
+ ```
35
+
36
+ 1. {ステップ1}
37
+ 2. {ステップ2}
38
+
39
+ ## 判断条件
40
+
41
+ | 判断ポイント | 条件 | アクション |
42
+ |------------|------|----------|
43
+ | {判断ポイント} | {条件} | {アクション} |
44
+
45
+ ## エラーポリシー
46
+
47
+ | エラーケース | 発生条件 | 対応 |
48
+ |------------|---------|------|
49
+ | {エラーケース} | {発生条件} | {対応} |
50
+
51
+ ## テスト観点
52
+
53
+ - {正常系の観点}
54
+ - {異常系の観点}
55
+ - {境界条件の観点}
@@ -27,22 +27,25 @@ Phase 5: architecture contract 化
27
27
 
28
28
  ## Phase 2: 要件とユースケースの抽出
29
29
 
30
- 1. 既存機能からユースケースを逆算する
30
+ 1. `current-system-inventory.md` を起点に、既存機能からユースケースを逆算する
31
31
  2. `docs/01_要件定義/要件定義.md` と `docs/02_概要設計/ユースケース一覧.md` の draft を作る
32
- 3. ユーザーに確認・承認を得る
32
+ 3. ドメイン用語が識別できたら `docs/01_要件定義/ユビキタス言語辞書.md` も draft する
33
+ 4. ユーザーに確認・承認を得る
33
34
 
34
35
  ## Phase 3: 概要設計の draft 化
35
36
 
36
- 1. `docs/02_概要設計/システム全体俯瞰.md` を作る
37
- 2. 必要なら ADR 候補も洗い出す
38
- 3. ユーザーに確認・承認を得る
37
+ 1. UC から集約・境界コンテキストを整理し `docs/02_概要設計/ドメインモデル.md` を draft する
38
+ 2. `docs/02_概要設計/システム全体俯瞰.md` を作る
39
+ 3. 必要なら ADR 候補も洗い出す(配置先は `90_ADR/全体/` / `ドメイン/` / `UC/` / `DB/`)
40
+ 4. ユーザーに確認・承認を得る
39
41
 
40
42
  ## Phase 4: 詳細設計の draft 化
41
43
 
42
- 1. `docs/03_詳細設計/src/**``src/` ミラーで作る
43
- 2. `maps_to` に対応コードとテストを入れる
44
- 3. 補助設計が必要なら `docs/03_詳細設計/infrastructure/**` を作る
45
- 4. ユーザーに確認・承認を得る
44
+ 1. ドメインごとにビジネスルール・集約を整理し `docs/03_詳細設計/01_ドメイン/{ドメイン名}.md`draft する
45
+ 2. UC ごとに `docs/03_詳細設計/02_ユースケース/UC-{日本語名}.md` を draft する
46
+ 3. DB・外部サービスの仕様が必要なら `docs/03_詳細設計/03_DB・外部サービス/` を作る
47
+ 4. 各ファイルの `maps_to` に対応コードとテストを入れる
48
+ 5. ユーザーに確認・承認を得る
46
49
 
47
50
  ## Phase 5: architecture contract 化
48
51
 
@@ -68,6 +68,8 @@ Phase 4: 影響範囲の反映確認
68
68
 
69
69
  ## Phase 3: skill / rule / agent / template の修正
70
70
 
71
+ ファイルを作成・修正する前に **`.claude/rules/harness-formats.md`** を読み、フォーマットを確認する。
72
+
71
73
  1. 対象ファイルを特定する
72
74
  2. 意図が変わらない最小差分で修正する
73
75
  3. 片系だけでなく、対応するテンプレートも揃えて更新する
@@ -91,6 +93,8 @@ Phase 4: 影響範囲の反映確認
91
93
  - Claude / Copilot の対応ファイルに反映漏れがないか
92
94
  - 今回限りのノイズをルール化していないか
93
95
  - skill 名・起動条件・使いどころを変更した場合、`CLAUDE.md` の記述と一致しているか
96
+ - `CLAUDE.md` が肥大化していないか(20行超えたら `rules/` や `skills/` へ移動を検討する)
97
+ - docs 構造・命名規則・node_id 体系に影響する変更の場合、`design-docs.md` と整合しているか
94
98
 
95
99
  ## 原則
96
100
 
@@ -26,13 +26,89 @@ description: 新機能実装やバグ修正を行う際、実装コードを書
26
26
  テストより先にコードを書いたなら削除して最初からやり直す。
27
27
  「参考として残す」も「テストを書きながら適応させる」も不可。
28
28
 
29
+ ## テスト戦略:テストピラミッド
30
+
31
+ 実装前にどのテスト種別を書くかを決める。迷ったら**単体テストから始める**。
32
+
33
+ ```
34
+ /\
35
+ /E2E\ 少数・遅い・ユーザーシナリオ全体
36
+ /------\
37
+ / 結合 \ 中程度・モジュール間連携・外部境界
38
+ /----------\
39
+ / 単体 \ 多数・高速・関数・クラス単位
40
+ /______________\
41
+ ```
42
+
43
+ ### 単体テスト(Unit)
44
+
45
+ **対象:** 関数・クラス・モジュールの振る舞い(外部依存なし)
46
+
47
+ **書くとき:**
48
+ - ビジネスロジック・計算・変換処理
49
+ - エラー処理・バリデーション
50
+ - 状態変化(純粋関数・値オブジェクト)
51
+
52
+ **外部依存の扱い:** 実際に遅い・副作用がある依存のみモック。それ以外は実物を使う。
53
+
54
+ **速度目安:** ミリ秒単位。CI で毎回全件実行できる。
55
+
56
+ ### 結合テスト(Integration)
57
+
58
+ **対象:** 複数モジュールの連携、DB・キャッシュ・外部APIとの境界
59
+
60
+ **書くとき:**
61
+ - DB へのクエリ・永続化
62
+ - 外部サービス呼び出し(HTTP, メッセージキュー等)
63
+ - 複数の集約をまたぐユースケース
64
+
65
+ **外部依存の扱い:** 原則として実物を使う(テスト用 DB、テスト環境の外部サービス)。
66
+ 動かせない外部サービスのみスタブ/フェイクで代替する。
67
+
68
+ **速度目安:** 秒単位。PR ごとに実行できる。
69
+
70
+ ### E2E テスト
71
+
72
+ **対象:** ユーザーが実際に操作するシナリオ全体(UI から DB まで)
73
+
74
+ **書くとき:**
75
+ - 最重要のユーザーシナリオ(ハッピーパス)
76
+ - リグレッションが致命的な機能(決済・認証等)
77
+
78
+ **数を絞る:** E2E は維持コストが高い。書く前に「単体+結合で代替できないか?」を問う。
79
+
80
+ **速度目安:** 分単位。夜間や本番リリース前など頻度を落として実行。
81
+
82
+ ## テスト種別の選び方
83
+
84
+ | 実装するもの | まず書くテスト | 追加で書くテスト |
85
+ |---|---|---|
86
+ | ロジック・計算 | 単体 | — |
87
+ | DB 操作 | 結合 | — |
88
+ | API エンドポイント | 結合 | 主要シナリオは E2E |
89
+ | 複数サービスをまたぐフロー | 結合 | — |
90
+ | ユーザー向け主要機能 | 単体+結合 | E2E(絞る) |
91
+ | バグ修正 | 最小レベルで再現テスト | — |
92
+
93
+ **バグ修正の場合:** バグを再現できる最も低いレベルのテストを書く。
94
+ 単体で再現できるなら単体、DBが絡むなら結合。E2E で初めて再現するバグは、単体・結合に落とし込めないか検討する。
95
+
29
96
  ## テスト実行コマンド
30
97
 
31
98
  > このスキルはテンプレートとして配布されます。
32
99
  > `architecture-skill-development` を使ってプロジェクト固有のコマンドに書き換えてください。
33
100
 
34
101
  ```bash
35
- # 全テスト(プロジェクトのテストコマンドに置き換える)
102
+ # 単体テスト(高速・毎回実行)
103
+ <your-unit-test-command>
104
+
105
+ # 結合テスト
106
+ <your-integration-test-command>
107
+
108
+ # E2E テスト
109
+ <your-e2e-test-command>
110
+
111
+ # 全テスト
36
112
  <your-test-command>
37
113
 
38
114
  # 特定ファイル
@@ -46,7 +122,7 @@ description: 新機能実装やバグ修正を行う際、実装コードを書
46
122
 
47
123
  ### RED - 失敗するテストを書く
48
124
 
49
- 起きてほしいことを示す、最小のテストを1つ書く。
125
+ テスト種別を決めたうえで、起きてほしいことを示す最小のテストを1つ書く。
50
126
 
51
127
  ```
52
128
  // 例(言語・フレームワークはプロジェクトに合わせる)
@@ -93,7 +169,7 @@ test("ある入力に対して期待する出力を返す", () => {
93
169
  `@test-runner` エージェントに委任して実行する。
94
170
 
95
171
  - テストが通る
96
- - **他のテストも全て通る**
172
+ - **同種のテストが全て通る**(単体なら単体全件、結合なら結合全件)
97
173
  - 出力がクリーン(エラー、警告なし)
98
174
  - **カバレッジの未カバー行を確認** — 新規コードが未カバーなら追加テストを書く
99
175
 
@@ -122,18 +198,34 @@ GREEN / REFACTORフェーズで書く実装コードにもビジネスロジッ
122
198
 
123
199
  ## テスト構成
124
200
 
125
- テストファイルは `src/` と同じディレクトリ構造を `tests/` に鏡写しにする。
201
+ ```
202
+ tests/
203
+ unit/ # 単体テスト(src/ と同じ構造を鏡写し)
204
+ integration/ # 結合テスト
205
+ e2e/ # E2E テスト
206
+ ```
207
+
208
+ テストファイルは `src/` と同じディレクトリ構造を各テスト種別のディレクトリ内に鏡写しにする。
126
209
 
127
210
  ## fixture / テストデータの活用
128
211
 
129
212
  - テストごとに独立した状態を持つ
130
213
  - テストデータ生成にはヘルパ関数を定義して一貫性を保つ
131
214
  - 外部サービス(API・メール・ストレージ等)は必要な場合のみモックする
215
+ - 結合テスト用のシードデータは `tests/integration/fixtures/` に置く
132
216
 
133
217
  ## モックのルール
134
218
 
135
219
  モックは分離の手段であり、テスト対象ではない。
136
220
 
221
+ **テスト種別ごとのモック方針:**
222
+
223
+ | テスト種別 | 原則 |
224
+ |---|---|
225
+ | 単体 | 外部 I/O(DB・HTTP・ファイル)のみモック可。ビジネスロジックはモックしない |
226
+ | 結合 | 実物の外部依存を使う。動かせない外部サービスのみスタブ可 |
227
+ | E2E | モックしない。全て実物 |
228
+
137
229
  **モック前の自問:**
138
230
  1. 「実メソッドにはどんな副作用があるか?」
139
231
  2. 「このテストはその副作用に依存しているか?」
@@ -168,6 +260,8 @@ GREEN / REFACTORフェーズで書く実装コードにもビジネスロジッ
168
260
  | テスト前にコードを書いた | コードを削除し、TDDで最初からやり直す |
169
261
  | テストが最初から通る | 既存挙動をテストしている。テストを修正する |
170
262
  | なぜ失敗したか説明できない | テストが正しいか再検討する |
263
+ | 全部 E2E で書いた | ピラミッドが逆転している。単体・結合に落とし込む |
264
+ | 全部モックだらけ | 結合が強すぎる。または結合テストを書くべき |
171
265
 
172
266
  **どれか1つでも当てはまるなら: コードを削除し、TDDで最初からやり直す。**
173
267
 
@@ -180,14 +274,15 @@ GREEN / REFACTORフェーズで書く実装コードにもビジネスロジッ
180
274
 
181
275
  完了宣言の前に:
182
276
 
277
+ - [ ] 実装前にテスト種別(単体・結合・E2E)を決めた
183
278
  - [ ] 新規関数/メソッドにテストがある
184
279
  - [ ] 各テストは実装前に失敗するのを見た
185
280
  - [ ] 期待通りの理由で失敗した(機能不足であり誤字ではない)
186
281
  - [ ] 通す最小コードを書いた
187
- - [ ] 全テストが通る
282
+ - [ ] 同種のテストが全件通る
188
283
  - [ ] 出力がクリーン(エラー、警告なし)
189
284
  - [ ] カバレッジを確認し、新規コードの未カバー行がない
190
- - [ ] 実コード中心(不可避な場合のみモック)
285
+ - [ ] モック方針がテスト種別に合っている
191
286
  - [ ] エッジケースとエラーをカバーした
192
287
 
193
288
  すべてにチェックできないならTDDを飛ばしている。やり直すこと。
@@ -197,9 +292,11 @@ GREEN / REFACTORフェーズで書く実装コードにもビジネスロジッ
197
292
  | 問題 | 解決 |
198
293
  |------|------|
199
294
  | どうテストすべきか分からない | 望むAPIを書き、まずアサーションを書く。ユーザーに相談する |
295
+ | どのテスト種別か迷う | 単体から始める。単体で書けないなら結合を検討する |
200
296
  | テストが複雑すぎる | 設計が複雑すぎる。インターフェースを簡素化する |
201
- | 何でもモック必須 | 結合が強すぎる。依存性注入を使う |
297
+ | 何でもモック必須 | 結合が強すぎる。依存性注入を使う。または結合テストで書く |
202
298
  | セットアップが巨大 | fixtureやテストユーティリティに抽出する。それでも大きいなら設計を簡素化する |
299
+ | E2E が遅すぎる | 単体・結合に落とし込めるか検討する |
203
300
 
204
301
  ## 最終ルール
205
302
 
@@ -11,12 +11,12 @@ docs/ 配下の設計書と src/ 配下の実装コードを突合し、乖離
11
11
 
12
12
  ## 手順
13
13
 
14
- 1. docs/ 配下の設計書ファイルを一覧取得する
14
+ 1. `docs/` 配下の設計書ファイルを一覧取得する
15
15
  2. 各設計書の frontmatter を読み、`spec_runner.node_id` / `kind` / `depends_on` / `maps_to` を確認する
16
- 3. `docs/02_概要設計/**` は上位設計として扱い、ユースケース・責務・外部 IF・非機能方針が実装に反映されているか確認する
17
- 4. `docs/03_詳細設計/src/**` `maps_to` で対応先コードを特定し、責務・入出力・判断条件・テスト観点を比較する
18
- 5. `docs/03_詳細設計/infrastructure/**` などの例外文書も `maps_to` を起点に IaC / 設定 / DB 定義と比較する
19
- 6. 乖離を報告する
16
+ 3. `docs/02_概要設計/**` の各ファイルを読む。ユースケース・責務・外部 IF が実装に反映されているか確認するために、`maps_to` から対応する `src/` ファイルを特定して実際に読んで比較する
17
+ 4. `docs/03_詳細設計/**` の各ファイルを読む。`maps_to` に列挙された `src/` / `tests/` ファイルを**実際に読み**、責務・入出力・判断条件・テスト観点を設計書と行レベルで比較する
18
+ - `maps_to` が空または未設定の場合はフロントマターの問題として報告する(パス推定は行わない)
19
+ 5. 乖離を報告する
20
20
 
21
21
  ## チェック項目
22
22
 
@@ -28,13 +28,13 @@ docs/ 配下の設計書と src/ 配下の実装コードを突合し、乖離
28
28
 
29
29
  ### 概要設計
30
30
 
31
- - **ユースケース整合**: `ユースケース一覧.md` と個別 UC が実装のエンドポイント・コマンド・画面遷移と一致しているか
31
+ - **ユースケース整合**: `ユースケース一覧.md` の各 UC が実装のエンドポイント・コマンド・画面遷移と一致しているか
32
32
  - **全体俯瞰**: `システム全体俯瞰.md` の責務分割・連携フロー・外部 IF が実装構造と一致しているか
33
33
  - **ADR 反映**: `docs/02_概要設計/90_ADR/**` の採用方針が概要設計・詳細設計に反映されているか
34
34
 
35
35
  ### 詳細設計
36
36
 
37
- - **責務整合**: `docs/03_詳細設計/src/**` の責務記述が対応コードの責務と一致しているか
37
+ - **責務整合**: `docs/03_詳細設計/**` の責務記述が `maps_to` 先コードの責務と一致しているか
38
38
  - **入出力整合**: 関数シグネチャ、設定値、エラー処理、外部依存の扱いが設計どおりか
39
39
  - **テスト整合**: `maps_to` に含まれる `tests/**` が設計上の主要シナリオをカバーしているか
40
40
  - **不足 / 過剰**: 設計書にあるがコードにない、またはコードにあるが設計書にない要素があるか
@@ -62,4 +62,4 @@ docs/ 配下の設計書と src/ 配下の実装コードを突合し、乖離
62
62
  - 読み取り専用(コードや設計書の変更は行わない)
63
63
  - 日本語で報告する
64
64
  - ADR はコードと 1 対 1 の突合対象ではないが、配置先と反映有無は確認する
65
- - hard code のパス推定より frontmatter の `maps_to` を優先する
65
+ - `maps_to` を唯一の参照先とする。パス推定は行わない
@@ -1,25 +1,44 @@
1
1
  ---
2
2
  name: impact-analyzer
3
- description: design-change で影響範囲を調査するときに呼ぶ。変更対象の node_id またはファイルパスを受け取り、docs/ 全体の frontmatter を走査して depends_on / maps_to で連鎖する影響ファイルを一覧化する。
4
- tools: Read, Grep, Glob
3
+ description: design-change で影響範囲を調査するときに呼ぶ。変更対象の node_id またはファイルパスを受け取り、.spec-runner/scan/graph.json のキャッシュを参照して影響ファイルを一覧化し、maps_to の参照整合性も報告する。
4
+ tools: Bash
5
5
  model: sonnet
6
6
  ---
7
7
 
8
8
  # 影響範囲分析エージェント
9
9
 
10
- 変更対象の docs ノードを起点に、frontmatter の `depends_on` / `maps_to` を辿って影響を受けるファイルを一覧化する。
10
+ `.spec-runner/scan/graph.json`(`scan.js` が生成するキャッシュ)を読み、変更対象の node_id から連鎖する影響ファイルを一覧化する。
11
11
 
12
12
  ## 入力
13
13
 
14
- - 変更対象の `node_id`(例: `usecase.order_registration`)またはファイルパス
14
+ - 変更対象の `node_id`(例: `detail.usecase.order_registration`)またはファイルパス
15
15
 
16
16
  ## 手順
17
17
 
18
- 1. `docs/` 配下の全 `.md` ファイルの frontmatter を読む
19
- 2. `depends_on` に入力の node_id を含むファイルを「直接影響」として収集する
20
- 3. 収集したファイルの node_id を起点に同じ検索を繰り返す(2階層まで)
21
- 4. `maps_to` に入力の node_id を含む `src/` / `tests/` ファイルを「実装影響」として収集する
22
- 5. 結果を一覧化する
18
+ ### 1. グラフキャッシュの確認・更新
19
+
20
+ ```bash
21
+ node .spec-runner/scripts/scan.js
22
+ ```
23
+
24
+ キャッシュが古い場合や存在しない場合は再生成する。
25
+
26
+ ### 2. 影響範囲をグラフから取得
27
+
28
+ ```bash
29
+ node -e "
30
+ const g = require('./.spec-runner/scan/graph.json');
31
+ const id = '{node_id}';
32
+ const node = g.nodes[id] || {};
33
+ const direct = g.reverse_index[id] || [];
34
+ const indirect = [...new Set(
35
+ direct.flatMap(n => g.reverse_index[n] || []).filter(n => !direct.includes(n) && n !== id)
36
+ )];
37
+ console.log(JSON.stringify({ node, direct: direct.map(n => ({id: n, ...g.nodes[n]})), indirect: indirect.map(n => ({id: n, ...g.nodes[n]})), missing: g.missing_maps_to }, null, 2));
38
+ "
39
+ ```
40
+
41
+ ### 3. 結果を一覧化して報告する
23
42
 
24
43
  ## 報告フォーマット
25
44
 
@@ -29,8 +48,9 @@ model: sonnet
29
48
  ### 起点
30
49
  - node_id: {node_id}
31
50
  - ファイル: {ファイルパス}
51
+ - kind: {kind}
32
52
 
33
- ### 直接影響(depends_on で参照)
53
+ ### 直接影響(1階層目)
34
54
  - [ファイルパス] — node_id: {node_id}, kind: {kind}
35
55
 
36
56
  ### 間接影響(2階層目)
@@ -39,6 +59,10 @@ model: sonnet
39
59
  ### 実装影響(maps_to で対応)
40
60
  - [src/ または tests/ のファイルパス]
41
61
 
62
+ ### maps_to 整合性チェック
63
+ - OK: 全参照ファイルが存在する
64
+ - MISSING: {missing} — {source} ({node_id}) に記載されているが存在しない
65
+
42
66
  ### 影響なし(確認済みで変更不要)
43
67
  - [ファイルパス] — 理由: {理由}
44
68
  ```
@@ -47,5 +71,5 @@ model: sonnet
47
71
 
48
72
  - 読み取り専用(ファイルの変更は行わない)
49
73
  - 日本語で報告する
50
- - frontmatter が存在しないファイルはスキップする
74
+ - graph.json が存在しない場合は scan.js を実行してから進む
51
75
  - 影響ファイルが多い場合は kind 別にグループ化する
@@ -23,6 +23,7 @@ applyTo: "src/**,tests/**"
23
23
  - **言語**: 日本語
24
24
  - **docstring**: モジュール先頭に1行で概要を書く。関数・クラスには原則不要(名前で意図が伝わる場合)
25
25
  - **インラインコメント**: ビジネスロジックの「なぜ」を説明する場合のみ。処理内容の「何」は書かない
26
+ - **変更履歴コメント禁止**: `# 新機能追加`, `# ここを修正`, `# v2 で変更` のような変更経緯はコードに書かない。git の commit message で管理する
26
27
 
27
28
  ```python
28
29
  # 良い例
@@ -88,6 +89,16 @@ truncated_json = '[{"account_name": "売掛金", ...'
88
89
 
89
90
  - **英語コメント禁止**: `Arrange` / `Act` / `Assert` 等の英語は使わない
90
91
 
92
+ ## 後方互換ハックの禁止
93
+
94
+ 使われなくなったコードは完全に削除する。互換性維持のための温存は行わない。
95
+
96
+ 禁止パターン:
97
+ - 未使用の引数・変数を `_` プレフィックスで残す(`_old_param`)
98
+ - 削除した型・関数を `from x import Y` で再公開する
99
+ - `# removed`, `# deprecated`, `# 旧実装` コメントとともにコードを残す
100
+ - 後方互換用のラッパー関数・エイリアスを追加する
101
+
91
102
  ## 検索ルール
92
103
 
93
104
  - コードの検索・置換は `src/` と `tests/` の両方を対象にする
@@ -19,44 +19,61 @@ applyTo: "docs/**"
19
19
  - **`docs/**` の全設計書に frontmatter を付ける**
20
20
  - 正本の必須項目は `spec_runner.node_id` / `spec_runner.kind` / `spec_runner.depends_on` / `spec_runner.maps_to`
21
21
  - `depends_on` はまず文字列配列でよい。依存理由が必要な場合のみオブジェクト形式を使う
22
- - `maps_to` には見直し対象となる `src/` / `tests/` / IaC / 設定ファイルを列挙する
22
+ - `maps_to` には見直し対象となる `src/` / `tests/` / IaC / 設定ファイルを列挙する。**必ず設定する(空にしない)**
23
23
  - `modules` / `source_files` などの拡張項目を足す場合でも、`maps_to` と矛盾させない
24
24
 
25
25
  ```yaml
26
26
  ---
27
27
  spec_runner:
28
- node_id: detail.src.agents.reconciliation.agent
28
+ node_id: detail.usecase.注文確定
29
29
  kind: detailed_design
30
30
  depends_on:
31
- - overview.system_context
32
- - use_case.reconciliation.list
31
+ - overview.use_case_list
32
+ - detail.domain.注文
33
33
  maps_to:
34
- - src/agents/reconciliation/agent.py
35
- - tests/agents/reconciliation/test_agent.py
34
+ - src/application/order/confirm.py
35
+ - src/domain/order/aggregate.py
36
+ - tests/application/order/test_confirm.py
36
37
  ---
37
38
  ```
38
39
 
40
+ ### node_id 体系
41
+
42
+ | 対象 | node_id 形式 | 例 |
43
+ |------|-------------|-----|
44
+ | 要件定義 | `requirement.{名前}` | `requirement.要件定義` |
45
+ | システム全体俯瞰 | `overview.system_context` | — |
46
+ | ドメインモデル | `overview.domain_model` | — |
47
+ | ユースケース一覧 | `overview.use_case_list` | — |
48
+ | ADR | `overview.adr.{slug}` | `overview.adr.0404-ドメイン-注文集約` |
49
+ | ドメイン詳細設計 | `detail.domain.{ドメイン名}` | `detail.domain.注文` |
50
+ | UC 詳細設計 | `detail.usecase.{UC名}` | `detail.usecase.注文確定` |
51
+ | DB・外部サービス | `detail.db.{名前}` | `detail.db.スキーマ定義` |
52
+
39
53
  ## 命名規則
40
54
 
41
55
  | 対象 | 規則 | 例 |
42
56
  |------|------|-----|
43
- | `docs/01_要件定義` | 日本語 | `要件定義.md` |
44
- | `docs/02_概要設計` | 日本語 | `ユースケース一覧.md`, `システム全体俯瞰.md` |
45
- | `docs/02_概要設計/ユースケース` | `UC-{日本語名}.md` | `UC-差異一覧表示.md` |
46
- | `docs/02_概要設計/90_ADR` | `mmdd-{日本語タイトル}.md` | `0404-詳細設計をsrcミラーにする.md` |
47
- | `docs/03_詳細設計/src/**` | `src/` に合わせた英語 `snake_case` | `agent.md`, `domain.md`, `skill.md` |
48
- | `docs/03_詳細設計/infrastructure/**` | 対応先に合わせる。例外で置く場合も `maps_to` 必須 | `database.md`, `schema.dbml` |
57
+ | `docs/01_要件定義` | 日本語 | `要件定義.md`, `ユビキタス言語辞書.md` |
58
+ | `docs/02_概要設計` | 日本語 | `ユースケース一覧.md`, `システム全体俯瞰.md`, `ドメインモデル.md` |
59
+ | `docs/02_概要設計/90_ADR/{対象}/` | `mmdd-{日本語タイトル}.md` | `0404-注文集約の設計.md` |
60
+ | `{対象}` の選択肢 | `全体` / `ドメイン` / `UC` / `DB` | — |
61
+ | `docs/03_詳細設計/01_ドメイン` | 日本語 | `注文.md`, `在庫.md` |
62
+ | `docs/03_詳細設計/02_ユースケース` | `UC-{日本語名}.md` | `UC-注文確定.md` |
63
+ | `docs/03_詳細設計/03_DB・外部サービス` | 日本語 | `スキーマ定義.dbml`, `外部サービス.md` |
49
64
 
50
65
  ## ADR
51
66
 
52
67
  - **ADR は必ず 3 案を比較してから採用案を決める**
53
- - ADR は原則 `docs/02_概要設計/90_ADR/` に置く
54
- - ドメインローカル ADR が必要な場合だけ `docs/02_概要設計/<ドメイン>/90_ADR/` を使う
68
+ - ADR `docs/02_概要設計/90_ADR/{対象}/` で管理する(`全体` / `ドメイン` / `UC` / `DB`)
69
+ - ファイル名は `mmdd-{日本語タイトル}.md`。対象はフォルダで表す
55
70
  - ADR は理由の記録であり、詳細設計の代わりにしない
71
+ - 廃止 UC の理由も ADR に記録する(UC ファイル本体は削除)
56
72
 
57
73
  ## 文書品質
58
74
 
59
75
  - **概要設計では「何をするか」を書き、コード片・DDL・クラス定義は持ち込まない**
60
- - **詳細設計では `src/` に対応する責務・入出力・判断条件・テスト観点を書く**
61
- - **`docs/03_詳細設計` は原則 `src/` ミラーにする。例外文書は `maps_to` で根拠を残す**
76
+ - **詳細設計ではドメインルール・UC の責務・入出力・判断条件・テスト観点を書く。コード・プロンプト本文は書かない**
77
+ - **`maps_to` を唯一の src 対応として使う。パス推定に頼らない**
62
78
  - **Markdown に HTML タグ(details, summary, br など)を使わない**
79
+ - **`概要.md` のような汎用的な名前のファイルは作らない。内容を具体的に示す名前(`要件定義.md`、`ユースケース一覧.md`、`システム全体俯瞰.md` など)を使う**
@@ -0,0 +1,84 @@
1
+ ---
2
+ applyTo: "**"
3
+ ---
4
+
5
+ # ハーネスファイルフォーマット
6
+
7
+ `harness-engineering` や `architecture-skill-development` で rules / agents / skills を作成・修正するときは、このフォーマットに従う。
8
+
9
+ ## rule ファイル(`.github/instructions/*.instructions.md`)
10
+
11
+ ```markdown
12
+ ---
13
+ applyTo: "対象パス/**" # 省略すると "**"(全ファイルに適用)
14
+ ---
15
+
16
+ # ルール名
17
+
18
+ 本文...
19
+ ```
20
+
21
+ - 対応する `.claude/rules/{name}.md` も同時に作成・更新する
22
+
23
+ ## agent ファイル(`.github/agents/*.agent.md`)
24
+
25
+ ```markdown
26
+ ---
27
+ name: agent-name
28
+ description: いつ・何のために呼ぶかを具体的に書く(トリガー型)
29
+ tools: Read, Grep, Glob # 必要最小限のツールだけ付与
30
+ model: sonnet
31
+ ---
32
+
33
+ # エージェント名
34
+
35
+ 本文...
36
+ ```
37
+
38
+ - `description` はトリガー型で書く(「〇〇のときに自動で呼ぶ」形式)
39
+ - `tools` は最小権限原則。読み取りのみなら `Read, Grep, Glob`
40
+ - 対応する `.claude/agents/{name}.md` も同時に作成・更新する
41
+
42
+ ## skill ファイル(`.github/skills/{name}/SKILL.md`)
43
+
44
+ ```markdown
45
+ ---
46
+ name: skill-name
47
+ description: このスキルの目的と使うタイミング(1〜2行)
48
+ ---
49
+
50
+ # スキル名
51
+
52
+ 本文...
53
+ ```
54
+
55
+ - 対応する `.claude/skills/{name}/SKILL.md` も同時に作成・更新する
56
+
57
+ ## CLAUDE.md
58
+
59
+ CLAUDE.md は**全会話で常にコンテキストに読み込まれる**。書くほどコストが増えるため、最小に保つ。
60
+
61
+ ### 書いてよいもの
62
+
63
+ - よく使う skill の名前と起動タイミング(開発ワークフローの入口)
64
+ - プロジェクト全体に常時適用すべき制約(例: 言語、承認フロー)
65
+
66
+ ### 書いてはいけないもの(代わりの置き場所)
67
+
68
+ | 内容 | 正しい置き場所 |
69
+ |------|--------------|
70
+ | コーディング規約の詳細 | `.github/instructions/coding.instructions.md` |
71
+ | フォーマット定義・手順 | `.github/instructions/*.instructions.md` |
72
+ | スキルの詳細フロー | `.github/skills/*/SKILL.md` |
73
+ | 過去の決定・背景 | `docs/02_概要設計/90_ADR/` |
74
+
75
+ ### 目安
76
+
77
+ - 20行を超えたら見直しを検討する
78
+ - 新しい内容を追加する前に「instructions / skills に移せないか」を先に考える
79
+
80
+ ## 共通原則
81
+
82
+ - `.claude/` と `.github/` は常に対で更新する(片系だけ更新しない)
83
+ - `description` は「何をするか」より「**いつ・なぜ使うか**」を優先して書く
84
+ - 新規作成時は既存ファイルを参考にフォーマットを確認してから作る
@@ -28,14 +28,14 @@ Phase 5: 次の skill へ引き渡し
28
28
  ## Phase 2: 概要設計の骨格作成
29
29
 
30
30
  1. `docs/02_概要設計/ユースケース一覧.md` を作る
31
- 2. `docs/02_概要設計/システム全体俯瞰.md` を作る
32
- 3. 必要に応じて `ユースケース/`、`外部IF一覧.md`、`非機能・運用方針.md` を追加する
31
+ 2. UC から集約・境界コンテキストを整理し `docs/02_概要設計/ドメインモデル.md` を作る
32
+ 3. `docs/02_概要設計/システム全体俯瞰.md` を作る
33
33
  4. ユーザーに確認・承認を得る
34
34
 
35
35
  ## Phase 3: アーキテクチャ判断の明文化
36
36
 
37
37
  1. ドメイン分割、責務境界、実装単位、インフラ方針を整理する
38
- 2. 必要なら `docs/02_概要設計/90_ADR/` ADR を作る
38
+ 2. 必要なら対象フォルダに ADR を作る(`90_ADR/全体/` / `ドメイン/` / `UC/` / `DB/`)
39
39
  3. ユーザーに確認・承認を得る
40
40
 
41
41
  ## Phase 4: architecture contract 作成