spec-runner 1.1.7 → 1.1.8
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/README.md +51 -80
- package/bin/spec-runner-installer.js +401 -0
- package/install.sh +1 -1
- package/package.json +7 -6
- package/spec-runner/templates/.claude/agents/code-reviewer.md +69 -0
- package/spec-runner/templates/.claude/agents/design-reviewer.md +65 -0
- package/spec-runner/templates/.claude/agents/test-runner.md +34 -0
- package/spec-runner/templates/.claude/rules/coding.md +106 -0
- package/spec-runner/templates/.claude/rules/design-docs.md +63 -0
- package/spec-runner/templates/.claude/skills/architecture-definition/SKILL.md +60 -0
- package/spec-runner/templates/.claude/skills/architecture-skill-development/SKILL.md +126 -0
- package/spec-runner/templates/.claude/skills/commit/SKILL.md +83 -0
- package/spec-runner/templates/.claude/skills/design-change/SKILL.md +94 -0
- 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 +66 -0
- package/spec-runner/templates/.claude/skills/design-change/templates/90_ADR/ADR/343/203/206/343/203/263/343/203/227/343/203/254/343/203/274/343/203/210.md +81 -0
- package/spec-runner/templates/.claude/skills/existing-project-to-docs/SKILL.md +57 -0
- package/spec-runner/templates/.claude/skills/harness-engineering/SKILL.md +100 -0
- package/spec-runner/templates/.claude/skills/plugin-development/SKILL.md +173 -0
- 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 +88 -0
- 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 +81 -0
- 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 +80 -0
- 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 +57 -0
- 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 +53 -0
- 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 +54 -0
- 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 +25 -0
- 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 +28 -0
- 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 +56 -0
- 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 +47 -0
- 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 +67 -0
- 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 +72 -0
- 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 +53 -0
- 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 +51 -0
- package/spec-runner/templates/.claude/skills/test-driven-development/SKILL.md +211 -0
- package/spec-runner/templates/.github/agents/code-reviewer.agent.md +69 -0
- package/spec-runner/templates/.github/agents/design-reviewer.agent.md +65 -0
- package/spec-runner/templates/.github/agents/test-runner.agent.md +34 -0
- package/spec-runner/templates/.github/instructions/coding.instructions.md +105 -0
- package/spec-runner/templates/.github/instructions/design-docs.instructions.md +62 -0
- package/spec-runner/templates/.github/skills/architecture-definition/SKILL.md +60 -0
- package/spec-runner/templates/.github/skills/architecture-skill-development/SKILL.md +126 -0
- package/spec-runner/templates/.github/skills/commit/SKILL.md +83 -0
- package/spec-runner/templates/.github/skills/design-change/SKILL.md +94 -0
- 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 +66 -0
- package/spec-runner/templates/.github/skills/design-change/templates/90_ADR/ADR/343/203/206/343/203/263/343/203/227/343/203/254/343/203/274/343/203/210.md +81 -0
- package/spec-runner/templates/.github/skills/existing-project-to-docs/SKILL.md +57 -0
- package/spec-runner/templates/.github/skills/harness-engineering/SKILL.md +100 -0
- package/spec-runner/templates/.github/skills/plugin-development/SKILL.md +173 -0
- 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 +88 -0
- 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 +81 -0
- 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 +80 -0
- 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 +57 -0
- 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 +53 -0
- 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 +54 -0
- 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 +25 -0
- 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 +28 -0
- 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 +56 -0
- 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 +47 -0
- 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 +67 -0
- 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 +72 -0
- 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 +53 -0
- 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 +51 -0
- package/spec-runner/templates/.github/skills/test-driven-development/SKILL.md +211 -0
- package/bin/spec-runner.js +0 -270
- package/docs/flow.md +0 -72
- package/templates/.spec-runner/project.json.example +0 -27
- package/templates/.spec-runner/scripts/check.sh +0 -390
- package/templates/.spec-runner/scripts/spec-runner-core.sh +0 -289
- package/templates/.spec-runner/scripts/uc-next-start.sh +0 -161
- package/templates/.spec-runner/spec-runner.sh +0 -29
- package/templates/.spec-runner/steps/steps.json +0 -96
- package/templates/.spec-runner/steps//343/203/206/343/202/271/343/203/210/350/250/255/350/250/210.md +0 -58
- package/templates/.spec-runner/steps//343/203/211/343/203/241/343/202/244/343/203/263/350/250/255/350/250/210.md +0 -52
- package/templates/.spec-runner/steps//344/273/225/346/247/230/347/255/226/345/256/232.md +0 -210
- package/templates/.spec-runner/steps//345/210/206/346/236/220.md +0 -106
- package/templates/.spec-runner/steps//345/256/237/350/243/205.md +0 -80
- package/templates/.spec-runner/steps//345/256/237/350/243/205/350/250/210/347/224/273.md +0 -96
- package/templates/.spec-runner/steps//346/206/262/347/253/240.md +0 -95
- package/templates/.spec-runner/steps//346/233/226/346/230/247/343/201/225/350/247/243/346/266/210.md +0 -110
- package/templates/.spec-runner/templates/UC-N-MMDD-/345/210/244/346/226/255/350/250/230/351/214/262/343/203/206/343/203/263/343/203/227/343/203/254.md +0 -33
- package/templates/.spec-runner/templates/UC-N-/343/203/246/343/203/274/343/202/271/343/202/261/343/203/274/343/202/271/345/220/215.md +0 -26
- package/templates/.spec-runner/templates/phase-locks.json +0 -49
- package/templates/.spec-runner/templates//343/203/211/343/203/241/343/202/244/343/203/263/343/203/242/343/203/207/343/203/253.md +0 -21
- package/templates/.spec-runner/templates//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 -16
- package/templates/.spec-runner/templates//346/206/262/347/253/240.md +0 -51
- package/templates/.spec-runner/templates//351/233/206/347/264/204.md +0 -46
- package/templates/mkdocs-scaffold/docs/index.md +0 -32
- package/templates/mkdocs-scaffold/mkdocs.yml +0 -16
- package/templates/mkdocs-scaffold/requirements-docs.txt +0 -2
- package/templates/skills/uc-k1-work-card-init/SKILL.md +0 -76
- package/templates/skills/uc-k2-pre-commit-check/SKILL.md +0 -57
- package/templates/skills/uc-k3-spec-impl-diff-review/SKILL.md +0 -57
- package/templates/spec-runner-command.md +0 -51
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test-driven-development
|
|
3
|
+
description: 新機能実装やバグ修正を行う際、実装コードを書く前に必ず使用する。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# テスト駆動開発(TDD)
|
|
7
|
+
|
|
8
|
+
## 概要
|
|
9
|
+
|
|
10
|
+
テストを先に書く。失敗するのを確認する。通る最小のコードを書く。
|
|
11
|
+
|
|
12
|
+
**中核原則:** テストが失敗するのを見ていないなら、そのテストが正しいものを検証しているか分からない。
|
|
13
|
+
|
|
14
|
+
## いつ使うか
|
|
15
|
+
|
|
16
|
+
**常に:** 新機能・バグ修正・リファクタリング・振る舞い変更
|
|
17
|
+
|
|
18
|
+
**例外(ユーザーに確認する):** 使い捨てプロトタイプ・生成コード・設定ファイル
|
|
19
|
+
|
|
20
|
+
## 鉄の掟
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
失敗するテストなしに本番コードを書かない
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
テストより先にコードを書いたなら削除して最初からやり直す。
|
|
27
|
+
「参考として残す」も「テストを書きながら適応させる」も不可。
|
|
28
|
+
|
|
29
|
+
## テスト実行コマンド
|
|
30
|
+
|
|
31
|
+
> このスキルはテンプレートとして配布されます。
|
|
32
|
+
> `architecture-skill-development` を使ってプロジェクト固有のコマンドに書き換えてください。
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# 全テスト(プロジェクトのテストコマンドに置き換える)
|
|
36
|
+
<your-test-command>
|
|
37
|
+
|
|
38
|
+
# 特定ファイル
|
|
39
|
+
<your-test-command> <test-file>
|
|
40
|
+
|
|
41
|
+
# カバレッジ計測
|
|
42
|
+
<your-test-command> --coverage
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Red-Green-Refactor
|
|
46
|
+
|
|
47
|
+
### RED - 失敗するテストを書く
|
|
48
|
+
|
|
49
|
+
起きてほしいことを示す、最小のテストを1つ書く。
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
// 例(言語・フレームワークはプロジェクトに合わせる)
|
|
53
|
+
test("ある入力に対して期待する出力を返す", () => {
|
|
54
|
+
// 準備 - テスト対象の入力データを用意する
|
|
55
|
+
const input = ...
|
|
56
|
+
|
|
57
|
+
// 実行 - テスト対象の関数を呼び出す
|
|
58
|
+
const result = targetFunction(input)
|
|
59
|
+
|
|
60
|
+
// 判定 - 期待する出力と一致するか確認する
|
|
61
|
+
expect(result).toBe(expectedOutput)
|
|
62
|
+
})
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**要件:**
|
|
66
|
+
- 1つの振る舞い
|
|
67
|
+
- 明確なテスト名(振る舞いを説明する)
|
|
68
|
+
- 実コード中心(不可避な場合のみモック)
|
|
69
|
+
|
|
70
|
+
### Verify RED - 失敗するのを確認する
|
|
71
|
+
|
|
72
|
+
**必須。絶対に省略しない。**
|
|
73
|
+
|
|
74
|
+
`@test-runner` エージェントに委任して実行する。
|
|
75
|
+
|
|
76
|
+
- テストが**失敗する**(エラーではない)
|
|
77
|
+
- 失敗メッセージが期待通り
|
|
78
|
+
- **機能がないこと**が原因で失敗している(誤字等ではない)
|
|
79
|
+
|
|
80
|
+
テストが通る → 既存挙動をテストしている。テストを修正する。
|
|
81
|
+
テストがエラー → エラーを直して再実行し、「正しく失敗する」まで繰り返す。
|
|
82
|
+
|
|
83
|
+
### GREEN - 通す最小のコードを書く
|
|
84
|
+
|
|
85
|
+
テストを通すための最も単純なコードを書く。
|
|
86
|
+
|
|
87
|
+
テストにない機能を足さない。他の改善やリファクタもここではしない。
|
|
88
|
+
|
|
89
|
+
### Verify GREEN - 通るのを確認する
|
|
90
|
+
|
|
91
|
+
**必須。**
|
|
92
|
+
|
|
93
|
+
`@test-runner` エージェントに委任して実行する。
|
|
94
|
+
|
|
95
|
+
- テストが通る
|
|
96
|
+
- **他のテストも全て通る**
|
|
97
|
+
- 出力がクリーン(エラー、警告なし)
|
|
98
|
+
- **カバレッジの未カバー行を確認** — 新規コードが未カバーなら追加テストを書く
|
|
99
|
+
|
|
100
|
+
テストが落ちる → テストではなくコードを直す。
|
|
101
|
+
他のテストが落ちる → 直ちに修正する。
|
|
102
|
+
|
|
103
|
+
### REFACTOR - 整理する
|
|
104
|
+
|
|
105
|
+
Greenの後にのみ: 重複削除・命名改善・ヘルパ抽出。
|
|
106
|
+
テストは常にGreenを維持する。新しい挙動は追加しない。
|
|
107
|
+
|
|
108
|
+
### 繰り返す
|
|
109
|
+
|
|
110
|
+
次の機能のために、次の失敗するテストを書く。
|
|
111
|
+
|
|
112
|
+
## よいテスト
|
|
113
|
+
|
|
114
|
+
- **最小**: 1つの振る舞いだけ。「and」が入るなら分割する
|
|
115
|
+
- **明確**: テスト名が挙動を説明する
|
|
116
|
+
- **意図が見える**: 望ましいAPIの使い方が伝わる
|
|
117
|
+
|
|
118
|
+
## テストのコメント
|
|
119
|
+
|
|
120
|
+
テストコメントの規約は同梱のコーディング規約ファイルの「テストコメント規約」に従う。
|
|
121
|
+
GREEN / REFACTORフェーズで書く実装コードにもビジネスロジックの意図をコメントする。
|
|
122
|
+
|
|
123
|
+
## テスト構成
|
|
124
|
+
|
|
125
|
+
テストファイルは `src/` と同じディレクトリ構造を `tests/` に鏡写しにする。
|
|
126
|
+
|
|
127
|
+
## fixture / テストデータの活用
|
|
128
|
+
|
|
129
|
+
- テストごとに独立した状態を持つ
|
|
130
|
+
- テストデータ生成にはヘルパ関数を定義して一貫性を保つ
|
|
131
|
+
- 外部サービス(API・メール・ストレージ等)は必要な場合のみモックする
|
|
132
|
+
|
|
133
|
+
## モックのルール
|
|
134
|
+
|
|
135
|
+
モックは分離の手段であり、テスト対象ではない。
|
|
136
|
+
|
|
137
|
+
**モック前の自問:**
|
|
138
|
+
1. 「実メソッドにはどんな副作用があるか?」
|
|
139
|
+
2. 「このテストはその副作用に依存しているか?」
|
|
140
|
+
3. 依存しているなら → より低いレベル(実際に遅い/外部な操作)をモックする
|
|
141
|
+
|
|
142
|
+
**原則:**
|
|
143
|
+
- 実コンポーネントの**出力**をテストする。モックの呼び出し確認だけにアサートしない
|
|
144
|
+
- 本番クラスにテスト専用メソッドを追加しない → fixtureやテストユーティリティに置く
|
|
145
|
+
- テストデータはドメインモデルの全フィールドを含める
|
|
146
|
+
|
|
147
|
+
**赤信号(モックをやめて設計を見直す):**
|
|
148
|
+
- モック準備がテスト本体より長い
|
|
149
|
+
- モックを外すとテストが成立しない
|
|
150
|
+
- なぜモックが必要か説明できない
|
|
151
|
+
|
|
152
|
+
## なぜ順序が重要か
|
|
153
|
+
|
|
154
|
+
実装後のテストはすぐ通る。すぐ通ることは何も証明しない:
|
|
155
|
+
- 間違ったものをテストしているかもしれない
|
|
156
|
+
- 実装に引きずられて挙動ではなく実装をテストしがち
|
|
157
|
+
- バグを捕まえる力を見ていない
|
|
158
|
+
|
|
159
|
+
テストファーストは、テストが本当に何かを検証していることを「失敗」で証明する。
|
|
160
|
+
|
|
161
|
+
## よくある合理化と赤信号
|
|
162
|
+
|
|
163
|
+
| 兆候 | 問題 |
|
|
164
|
+
|------|------|
|
|
165
|
+
| 「簡単すぎてテスト不要」 | 簡単でも壊れる。テストは30秒 |
|
|
166
|
+
| 「あとでテストする」 | すぐ通るテストは何も証明しない |
|
|
167
|
+
| 「今回だけTDDを飛ばす」 | 合理化である。止めること |
|
|
168
|
+
| テスト前にコードを書いた | コードを削除し、TDDで最初からやり直す |
|
|
169
|
+
| テストが最初から通る | 既存挙動をテストしている。テストを修正する |
|
|
170
|
+
| なぜ失敗したか説明できない | テストが正しいか再検討する |
|
|
171
|
+
|
|
172
|
+
**どれか1つでも当てはまるなら: コードを削除し、TDDで最初からやり直す。**
|
|
173
|
+
|
|
174
|
+
## 完了時のレビュー
|
|
175
|
+
|
|
176
|
+
実装完了後、以下のエージェントでレビューする:
|
|
177
|
+
- `@code-reviewer` — コーディング規約への適合チェック
|
|
178
|
+
|
|
179
|
+
## 検証チェックリスト
|
|
180
|
+
|
|
181
|
+
完了宣言の前に:
|
|
182
|
+
|
|
183
|
+
- [ ] 新規関数/メソッドにテストがある
|
|
184
|
+
- [ ] 各テストは実装前に失敗するのを見た
|
|
185
|
+
- [ ] 期待通りの理由で失敗した(機能不足であり誤字ではない)
|
|
186
|
+
- [ ] 通す最小コードを書いた
|
|
187
|
+
- [ ] 全テストが通る
|
|
188
|
+
- [ ] 出力がクリーン(エラー、警告なし)
|
|
189
|
+
- [ ] カバレッジを確認し、新規コードの未カバー行がない
|
|
190
|
+
- [ ] 実コード中心(不可避な場合のみモック)
|
|
191
|
+
- [ ] エッジケースとエラーをカバーした
|
|
192
|
+
|
|
193
|
+
すべてにチェックできないならTDDを飛ばしている。やり直すこと。
|
|
194
|
+
|
|
195
|
+
## 詰まったとき
|
|
196
|
+
|
|
197
|
+
| 問題 | 解決 |
|
|
198
|
+
|------|------|
|
|
199
|
+
| どうテストすべきか分からない | 望むAPIを書き、まずアサーションを書く。ユーザーに相談する |
|
|
200
|
+
| テストが複雑すぎる | 設計が複雑すぎる。インターフェースを簡素化する |
|
|
201
|
+
| 何でもモック必須 | 結合が強すぎる。依存性注入を使う |
|
|
202
|
+
| セットアップが巨大 | fixtureやテストユーティリティに抽出する。それでも大きいなら設計を簡素化する |
|
|
203
|
+
|
|
204
|
+
## 最終ルール
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
本番コード → 先にテストが存在し、失敗している
|
|
208
|
+
それ以外 → TDDではない
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
ユーザーの許可なしに例外はない。
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-reviewer
|
|
3
|
+
description: コーディング規約ファイルへの適合をチェックする。コード変更後のレビューに使用する。
|
|
4
|
+
tools: Read, Grep, Glob, Bash
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# コーディング規約チェックエージェント
|
|
9
|
+
|
|
10
|
+
同梱のコーディング規約ファイルに定義されたコーディング規約への適合をチェックする。
|
|
11
|
+
|
|
12
|
+
## 手順
|
|
13
|
+
|
|
14
|
+
1. `git diff --name-only` で変更ファイルを確認する(引数でファイルが指定された場合はそちらを使用)
|
|
15
|
+
2. 変更された `.py` ファイルを読み込む
|
|
16
|
+
3. 以下のチェック項目を検証する
|
|
17
|
+
4. 違反を報告する
|
|
18
|
+
|
|
19
|
+
## チェック項目
|
|
20
|
+
|
|
21
|
+
### 命名規則
|
|
22
|
+
- ファイル名: snake_case
|
|
23
|
+
- クラス名: PascalCase
|
|
24
|
+
- 関数・メソッド: snake_case
|
|
25
|
+
- 変数: snake_case
|
|
26
|
+
- 定数: UPPER_SNAKE_CASE
|
|
27
|
+
- モジュール内部定数: _UPPER_SNAKE_CASE(先頭アンダースコア)
|
|
28
|
+
- テストクラス: Test + PascalCase
|
|
29
|
+
- テストメソッド: test_ + snake_case(日本語不可)
|
|
30
|
+
|
|
31
|
+
### 型ヒント
|
|
32
|
+
- Python 3.12+ のビルトイン型を使用(`list[str]`, `dict[str, int]`, `str | None`)
|
|
33
|
+
- `typing` モジュールの `List`, `Dict`, `Optional` を使っていないか
|
|
34
|
+
- 値オブジェクトに `frozen=True` の dataclass を使っているか
|
|
35
|
+
|
|
36
|
+
### コメント・docstring
|
|
37
|
+
- コメントが日本語であるか(英語コメント禁止)
|
|
38
|
+
- モジュール先頭に1行概要があるか
|
|
39
|
+
- 不要なdocstring(名前で意図が伝わる関数へのdocstring)がないか
|
|
40
|
+
|
|
41
|
+
### テストコメント
|
|
42
|
+
- 全テストメソッドにdocstring(テスト意図を日本語1行)があるか
|
|
43
|
+
- セットアップ5行以上のテストに `# 準備` / `# 実行` / `# 検証` があるか
|
|
44
|
+
- テストクラスが3つ以上のファイルにセクション区切り(`# ====`)があるか
|
|
45
|
+
|
|
46
|
+
### プロジェクト構造
|
|
47
|
+
- テストファイルが実装と同じディレクトリ構造にあるか
|
|
48
|
+
- `__init__.py` が存在するか
|
|
49
|
+
|
|
50
|
+
## 報告フォーマット
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
## コーディング規約チェック結果
|
|
54
|
+
|
|
55
|
+
### 違反あり
|
|
56
|
+
#### [ファイルパス]:[行番号]
|
|
57
|
+
- 規約: [違反した規約名]
|
|
58
|
+
- 内容: [具体的な違反内容]
|
|
59
|
+
- 修正案: [修正例]
|
|
60
|
+
|
|
61
|
+
### 問題なし
|
|
62
|
+
- [チェック済みファイル一覧]
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 注意事項
|
|
66
|
+
|
|
67
|
+
- 読み取り専用(コードの変更は行わない)
|
|
68
|
+
- 日本語で報告する
|
|
69
|
+
- 変更されたファイルのみをチェック対象とする(既存コードの規約違反は指摘しない)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design-reviewer
|
|
3
|
+
description: 設計書(docs/)と実装コード(src/)の整合性をチェックする。設計書と実装の乖離が心配なときに使用する。
|
|
4
|
+
tools: Read, Grep, Glob
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# 設計書⇔実装 整合性チェックエージェント
|
|
9
|
+
|
|
10
|
+
docs/ 配下の設計書と src/ 配下の実装コードを突合し、乖離を報告する。
|
|
11
|
+
|
|
12
|
+
## 手順
|
|
13
|
+
|
|
14
|
+
1. docs/ 配下の設計書ファイルを一覧取得する
|
|
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. 乖離を報告する
|
|
20
|
+
|
|
21
|
+
## チェック項目
|
|
22
|
+
|
|
23
|
+
### frontmatter
|
|
24
|
+
|
|
25
|
+
- **必須項目**: `node_id` / `kind` / `depends_on` / `maps_to` が存在するか
|
|
26
|
+
- **依存整合**: `depends_on` の参照先が実在するか。依存の向きが明らかに逆転していないか
|
|
27
|
+
- **対応整合**: `maps_to` の実ファイルが存在するか。変更対象が漏れていないか
|
|
28
|
+
|
|
29
|
+
### 概要設計
|
|
30
|
+
|
|
31
|
+
- **ユースケース整合**: `ユースケース一覧.md` と個別 UC が実装のエンドポイント・コマンド・画面遷移と一致しているか
|
|
32
|
+
- **全体俯瞰**: `システム全体俯瞰.md` の責務分割・連携フロー・外部 IF が実装構造と一致しているか
|
|
33
|
+
- **ADR 反映**: `docs/02_概要設計/90_ADR/**` の採用方針が概要設計・詳細設計に反映されているか
|
|
34
|
+
|
|
35
|
+
### 詳細設計
|
|
36
|
+
|
|
37
|
+
- **責務整合**: `docs/03_詳細設計/src/**` の責務記述が対応コードの責務と一致しているか
|
|
38
|
+
- **入出力整合**: 関数シグネチャ、設定値、エラー処理、外部依存の扱いが設計どおりか
|
|
39
|
+
- **テスト整合**: `maps_to` に含まれる `tests/**` が設計上の主要シナリオをカバーしているか
|
|
40
|
+
- **不足 / 過剰**: 設計書にあるがコードにない、またはコードにあるが設計書にない要素があるか
|
|
41
|
+
|
|
42
|
+
## 報告フォーマット
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
## 整合性チェック結果
|
|
46
|
+
|
|
47
|
+
### frontmatterの問題
|
|
48
|
+
- [ファイル]: [問題内容]
|
|
49
|
+
|
|
50
|
+
### 一致(問題なし)
|
|
51
|
+
- [ファイルペアの一覧]
|
|
52
|
+
|
|
53
|
+
### 乖離あり
|
|
54
|
+
#### [設計書ファイル] ⇔ [実装ファイル]
|
|
55
|
+
- 種別: 不足 / 過剰 / 変更
|
|
56
|
+
- 内容: [具体的な差分の説明]
|
|
57
|
+
- 推奨対応: 設計書を更新 / 実装を修正
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## 注意事項
|
|
61
|
+
|
|
62
|
+
- 読み取り専用(コードや設計書の変更は行わない)
|
|
63
|
+
- 日本語で報告する
|
|
64
|
+
- ADR はコードと 1 対 1 の突合対象ではないが、配置先と反映有無は確認する
|
|
65
|
+
- hard code のパス推定より frontmatter の `maps_to` を優先する
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test-runner
|
|
3
|
+
description: コード変更後にテストを実行し、失敗時は原因分析まで行う。コード修正・機能追加の後に使用する。
|
|
4
|
+
tools: Read, Grep, Glob, Bash
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# テスト実行エージェント
|
|
9
|
+
|
|
10
|
+
テストをDocker環境で実行し、結果を分析する。
|
|
11
|
+
|
|
12
|
+
## 手順
|
|
13
|
+
|
|
14
|
+
1. `git diff --name-only` で変更ファイルを確認する
|
|
15
|
+
2. 変更ファイルに対応するテストファイルを特定する(`tests/` 配下の同構造)
|
|
16
|
+
3. テストを実行する:
|
|
17
|
+
- 対象テストが明確な場合: `docker compose run --rm test pytest tests/path/to/test_file.py -v`
|
|
18
|
+
- 全体実行が必要な場合: `docker compose run --rm test pytest -v`
|
|
19
|
+
4. 結果を分析する
|
|
20
|
+
|
|
21
|
+
## 失敗時の分析
|
|
22
|
+
|
|
23
|
+
テストが失敗した場合、以下を報告する:
|
|
24
|
+
|
|
25
|
+
- **失敗したテスト**: テスト名とファイルパス
|
|
26
|
+
- **エラー内容**: アサーションエラーやスタックトレースの要約
|
|
27
|
+
- **原因の推定**: 変更内容との関連性を分析
|
|
28
|
+
- **修正案**: 具体的なコード修正の提案(コード例を含める)
|
|
29
|
+
|
|
30
|
+
## 注意事項
|
|
31
|
+
|
|
32
|
+
- テスト実行は必ず `docker compose run --rm test pytest` で行う
|
|
33
|
+
- コードの修正は行わない(分析と提案のみ)
|
|
34
|
+
- 日本語で報告する
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
applyTo: "src/**,tests/**"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# コーディング規約
|
|
6
|
+
|
|
7
|
+
## 命名規則
|
|
8
|
+
|
|
9
|
+
| 対象 | 規則 | 例 |
|
|
10
|
+
|------|------|-----|
|
|
11
|
+
| ファイル名 | snake_case | `domain.py`, `journal_search.py` |
|
|
12
|
+
| クラス名 | PascalCase | `CheckExecution`, `AccountBalance` |
|
|
13
|
+
| 関数・メソッド | snake_case | `aggregate_by_account()`, `determine_severity()` |
|
|
14
|
+
| 変数 | snake_case | `journal_entries`, `diff_amount` |
|
|
15
|
+
| 定数 | UPPER_SNAKE_CASE | `THRESHOLD_ERROR`, `_VALID_SEVERITIES` |
|
|
16
|
+
| モジュール内部定数 | _UPPER_SNAKE_CASE(先頭アンダースコア) | `_THRESHOLD_WARNING` |
|
|
17
|
+
| テストクラス | Test + PascalCase | `TestDetermineSeverity` |
|
|
18
|
+
| テストメソッド | test_ + snake_case(日本語不可) | `test_empty_entries_raises` |
|
|
19
|
+
| ディレクトリ | snake_case | `agents/reconciliation/`, `plugins/tools/` |
|
|
20
|
+
|
|
21
|
+
## コメント・docstring
|
|
22
|
+
|
|
23
|
+
- **言語**: 日本語
|
|
24
|
+
- **docstring**: モジュール先頭に1行で概要を書く。関数・クラスには原則不要(名前で意図が伝わる場合)
|
|
25
|
+
- **インラインコメント**: ビジネスロジックの「なぜ」を説明する場合のみ。処理内容の「何」は書かない
|
|
26
|
+
|
|
27
|
+
```python
|
|
28
|
+
# 良い例
|
|
29
|
+
# 貸方は負の値として扱う(借方 - 貸方 = 残高)
|
|
30
|
+
balances[credit_key] = balances.get(credit_key, 0) - entry.credit_amount
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 型
|
|
34
|
+
|
|
35
|
+
- Python 3.12+ のビルトイン型を使用(`list[str]`, `dict[str, int]`, `str | None`)
|
|
36
|
+
- `typing` モジュールのインポートは不要(`List`, `Dict`, `Optional` は使わない)
|
|
37
|
+
- dataclass の `frozen=True` を値オブジェクトに使用
|
|
38
|
+
|
|
39
|
+
## テスト
|
|
40
|
+
|
|
41
|
+
- テストファイルは実装と同じディレクトリ構造: `tests/agents/reconciliation/test_domain.py`
|
|
42
|
+
- TDDサイクル: RED → GREEN → REFACTOR
|
|
43
|
+
|
|
44
|
+
### テストコメント規約
|
|
45
|
+
|
|
46
|
+
- **docstring**: 全テストメソッドにテスト意図を日本語1行で書く(メソッド名の言い換えではなく「なぜそのテストが必要か」を書く)
|
|
47
|
+
- **セクション区切り**: テストクラスが3つ以上あるファイルでは、クラス間に区切りコメントを入れる
|
|
48
|
+
|
|
49
|
+
```python
|
|
50
|
+
# ============================================================
|
|
51
|
+
# 重要度判定
|
|
52
|
+
# ============================================================
|
|
53
|
+
class TestDetermineSeverity:
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
- **準備・実行・検証**: セットアップが5行以上のテストでは `# 準備` / `# 実行` / `# 検証` で構造を明示する。`—` で簡潔な意図を添える(推奨)
|
|
57
|
+
|
|
58
|
+
```python
|
|
59
|
+
def test_full_flow(self):
|
|
60
|
+
"""集計→比較→分析の全フローが動作する"""
|
|
61
|
+
# 準備 — 仕訳と調書に50K円の差異を作る
|
|
62
|
+
agent = self._make_agent()
|
|
63
|
+
entries = [_make_entry("売掛金", "売上高", 1_000_000)]
|
|
64
|
+
worksheet = [_make_balance("worksheet", "売掛金", 950_000)]
|
|
65
|
+
|
|
66
|
+
# 実行
|
|
67
|
+
results = agent.run_check(entries, worksheet, [])
|
|
68
|
+
|
|
69
|
+
# 検証 — 差異がある科目のみ返る
|
|
70
|
+
assert len(results) == 1
|
|
71
|
+
assert results[0].severity.value == "error"
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
- **インラインコメント**: データ構造やモック応答の意図が分かりにくい箇所には積極的にコメントを付ける。特にリスト要素やside_effectの各要素には `# 計画`、`# 1パス目分析` のように役割を明示する
|
|
75
|
+
|
|
76
|
+
```python
|
|
77
|
+
llm.chat.side_effect = [
|
|
78
|
+
plan_json, # 計画
|
|
79
|
+
_make_analysis_response(), # 1パス目分析
|
|
80
|
+
investigation_needs, # 調査判断1: 追加調査必要
|
|
81
|
+
_make_analysis_response(), # 再分析1
|
|
82
|
+
# ここで上限到達 → ループ終了
|
|
83
|
+
]
|
|
84
|
+
|
|
85
|
+
# 1回目: 途中で切れたJSON、2回目: リトライで正しいJSON
|
|
86
|
+
truncated_json = '[{"account_name": "売掛金", ...'
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
- **英語コメント禁止**: `Arrange` / `Act` / `Assert` 等の英語は使わない
|
|
90
|
+
|
|
91
|
+
## 検索ルール
|
|
92
|
+
|
|
93
|
+
- コードの検索・置換は `src/` と `tests/` の両方を対象にする
|
|
94
|
+
- 日本語のキーワード(後方互換、レガシー等)も検索対象に含める
|
|
95
|
+
|
|
96
|
+
## プロジェクト構造
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
src/
|
|
100
|
+
agents/{agent_name}/ # agent.py, domain.py, prompts.py, config.py
|
|
101
|
+
plugins/tools/{tool}/ # tool.py
|
|
102
|
+
plugins/skills/{skill}/ # skill.py
|
|
103
|
+
web/ # FastAPI + HTMX
|
|
104
|
+
tests/ # src/ と同じ構造
|
|
105
|
+
```
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
applyTo: "docs/**"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# 設計書共通ルール
|
|
6
|
+
|
|
7
|
+
## フェーズ管理
|
|
8
|
+
|
|
9
|
+
- **ユーザー承認なしにフェーズを進めない**
|
|
10
|
+
- フェーズは必ず `要件定義 -> 概要設計 -> 詳細設計 -> TDD -> 実装` の順に進める
|
|
11
|
+
|
|
12
|
+
## テンプレート
|
|
13
|
+
|
|
14
|
+
- **設計書は必ずテンプレートをコピーして生成する。独自にゼロから作成しない**
|
|
15
|
+
- 手順: テンプレートを読む → 出力先へコピーする → プレースホルダーを埋める
|
|
16
|
+
|
|
17
|
+
## frontmatter
|
|
18
|
+
|
|
19
|
+
- **`docs/**` の全設計書に frontmatter を付ける**
|
|
20
|
+
- 正本の必須項目は `spec_runner.node_id` / `spec_runner.kind` / `spec_runner.depends_on` / `spec_runner.maps_to`
|
|
21
|
+
- `depends_on` はまず文字列配列でよい。依存理由が必要な場合のみオブジェクト形式を使う
|
|
22
|
+
- `maps_to` には見直し対象となる `src/` / `tests/` / IaC / 設定ファイルを列挙する
|
|
23
|
+
- `modules` / `source_files` などの拡張項目を足す場合でも、`maps_to` と矛盾させない
|
|
24
|
+
|
|
25
|
+
```yaml
|
|
26
|
+
---
|
|
27
|
+
spec_runner:
|
|
28
|
+
node_id: detail.src.agents.reconciliation.agent
|
|
29
|
+
kind: detailed_design
|
|
30
|
+
depends_on:
|
|
31
|
+
- overview.system_context
|
|
32
|
+
- use_case.reconciliation.list
|
|
33
|
+
maps_to:
|
|
34
|
+
- src/agents/reconciliation/agent.py
|
|
35
|
+
- tests/agents/reconciliation/test_agent.py
|
|
36
|
+
---
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 命名規則
|
|
40
|
+
|
|
41
|
+
| 対象 | 規則 | 例 |
|
|
42
|
+
|------|------|-----|
|
|
43
|
+
| `docs/01_要件定義` | 日本語 | `要件定義.md` |
|
|
44
|
+
| `docs/02_概要設計` | 日本語 | `ユースケース一覧.md`, `システム全体俯瞰.md` |
|
|
45
|
+
| `docs/02_概要設計/ユースケース` | `UC-{日本語名}.md` | `UC-差異一覧表示.md` |
|
|
46
|
+
| `docs/02_概要設計/90_ADR` | `ADR-0001-{slug}.md` | `ADR-0001-detailed-design-mirrors-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` |
|
|
49
|
+
|
|
50
|
+
## ADR
|
|
51
|
+
|
|
52
|
+
- **ADR は必ず 3 案を比較してから採用案を決める**
|
|
53
|
+
- ADR は原則 `docs/02_概要設計/90_ADR/` に置く
|
|
54
|
+
- ドメインローカル ADR が必要な場合だけ `docs/02_概要設計/<ドメイン>/90_ADR/` を使う
|
|
55
|
+
- ADR は理由の記録であり、詳細設計の代わりにしない
|
|
56
|
+
|
|
57
|
+
## 文書品質
|
|
58
|
+
|
|
59
|
+
- **概要設計では「何をするか」を書き、コード片・DDL・クラス定義は持ち込まない**
|
|
60
|
+
- **詳細設計では `src/` に対応する責務・入出力・判断条件・テスト観点を書く**
|
|
61
|
+
- **`docs/03_詳細設計` は原則 `src/` ミラーにする。例外文書は `maps_to` で根拠を残す**
|
|
62
|
+
- **Markdown に HTML タグ(details, summary, br など)を使わない**
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: architecture-definition
|
|
3
|
+
description: 新規プロジェクトで docs と `.spec-runner/architecture/architecture.yaml` を立ち上げるための初期化フロー。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# architecture-definition
|
|
7
|
+
|
|
8
|
+
新規プロジェクト向けの初期化フロー。
|
|
9
|
+
要件定義から概要設計、architecture contract の作成までを先に固め、その後に project 専用 skill の開発へ渡す。
|
|
10
|
+
|
|
11
|
+
## 全体フロー
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
Phase 1: 要件整理
|
|
15
|
+
Phase 2: 概要設計の骨格作成
|
|
16
|
+
Phase 3: アーキテクチャ判断の明文化
|
|
17
|
+
Phase 4: architecture contract 作成
|
|
18
|
+
Phase 5: 次の skill へ引き渡し
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Phase 1: 要件整理
|
|
22
|
+
|
|
23
|
+
1. ユーザーから背景、提供価値、制約、スコープ外を確認する
|
|
24
|
+
2. `docs/01_要件定義/要件定義.md` を作る
|
|
25
|
+
3. frontmatter を付ける
|
|
26
|
+
4. ユーザーに確認・承認を得る
|
|
27
|
+
|
|
28
|
+
## Phase 2: 概要設計の骨格作成
|
|
29
|
+
|
|
30
|
+
1. `docs/02_概要設計/ユースケース一覧.md` を作る
|
|
31
|
+
2. `docs/02_概要設計/システム全体俯瞰.md` を作る
|
|
32
|
+
3. 必要に応じて `ユースケース/`、`外部IF一覧.md`、`非機能・運用方針.md` を追加する
|
|
33
|
+
4. ユーザーに確認・承認を得る
|
|
34
|
+
|
|
35
|
+
## Phase 3: アーキテクチャ判断の明文化
|
|
36
|
+
|
|
37
|
+
1. ドメイン分割、責務境界、実装単位、インフラ方針を整理する
|
|
38
|
+
2. 必要なら `docs/02_概要設計/90_ADR/` に ADR を作る
|
|
39
|
+
3. ユーザーに確認・承認を得る
|
|
40
|
+
|
|
41
|
+
## Phase 4: architecture contract 作成
|
|
42
|
+
|
|
43
|
+
1. `.spec-runner/architecture/architecture.yaml` を作る
|
|
44
|
+
2. 最低限、以下を構造化する
|
|
45
|
+
- domain_structure
|
|
46
|
+
- runtime_units
|
|
47
|
+
- design_policy
|
|
48
|
+
- testing_policy
|
|
49
|
+
3. ユーザーに確認・承認を得る
|
|
50
|
+
|
|
51
|
+
## Phase 5: 次の skill へ引き渡し
|
|
52
|
+
|
|
53
|
+
1. `architecture-skill-development` に渡す前提を整理する
|
|
54
|
+
2. project 専用 skill に切り出すべき反復フローを列挙する
|
|
55
|
+
|
|
56
|
+
## 原則
|
|
57
|
+
|
|
58
|
+
- docs を先に作る
|
|
59
|
+
- `.spec-runner/` は補助情報として扱う
|
|
60
|
+
- project 専用 skill を作る前にアーキテクチャを固める
|