spec-runner 1.4.1 → 1.5.0

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 (55) hide show
  1. package/package.json +1 -1
  2. package/spec-runner/templates/{.github/agents/impact-analyzer.agent.md → .claude/agents/analyze-impact.md} +5 -7
  3. package/spec-runner/templates/.claude/agents/{code-reviewer.md → review-code.md} +3 -5
  4. package/spec-runner/templates/{.github/agents/design-reviewer.agent.md → .claude/agents/review-design.md} +11 -11
  5. package/spec-runner/templates/.claude/agents/{test-runner.md → run-tests.md} +4 -8
  6. package/spec-runner/templates/.claude/rules/agent-delegation.md +31 -0
  7. package/spec-runner/templates/.claude/rules/{coding.md → code-style.md} +15 -4
  8. package/spec-runner/templates/.claude/rules/design-docs.md +4 -4
  9. package/spec-runner/templates/.claude/rules/{testing.md → test-config.md} +1 -1
  10. package/spec-runner/templates/.claude/skills/architecture-definition/SKILL.md +10 -19
  11. package/spec-runner/templates/.claude/skills/architecture-skill-development/SKILL.md +14 -51
  12. package/spec-runner/templates/.claude/skills/{docs-driven-seed → ddd-seed}/SKILL.md +4 -17
  13. package/spec-runner/templates/.claude/skills/design-change/SKILL.md +12 -25
  14. package/spec-runner/templates/.claude/skills/design-change/references//345/275/261/351/237/277/347/257/204/345/233/262/343/203/201/343/202/247/343/203/203/343/202/257/343/203/252/343/202/271/343/203/210.md +1 -1
  15. package/spec-runner/templates/.claude/skills/existing-project-to-docs/SKILL.md +10 -18
  16. package/spec-runner/templates/.claude/skills/harness-engineering/SKILL.md +6 -45
  17. package/spec-runner/templates/.claude/{rules/harness-formats.md → skills/harness-engineering/references/harness-format.md} +10 -4
  18. package/spec-runner/templates/.claude/skills/simple-seed/SKILL.md +1 -10
  19. package/spec-runner/templates/.claude/skills/spec-probe/SKILL.md +12 -0
  20. package/spec-runner/templates/.claude/skills/test-driven-development/SKILL.md +34 -172
  21. package/spec-runner/templates/{.claude/agents/impact-analyzer.md → .github/agents/analyze-impact.agent.md} +5 -7
  22. package/spec-runner/templates/.github/agents/{code-reviewer.agent.md → review-code.agent.md} +3 -5
  23. package/spec-runner/templates/{.claude/agents/design-reviewer.md → .github/agents/review-design.agent.md} +11 -11
  24. package/spec-runner/templates/.github/agents/{test-runner.agent.md → run-tests.agent.md} +4 -8
  25. package/spec-runner/templates/.github/instructions/agent-delegation.instructions.md +31 -0
  26. package/spec-runner/templates/.github/instructions/{coding.instructions.md → code-style.instructions.md} +17 -5
  27. package/spec-runner/templates/.github/instructions/design-docs.instructions.md +3 -3
  28. package/spec-runner/templates/.github/skills/architecture-definition/SKILL.md +10 -19
  29. package/spec-runner/templates/.github/skills/architecture-skill-development/SKILL.md +14 -51
  30. package/spec-runner/templates/.github/skills/{docs-driven-seed → ddd-seed}/SKILL.md +4 -17
  31. package/spec-runner/templates/.github/skills/design-change/SKILL.md +12 -25
  32. package/spec-runner/templates/.github/skills/design-change/references//345/275/261/351/237/277/347/257/204/345/233/262/343/203/201/343/202/247/343/203/203/343/202/257/343/203/252/343/202/271/343/203/210.md +1 -1
  33. package/spec-runner/templates/.github/skills/existing-project-to-docs/SKILL.md +12 -20
  34. package/spec-runner/templates/.github/skills/harness-engineering/SKILL.md +8 -47
  35. package/spec-runner/templates/.github/{instructions/harness-formats.instructions.md → skills/harness-engineering/references/harness-format.md} +9 -3
  36. package/spec-runner/templates/.github/skills/simple-seed/SKILL.md +1 -10
  37. package/spec-runner/templates/.github/skills/spec-probe/SKILL.md +12 -0
  38. package/spec-runner/templates/.github/skills/test-driven-development/SKILL.md +34 -172
  39. package/spec-runner/templates/.claude/rules/sub-agent-delegation.md +0 -37
  40. package/spec-runner/templates/.github/instructions/sub-agent-delegation.instructions.md +0 -37
  41. /package/spec-runner/templates/.claude/skills/{docs-driven-seed → ddd-seed}/templates/01_/350/246/201/344/273/266/345/256/232/347/276/251//343/203/246/343/203/223/343/202/255/343/202/277/343/202/271/350/250/200/350/252/236/350/276/236/346/233/270.md" +0 -0
  42. /package/spec-runner/templates/.claude/skills/{docs-driven-seed → ddd-seed}/templates/01_/350/246/201/344/273/266/345/256/232/347/276/251//350/246/201/344/273/266/345/256/232/347/276/251.md" +0 -0
  43. /package/spec-runner/templates/.claude/skills/{docs-driven-seed → ddd-seed}/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.md" +0 -0
  44. /package/spec-runner/templates/.claude/skills/{docs-driven-seed → ddd-seed}/templates/02_/346/246/202/350/246/201/350/250/255/350/250/210//343/203/211/343/203/241/343/202/244/343/203/263/343/203/242/343/203/207/343/203/253.md" +0 -0
  45. /package/spec-runner/templates/.claude/skills/{docs-driven-seed → ddd-seed}/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.md" +0 -0
  46. /package/spec-runner/templates/.claude/skills/{docs-driven-seed → ddd-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" +0 -0
  47. /package/spec-runner/templates/.claude/skills/{docs-driven-seed → ddd-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" +0 -0
  48. /package/spec-runner/templates/.github/instructions/{testing.instructions.md → test-config.instructions.md} +0 -0
  49. /package/spec-runner/templates/.github/skills/{docs-driven-seed → ddd-seed}/templates/01_/350/246/201/344/273/266/345/256/232/347/276/251//343/203/246/343/203/223/343/202/255/343/202/277/343/202/271/350/250/200/350/252/236/350/276/236/346/233/270.md" +0 -0
  50. /package/spec-runner/templates/.github/skills/{docs-driven-seed → ddd-seed}/templates/01_/350/246/201/344/273/266/345/256/232/347/276/251//350/246/201/344/273/266/345/256/232/347/276/251.md" +0 -0
  51. /package/spec-runner/templates/.github/skills/{docs-driven-seed → ddd-seed}/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.md" +0 -0
  52. /package/spec-runner/templates/.github/skills/{docs-driven-seed → ddd-seed}/templates/02_/346/246/202/350/246/201/350/250/255/350/250/210//343/203/211/343/203/241/343/202/244/343/203/263/343/203/242/343/203/207/343/203/253.md" +0 -0
  53. /package/spec-runner/templates/.github/skills/{docs-driven-seed → ddd-seed}/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.md" +0 -0
  54. /package/spec-runner/templates/.github/skills/{docs-driven-seed → ddd-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" +0 -0
  55. /package/spec-runner/templates/.github/skills/{docs-driven-seed → ddd-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" +0 -0
@@ -5,9 +5,6 @@ description: 既存プロジェクトを読み解き、docs の正本と archite
5
5
 
6
6
  # existing-project-to-docs
7
7
 
8
- 既存コードから docs を起こすフロー。
9
- コード、テスト、設定、インフラ定義を読み、`docs/` と `.spec-runner/` の最初の土台を作る。
10
-
11
8
  ## 全体フロー
12
9
 
13
10
  ```
@@ -21,9 +18,10 @@ Phase 5: architecture contract 化
21
18
 
22
19
  ## 前提ルール
23
20
 
24
- - docs は正本とし、各ドキュメントに `spec_runner` frontmatter を付ける
21
+ - docs は正本とし、各ドキュメントに `spec_runner`ヘッダーを付ける
25
22
  - `maps_to` は必ず設定する。パス推定に頼らない
26
23
  - 既存コードを正として観測する。推測する場合は明示する
24
+ - `depends_on` を使って後続変更に耐える形へ整える
27
25
  - ユーザー承認なしに次フェーズへ進めない
28
26
  - `style: ddd` の場合: UC がドメインを使う。ドメインの中に UC を入れない
29
27
  - `style: ddd` の場合: 詳細設計は `01_ドメイン/` `02_ユースケース/` `03_DB・外部サービス/` の 3 層で構成する
@@ -50,20 +48,20 @@ Phase 5: architecture contract 化
50
48
 
51
49
  ## Phase 2: 要件とユースケースの抽出
52
50
 
53
- 要件定義テンプレートは `simple-seed` に存在しないため、`style` に関わらず `docs-driven-seed` のテンプレートを使う。
51
+ 要件定義テンプレートは `simple-seed` に存在しないため、`style` に関わらず `ddd-seed` のテンプレートを使う。
54
52
 
55
53
  1. `current-system-inventory.md` を起点に、既存機能からユースケースを逆算する
56
- 2. `.claude/skills/docs-driven-seed/templates/01_要件定義/要件定義.md` を使い `docs/01_要件定義/要件定義.md` を作る
57
- 3. `.claude/skills/docs-driven-seed/templates/02_概要設計/ユースケース一覧.md` を使い `docs/02_概要設計/ユースケース一覧.md` を作る
58
- 4. ドメイン用語が識別できたら `.claude/skills/docs-driven-seed/templates/01_要件定義/ユビキタス言語辞書.md` を使い `docs/01_要件定義/ユビキタス言語辞書.md` を作る
54
+ 2. `.claude/skills/ddd-seed/templates/01_要件定義/要件定義.md` を使い `docs/01_要件定義/要件定義.md` を作る
55
+ 3. `.claude/skills/ddd-seed/templates/02_概要設計/ユースケース一覧.md` を使い `docs/02_概要設計/ユースケース一覧.md` を作る
56
+ 4. ドメイン用語が識別できたら `.claude/skills/ddd-seed/templates/01_要件定義/ユビキタス言語辞書.md` を使い `docs/01_要件定義/ユビキタス言語辞書.md` を作る
59
57
  5. ユーザーに確認・承認を得る
60
58
 
61
59
  ## Phase 3: 概要設計
62
60
 
63
61
  `style: ddd` の場合:
64
62
 
65
- 1. `.claude/skills/docs-driven-seed/templates/02_概要設計/システム全体俯瞰.md` を使い `docs/02_概要設計/システム全体俯瞰.md` を作る
66
- 2. `.claude/skills/docs-driven-seed/templates/02_概要設計/ドメインモデル.md` を使い `docs/02_概要設計/ドメインモデル.md` を作る
63
+ 1. `.claude/skills/ddd-seed/templates/02_概要設計/システム全体俯瞰.md` を使い `docs/02_概要設計/システム全体俯瞰.md` を作る
64
+ 2. `.claude/skills/ddd-seed/templates/02_概要設計/ドメインモデル.md` を使い `docs/02_概要設計/ドメインモデル.md` を作る
67
65
  3. 必要なら ADR を作る(作成ルールは下記)
68
66
 
69
67
  `style: layered` の場合:
@@ -101,8 +99,8 @@ Phase 5: architecture contract 化
101
99
 
102
100
  `style: ddd` の場合(ドメイン → UC → DB・外部サービス の順に設計する):
103
101
 
104
- 1. `.claude/skills/docs-driven-seed/templates/03_詳細設計/01_ドメイン/{ドメイン名}.md` を使い、ドメインごとにビジネスルール・集約を整理し `docs/03_詳細設計/01_ドメイン/{ドメイン名}.md` を作る
105
- 2. `.claude/skills/docs-driven-seed/templates/03_詳細設計/02_ユースケース/UC-{日本語名}.md` を使い、UC ごとに `docs/03_詳細設計/02_ユースケース/UC-{日本語名}.md` を作る(シーケンス図は Mermaid で埋め込む)
102
+ 1. `.claude/skills/ddd-seed/templates/03_詳細設計/01_ドメイン/{ドメイン名}.md` を使い、ドメインごとにビジネスルール・集約を整理し `docs/03_詳細設計/01_ドメイン/{ドメイン名}.md` を作る
103
+ 2. `.claude/skills/ddd-seed/templates/03_詳細設計/02_ユースケース/UC-{日本語名}.md` を使い、UC ごとに `docs/03_詳細設計/02_ユースケース/UC-{日本語名}.md` を作る(シーケンス図は Mermaid で埋め込む)
106
104
  3. DB・外部サービスの仕様が必要なら `docs/03_詳細設計/03_DB・外部サービス/` を作る
107
105
 
108
106
  `style: layered` の場合(UC → DB・外部サービス の順に設計する):
@@ -118,9 +116,3 @@ Phase 5: architecture contract 化
118
116
  2. 現状構造を project 専用 skill へ渡せる粒度に整える
119
117
  3. `architecture-skill-development` へ引き渡す
120
118
 
121
- ## 原則
122
-
123
- - docs は正本。draft であっても `spec_runner` frontmatter とテンプレートを使う
124
- - `maps_to` は必ず設定する。パス推定に頼らない
125
- - 既存コードを正として観測する。推測する場合は明示する
126
- - `depends_on` を使って後続変更に耐える形へ整える
@@ -5,8 +5,6 @@ description: skills・rules・agents・テンプレートを改善・保守す
5
5
 
6
6
  # harness-engineering
7
7
 
8
- skills・rules・agents・テンプレートを改善するためのメタスキル。主目的の作業を先に進め、再利用価値のある改善が必要なときだけ使う。
9
-
10
8
  ## 使うタイミング
11
9
 
12
10
  以下のいずれかに当てはまるときに使う。
@@ -23,8 +21,6 @@ skills・rules・agents・テンプレートを改善するためのメタスキ
23
21
  - アプリケーションコードに対する TDD
24
22
  - 単なる言い回しの微調整で済む変更
25
23
 
26
- TDD はこのスキルの対象ではない。TDD は `test-driven-development` スキルに従い、対象プロダクトのコード品質を上げるために行う。
27
-
28
24
  ## 全体フロー
29
25
 
30
26
  ```
@@ -36,56 +32,29 @@ Phase 4: 影響範囲の反映確認
36
32
 
37
33
  ## Phase 1: 問題の抽出
38
34
 
39
- ### 手順
40
-
41
35
  1. 今回の作業で何が詰まり、どこに無駄が出たかを整理する
42
36
  2. その問題が一時的なものか、再発しうる構造的な問題かを判定する
43
- 3. 改善対象を特定する
44
- - skill
45
- - rule
46
- - agent
47
- - template
37
+ 3. 改善対象を特定する(skill / rule / agent / template)
48
38
 
49
- ### 出力
50
-
51
- - 問題の要約
52
- - 再発条件
53
- - 変更対象の候補一覧
39
+ **出力:** 問題の要約・再発条件・変更対象の候補一覧
54
40
 
55
41
  ## Phase 2: 対応方針の決定
56
42
 
57
- 1. 最小変更で解決できる対象を選ぶ
43
+ 1. 最小変更で解決できる対象を選ぶ(まず既存の資産を直す。新しい skill は繰り返し使う独立したワークフローがある場合だけ追加する)
58
44
  2. 新しい skill を増やすべきか、既存 skill / rule / agent の修正で十分かを判断する
59
45
  3. Claude / Copilot の両テンプレートに影響するか確認する
60
46
 
61
- ### 判断原則
62
-
63
- - まず既存の資産を直す
64
- - 新しい skill は、繰り返し使う独立したワークフローがある場合だけ追加する
65
- - 一時的な事情を恒久ルールにしない
66
-
67
47
  ## Phase 3: skill / rule / agent / template の修正
68
48
 
69
- ファイルを作成・修正する前に `.claude/rules/harness-formats.md` を読み、フォーマットを確認する。
49
+ ファイルを作成・修正する前に `.claude/skills/harness-engineering/references/harness-format.md` を読み、フォーマットを確認する。
70
50
 
71
51
  1. 対象ファイルを特定する
72
- 2. 意図が変わらない最小差分で修正する
73
- 3. 片系だけでなく、対応するテンプレートも揃えて更新する
74
- - `.claude/`
75
- - `.github/`
52
+ 2. 意図が変わらない最小差分で修正する(役割の重複を増やさない。既存スキルの主要フローを壊さない。ユーザー承認が前提のフローは勝手に短絡しない)
53
+ 3. `.claude/` と `.github/` を対で更新する
76
54
  4. references や templates を参照している場合、必要な範囲だけ更新する
77
55
 
78
- ### 修正時の注意
79
-
80
- - 役割の重複を増やさない
81
- - 既存スキルの主要フローを壊さない
82
- - ユーザー承認が前提のフローは勝手に短絡しない
83
- - アプリコード向けの TDD ルールを、このスキルの改善目的と混同しない
84
-
85
56
  ## Phase 4: 影響範囲の反映確認
86
57
 
87
- ### 確認項目
88
-
89
58
  - 問題の原因に対して、変更箇所が直接効いているか
90
59
  - 関連する skill / rule / agent / template の記述が矛盾していないか
91
60
  - Claude / Copilot の対応ファイルに反映漏れがないか
@@ -93,11 +62,3 @@ Phase 4: 影響範囲の反映確認
93
62
  - skill 名・起動条件・使いどころを変更した場合、`CLAUDE.md` の記述と一致しているか
94
63
  - `CLAUDE.md` が肥大化していないか(20行超えたら `rules/` や `skills/` へ移動を検討する)
95
64
  - docs 構造・命名規則・node_id 体系に影響する変更の場合、`design-docs.md` と整合しているか
96
-
97
- ## 原則
98
-
99
- - ハーネス改善は常時実行しない。必要なときだけ行う
100
- - 主目的の作業を優先する
101
- - 最小変更で改善する
102
- - 新しい skill の追加は慎重に行う
103
- - TDD の責務を skill 改善と混同しない
@@ -4,8 +4,6 @@ description: rules・agents・skills ファイルのフォーマット定義。h
4
4
 
5
5
  # ハーネスファイルフォーマット
6
6
 
7
- `harness-engineering` や `architecture-skill-development` で rules / agents / skills を作成・修正するときは、このフォーマットに従う。
8
-
9
7
  ## rule ファイル(`.claude/rules/*.md`)
10
8
 
11
9
  ```markdown
@@ -22,7 +20,7 @@ paths: ["対象パス/**"] # 省略すると全ファイルに適用
22
20
  - `description` は必須。Claude がルールを選択するときに使う
23
21
  - `paths` は省略可。省略すると `**` 相当(全ファイルに適用)
24
22
  - `integrations` に `github` が含まれる場合、対応する `.github/instructions/{name}.instructions.md` も作成・更新する
25
- - `.github/` 版の frontmatter は `applyTo: "対象パス/**"` 形式に変換する
23
+ - `.github/` 版のヘッダーは `applyTo: "対象パス/**"` 形式に変換する
26
24
 
27
25
  ## agent ファイル(`.claude/agents/*.md`)
28
26
 
@@ -73,7 +71,7 @@ CLAUDE.md は全会話で常にコンテキストに読み込まれる。書く
73
71
 
74
72
  | 内容 | 正しい置き場所 |
75
73
  |------|--------------|
76
- | コーディング規約の詳細 | `.claude/rules/coding.md` |
74
+ | コーディング規約の詳細 | `.claude/rules/code-style.md` |
77
75
  | フォーマット定義・手順 | `.claude/rules/*.md` |
78
76
  | スキルの詳細フロー | `.claude/skills/*/SKILL.md` |
79
77
  | 過去の決定・背景 | `docs/02_概要設計/90_ADR/` |
@@ -91,3 +89,11 @@ CLAUDE.md は全会話で常にコンテキストに読み込まれる。書く
91
89
  - 両方 → `.claude/` と `.github/` を対で更新する
92
90
  - `description` は「何をするか」より「いつ・なぜ使うか」を優先して書く
93
91
  - 新規作成時は既存ファイルを参考にフォーマットを確認してから作る
92
+
93
+ ## 書き方の原則
94
+
95
+ - H1 は用途を示す。description の言い換えは書かない
96
+ - H1 直下に説明文を置かない。description に書いたことを本文で繰り返さない
97
+ - `(読み取り専用)` のような付記は H1 に入れない。tools の構成で表現する
98
+ - agent のテンプレート注記(「このファイルはテンプレートです」)は agent ファイルに書かない。test-config.md に書く
99
+ - agent の書き順: ヘッダー → H1 → 前提・入力(必要な場合のみ) → 手順 → 報告フォーマット
@@ -5,9 +5,6 @@ description: レイヤードアーキテクチャ / CRUD 中心のプロジェ
5
5
 
6
6
  # simple-seed
7
7
 
8
- > レイヤードアーキテクチャ / CRUD 中心のプロジェクト向けの docs 正本開発フロー(種)。`architecture.yaml` の `style: layered` で使う。DDD が必要なプロジェクトは `docs-driven-seed` を使う。
9
- > このスキルは種。`architecture-skill-development` でプロジェクト専用スキルに育てる。
10
-
11
8
  ## 全体フロー
12
9
 
13
10
  ```
@@ -20,7 +17,7 @@ Phase 5: TDD → 実装
20
17
 
21
18
  ## 前提ルール
22
19
 
23
- - docs は正本とし、各ドキュメントに `spec_runner` frontmatter を付ける
20
+ - docs は正本とし、各ドキュメントに `spec_runner`ヘッダーを付ける
24
21
  - 詳細設計は `01_ユースケース/` `02_DB・外部サービス/` の 2 層で構成する
25
22
  - `maps_to` は必ず設定する。パス推定に頼らない
26
23
  - ユーザー承認なしに次フェーズへ進めない
@@ -91,12 +88,6 @@ docs/03_詳細設計/02_DB・外部サービス/
91
88
 
92
89
  `test-driven-development` スキルへ移行する。
93
90
 
94
- ### 実装完了後
95
-
96
- - `@design-reviewer` — 設計書⇔実装の整合性チェック
97
- - `@code-reviewer` — コーディング規約への適合チェック
98
-
99
91
  ## 原則
100
92
 
101
93
  - ドメイン層は持たない。ビジネスロジックは UC / サービス層で表現する
102
- - `maps_to` は必ず設定する。パス推定に頼らない
@@ -0,0 +1,12 @@
1
+ ---
2
+ name: spec-probe
3
+ description: 設計・要件の前提を一問一答で深掘りする。設計レビュー・要件定義・ADR 前に使う。
4
+ ---
5
+
6
+ 計画・設計・要件のあらゆる側面について、共通理解に達するまで容赦なくインタビューする。
7
+ 決定ツリーの各分岐を辿り、依存関係のある判断を一つずつ解決する。
8
+ 各質問に対して、推奨する答えも提示する。
9
+
10
+ 質問は一度に一つだけ行う。
11
+
12
+ コードベースを読めば答えられる質問は、質問する代わりにコードを読む。
@@ -5,40 +5,27 @@ description: 新機能実装やバグ修正を行う際、実装コードを書
5
5
 
6
6
  # テスト駆動開発(TDD)
7
7
 
8
- ## 概要
9
-
10
- テストを先に書く。失敗するのを確認する。通る最小のコードを書く。
11
-
12
- テストが失敗するのを見ていないなら、そのテストが正しいものを検証しているか分からない。
13
-
14
- ## いつ使うか
15
-
16
8
  常に使う: 新機能・バグ修正・リファクタリング・振る舞い変更
17
-
18
9
  例外(ユーザーに確認する): 使い捨てプロトタイプ・生成コード・設定ファイル
19
10
 
20
- ## 鉄の掟
11
+ **テストを先に書く。実装する。テストを実行して確認する。**
21
12
 
22
- ```
23
- 失敗するテストなしに本番コードを書かない
24
- ```
13
+ テスト実行コマンドと構成は `.claude/rules/test-config.md` を参照する。
25
14
 
26
- テストより先にコードを書いたなら削除して最初からやり直す。
27
- 「参考として残す」も「テストを書きながら適応させる」も不可。
15
+ ## Step 1: テスト種別を決める
28
16
 
29
- ## テスト戦略:テストピラミッド
17
+ 単体(多数)> 結合(中程度)> E2E(少数)の順で比率を保つ。迷ったら単体から始める。
30
18
 
31
- 実装前にどのテスト種別を書くかを決める。迷ったら単体テストから始める。
19
+ | 実装するもの | まず書くテスト | 追加で書くテスト |
20
+ |---|---|---|
21
+ | ロジック・計算 | 単体 | — |
22
+ | DB 操作 | 結合 | — |
23
+ | API エンドポイント | 結合 | 主要シナリオは E2E |
24
+ | 複数サービスをまたぐフロー | 結合 | — |
25
+ | ユーザー向け主要機能 | 単体+結合 | E2E(絞る) |
26
+ | バグ修正 | 最小レベルで再現テスト | — |
32
27
 
33
- ```
34
- /\
35
- /E2E\ 少数・遅い・ユーザーシナリオ全体
36
- /------\
37
- / 結合 \ 中程度・モジュール間連携・外部境界
38
- /----------\
39
- / 単体 \ 多数・高速・関数・クラス単位
40
- /______________\
41
- ```
28
+ **バグ修正の場合:** バグを再現できる最も低いレベルのテストを書く。単体で再現できるなら単体、DB が絡むなら結合。E2E で初めて再現するバグは、単体・結合に落とし込めないか検討する。
42
29
 
43
30
  ### 単体テスト(Unit)
44
31
 
@@ -62,8 +49,7 @@ description: 新機能実装やバグ修正を行う際、実装コードを書
62
49
  - 外部サービス呼び出し(HTTP, メッセージキュー等)
63
50
  - 複数の集約をまたぐユースケース
64
51
 
65
- **外部依存の扱い:** 原則として実物を使う(テスト用 DB、テスト環境の外部サービス)。
66
- 動かせない外部サービスのみスタブ/フェイクで代替する。
52
+ **外部依存の扱い:** 原則として実物を使う(テスト用 DB、テスト環境の外部サービス)。動かせない外部サービスのみスタブ/フェイクで代替する。
67
53
 
68
54
  **速度目安:** 秒単位。PR ごとに実行できる。
69
55
 
@@ -79,121 +65,54 @@ description: 新機能実装やバグ修正を行う際、実装コードを書
79
65
 
80
66
  **速度目安:** 分単位。夜間や本番リリース前など頻度を落として実行。
81
67
 
82
- ## テスト種別の選び方
83
-
84
- | 実装するもの | まず書くテスト | 追加で書くテスト |
85
- |---|---|---|
86
- | ロジック・計算 | 単体 | — |
87
- | DB 操作 | 結合 | — |
88
- | API エンドポイント | 結合 | 主要シナリオは E2E |
89
- | 複数サービスをまたぐフロー | 結合 | — |
90
- | ユーザー向け主要機能 | 単体+結合 | E2E(絞る) |
91
- | バグ修正 | 最小レベルで再現テスト | — |
92
-
93
- **バグ修正の場合:** バグを再現できる最も低いレベルのテストを書く。
94
- 単体で再現できるなら単体、DB が絡むなら結合。E2E で初めて再現するバグは、単体・結合に落とし込めないか検討する。
95
-
96
- ## テスト実行コマンド
97
-
98
- `.claude/rules/testing.md` に記載されたコマンドを使う。
99
-
100
- ## Red-Green-Refactor
101
-
102
- ### RED - 失敗するテストを書く
103
-
104
- テスト種別を決めたうえで、起きてほしいことを示す最小のテストを1つ書く。
105
-
106
- ```
107
- // 例(言語・フレームワークはプロジェクトに合わせる)
108
- test("ある入力に対して期待する出力を返す", () => {
109
- // 準備 - テスト対象の入力データを用意する
110
- const input = ...
111
-
112
- // 実行 - テスト対象の関数を呼び出す
113
- const result = targetFunction(input)
68
+ ## Step 2: テストを書く
114
69
 
115
- // 判定 - 期待する出力と一致するか確認する
116
- expect(result).toBe(expectedOutput)
117
- })
118
- ```
70
+ 起きてほしいことを示す最小のテストを1つ書く。
119
71
 
120
72
  **要件:**
121
73
  - 1つの振る舞い
122
74
  - 明確なテスト名(振る舞いを説明する)
123
75
  - 実コード中心(不可避な場合のみモック)
76
+ - 望ましい API の使い方が伝わる書き方にする
124
77
 
125
- ### Verify RED - 失敗するのを確認する
78
+ ## Step 3: 実装する
126
79
 
127
- > 必須。絶対に省略しない。
80
+ テストを通すコードを書く。実装コードにもビジネスロジックの意図をコメントする。
128
81
 
129
- `@test-runner` エージェントに委任して実行する。
82
+ ## Step 4: テストを実行して確認する
130
83
 
131
- - テストが**失敗する**(エラーではない)
132
- - 失敗メッセージが期待通り
133
- - **機能がないこと**が原因で失敗している(誤字等ではない)
134
-
135
- テストが通る → 既存挙動をテストしている。テストを修正する。
136
- テストがエラー → エラーを直して再実行し、「正しく失敗する」まで繰り返す。
137
-
138
- ### GREEN - 通す最小のコードを書く
139
-
140
- テストを通すための最も単純なコードを書く。
141
-
142
- テストにない機能を足さない。他の改善やリファクタもここではしない。
143
-
144
- ### Verify GREEN - 通るのを確認する
145
-
146
- > 必須。
147
-
148
- `@test-runner` エージェントに委任して実行する。
84
+ `@run-tests` エージェントに委任して実行する。
149
85
 
150
86
  - テストが通る
151
87
  - **同種のテストが全て通る**(単体なら単体全件、結合なら結合全件)
152
88
  - 出力がクリーン(エラー、警告なし)
153
89
  - **カバレッジの未カバー行を確認** — 新規コードが未カバーなら追加テストを書く
154
90
 
155
- テストが落ちる → テストではなくコードを直す。
91
+ テストが落ちる → 実装を直す。
156
92
  他のテストが落ちる → 直ちに修正する。
157
93
 
158
- ### REFACTOR - 整理する
159
-
160
- Green の後にのみ: 重複削除・命名改善・ヘルパ抽出。
161
- テストは常に Green を維持する。新しい挙動は追加しない。
94
+ ## Step 5: 整理する
162
95
 
163
- ### 繰り返す
96
+ 重複削除・命名改善・ヘルパ抽出。テストは通ったまま維持する。新しい挙動は追加しない。
164
97
 
165
- 次の機能のために、次の失敗するテストを書く。
98
+ **→ Step 2 へ戻り、次の振る舞いのテストを書く。**
166
99
 
167
- ## よいテスト
168
-
169
- - **最小**: 1つの振る舞いだけ。「and」が入るなら分割する
170
- - **明確**: テスト名が挙動を説明する
171
- - **意図が見える**: 望ましい API の使い方が伝わる
172
-
173
- ## テストのコメント
174
-
175
- テストコメントの規約は同梱のコーディング規約ファイルの「テストコメント規約」に従う。
176
- GREEN / REFACTOR フェーズで書く実装コードにもビジネスロジックの意図をコメントする。
100
+ ---
177
101
 
178
- ## テスト構成
102
+ ## 参考
179
103
 
180
- ```
181
- tests/
182
- unit/ # 単体テスト(src/ と同じ構造を鏡写し)
183
- integration/ # 結合テスト
184
- e2e/ # E2E テスト
185
- ```
104
+ ### テストのコメント規約
186
105
 
187
- テストファイルは `src/` と同じディレクトリ構造を各テスト種別のディレクトリ内に鏡写しにする。
106
+ `.claude/rules/code-style.md` のテストコメント規約に従う。
188
107
 
189
- ## fixture / テストデータの活用
108
+ ### fixture / テストデータ
190
109
 
191
110
  - テストごとに独立した状態を持つ
192
111
  - テストデータ生成にはヘルパ関数を定義して一貫性を保つ
193
- - 外部サービス(API・メール・ストレージ等)は必要な場合のみモックする
112
+ - テストデータはドメインモデルの全フィールドを含める
194
113
  - 結合テスト用のシードデータは `tests/integration/fixtures/` に置く
195
114
 
196
- ## モックのルール
115
+ ### モックのルール
197
116
 
198
117
  モックは分離の手段であり、テスト対象ではない。
199
118
 
@@ -213,61 +132,13 @@ tests/
213
132
  **原則:**
214
133
  - 実コンポーネントの**出力**をテストする。モックの呼び出し確認だけにアサートしない
215
134
  - 本番クラスにテスト専用メソッドを追加しない → fixtureやテストユーティリティに置く
216
- - テストデータはドメインモデルの全フィールドを含める
217
135
 
218
- **赤信号(モックをやめて設計を見直す):**
136
+ **設計見直しのサイン:**
219
137
  - モック準備がテスト本体より長い
220
138
  - モックを外すとテストが成立しない
221
139
  - なぜモックが必要か説明できない
222
140
 
223
- ## なぜ順序が重要か
224
-
225
- 実装後のテストはすぐ通る。すぐ通ることは何も証明しない:
226
- - 間違ったものをテストしているかもしれない
227
- - 実装に引きずられて挙動ではなく実装をテストしがち
228
- - バグを捕まえる力を見ていない
229
-
230
- テストファーストは、テストが本当に何かを検証していることを「失敗」で証明する。
231
-
232
- ## よくある合理化と赤信号
233
-
234
- | 兆候 | 問題 |
235
- |------|------|
236
- | 「簡単すぎてテスト不要」 | 簡単でも壊れる。テストは30秒 |
237
- | 「あとでテストする」 | すぐ通るテストは何も証明しない |
238
- | 「今回だけ TDD を飛ばす」 | 合理化である。止めること |
239
- | テスト前にコードを書いた | コードを削除し、TDD で最初からやり直す |
240
- | テストが最初から通る | 既存挙動をテストしている。テストを修正する |
241
- | なぜ失敗したか説明できない | テストが正しいか再検討する |
242
- | 全部 E2E で書いた | ピラミッドが逆転している。単体・結合に落とし込む |
243
- | 全部モックだらけ | 結合が強すぎる。または結合テストを書くべき |
244
-
245
- どれか 1 つでも当てはまるなら: コードを削除し、TDD で最初からやり直す。
246
-
247
- ## 完了時のレビュー
248
-
249
- 実装完了後、以下のエージェントを**同時に**起動してレビューする:
250
- - `@design-reviewer` — 設計書⇔実装の整合性チェック
251
- - `@code-reviewer` — コーディング規約への適合チェック
252
-
253
- ## 検証チェックリスト
254
-
255
- 完了宣言の前に:
256
-
257
- - [ ] 実装前にテスト種別(単体・結合・E2E)を決めた
258
- - [ ] 新規関数/メソッドにテストがある
259
- - [ ] 各テストは実装前に失敗するのを見た
260
- - [ ] 期待通りの理由で失敗した(機能不足であり誤字ではない)
261
- - [ ] 通す最小コードを書いた
262
- - [ ] 同種のテストが全件通る
263
- - [ ] 出力がクリーン(エラー、警告なし)
264
- - [ ] カバレッジを確認し、新規コードの未カバー行がない
265
- - [ ] モック方針がテスト種別に合っている
266
- - [ ] エッジケースとエラーをカバーした
267
-
268
- すべてにチェックできないなら TDD を飛ばしている。やり直すこと。
269
-
270
- ## 詰まったとき
141
+ ### 詰まったとき
271
142
 
272
143
  | 問題 | 解決 |
273
144
  |------|------|
@@ -277,12 +148,3 @@ tests/
277
148
  | 何でもモック必須 | 結合が強すぎる。依存性注入を使う。または結合テストで書く |
278
149
  | セットアップが巨大 | fixtureやテストユーティリティに抽出する。それでも大きいなら設計を簡素化する |
279
150
  | E2E が遅すぎる | 単体・結合に落とし込めるか検討する |
280
-
281
- ## 最終ルール
282
-
283
- ```
284
- 本番コード → 先にテストが存在し、失敗している
285
- それ以外 → TDD ではない
286
- ```
287
-
288
- ユーザーの許可なしに例外はない。
@@ -1,13 +1,11 @@
1
1
  ---
2
- name: impact-analyzer
2
+ name: analyze-impact
3
3
  description: design-change で影響範囲を調査するときに呼ぶ。node_id から連鎖する影響ファイルを一覧化し、maps_to の整合性を報告する。
4
4
  tools: Bash
5
5
  model: sonnet
6
6
  ---
7
7
 
8
- # 影響範囲分析エージェント(読み取り専用)
9
-
10
- `graph.json`(`scan.js` が生成するキャッシュ)を読み、変更対象の node_id から連鎖する影響ファイルを一覧化する。
8
+ # 影響範囲分析
11
9
 
12
10
  ## 入力
13
11
 
@@ -15,14 +13,14 @@ model: sonnet
15
13
 
16
14
  ## 手順
17
15
 
18
- ### 1. グラフキャッシュの確認・更新
16
+ ### 1. graph.json の確認
17
+
18
+ `graph.json` は Edit / Write のたびに hooks で自動更新される。`.spec-runner/scan/graph.json` が存在しない場合のみ以下を実行する。
19
19
 
20
20
  ```bash
21
21
  node .spec-runner/scripts/scan.js
22
22
  ```
23
23
 
24
- キャッシュが古い場合や存在しない場合は再生成する。
25
-
26
24
  ### 2. 影響範囲をグラフから取得
27
25
 
28
26
  ```bash
@@ -1,18 +1,16 @@
1
1
  ---
2
- name: code-reviewer
2
+ name: review-code
3
3
  description: 実装・修正が完了したときに自動で呼ぶ。変更ファイルをコーディング規約と照合し違反を報告する。修正はしない。
4
4
  tools: Read, Grep, Glob, Bash
5
5
  model: sonnet
6
6
  ---
7
7
 
8
- # コーディング規約チェックエージェント(読み取り専用)
9
-
10
- 変更されたコードをコーディング規約と照合し、違反を報告する。変更ファイルのみが対象。
8
+ # コーディング規約チェック
11
9
 
12
10
  ## 手順
13
11
 
14
12
  1. `git diff --name-only` で変更ファイルを確認する(引数でファイルが指定された場合はそちらを使用)
15
- 2. `.github/instructions/coding.instructions.md` を読み、チェック項目を把握する
13
+ 2. `.github/instructions/code-style.instructions.md` を読み、チェック項目を把握する
16
14
  3. 変更されたソースファイルを読み込む
17
15
  4. チェック項目に照らして違反を検出する
18
16
  5. 違反を報告する
@@ -1,26 +1,26 @@
1
1
  ---
2
- name: design-reviewer
2
+ name: review-design
3
3
  description: 設計書を変更したとき、またはフェーズレビュー時に自動で呼ぶ。docs⇔src の乖離を報告する。修正はしない。
4
4
  tools: Read, Grep, Glob
5
5
  model: sonnet
6
6
  ---
7
7
 
8
- # 設計書⇔実装 整合性チェックエージェント(読み取り専用)
9
-
10
- `docs/` の設計書と `src/` の実装コードを突合し、乖離を報告する。`maps_to` を唯一の参照先とする(パス推定は行わない)。
8
+ # 設計書⇔実装 整合性チェック
11
9
 
12
10
  ## 手順
13
11
 
14
- 1. `docs/` 配下の設計書ファイルを一覧取得する
15
- 2. 各設計書の frontmatter を読み、`spec_runner.node_id` / `kind` / `depends_on` / `maps_to` を確認する
16
- 3. `docs/02_概要設計/**` の各ファイルを読む。`maps_to` から対応する `src/` ファイルを特定して読み、ユースケース・責務・外部 IF が実装に反映されているか比較する
17
- 4. `docs/03_詳細設計/**` の各ファイルを読む。`maps_to` に列挙された `src/` / `tests/` ファイルを実際に読み、責務・入出力・判断条件・テスト観点を設計書と行レベルで比較する(`maps_to` が空または未設定の場合は frontmatter の問題として報告する)
18
- 5. 乖離を報告する
12
+ 1. `.spec-runner/scan/graph.json` を読み、`missing_maps_to` を取得する。以降のヘッダーチェックではこの結果を使う(`graph.json` は Edit / Write のたびに hooks で自動更新済み)
13
+ 2. `docs/` 配下の設計書ファイルを一覧取得する
14
+ 3. 各設計書のヘッダーを読み、`spec_runner.node_id` / `kind` / `depends_on` / `maps_to` を確認する
15
+ 4. `docs/02_概要設計/**` の各ファイルを読む。`maps_to` から対応する `src/` ファイルを特定して読み、ユースケース・責務・外部 IF が実装に反映されているか比較する
16
+ 5. `docs/03_詳細設計/**` の各ファイルを読む。`maps_to` に列挙された `src/` / `tests/` ファイルを実際に読み、責務・入出力・判断条件・テスト観点を設計書と行レベルで比較する(`maps_to` が空または未設定の場合はヘッダーの問題として報告する)
17
+ 6. 乖離を報告する
19
18
 
20
19
  ## チェック項目
21
20
 
22
- ### frontmatter
21
+ ### ヘッダー
23
22
 
23
+ - **参照原則**: `maps_to` を唯一の src 対応とする。パス推定は行わない
24
24
  - **必須項目**: `node_id` / `kind` / `depends_on` / `maps_to` が存在するか
25
25
  - **依存整合**: `depends_on` の参照先が実在するか。依存の向きが明らかに逆転していないか
26
26
  - **対応整合**: `maps_to` の実ファイルが存在するか。変更対象が漏れていないか
@@ -43,7 +43,7 @@ model: sonnet
43
43
  ```
44
44
  ## 整合性チェック結果
45
45
 
46
- ### frontmatter の問題
46
+ ### ヘッダーの問題
47
47
  - [ファイル]: [問題内容]
48
48
 
49
49
  ### 一致(問題なし)
@@ -1,25 +1,21 @@
1
1
  ---
2
- name: test-runner
2
+ name: run-tests
3
3
  description: 実装・修正が完了したときに自動で呼ぶ。テストを実行し、失敗時は原因と修正案を報告する。コードは修正しない。
4
4
  tools: Read, Grep, Glob, Bash
5
5
  model: sonnet
6
6
  ---
7
7
 
8
- # テスト実行エージェント(読み取り専用)
9
-
10
- > このファイルはテンプレートです。`architecture-skill-development` でプロジェクトのテスト実行コマンドに書き換えてください。
11
-
12
- テストを実行し、結果を分析する。コードは修正しない。
8
+ # テスト実行
13
9
 
14
10
  ## 手順
15
11
 
16
12
  1. `git diff --name-only` で変更ファイルを確認する
17
13
  2. 変更ファイルに対応するテストファイルを特定する(`tests/` 配下の同構造)
18
- 3. `.github/instructions/testing.instructions.md` を読んでテスト実行コマンドを確認する
14
+ 3. `.github/instructions/test-config.instructions.md` を読んでテスト実行コマンドを確認する
19
15
  4. テストを実行する:
20
16
  - 対象テストが明確な場合: テストコマンド + `<test-file> -v`
21
17
  - 全体実行が必要な場合: 全テストコマンド + `-v`
22
- 4. 結果を分析する
18
+ 5. 結果を分析する
23
19
 
24
20
  ## 失敗時の分析
25
21