spec-runner 1.4.1 → 1.6.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.
- package/package.json +1 -1
- package/spec-runner/templates/{.github/agents/impact-analyzer.agent.md → .claude/agents/analyze-impact.md} +5 -7
- package/spec-runner/templates/.claude/agents/{code-reviewer.md → review-code.md} +3 -5
- package/spec-runner/templates/{.github/agents/design-reviewer.agent.md → .claude/agents/review-design.md} +11 -11
- package/spec-runner/templates/.claude/agents/{test-runner.md → run-tests.md} +4 -8
- package/spec-runner/templates/.claude/rules/agent-delegation.md +31 -0
- package/spec-runner/templates/.claude/rules/{coding.md → code-style.md} +15 -4
- package/spec-runner/templates/.claude/rules/design-docs.md +4 -4
- package/spec-runner/templates/.claude/rules/{testing.md → test-config.md} +1 -1
- package/spec-runner/templates/.claude/skills/architecture-definition/SKILL.md +18 -19
- package/spec-runner/templates/.claude/skills/architecture-skill-development/SKILL.md +17 -52
- package/spec-runner/templates/{.github/skills/docs-driven-seed → .claude/skills/ddd-seed}/SKILL.md +18 -16
- 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 +10 -0
- 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 +15 -0
- package/spec-runner/templates/.claude/skills/design-change/SKILL.md +24 -25
- 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
- package/spec-runner/templates/.claude/skills/existing-project-to-docs/SKILL.md +10 -18
- package/spec-runner/templates/.claude/skills/harness-engineering/SKILL.md +6 -45
- package/spec-runner/templates/.claude/{rules/harness-formats.md → skills/harness-engineering/references/harness-format.md} +10 -4
- package/spec-runner/templates/.claude/skills/simple-seed/SKILL.md +15 -9
- package/spec-runner/templates/.claude/skills/simple-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 +10 -0
- package/spec-runner/templates/.claude/skills/simple-seed/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/01_/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 +15 -0
- package/spec-runner/templates/.claude/skills/spec-probe/SKILL.md +12 -0
- package/spec-runner/templates/.claude/skills/test-driven-development/SKILL.md +34 -172
- package/spec-runner/templates/{.claude/agents/impact-analyzer.md → .github/agents/analyze-impact.agent.md} +5 -7
- package/spec-runner/templates/.github/agents/{code-reviewer.agent.md → review-code.agent.md} +3 -5
- package/spec-runner/templates/{.claude/agents/design-reviewer.md → .github/agents/review-design.agent.md} +11 -11
- package/spec-runner/templates/.github/agents/{test-runner.agent.md → run-tests.agent.md} +4 -8
- package/spec-runner/templates/.github/instructions/agent-delegation.instructions.md +31 -0
- package/spec-runner/templates/.github/instructions/{coding.instructions.md → code-style.instructions.md} +17 -5
- package/spec-runner/templates/.github/instructions/design-docs.instructions.md +3 -3
- package/spec-runner/templates/.github/skills/architecture-definition/SKILL.md +18 -19
- package/spec-runner/templates/.github/skills/architecture-skill-development/SKILL.md +17 -52
- package/spec-runner/templates/{.claude/skills/docs-driven-seed → .github/skills/ddd-seed}/SKILL.md +18 -16
- 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 +10 -0
- 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 +15 -0
- package/spec-runner/templates/.github/skills/design-change/SKILL.md +24 -25
- 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
- package/spec-runner/templates/.github/skills/existing-project-to-docs/SKILL.md +12 -20
- package/spec-runner/templates/.github/skills/harness-engineering/SKILL.md +8 -47
- package/spec-runner/templates/.github/{instructions/harness-formats.instructions.md → skills/harness-engineering/references/harness-format.md} +9 -3
- package/spec-runner/templates/.github/skills/simple-seed/SKILL.md +15 -9
- package/spec-runner/templates/.github/skills/simple-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 +10 -0
- package/spec-runner/templates/.github/skills/simple-seed/templates/03_/350/251/263/347/264/260/350/250/255/350/250/210/01_/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 +15 -0
- package/spec-runner/templates/.github/skills/spec-probe/SKILL.md +12 -0
- package/spec-runner/templates/.github/skills/test-driven-development/SKILL.md +34 -172
- package/spec-runner/templates/.claude/rules/sub-agent-delegation.md +0 -37
- package/spec-runner/templates/.github/instructions/sub-agent-delegation.instructions.md +0 -37
- /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
- /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
- /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
- /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
- /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
- /package/spec-runner/templates/.github/instructions/{testing.instructions.md → test-config.instructions.md} +0 -0
- /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
- /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
- /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
- /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
- /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
|
@@ -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
|
-
|
|
78
|
+
## Step 3: 実装する
|
|
126
79
|
|
|
127
|
-
|
|
80
|
+
テストを通すコードを書く。実装コードにもビジネスロジックの意図をコメントする。
|
|
128
81
|
|
|
129
|
-
|
|
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
|
-
|
|
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
|
-
|
|
106
|
+
`.claude/rules/code-style.md` のテストコメント規約に従う。
|
|
188
107
|
|
|
189
|
-
|
|
108
|
+
### fixture / テストデータ
|
|
190
109
|
|
|
191
110
|
- テストごとに独立した状態を持つ
|
|
192
111
|
- テストデータ生成にはヘルパ関数を定義して一貫性を保つ
|
|
193
|
-
-
|
|
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
|
|
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
|
package/spec-runner/templates/.github/agents/{code-reviewer.agent.md → review-code.agent.md}
RENAMED
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: code
|
|
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/
|
|
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
|
|
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. `
|
|
15
|
-
2.
|
|
16
|
-
3. `
|
|
17
|
-
4. `docs/
|
|
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
|
-
###
|
|
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
|
-
###
|
|
46
|
+
### ヘッダーの問題
|
|
47
47
|
- [ファイル]: [問題内容]
|
|
48
48
|
|
|
49
49
|
### 一致(問題なし)
|
|
@@ -1,25 +1,21 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
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/
|
|
14
|
+
3. `.github/instructions/test-config.instructions.md` を読んでテスト実行コマンドを確認する
|
|
19
15
|
4. テストを実行する:
|
|
20
16
|
- 対象テストが明確な場合: テストコマンド + `<test-file> -v`
|
|
21
17
|
- 全体実行が必要な場合: 全テストコマンド + `-v`
|
|
22
|
-
|
|
18
|
+
5. 結果を分析する
|
|
23
19
|
|
|
24
20
|
## 失敗時の分析
|
|
25
21
|
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
applyTo: "**"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# サブエージェント委任ルール
|
|
6
|
+
|
|
7
|
+
メインエージェントは判断・対話・ファイル編集に集中する。検証・調査・実行・ファイル検索はすべてサブエージェントへ委任する(メインのコンテキスト節約)。
|
|
8
|
+
|
|
9
|
+
## 委任する場面と委任先
|
|
10
|
+
|
|
11
|
+
| 場面 | 委任先 | タイミング |
|
|
12
|
+
|------|--------|-----------|
|
|
13
|
+
| 設計書⇔実装の整合性確認 | `@review-design` | 設計書を変更したとき、フェーズレビュー時 |
|
|
14
|
+
| コーディング規約チェック | `@review-code` | 実装・修正が完了したとき |
|
|
15
|
+
| テスト実行+失敗分析 | `@run-tests` | 実装・修正が完了したとき |
|
|
16
|
+
| 変更の影響範囲調査 | `@analyze-impact` | design-change で影響範囲を洗うとき |
|
|
17
|
+
|
|
18
|
+
## 並行起動
|
|
19
|
+
|
|
20
|
+
独立して動けるエージェントは同時に起動する。
|
|
21
|
+
|
|
22
|
+
例: 実装完了後 → `@run-tests` と `@review-code` を**同時に**起動し、両方の結果を待ってからユーザーへ報告する。
|
|
23
|
+
|
|
24
|
+
## メインエージェントが自分でやること
|
|
25
|
+
|
|
26
|
+
サブエージェントは会話の文脈を持たない。以下はメインエージェントが担う:
|
|
27
|
+
|
|
28
|
+
- ユーザーとの対話・意思決定・承認の受け取り
|
|
29
|
+
- フェーズの進行管理・次のアクションの判断
|
|
30
|
+
- ファイルの作成・編集
|
|
31
|
+
- サブエージェントの結果をポイントを絞ってユーザーへ伝える(生の出力をそのまま貼らない)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
2
|
+
description: コーディング規約(命名規則・コメント・テスト構成)
|
|
3
|
+
paths: ["src/**", "tests/**"]
|
|
3
4
|
---
|
|
4
5
|
|
|
5
6
|
# コーディング規約
|
|
@@ -47,15 +48,26 @@ applyTo: "src/**,tests/**"
|
|
|
47
48
|
|
|
48
49
|
## テスト
|
|
49
50
|
|
|
50
|
-
- テストファイルは実装と同じディレクトリ構造を維持する(`tests/` 配下に `src/` と同じ構造)
|
|
51
|
-
- TDD サイクル: RED → GREEN → REFACTOR
|
|
52
|
-
|
|
53
51
|
### テストコメント規約
|
|
54
52
|
|
|
55
53
|
- **意図の記述**: 全テストにテスト意図を日本語 1 行で書く(メソッド名の言い換えではなく「なぜそのテストが必要か」を書く)
|
|
56
|
-
- **準備・実行・検証**: セットアップが 5 行以上のテストでは `#
|
|
54
|
+
- **準備・実行・検証**: セットアップが 5 行以上のテストでは `# 準備 - ...` / `# 実行 - ...` / `# 検証 - ...` で構造を明示する。サフィックスには具体的に何をしているかを書く
|
|
57
55
|
- **英語コメント禁止**: `Arrange` / `Act` / `Assert` 等の英語は使わない
|
|
58
56
|
|
|
57
|
+
```
|
|
58
|
+
# なぜそのテストが必要かを1行で書く
|
|
59
|
+
test("ある入力に対して期待する出力を返す", () => {
|
|
60
|
+
# 準備 - テスト対象の入力データを用意する
|
|
61
|
+
const input = ...
|
|
62
|
+
|
|
63
|
+
# 実行 - テスト対象の関数を呼び出す
|
|
64
|
+
const result = targetFunction(input)
|
|
65
|
+
|
|
66
|
+
# 検証 - 期待する出力と一致するか確認する
|
|
67
|
+
expect(result).toBe(expectedOutput)
|
|
68
|
+
})
|
|
69
|
+
```
|
|
70
|
+
|
|
59
71
|
## 後方互換ハックの禁止
|
|
60
72
|
|
|
61
73
|
使われなくなったコードは完全に削除する。互換性維持のための温存は行わない。
|
|
@@ -14,9 +14,9 @@ applyTo: "docs/**"
|
|
|
14
14
|
- 設計書は必ずテンプレートをコピーして生成する。独自にゼロから作成しない
|
|
15
15
|
- 手順: テンプレートを読む → 出力先へコピーする → プレースホルダーを埋める
|
|
16
16
|
|
|
17
|
-
##
|
|
17
|
+
## ヘッダー
|
|
18
18
|
|
|
19
|
-
- `docs/**`
|
|
19
|
+
- `docs/**` の全設計書にヘッダーを付ける
|
|
20
20
|
- 正本の必須項目は `spec_runner.node_id` / `spec_runner.kind` / `spec_runner.depends_on` / `spec_runner.maps_to`
|
|
21
21
|
- `depends_on` はまず文字列配列でよい。依存理由が必要な場合のみオブジェクト形式を使う
|
|
22
22
|
- `maps_to` には `src/` / `tests/` / IaC / 設定ファイルを列挙する。必ず設定する(空にしない)
|
|
@@ -81,7 +81,7 @@ spec_runner:
|
|
|
81
81
|
- Markdown に HTML タグ(details, summary, br など)を使わない
|
|
82
82
|
- 設計書に絵文字・記号(✓ ✅ ☑ ◯ × △ など)を使わない。状態・判定は文字で表現する
|
|
83
83
|
- `概要.md` のような汎用的な名前は使わない(`要件定義.md`、`ユースケース一覧.md` のように内容を示す名前にする)
|
|
84
|
-
-
|
|
84
|
+
- 「関連ドキュメント」セクションを設計書に作らない。依存関係はヘッダーの `depends_on` で管理する
|
|
85
85
|
- 「スケジュール」セクションを設計書に作らない。進捗管理は設計書の責務ではない
|
|
86
86
|
|
|
87
87
|
## ドメインモデルとデータモデルの分離(style: ddd のみ)
|
|
@@ -5,9 +5,6 @@ description: 新規プロジェクトで docs と `.spec-runner/architecture/arc
|
|
|
5
5
|
|
|
6
6
|
# architecture-definition
|
|
7
7
|
|
|
8
|
-
新規プロジェクト向けの初期化フロー。
|
|
9
|
-
要件定義・フォルダ構造の決定・architecture contract の作成までを先に固め、スキル整備を経てから概要設計へ進む。
|
|
10
|
-
|
|
11
8
|
## 全体フロー
|
|
12
9
|
|
|
13
10
|
```
|
|
@@ -21,19 +18,27 @@ Phase 5: architecture-skill-development へ自動移行
|
|
|
21
18
|
|
|
22
19
|
## Phase 1: 要件整理
|
|
23
20
|
|
|
24
|
-
テンプレート: `.claude/skills/
|
|
21
|
+
テンプレート: `.claude/skills/ddd-seed/templates/01_要件定義/`
|
|
25
22
|
|
|
26
|
-
1.
|
|
27
|
-
2.
|
|
28
|
-
3.
|
|
29
|
-
4.
|
|
23
|
+
1. 曖昧な前提があれば `spec-probe` スキルで先に整理する
|
|
24
|
+
2. ユーザーから背景、提供価値、制約、スコープ外を確認する
|
|
25
|
+
3. テンプレートをコピーして `docs/01_要件定義/要件定義.md` を作る
|
|
26
|
+
4. ドメイン用語が出てきたら `docs/01_要件定義/ユビキタス言語辞書.md` に随時追記する
|
|
27
|
+
5. アーキテクチャスタイルを選択する
|
|
30
28
|
|
|
31
29
|
| スタイル | 選ぶ基準 |
|
|
32
30
|
|---------|---------|
|
|
33
31
|
| `ddd` | 複雑なビジネスドメインがある。集約・境界コンテキストで設計する必要がある |
|
|
34
32
|
| `layered` | CRUD 中心またはビジネスロジックがシンプル。UC・サービス層で設計すれば十分 |
|
|
35
33
|
|
|
36
|
-
|
|
34
|
+
6. フロントエンドの有無を確認する
|
|
35
|
+
|
|
36
|
+
| 値 | 基準 |
|
|
37
|
+
|----|------|
|
|
38
|
+
| `true` | Web UI・モバイル画面がある |
|
|
39
|
+
| `false` | API・バックエンドのみ |
|
|
40
|
+
|
|
41
|
+
7. 使用する AI 連携を確認する
|
|
37
42
|
|
|
38
43
|
| 連携 | フォルダ |
|
|
39
44
|
|------|---------|
|
|
@@ -41,11 +46,11 @@ Phase 5: architecture-skill-development へ自動移行
|
|
|
41
46
|
| `github` | `.github/`(GitHub Copilot) |
|
|
42
47
|
| 両方 | `.claude/` と `.github/` |
|
|
43
48
|
|
|
44
|
-
|
|
49
|
+
8. ユーザーに確認・承認を得る
|
|
45
50
|
|
|
46
51
|
## Phase 2: フォルダ構造の決定
|
|
47
52
|
|
|
48
|
-
|
|
53
|
+
この段階で決めた構造がテンプレートの `maps_to` パスに焼き込まれるため、概要設計より前に確定させる。
|
|
49
54
|
|
|
50
55
|
1. 以下をユーザーと対話しながら決める
|
|
51
56
|
- `src/` 配下のパッケージ・モジュール構成
|
|
@@ -63,10 +68,11 @@ Phase 5: architecture-skill-development へ自動移行
|
|
|
63
68
|
|
|
64
69
|
## Phase 4: architecture contract 作成
|
|
65
70
|
|
|
66
|
-
1. `.spec-runner/architecture/architecture.yaml`
|
|
71
|
+
1. `.spec-runner/architecture/architecture.yaml` を作る(`.spec-runner/` は補助情報として扱う)
|
|
67
72
|
2. 最低限、以下を構造化する
|
|
68
73
|
- **integrations**: Phase 1 で確認した連携(`[claude]` / `[github]` / `[claude, github]`)
|
|
69
74
|
- **style**: Phase 1 で選択したスタイル(`ddd` / `layered`)
|
|
75
|
+
- **has_frontend**: Phase 1 で確認したフロントエンドの有無(`true` / `false`)
|
|
70
76
|
- **folder_structure**: Phase 2 で決定した構造(`src/` / `tests/` / `docs/` など)
|
|
71
77
|
- domain_structure(style: ddd のときのみ)
|
|
72
78
|
- runtime_units
|
|
@@ -82,10 +88,3 @@ Phase 4 が承認されたら、ユーザーにコマンドを打たせずに `a
|
|
|
82
88
|
2. project 専用 skill に切り出すべき反復フローを列挙する
|
|
83
89
|
3. 確認なしに `architecture-skill-development` Phase 1 へ進む
|
|
84
90
|
4. スキル整備完了後、プロジェクト専用スキルを使って概要設計へ進む
|
|
85
|
-
|
|
86
|
-
## 原則
|
|
87
|
-
|
|
88
|
-
- フォルダ構造を概要設計より前に確定する
|
|
89
|
-
- スキル整備が完了してから概要設計へ進む(テンプレートの `maps_to` を確定済み構造で焼き込むため)
|
|
90
|
-
- `.spec-runner/` は補助情報として扱う
|
|
91
|
-
- project 専用 skill を作る前にアーキテクチャを固める
|