@careerchain/stdd 0.1.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 (53) hide show
  1. package/README.md +44 -0
  2. package/assets/.claude/agents/code-reviewer.md +170 -0
  3. package/assets/.claude/agents/implementer.md +96 -0
  4. package/assets/.claude/agents/plan-writer.md +124 -0
  5. package/assets/.claude/agents/qa-engineer.md +133 -0
  6. package/assets/.claude/agents/spec-reviewer.md +173 -0
  7. package/assets/.claude/agents/spec-writer.md +194 -0
  8. package/assets/.claude/agents/test-reviewer.md +218 -0
  9. package/assets/.claude/docs/spec-driven-development-guide.md +436 -0
  10. package/assets/.claude/hooks/pre-push-check.sh +160 -0
  11. package/assets/.claude/settings.json +67 -0
  12. package/assets/.claude/skills/auto-implement/SKILL.md +168 -0
  13. package/assets/.claude/skills/auto-implement/references/github-project.md +54 -0
  14. package/assets/.claude/skills/auto-implement/references/phases.md +244 -0
  15. package/assets/.claude/skills/create-pr/SKILL.md +112 -0
  16. package/assets/.claude/skills/documenting-plans/SKILL.md +217 -0
  17. package/assets/.claude/skills/documenting-plans/templates/plan.md +182 -0
  18. package/assets/.claude/skills/documenting-specifications/SKILL.md +300 -0
  19. package/assets/.claude/skills/documenting-specifications/guides/error-handling.md +78 -0
  20. package/assets/.claude/skills/documenting-specifications/guides/stdd-violations.md +237 -0
  21. package/assets/.claude/skills/documenting-specifications/templates/requirements.md +184 -0
  22. package/assets/.claude/skills/documenting-specifications/templates/screen-items-definition.md +179 -0
  23. package/assets/.claude/skills/documenting-specifications/templates/tech-design.md +241 -0
  24. package/assets/.claude/skills/generating-wireframes/SKILL.md +121 -0
  25. package/assets/.claude/skills/generating-wireframes/examples/tob-form.html +497 -0
  26. package/assets/.claude/skills/generating-wireframes/examples/tob-list.html +536 -0
  27. package/assets/.claude/skills/generating-wireframes/examples/toc-form.html +493 -0
  28. package/assets/.claude/skills/generating-wireframes/examples/toc-list.html +538 -0
  29. package/assets/.claude/skills/generating-wireframes/guides/from-requirements.md +53 -0
  30. package/assets/.claude/skills/generating-wireframes/templates/index.html +472 -0
  31. package/assets/.claude/skills/generating-wireframes/templates/screen.html +480 -0
  32. package/assets/.claude/skills/introducing-stdd/SKILL.md +185 -0
  33. package/assets/.claude/skills/introducing-stdd/templates/introduction-plan.md +64 -0
  34. package/assets/.claude/skills/kaizen/SKILL.md +129 -0
  35. package/assets/.claude/skills/kaizen/references/code-examples.md +233 -0
  36. package/assets/.claude/skills/reverse-engineering-common-spec/SKILL.md +137 -0
  37. package/assets/.claude/skills/reverse-engineering-feature-spec/SKILL.md +463 -0
  38. package/assets/.claude/skills/reverse-engineering-feature-spec/guides/accuracy.md +215 -0
  39. package/assets/.claude/skills/reverse-engineering-feature-spec/guides/figma-capture.md +313 -0
  40. package/assets/.claude/skills/review-pr-with-agents/SKILL.md +159 -0
  41. package/assets/.claude/skills/searching-existing-solutions/SKILL.md +110 -0
  42. package/assets/.claude/skills/setup-stdd/SKILL.md +82 -0
  43. package/assets/.claude/skills/software-architecture/SKILL.md +260 -0
  44. package/assets/.claude/skills/starting-new-with-stdd/SKILL.md +142 -0
  45. package/assets/.claude/skills/starting-new-with-stdd/templates/bootstrap-plan.md +73 -0
  46. package/assets/.claude/skills/tailoring-spec-format/SKILL.md +103 -0
  47. package/assets/.claude/skills/verifying-consistency/SKILL.md +90 -0
  48. package/assets/stdd.config.yml.tpl +34 -0
  49. package/dist/cli.js +148 -0
  50. package/dist/cli.js.map +1 -0
  51. package/dist/install.js +121 -0
  52. package/dist/install.js.map +1 -0
  53. package/package.json +48 -0
@@ -0,0 +1,436 @@
1
+ # Spec and Test Driven Development (STDD): 開発ガイド
2
+
3
+ ## 目次
4
+
5
+ 1. [概要](#概要)
6
+ 2. [なぜSpec and Test Driven Developmentなのか](#なぜspec-and-test-driven-developmentなのか)
7
+ 3. [仕様ドキュメントの役割](#仕様ドキュメントの役割)
8
+ 4. [テスト戦略](#テスト戦略)
9
+ 5. [開発フロー](#開発フロー)
10
+ 6. [ベストプラクティス](#ベストプラクティス)
11
+
12
+ ---
13
+
14
+ ## 概要
15
+
16
+ ### Spec and Test Driven Development (STDD) とは
17
+
18
+ **仕様を先に定義し、その仕様に基づいてテストを作成し、それに基づいて実装を行う開発手法**
19
+
20
+ ```
21
+ Spec and Test Driven Development (STDD):
22
+ 仕様 → テスト → 実装 → 検証
23
+ (仕様が常に最新のSSoT)
24
+ ```
25
+
26
+ ---
27
+
28
+ ## なぜSpec and Test Driven Developmentなのか
29
+
30
+ **1. 仕様ドキュメント↔テスト↔実装の一貫性を保つ**
31
+
32
+ - ✅ 仕様ドキュメント = ビジネス要件のSSoT(Single Source of Truth)
33
+ - ✅ テスト = 仕様の実行可能な証明
34
+ - ✅ 実装 = テストを通すための手段
35
+
36
+ ```
37
+ REQUIREMENTS.md (What & Why)
38
+ ↓ Test Strategyで対応を明示
39
+ Test (E2E/Integration/Unit)
40
+ ↓ テストを通すために実装
41
+ Implementation
42
+ ↓ 仕様を満たしていることを証明
43
+ Test Pass ✅
44
+ ```
45
+
46
+ ---
47
+
48
+ **2. 仕様ドキュメントさえあれば、機能性が担保された実装をAIが行うことができる**
49
+
50
+ Claude Codeは仕様ドキュメント(REQUIREMENTS.md + TECH_DESIGN.md)を読み込み、Test Strategy に従ってテストを作成し、テストを通す実装を自動生成します。
51
+
52
+ ```
53
+ Human: REQUIREMENTS.md作成(ビジネス要件)
54
+
55
+ Human: TECH_DESIGN.md作成(技術設計)
56
+
57
+ Human: レビュー・承認
58
+
59
+ Claude Code: テスト作成(E2E/Integration/Unit)
60
+
61
+ Claude Code: 実装(テストを通すために)
62
+
63
+ Claude Code: テスト実行・検証
64
+ ```
65
+
66
+ **メリット**:
67
+
68
+ - 人間は「何を作るか(What)」に集中
69
+ - 仕様さえ正確なら、実装の品質が担保される
70
+
71
+ ---
72
+
73
+ **3. 仕様ドキュメントをビジネス要件のSSoT(Single Source of Truth)として利用することができる**
74
+
75
+ REQUIREMENTS.mdは以下の情報を集約します:
76
+
77
+ - ユーザージャーニー(すべて記述、エラーケース含む)
78
+ - 各JourneyのPriority(P0/P1/P2)
79
+ - 成功基準、エッジケース
80
+
81
+ これにより:
82
+
83
+ - ✅ ステークホルダーとの合意形成が容易
84
+ - ✅ 仕様レビュー段階で方向性を確定(手戻りを最小化)
85
+ - ✅ 常に最新のビジネス要件が参照可能
86
+ - ✅ ドキュメントと実装の乖離がない
87
+
88
+ ---
89
+
90
+ ## 仕様ドキュメントの役割
91
+
92
+ - 以下で表すものはすべて同じものを指す
93
+ - Specドキュメント
94
+ - Spec
95
+ - 仕様ドキュメント
96
+ - 仕様書
97
+ - 仕様ドキュメントは以下2つがある
98
+
99
+ ### REQUIREMENTS.md
100
+
101
+ **目的**: ビジネス要件とユーザージャーニーを定義し、SSoT(Single Source of Truth)として機能させる
102
+
103
+ **記述内容**:
104
+
105
+ - Problem Statement: このFeatureが解決する問題
106
+ - Business Goals: ビジネス目標
107
+ - **すべてのUser Journeyを記述**(正常系、エラーケース、エッジケース含む)
108
+ - **各JourneyにPriority(P0/P1/P2)を付与**
109
+ - Out of Scope: 対応しない項目
110
+
111
+ ---
112
+
113
+ ### TECH_DESIGN.md
114
+
115
+ **目的**: Feature固有の技術設計と内部仕様を定義し、実装の指針とする
116
+
117
+ **記述内容**:
118
+
119
+ - Feature-Specific Architecture: この機能固有のアーキテクチャとデータフロー
120
+ - Key Design Decisions: 設計判断とその理由
121
+ - Data Model: ER図、TypeScript型定義、バリデーションルール
122
+ - API Design: エンドポイント、型定義、エラーハンドリング
123
+ - **Test Strategy**: 各Journeyおよび内部仕様とテストレベルの対応表
124
+ - **Error Handling Strategy**: エラーコード定義、HTTPステータス、実装方針
125
+ - Security Requirements: セキュリティ要件
126
+ - Performance Requirements: パフォーマンス目標
127
+ - Integration Points: 外部システムとの統合
128
+
129
+ ---
130
+
131
+ ### REQUIREMENTS.md と TECH_DESIGN.md の違い
132
+
133
+ | 項目 | REQUIREMENTS.md | TECH_DESIGN.md |
134
+ | -------- | -------------------------------- | ----------------------------------------------------- |
135
+ | **視点** | ユーザー視点(What & Why) | 技術視点(How) |
136
+ | **読者** | ステークホルダー、PM、デザイナー | エンジニア、アーキテクト |
137
+ | **内容** | ユーザージャーニー、ビジネス目標 | アーキテクチャ、API設計、内部仕様、仕様とテストの対応 |
138
+
139
+ **⚠️ 重要**: Specドキュメントには「対応済み」「実装中」などの**実装過程の記述を含めない**こと。Specドキュメントは常にSSoTとして最新の要件・仕様のみを記載する。
140
+
141
+ ---
142
+
143
+ ## テスト戦略
144
+
145
+ ### テストレベルの定義
146
+
147
+ | テストレベル | 対象 | 目的 |
148
+ | --------------- | ------------------------------------- | ---------------------------- |
149
+ | **E2E** | 機能(feature)またはページ(page) | Critical Pathsのみ |
150
+ | **Integration** | ページ(page)以下のReactコンポーネント | エラーケース、統合動作 |
151
+ | **Unit** | 関数、メソッド単体 | 詳細ロジック、バリデーション |
152
+
153
+ ---
154
+
155
+ ### Priority(P0/P1/P2)の定義
156
+
157
+ | Priority | 定義 | テスト戦略 |
158
+ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ |
159
+ | **P0** | **Critical Path**<br>・ビジネスに直結する最重要フロー<br>・頻度が非常に高い<br>・複数システムをまたぐ統合<br>・データ損失やセキュリティに関わる | E2E必須<br>+ Integration |
160
+ | **P1** | **Important**<br>・重要だがCritical Pathではない<br>・頻度が高い<br>・エラーケースの大半 | E2E検討(複雑さ・コストで判断)<br>Integration必須 |
161
+ | **P2** | **Nice to Have**<br>・エッジケース<br>・頻度が低い<br>・ユーザー体験の改善 | E2E不要<br>Integration<br>Unit |
162
+
163
+ ---
164
+
165
+ ## 開発フロー
166
+
167
+ ### 新機能開発の全体フロー
168
+
169
+ ```
170
+ 1. REQUIREMENTS.md作成
171
+ - すべてのUser Journey記述(エラーケース含む)
172
+ - 各JourneyにPriority付与(P0/P1/P2)
173
+
174
+ 2. ステークホルダーレビュー
175
+
176
+ 3. TECH_DESIGN.md作成
177
+ - Feature固有の技術設計
178
+ - Test Strategy(各Journeyとテストレベルの対応)
179
+ - ここでREQUIREMENTS.mdのJourneyを含めて仕様とテストの対応を明確にする
180
+
181
+ 4. アーキテクトレビュー
182
+
183
+ 5. ★ PLANドキュメント作成
184
+ - 開発者に実装スコープを確認
185
+ - Test Strategyに従ってタスクを分解
186
+ - Unit → Integration → E2Eの順でテスト作成タスクを記載
187
+ - その後、実装タスクを記載
188
+
189
+ 6. テスト作成(Red状態)(PLANドキュメントに従う)
190
+ - Unit test
191
+ - Integration test
192
+ - E2E test
193
+
194
+ 7. 実装(PLANドキュメントに従う)
195
+
196
+ 8. テスト実行
197
+ - Unit
198
+ - Integration
199
+ - E2E
200
+
201
+ 9. テスト通過確認(Green)
202
+
203
+ 10. PR作成 → 開発者によるレビュー → マージ
204
+ ```
205
+
206
+ ### 既存機能への追加・変更の全体フロー
207
+
208
+ ```
209
+ 1. ★ PLANドキュメント作成
210
+ - 開発者に実装スコープを確認
211
+ - タスクの一つとしてSpecドキュメントの更新を含める
212
+
213
+ 2. REQUIREMENTS.md更新
214
+ - 新しいJourneyを追加、または既存を変更
215
+ - Priority付与
216
+
217
+ 3. ステークホルダーレビュー
218
+
219
+ 4. TECH_DESIGN.md更新
220
+ - 技術設計の変更を反映
221
+ - Test Strategyを更新
222
+
223
+ 5. アーキテクトレビュー
224
+
225
+ 6. PLANドキュメント更新
226
+ - テスト・実装計画をTest Strategyに基づいて更新
227
+
228
+ 7. テスト作成・更新(Red状態)(PLANドキュメントに従う)
229
+
230
+ 8. 実装(PLANドキュメントに従う)
231
+
232
+ 9. テスト実行
233
+
234
+ 10. テスト通過確認
235
+
236
+ 11. PR作成 → 開発者によるレビュー → マージ
237
+ ```
238
+
239
+ ---
240
+
241
+ ### Phase 1: 仕様定義
242
+
243
+ #### 1-1. REQUIREMENTS.md作成/更新
244
+
245
+ **配置**: `docs/<app>/<path>/REQUIREMENTS.md`
246
+
247
+ **新機能の場合**: 新規作成
248
+
249
+ **既存機能への追加の場合**: 直接更新
250
+
251
+ **含めるべき内容**:
252
+
253
+ - Problem Statement、Target Users、Business Goals
254
+ - すべてのUser Journey(エラーケース、エッジケース含む)
255
+ - 各JourneyにPriority(P0/P1/P2)を付与
256
+ - Success Criteria、Edge Cases、Out of Scope
257
+
258
+ #### 1-2. ステークホルダーレビュー
259
+
260
+ - PMやデザイナーと仕様を確認
261
+ - ビジネス要件が満たされているか確認
262
+ - 修正が必要な場合は、REQUIREMENTS.mdを更新
263
+
264
+ ---
265
+
266
+ ### Phase 2: 技術設計
267
+
268
+ #### 2-1. TECH_DESIGN.md作成/更新
269
+
270
+ **配置**: `docs/<app>/<path>/TECH_DESIGN.md`
271
+
272
+ **新機能の場合**: 新規作成
273
+
274
+ **既存機能への追加の場合**: 直接更新
275
+
276
+ **含めるべき内容**:
277
+
278
+ - Feature-Specific Architecture
279
+ - Key Design Decisions(設計判断とその理由)
280
+ - Data Model(ER図、TypeScript型定義)
281
+ - API Design(エンドポイント、型定義)
282
+ - **Test Strategy**(各Journeyをどのテストレベルでカバーするか)
283
+ - REQUIREMENTS.mdのすべてのJourneyを含める
284
+ - 各Journeyとテストレベル(E2E/Integration/Unit)の対応を明示
285
+ - Error Handling Strategy
286
+ - Security/Performance Requirements
287
+ - Integration Points
288
+
289
+ #### 2-2. アーキテクトレビュー
290
+
291
+ - 技術設計が適切か確認
292
+ - アーキテクチャパターンに従っているか
293
+ - パフォーマンス・セキュリティ要件を満たせるか
294
+ - Test Strategyが適切か(E2E/Integration/Unitの役割分担)
295
+
296
+ ---
297
+
298
+ ### Phase 3: PLANドキュメント作成
299
+
300
+ PLANドキュメントはセッションごとの実装タスクを管理するドキュメントです。
301
+
302
+ **配置**: `docs/<app>/<feature-path>/plans/[yyyy-mm-dd].md`
303
+
304
+ **詳細**: [documenting-plans Skill](../.claude/skills/documenting-plans/SKILL.md) を参照
305
+
306
+ ---
307
+
308
+ ### Phase 4: テスト作成(Red状態)
309
+
310
+ **TDDの原則**: テスト作成 → **Red確認** → 実装 → **Green確認** → Refactor
311
+
312
+ TECH_DESIGN.mdのTest Strategyに従ってテストを作成:
313
+
314
+ 1. **Unit test**: バリデーションロジック、ビジネスロジック
315
+ 2. **Integration test**: エラーケース、コンポーネント統合
316
+ 3. **E2E test**: Critical Paths(P0の一部)
317
+
318
+ #### 重要: Red状態の確認
319
+
320
+ **テスト作成後、必ずテストを実行してRed(失敗)を確認すること**
321
+
322
+ **なぜRedを確認するのか**:
323
+
324
+ - ✅ テストが正しく動作していることを証明
325
+ - ✅ テストが実装をチェックしていることを保証
326
+ - ✅ "テストが最初から通ってしまう"バグを防ぐ
327
+
328
+ **Red確認の手順**:
329
+
330
+ ```bash
331
+ # テストを実行してRedを確認(<commands.test> は .stdd.config.yml の commands.test)
332
+ <commands.test> -- <test-file>
333
+
334
+ # 期待される結果: テストが失敗する(Red状態)
335
+ # ❌ FAIL: "実装がないため失敗" → 正常
336
+ # ✅ PASS: "テストが通った" → 異常(テストが何もチェックしていない)
337
+ ```
338
+
339
+ **もしテストが最初から通ってしまった場合**:
340
+
341
+ - テストが正しく実装をチェックしていない
342
+ - テストを修正し、Redになることを確認
343
+ - 例: アサーションが甘い、モックが実装を含んでいる
344
+
345
+ ---
346
+
347
+ ### Phase 5: 実装(Green状態)
348
+
349
+ PLANドキュメントに従って順次実装:
350
+
351
+ 1. Unit testに対応する実装
352
+ 2. Integration testに対応する実装
353
+ 3. E2E testに対応する実装
354
+
355
+ **実装時の原則(Red → Green → Refactorサイクル)**:
356
+
357
+ 1. **Red**: テストが失敗することを確認(Phase 4で完了)
358
+ 2. **Green**: 実装してテストを通す
359
+ - 1タスクずつ完成させる
360
+ - テストが通ることを確認してから次へ
361
+ 3. **Refactor**: コードを整理(必要に応じて)
362
+ 4. 各タスク完了後にcommit
363
+
364
+ **Greenになったら**:
365
+
366
+ ```bash
367
+ # すべてのテストを実行(<commands.test> は .stdd.config.yml の commands.test)
368
+ <commands.test>
369
+
370
+ # 期待される結果: すべてのテストが通る(Green状態)
371
+ # ✅ PASS: すべてのテスト → Phase 6へ進む
372
+ # ❌ FAIL: 一部のテストが失敗 → 実装を修正
373
+ ```
374
+
375
+ ---
376
+
377
+ ### Phase 6: テスト実行と検証
378
+
379
+ すべてのテストを実行し、Greenであることを確認:
380
+
381
+ - Unit test
382
+ - Integration test
383
+ - E2E test
384
+
385
+ ---
386
+
387
+ ### Phase 7: PR作成とマージ
388
+
389
+ #### 7-1. PR作成
390
+
391
+ - CIが通っていることを確認
392
+ - PR descriptionに仕様ドキュメントへのリンクを記載
393
+ - テストカバレッジを確認
394
+
395
+ #### 7-2. 開発者によるレビューとマージ
396
+
397
+ レビュアーは以下を確認:
398
+
399
+ - ✅ REQUIREMENTS.mdの要件を満たしているか
400
+ - ✅ TECH_DESIGN.mdの設計に従っているか
401
+ - ✅ Test Strategyに従ってテストが書かれているか
402
+ - ✅ すべてのテストが通っているか
403
+ - ✅ コード品質(可読性、保守性)
404
+
405
+ 承認後、マージを実行。
406
+
407
+ ---
408
+
409
+ ## ベストプラクティス
410
+
411
+ ### 1. 仕様レビューを最優先する
412
+
413
+ 実装前にREQUIREMENTS.mdとTECH_DESIGN.mdをレビューし、方向性を確定。手戻りを最小化。
414
+
415
+ ### 2. E2Eテストは「Critical Pathsのみ」
416
+
417
+ すべてのJourneyをE2E化しない。P0の一部のみE2E化し、その他はIntegration/Unitで検証。
418
+
419
+ ### 3. エラーケースもUser Journeyとして記述
420
+
421
+ エラーケースを「その他」として扱わず、Priorityを付与。
422
+
423
+ ### 4. Test StrategyをTECH_DESIGN.mdで明示
424
+
425
+ 各JourneyにどのテストレベルでカバーするかをTECH_DESIGN.mdで明記し、「なぜこのテストレベルか」の理由も記載。
426
+
427
+ ### 5. ドキュメントは実装ディレクトリに従う
428
+
429
+ 実装ファイル: `<app.path>/app/login/page.tsx`(`app.path` は `.stdd.config.yml` の `apps[].path`)
430
+ → ドキュメント: `docs/<app.id>/login/REQUIREMENTS.md`, `TECH_DESIGN.md`(`docs.layout.*` テンプレートに従う。`<app.id>` は `apps[].id`)
431
+
432
+ ### 6. セッション開始時にスコープを確認する
433
+
434
+ PLANドキュメント作成前に、必ず開発者に実装スコープを確認する。大きな機能は複数セッションに分割して実装することが多いため、スコープを明確にすることで認識齟齬を防ぐ。
435
+
436
+ **詳細**: [documenting-plans Skill](../.claude/skills/documenting-plans/SKILL.md) を参照
@@ -0,0 +1,160 @@
1
+ #!/bin/bash
2
+ # PreToolUse Hook: git push 実行前にテスト・ビルドを実行
3
+ # いずれかが失敗した場合、push を中止する。
4
+ #
5
+ # このフックは下流プロジェクト固有の値をハードコードせず、リポジトリルートの
6
+ # .stdd.config.yml を実行時に読み取って動作する(設定駆動)。
7
+ # - apps[].path : 検査対象アプリのディレクトリ
8
+ # - commands.test : 各アプリで実行するテストコマンド(必須)
9
+ # - commands.build : 各アプリで実行するビルドコマンド(任意)
10
+ # - project.primary_branch : upstream 未設定時の比較先ブランチ
11
+ #
12
+ # 設定が無い / 必須キーが欠ける場合は push をブロックせずスキップする。
13
+ # 詳細な記述規約は docs/config-driven-authoring.md を参照。
14
+
15
+ hook_input=$(cat)
16
+ command=$(echo "$hook_input" | jq -r '.tool_input.command // empty')
17
+
18
+ # git push コマンドかどうかを判定
19
+ if ! echo "$command" | grep -qE "git push"; then
20
+ exit 0
21
+ fi
22
+
23
+ # --no-verify オプションが付いている場合はスキップ
24
+ if echo "$command" | grep -qE "\-\-no-verify"; then
25
+ exit 0
26
+ fi
27
+
28
+ # プロジェクトルートディレクトリを取得
29
+ ROOT_DIR=$(git rev-parse --show-toplevel 2>/dev/null) || exit 0
30
+ CONFIG="$ROOT_DIR/.stdd.config.yml"
31
+
32
+ if [ ! -f "$CONFIG" ]; then
33
+ echo "Pre-push check: .stdd.config.yml が見つからないためスキップします"
34
+ exit 0
35
+ fi
36
+
37
+ # --- .stdd.config.yml パーサ(外部依存なし) ---
38
+
39
+ # 指定セクション直下のスカラー値を取得: $1=section, $2=key
40
+ yaml_scalar() {
41
+ awk -v sec="$1:" -v k="$2:" '
42
+ /^[^[:space:]]/ { insec = ($1 == sec) }
43
+ insec && $1 == k {
44
+ sub(/^[[:space:]]*[^:]*:[[:space:]]*/, "", $0)
45
+ print $0
46
+ exit
47
+ }
48
+ ' "$CONFIG"
49
+ }
50
+
51
+ # apps[] の path を 1 行ずつ取得
52
+ yaml_apps_paths() {
53
+ awk '
54
+ /^[^[:space:]]/ { inapps = ($1 == "apps:") }
55
+ inapps && $1 == "path:" {
56
+ sub(/^[[:space:]]*path:[[:space:]]*/, "", $0)
57
+ print $0
58
+ }
59
+ ' "$CONFIG"
60
+ }
61
+
62
+ # 前後のクォートを除去
63
+ strip_quotes() {
64
+ local v="$1"
65
+ v="${v%\"}"; v="${v#\"}"
66
+ v="${v%\'}"; v="${v#\'}"
67
+ printf '%s' "$v"
68
+ }
69
+
70
+ PRIMARY_BRANCH=$(strip_quotes "$(yaml_scalar project primary_branch)")
71
+ PRIMARY_BRANCH=${PRIMARY_BRANCH:-main}
72
+ TEST_CMD=$(strip_quotes "$(yaml_scalar commands test)")
73
+ BUILD_CMD=$(strip_quotes "$(yaml_scalar commands build)")
74
+
75
+ if [ -z "$TEST_CMD" ]; then
76
+ echo "Pre-push check: commands.test が未定義のためスキップします"
77
+ exit 0
78
+ fi
79
+
80
+ # リモートブランチとの差分を取得(push対象のコミット)
81
+ # upstream 未設定時は origin/<primary_branch> と比較
82
+ UPSTREAM=$(git rev-parse --abbrev-ref @{upstream} 2>/dev/null || echo "origin/$PRIMARY_BRANCH")
83
+ CHANGED_FILES=$(git diff --name-only "$UPSTREAM"...HEAD 2>/dev/null \
84
+ || git diff --name-only "origin/$PRIMARY_BRANCH"...HEAD 2>/dev/null \
85
+ || echo "")
86
+
87
+ # 検査対象アプリ(apps[].path)を取得。未定義ならリポジトリルートを単一アプリ扱い
88
+ APPS_PATHS=$(yaml_apps_paths)
89
+ if [ -z "$APPS_PATHS" ]; then
90
+ APPS_PATHS="."
91
+ fi
92
+
93
+ echo "=========================================="
94
+ echo "Pre-push check: 変更のあったアプリを検査します"
95
+ echo "=========================================="
96
+
97
+ FAILED=0
98
+ ANY=0
99
+
100
+ while IFS= read -r raw_path; do
101
+ [ -z "$raw_path" ] && continue
102
+ appdir=$(strip_quotes "$raw_path")
103
+ [ -z "$appdir" ] && continue
104
+
105
+ # 変更があったか判定
106
+ if [ "$appdir" = "." ]; then
107
+ # ルートを単一アプリとする構成: 何らかの変更があれば対象
108
+ if [ -n "$CHANGED_FILES" ]; then changed=1; else changed=0; fi
109
+ else
110
+ if echo "$CHANGED_FILES" | grep -qE "^${appdir%/}/"; then changed=1; else changed=0; fi
111
+ fi
112
+
113
+ if [ "$changed" -eq 0 ]; then
114
+ echo "⏭ $appdir: 変更がないためスキップ"
115
+ continue
116
+ fi
117
+
118
+ ANY=1
119
+ echo ""
120
+ echo "▶ $appdir: テスト実行中... ($TEST_CMD)"
121
+ if ( cd "$ROOT_DIR/$appdir" && eval "$TEST_CMD" 2>&1 ); then
122
+ echo "✓ $appdir: テスト成功"
123
+ else
124
+ echo "✗ $appdir: テスト失敗"
125
+ FAILED=1
126
+ break
127
+ fi
128
+
129
+ if [ -n "$BUILD_CMD" ]; then
130
+ echo ""
131
+ echo "▶ $appdir: ビルド実行中... ($BUILD_CMD)"
132
+ if ( cd "$ROOT_DIR/$appdir" && eval "$BUILD_CMD" 2>&1 ); then
133
+ echo "✓ $appdir: ビルド成功"
134
+ else
135
+ echo "✗ $appdir: ビルド失敗"
136
+ FAILED=1
137
+ break
138
+ fi
139
+ fi
140
+ done <<EOF
141
+ $APPS_PATHS
142
+ EOF
143
+
144
+ echo ""
145
+ echo "=========================================="
146
+ if [ "$ANY" -eq 0 ]; then
147
+ echo "Pre-push check: 対象アプリに変更がないためスキップします"
148
+ echo "=========================================="
149
+ exit 0
150
+ fi
151
+
152
+ if [ "$FAILED" -eq 1 ]; then
153
+ echo "✗ テストまたはビルドが失敗しました。push を中止します。"
154
+ echo "=========================================="
155
+ exit 2
156
+ else
157
+ echo "✓ すべてのテスト・ビルドが成功しました。push を続行します。"
158
+ echo "=========================================="
159
+ exit 0
160
+ fi
@@ -0,0 +1,67 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/claude-code-settings.json",
3
+ "env": {
4
+ "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1",
5
+ "MAX_THINKING_TOKENS": "10000",
6
+ "CLAUDE_AUTOCOMPACT_PCT_OVERRIDE": "50"
7
+ },
8
+ "permissions": {
9
+ "allow": [
10
+ "Skill",
11
+ "Task",
12
+ "Bash(npm:*)",
13
+ "Bash(git:*)",
14
+ "Bash(npx:*)",
15
+ "Bash(node:*)",
16
+ "Bash(bash:*)",
17
+ "Bash(devcontainer:*)",
18
+ "Bash(docker:*)",
19
+ "Bash(gh:*)",
20
+ "Bash(./scripts/create-worktree.sh:*)",
21
+ "Bash(./scripts/remove-worktree.sh:*)",
22
+ "Bash(./scripts/:*)",
23
+ "Bash(git -C:*)",
24
+ "Bash(ls:*)",
25
+ "Bash(find:*)",
26
+ "Bash(head:*)",
27
+ "Bash(tail:*)",
28
+ "Bash(cat:*)",
29
+ "Bash(grep:*)",
30
+ "Bash(wc:*)",
31
+ "Bash(sort:*)",
32
+ "Bash(jq:*)",
33
+ "Bash(echo:*)",
34
+ "Bash(test:*)",
35
+ "Bash(cp:*)",
36
+ "Bash(mv:*)",
37
+ "Bash(rm:*)",
38
+ "Bash(mkdir:*)",
39
+ "Bash(chmod:*)",
40
+ "Bash(sed:*)",
41
+ "Bash(curl:*)",
42
+ "Bash(nc:*)",
43
+ "Bash(lsof:*)",
44
+ "Bash(pgrep:*)",
45
+ "Bash(pkill:*)",
46
+ "Bash(realpath:*)",
47
+ "Bash(shasum:*)",
48
+ "Bash(xargs:*)",
49
+ "Bash(awk:*)",
50
+ "Bash(PGPASSWORD=postgres psql:*)"
51
+ ]
52
+ },
53
+ "hooks": {
54
+ "PreToolUse": [
55
+ {
56
+ "matcher": "Bash",
57
+ "hooks": [
58
+ {
59
+ "type": "command",
60
+ "command": ".claude/hooks/pre-push-check.sh",
61
+ "timeout": 600
62
+ }
63
+ ]
64
+ }
65
+ ]
66
+ }
67
+ }