@k2works/claude-code-booster 6.0.0 → 6.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.
- package/lib/assets/.claude/skills/migrating-ai-dlc/SKILL.md +243 -0
- package/lib/assets/.claude/skills/migrating-ai-dlc/evals/evals.json +60 -0
- package/lib/assets/.claude/skills/migrating-ai-dlc/references/artifact-templates.md +258 -0
- package/lib/assets/.claude/skills/migrating-ai-dlc/scripts/aidlc_check.py +372 -0
- package/lib/assets/CLAUDE.md +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: migrating-ai-dlc
|
|
3
|
+
description: XP ベースで運用してきた既存プロジェクトを AI-DLC(AI-Driven Development Lifecycle)の運用に移行し、移行後の適合性を検証する。現状を棚卸しして移行計画を作り、承認後にリスク台帳・用語集・既存コードの静的/動的モデル・受入条件の Given/When/Then 化・Unit 分解(依存 DAG・ストーリーマップ)・リリース計画のエントロピー評価・Bolt 計画・PROJECT.md のガードレールを 1 ステップずつ整える。「AI-DLC に移行したい」「AI-DLC を導入したい」「このプロジェクトを AI-DLC で回したい」「ストーリーを Unit に分けたい」「イテレーション計画を Bolt 計画にしたい」「AI-DLC に適合しているか確認したい」といった場面で必ず発動する。CLAUDE.md に AI-DLC 採用が書かれているのに docs/ や PROJECT.md が XP 版のままの場面でも積極的に提案すること。日常の Bolt 計画は planning-releases、ストーリー作成は analyzing-usecases が担う。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# AI-DLC 移行
|
|
7
|
+
|
|
8
|
+
XP ベースで運用してきたプロジェクトを **AI-DLC** の運用に移行し、移行後の適合性を検証する。日常の運用(Bolt 計画・ストーリー作成・実装)は各スキルが担い、本スキルは「一度きりの移行」と「適合しているかの確認」を担う。`migrating-okf` が文書のフォーマットを移行するのに対し、本スキルは **開発の進め方** を移行する。
|
|
9
|
+
|
|
10
|
+
移行の根拠は次のガイド。**作業前に必ず読む**。ガイドと本スキルが食い違う場合はガイドを正とする。
|
|
11
|
+
|
|
12
|
+
| ガイド | 本スキルで使う箇所 |
|
|
13
|
+
| :--- | :--- |
|
|
14
|
+
| `docs/reference/AI-DLC導入ガイド.md` | 第 3 章(10 原則)、第 4 章(成果物)、第 13 章(本プロジェクトへの導入ステップ) |
|
|
15
|
+
| `docs/reference/開発ガイド_AI-DLC版.md` | 活動ごとの AI と人の分担、ガイド対応表 |
|
|
16
|
+
| `docs/reference/リリース・イテレーション計画ガイド_AI-DLC版.md` | 第 1 章(Unit 分解・エントロピー評価・Bolt 計画)、第 5 章(リスク台帳)、第 8 章(計画スキルの読み替え) |
|
|
17
|
+
| `docs/reference/ユースケース作成ガイド_AI-DLC版.md` | 第 5 章(テンプレート)、第 10 章(Unit とストーリーマップ)、第 12 章(ブラウンフィールド) |
|
|
18
|
+
| `docs/reference/コーディングとテストガイド_AI-DLC版.md` | 基本原則(ガードレール化する規律)、本プロジェクトの開発スキルへの適用 |
|
|
19
|
+
| `docs/reference/AI-DLC用語集.md` | 用語の定義 |
|
|
20
|
+
|
|
21
|
+
同じディレクトリに `PROJECT.md` があれば必ず読む。対象プロジェクトの識別子・`docs/` と `apps/` の配置・既存の計画ファイル名・ガードレールの置き場所など、プロジェクト固有の値はそこにある。
|
|
22
|
+
|
|
23
|
+
## なぜ移行するのか
|
|
24
|
+
|
|
25
|
+
AI-DLC の核心は「AI が計画・分解・生成を担い、人が承認ゲートで検証・決定する」構図にある。ガイドを置き、CLAUDE.md に採用を書いただけでは、docs/ のストーリーは Unit にまとまっておらず、計画はストーリーポイントのままで、AI に渡せない範囲も決まっていない。そのままだと AI は既存の XP 版の成果物を読んで XP 版の振る舞いを続け、人は「AI-DLC を採用したはずなのに何も変わらない」と感じる。移行の本質はファイルの改名ではなく、**AI が読む成果物を AI-DLC の契約(Unit・受入条件・リスク・ガードレール)の形に揃えること** である。
|
|
26
|
+
|
|
27
|
+
移行そのものも AI-DLC の流儀で進める。計画を書き、人の承認を得てから 1 ステップずつ実行し、重要な判断(Unit の境界、AI に渡せない範囲、ゲート密度)は勝手にしない。
|
|
28
|
+
|
|
29
|
+
## モード
|
|
30
|
+
|
|
31
|
+
| モード | 用途 |
|
|
32
|
+
| :--- | :--- |
|
|
33
|
+
| `--plan` | 現状を棚卸しし、移行前の状態を測り、移行計画をチェックボックス付き Markdown で提示する。既存の成果物は変更しない |
|
|
34
|
+
| `--migrate` | 承認済みの移行計画を 1 ステップずつ実行する(既定) |
|
|
35
|
+
| `--check` | 移行後の適合性を検証し、不足を移行ステップに対応づけて報告する。ファイルは変更しない |
|
|
36
|
+
|
|
37
|
+
指定がなければ、移行済みの痕跡(`docs/requirements/<project>/units.md`)が無ければ `--plan` → 承認 → `--migrate`、あれば `--check` から始める。
|
|
38
|
+
|
|
39
|
+
## 進め方
|
|
40
|
+
|
|
41
|
+
### 1. 棚卸しと移行計画(`--plan`)
|
|
42
|
+
|
|
43
|
+
#### 1-1. 移行前の状態を測る
|
|
44
|
+
|
|
45
|
+
最初に検査スクリプトを実行し、ERROR と WARN の件数と主な項目を記録する。移行の前後を同じ物差しで比べられるようにするためで、計画の各ステップがどの不足を埋めるのかも、この結果と対応づけて書ける。
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
python .claude/skills/migrating-ai-dlc/scripts/aidlc_check.py --project <project>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
#### 1-2. 棚卸し
|
|
52
|
+
|
|
53
|
+
次を調べ、現状を表にまとめる。
|
|
54
|
+
|
|
55
|
+
| 調査対象 | 見るもの | 判断 |
|
|
56
|
+
| :--- | :--- | :--- |
|
|
57
|
+
| `CLAUDE.md` | 「開発方法論:AI-DLC を採用する」節の有無、ペルソナの参照先 | 無ければ移行ステップに含める |
|
|
58
|
+
| `docs/reference/` | AI-DLC 導入ガイドと AI-DLC 版ガイド 4 本・用語集の有無 | 無ければ `npx boost --update` を先に案内し、移行は中断する |
|
|
59
|
+
| `docs/requirements/<project>/` | ユーザーストーリーの本数、受入条件を持つストーリーの本数(ストーリー単位で数える)、書式 | 受入条件が Given/When/Then でなければ書き直しの対象 |
|
|
60
|
+
| `docs/development/<project>/` | `release_plan.md`・`iteration_plan-N.md` の見積もり方式、進行中のイテレーション | 進行中のイテレーションは Bolt 計画に読み替える。完了済みは触らない |
|
|
61
|
+
| `docs/design/<project>/` | ドメインモデル・用語集・アーキテクチャ・ADR の有無 | 用語集が無ければ移行ステップで作る |
|
|
62
|
+
| `apps/<project>/` | コードの有無(ブラウンフィールドか)、テストの有無、フロントエンドの有無 | ブラウンフィールドなら静的・動的モデルへの昇格を含める。フロントエンドが無ければ `developing-frontend` は対象外 |
|
|
63
|
+
| `.claude/skills/*/PROJECT.md` | 既存のガードレール(命名規則・既存ユーティリティ・確認必須の操作) | TDD の三原則などの AI-DLC の規律が無ければ追記対象 |
|
|
64
|
+
| 組織のポリシー | AI に渡せないデータ・コード・鍵 | 分からなければ質問する。仮定で埋めない |
|
|
65
|
+
|
|
66
|
+
#### 1-3. 移行計画を書く
|
|
67
|
+
|
|
68
|
+
計画は `docs/development/<project>/aidlc_migration_plan.md` に書く。ファイル名は変えない。`--check` がこのパスで計画の有無を確かめる。
|
|
69
|
+
|
|
70
|
+
**計画に書くのは「何を・どの順で変え・どこで人の判断が要るか」まで** にする。Unit 定義、依存 DAG、ストーリーマップ、リスク台帳の表、エントロピー評価の表、静的・動的モデル、Bolt のステップといった **後続ステップの成果物は計画に書かない**。理由は 2 つある。
|
|
71
|
+
|
|
72
|
+
- 承認ゲートは誤りを早く刈り取るための損失関数で、1 つのゲートで判断するものは少ないほど効く。計画に Unit 案まで入れると、人は計画の承認と Unit 境界の承認を同時に求められ、ステップ 6 のゲートを経ずに境界が既成事実になる
|
|
73
|
+
- 計画が変更依頼で書き直されると、先に作った成果物の下書きはそのまま無駄になる。計画が短いほど承認までの往復も速い
|
|
74
|
+
|
|
75
|
+
棚卸しで気づいた候補(「決済は独立 Unit になりそう」「10 万円超の承認分岐は業務ルール候補」など)は、該当ステップの注記か要確認に 1 行で書けば足りる。
|
|
76
|
+
|
|
77
|
+
```markdown
|
|
78
|
+
# AI-DLC 移行計画:<project>
|
|
79
|
+
|
|
80
|
+
## 現状
|
|
81
|
+
- 検査結果(移行前): ERROR 3 / WARN 9(主な項目: units.md 無し、risk_register.md 無し、CLAUDE.md の採用節無し)
|
|
82
|
+
- ストーリー: 12 本(受入条件あり 3 本、Given/When/Then 0 本)
|
|
83
|
+
- 計画: release_plan.md(ストーリーポイント)、iteration_plan-3.md 進行中
|
|
84
|
+
- コード: apps/<project>/(ブラウンフィールド、テスト 2 件、フロントエンド無し)
|
|
85
|
+
- ガードレール: developing-backend/PROJECT.md に命名規則のみ
|
|
86
|
+
|
|
87
|
+
## 移行ステップ
|
|
88
|
+
- [ ] 1. CLAUDE.md に AI-DLC 採用を明記する
|
|
89
|
+
- [ ] 2. AI に渡せる範囲(In/Out)とリスク台帳を作る ※組織ポリシーの確認が必要
|
|
90
|
+
- [ ] 3. ドメイン用語集を整備する
|
|
91
|
+
- [ ] 4. 既存コードを静的・動的モデルに昇格させる(ブラウンフィールド) ※業務ルール候補の確認が必要
|
|
92
|
+
- [ ] 5. ストーリーの受入条件を Given/When/Then に揃える
|
|
93
|
+
- [ ] 6. ストーリーを Unit にまとめ、依存 DAG とストーリーマップを作る ※Unit の境界は要承認
|
|
94
|
+
- [ ] 7. release_plan.md にエントロピー評価とスコープ・深さ・テスト戦略を加える
|
|
95
|
+
- [ ] 8. 進行中の iteration_plan-3.md を bolt_plan-3.md に読み替える ※ウォーキングスケルトンの選定は要承認
|
|
96
|
+
- [ ] 9. ガードレールを各スキルの PROJECT.md に書く
|
|
97
|
+
- [ ] 10. OKF を適用し、適合性を検証する(目標: ERROR 0)
|
|
98
|
+
|
|
99
|
+
## AI の仮定
|
|
100
|
+
- 決済は外部サービスのため AI に本番キーを渡さない(要確認)
|
|
101
|
+
|
|
102
|
+
## 要確認
|
|
103
|
+
- AI に渡せないデータ・鍵の範囲と、組織のリスク台帳の有無
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
`--plan` で作るのは計画ファイルと、その `index.md`・`log.md` への登録だけ。既存のストーリーや計画は変更しない。
|
|
107
|
+
|
|
108
|
+
### 2. 移行(`--migrate`)
|
|
109
|
+
|
|
110
|
+
承認された計画を 1 ステップずつ実行し、完了ごとにチェックボックスを更新する。成果物の書式は `references/artifact-templates.md` を使う。
|
|
111
|
+
|
|
112
|
+
#### ステップ 1:CLAUDE.md に AI-DLC 採用を明記する
|
|
113
|
+
|
|
114
|
+
`lib/assets/CLAUDE.md`(booster のテンプレート)と同じ「開発方法論:AI-DLC を採用する」節を、対象プロジェクトの `CLAUDE.md` に加える。ペルソナの参照先を `開発ガイド_AI-DLC版.md` にする。すでにあれば何もしない。
|
|
115
|
+
|
|
116
|
+
#### ステップ 2:AI に渡せる範囲とリスク台帳を作る
|
|
117
|
+
|
|
118
|
+
`docs/requirements/<project>/risk_register.md` を作る。組織のリスク台帳があればその ID と対応づける。本番データ・機密情報・鍵・決済など **AI に渡せないもの** と、**確認必須の操作**(新規ファイル・構造変更・外部連携・セキュリティ・データベース・本番環境)を列挙し、各リスクに `R-01` のような ID を振る。ここで決めた内容が以降のすべての AI 生成物の前提になるので、分からないことは質問して埋める。
|
|
119
|
+
|
|
120
|
+
#### ステップ 3:ドメイン用語集を整備する
|
|
121
|
+
|
|
122
|
+
`docs/design/<project>/glossary.md` が無ければ、既存のストーリー・ドメインモデル・コードの命名から用語を集めて作る。同じ概念が別の語で書かれていれば統一する。AI はユースケース内の語のゆれを別エンティティとして生成するため、用語集は Unit 分解の前に要る。
|
|
123
|
+
|
|
124
|
+
#### ステップ 4:既存コードを静的・動的モデルに昇格させる(ブラウンフィールドのみ)
|
|
125
|
+
|
|
126
|
+
`apps/<project>/` のコードから、静的モデル(コンポーネント・責務・関係)と動的モデル(主要ユースケースを実現する相互作用)を `docs/design/<project>/` に書く。コードに埋め込まれた条件分岐は業務ルール候補として別に列挙し、使われていない経路や不明な意図は推測せず「要確認」と印を付ける。人が検証してから次に進む。これを省くと AI は生のコードを読んで規約から外れた生成をする。
|
|
127
|
+
|
|
128
|
+
#### ステップ 5:受入条件を揃える
|
|
129
|
+
|
|
130
|
+
各ストーリーの受入条件を Given/When/Then で一意に判定できる形にする。「参照する成果物」「確認ポイント」「AI の仮定」の欄を加える(ユースケース作成ガイド AI-DLC 版 第 5 章のストーリー形式)。既存の文面の意味は変えない。曖昧で書き直せないものは「要確認」として人に戻す。
|
|
131
|
+
|
|
132
|
+
#### ステップ 6:Unit 分解・依存 DAG・ストーリーマップ
|
|
133
|
+
|
|
134
|
+
ストーリーを凝集度で **Unit** にまとめ、`docs/requirements/<project>/units.md` に書く。各 Unit には **目的・含まれるストーリー・NFR・リスク・測定基準・推奨 Bolt・エントロピー評価・AI の仮定** を置く。続けて Unit 間の依存 DAG と、ユースケース × Unit × ストーリーの対応表を書き、どの Unit にも入らないストーリーは「未配置」として列挙する。
|
|
135
|
+
|
|
136
|
+
- **Unit の条件** は「独立して開発・デプロイできる」こと。ユースケースの境界とは一致させない。境界は設計判断なので、案を示して人の承認を得る
|
|
137
|
+
- **リスク欄は台帳の ID で参照する**(例: `R-01(本番キーを渡さない)`)。ガードレールの本文は `risk_register.md` と各スキルの `PROJECT.md` に置き、units.md に書き写さない。AI は作業のたびに台帳と PROJECT.md を読むが、units.md に埋もれた禁止事項は Unit を読まない作業では見落とされ、二重管理にもなる。台帳がまだ無ければ暫定 ID(`R-P01` など)を振り、ステップ 2 で正式な ID に置き換えると「AI の仮定」に書く
|
|
138
|
+
- **AI の仮定** には、境界を決めるときに置いた前提(「与信チェックは注文処理側に置く」など)を書く。承認ゲートで人が確かめるべき点が明示される
|
|
139
|
+
|
|
140
|
+
書き終えたら `aidlc_check.py` を実行し、units.md に関する項目がすべて OK になったことを確かめて報告する。
|
|
141
|
+
|
|
142
|
+
#### ステップ 7:リリース計画の読み替え
|
|
143
|
+
|
|
144
|
+
`docs/development/<project>/release_plan.md` に、Unit ごとの **エントロピー評価**(意図の曖昧さ・構造的不確実性・検証の不確実性・リスク・未解決の仮定を LOW/MED/HIGH)と、**スコープ・深さ・テスト戦略** の選択を加える。ストーリーポイント欄は削除せず「参考」として残す。本番機能のテスト戦略は Standard 未満にしない。未配置のストーリーを計画に残す場合は、Unit を追加するかスコープバッファとして明記する。
|
|
145
|
+
|
|
146
|
+
#### ステップ 8:進行中のイテレーション計画を Bolt 計画に読み替える
|
|
147
|
+
|
|
148
|
+
進行中の `iteration_plan-N.md` から、同じ番号の `bolt_plan-N.md` を作る。Bolt ゴールに「確認したい仮説」を入れ、最初の Bolt を **ウォーキングスケルトン**(エンドツーエンドの最小の縦割り)にする。ゴールとステップが一致しているか(「API から DB まで通す」ならその層のステップが全部あるか)を確かめる。ゲート密度は「各ステップでゲート」を既定にし、ウォーキングスケルトンの結果で見直すと明記する。元の `iteration_plan-N.md` は `apply-okf` の deprecate で `replaced_by` を付け、削除しない。完了済みのイテレーション計画は触らない。
|
|
149
|
+
|
|
150
|
+
#### ステップ 9:ガードレールを書く
|
|
151
|
+
|
|
152
|
+
各スキルの `PROJECT.md` に、AI-DLC の規律をプロジェクト固有の形で書く。SKILL.md は booster の更新で上書きされるため、必ず `PROJECT.md` 側に置く。対象プロジェクトに無い層のスキル(フロントエンドが無ければ `developing-frontend`)は書かなくてよい。
|
|
153
|
+
|
|
154
|
+
| 置き場所 | 書く内容 |
|
|
155
|
+
| :--- | :--- |
|
|
156
|
+
| `developing-backend/PROJECT.md`、`developing-frontend/PROJECT.md` | TDD の三原則をプロンプトに明示すること、ステップ計画の置き場所、テストの命名規則、参照すべき既存実装・フィクスチャ、確認必須の操作 |
|
|
157
|
+
| `planning-releases/PROJECT.md` | Unit 定義・Bolt 計画の置き場所、エントロピー評価の運用、ゲート密度の既定 |
|
|
158
|
+
| `analyzing-usecases/PROJECT.md` | 用語集の場所、受入条件の書式、Unit 分解の条件 |
|
|
159
|
+
| `developing-review/PROJECT.md` | AI 生成コード固有の観点(先回り実装・同型テスト・過剰モック・既存の無視) |
|
|
160
|
+
| `ai-agent-guidelines/PROJECT.md` | 全行理解、仮の実装の明示、修正のガードレール反映先 |
|
|
161
|
+
|
|
162
|
+
既に人が AI を修正した記録(ジャーナル・レビュー指摘)があれば、それもガードレールに写す。
|
|
163
|
+
|
|
164
|
+
#### ステップ 10:OKF 適用と検証
|
|
165
|
+
|
|
166
|
+
作成・変更した文書に `apply-okf` を実行し(`apply docs --changed --by <agent>`)、`index.md`・`log.md` を更新する。`okf_apply.py` は git の差分から変更を判定するため、git 管理外のプロジェクトでは失敗する。その場合は `docs/reference/OKF導入ガイド_V0.2.md` §5 に沿ってフロントマター(`type`・`title`・`description`・`generated`、未レビューなら `status: draft`)を手で書き、`index.md`・`log.md` も既存の書式に合わせて更新し、完了報告にその旨を書く。
|
|
167
|
+
|
|
168
|
+
続けて本スキルの `--check` を実行し、不足があれば計画に戻る。移行計画の「AI の仮定」欄に残った未確認の仮定は、完了報告の要確認に載せる。
|
|
169
|
+
|
|
170
|
+
### 3. 検証(`--check`)
|
|
171
|
+
|
|
172
|
+
#### 3-1. 検査スクリプトを実行する
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
python .claude/skills/migrating-ai-dlc/scripts/aidlc_check.py --project <project> [--docs docs] [--apps apps] [--claude-md CLAUDE.md]
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
ERROR は移行が完了していない印、WARN は運用の中で埋めればよい印。報告には件数(`ERROR n / WARN n`)と各項目をそのまま載せる。
|
|
179
|
+
|
|
180
|
+
| 項目 | 判定 |
|
|
181
|
+
| :--- | :--- |
|
|
182
|
+
| CLAUDE.md に「AI-DLC を採用する」節がある | ERROR |
|
|
183
|
+
| AI-DLC 導入ガイド・AI-DLC 版ガイド 4 本・用語集が `docs/reference/` にある | ERROR |
|
|
184
|
+
| `units.md` がある | ERROR |
|
|
185
|
+
| 各 Unit に目的・ストーリー・NFR・リスク・測定基準・推奨 Bolt・エントロピー評価・AI の仮定がある | WARN |
|
|
186
|
+
| `units.md` に依存 DAG とストーリーマップがある | WARN |
|
|
187
|
+
| 未配置のストーリーが `release_plan.md` に割り当てられていない | WARN |
|
|
188
|
+
| `risk_register.md` があり、AI に渡せる範囲と確認必須の操作が書かれている | ERROR |
|
|
189
|
+
| `glossary.md` がある | WARN |
|
|
190
|
+
| 受入条件を持つストーリーの本数と、Given/When/Then の本数(ストーリー単位) | WARN(割合を報告) |
|
|
191
|
+
| `release_plan.md` にエントロピー評価とテスト戦略がある | WARN |
|
|
192
|
+
| `bolt_plan-N.md` に確認したい仮説・ゲート密度・ウォーキングスケルトンがあり、同じ番号の `iteration_plan-N.md` が deprecated になっている | WARN |
|
|
193
|
+
| ブラウンフィールドで静的・動的モデルがある | WARN |
|
|
194
|
+
| 移行で作った成果物に人の承認記録(`verified`)がある | WARN |
|
|
195
|
+
| 移行で作った成果物が各ディレクトリの `index.md` に登録されている | WARN |
|
|
196
|
+
| `aidlc_migration_plan.md` がある | WARN |
|
|
197
|
+
| 開発スキルの `PROJECT.md` に TDD の三原則がある(フロントエンドが無ければ `developing-frontend` は対象外) | WARN |
|
|
198
|
+
|
|
199
|
+
#### 3-2. スクリプトが見ない点を読んで確かめる
|
|
200
|
+
|
|
201
|
+
スクリプトはファイルとキーワードの有無しか見ない。ERROR 0 でも運用できる状態とは限らないので、次を実際に読んで確かめる。
|
|
202
|
+
|
|
203
|
+
- **成果物同士の矛盾**: 依存 DAG と Bolt の並び・リリース計画の順序が逆になっていないか。Bolt ゴールとステップが一致しているか。ストーリーの状態が文書間で食い違っていないか
|
|
204
|
+
- **契約としての中身**: リスク台帳に「In(AI に任せる範囲)」が書かれているか、確認必須の操作が CLAUDE.md より少なくないか。用語集で語のゆれが解消されているか
|
|
205
|
+
- **コードと契約の整合**(ブラウンフィールド): 受入条件と既存実装の振る舞いが一致しているか。テストの無い先回り実装や未使用コードが残っていないか
|
|
206
|
+
|
|
207
|
+
#### 3-3. 報告する
|
|
208
|
+
|
|
209
|
+
不足ごとに、該当する移行ステップ番号と直し方を書く。`--check` ではファイルを変更しない。直すかどうかは人が決め、承認されたら `--migrate` の該当ステップで直す。
|
|
210
|
+
|
|
211
|
+
## 判断に迷いやすい点
|
|
212
|
+
|
|
213
|
+
- **Unit の境界**: ユースケース単位でも画面単位でもなく「独立してデプロイできるか」で切る。迷ったら小さく切らず、依存を共有する Unit を 1 つにまとめる方が安全。分割は後からできる
|
|
214
|
+
- **完了済みのイテレーション**: 読み替えない。過去の記録は当時の方法論のまま残す
|
|
215
|
+
- **ストーリーポイントの扱い**: 消さない。エントロピー評価を並記し、数 Bolt 回した後にどちらが予測に役立ったかで決める
|
|
216
|
+
- **ガードレールの粒度**: 「〜してはならない」を並べるより、なぜその規律が要るか(AI が先回りして実装する、既存を探さず重複を作る)を書く。理由が伝われば AI は類似の場面にも適用できる
|
|
217
|
+
- **AI に渡せない範囲が決まらない**: 移行を止めて質問する。ここを仮定で埋めると、以降のすべての生成物が組織ポリシーに反する可能性がある
|
|
218
|
+
- **計画に下書きを入れたくなったとき**: 入れない。気づいた候補は要確認に 1 行で残し、該当ステップのゲートで判断してもらう
|
|
219
|
+
|
|
220
|
+
## 完了報告
|
|
221
|
+
|
|
222
|
+
`--migrate` の最後に次を報告する。
|
|
223
|
+
|
|
224
|
+
```markdown
|
|
225
|
+
## AI-DLC 移行結果
|
|
226
|
+
|
|
227
|
+
- 対象: <project>(グリーンフィールド/ブラウンフィールド)
|
|
228
|
+
- Unit: <N> 件(ストーリー <M> 件を配置、未配置 <K> 件)
|
|
229
|
+
- 計画: release_plan.md にエントロピー評価を追加、iteration_plan-<N>.md → bolt_plan-<N>.md(ウォーキングスケルトン: <Unit 名>)
|
|
230
|
+
- ガードレール: <更新した PROJECT.md の一覧>
|
|
231
|
+
- 検証: 移行前 ERROR <n> / WARN <n> → 移行後 ERROR 0 / WARN <n>
|
|
232
|
+
- 要確認: <Unit の境界の判断、AI に渡せない範囲、未確認の仮定 など>
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## 関連スキル
|
|
236
|
+
|
|
237
|
+
- `planning-releases` / `opening-iteration` — 移行後の Bolt 計画の日常運用
|
|
238
|
+
- `analyzing-usecases` — 移行後のストーリー作成(Mob Elaboration)
|
|
239
|
+
- `analyzing-architecture` / `analyzing-domain-model` — ブラウンフィールドのモデル昇格で参照する設計ガイド
|
|
240
|
+
- `apply-okf` — 作成・変更した文書のフロントマターと索引、旧計画の deprecate
|
|
241
|
+
- `apply-docs-structure` — 成果物の配置先の判断
|
|
242
|
+
- `migrating-okf` — 文書フォーマットの移行(本スキルは開発の進め方の移行)
|
|
243
|
+
- `git-commit` — 移行後のコミット(ユーザーの指示があるまでコミットしない)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "migrating-ai-dlc",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "booster を更新したら docs/reference に AI-DLC 版のガイドが入ってた。うちの受注管理プロジェクト(docs/requirements/order/ にストーリー 12 本、docs/development/order/ に release_plan.md と進行中の iteration_plan-3.md、apps/order/ に Spring Boot のコードあり)を AI-DLC に移行したい。まず何をどう変えるか計画を出して。",
|
|
7
|
+
"expected_output": "--plan として、まず aidlc_check.py で移行前の状態(ERROR/WARN の件数)を測り、現状を棚卸しする。docs/development/order/aidlc_migration_plan.md に、検査結果・現状・チェックボックス付きの 10 ステップ(CLAUDE.md、リスク台帳、用語集、静的・動的モデル、受入条件、Unit 分解、release_plan 追記、iteration_plan-3 → bolt_plan-3、ガードレール、OKF 適用)・AI の仮定・要確認を書く。Unit 案・依存 DAG・ストーリーマップ・リスク台帳の表・静的モデル・Bolt 計画案などの後続ステップの成果物は計画に書かず、候補は要確認に 1 行で残す。既存のストーリーと計画は変更しない",
|
|
8
|
+
"files": [],
|
|
9
|
+
"assertions": [
|
|
10
|
+
"移行計画がチェックボックス付き Markdown で作られている",
|
|
11
|
+
"移行計画が既定のパス docs/development/order/aidlc_migration_plan.md にある",
|
|
12
|
+
"計画に Unit 分解と iteration_plan → bolt_plan の読み替えが含まれる",
|
|
13
|
+
"ブラウンフィールドとして既存コードの静的・動的モデル昇格が含まれる",
|
|
14
|
+
"リスク台帳と AI に渡せる範囲(In/Out)の作成が含まれる",
|
|
15
|
+
"Unit 境界などの判断を要確認として人に戻している",
|
|
16
|
+
"--plan では既存のストーリー・計画ファイルを変更していない",
|
|
17
|
+
"CLAUDE.md への AI-DLC 採用の明記が含まれる",
|
|
18
|
+
"移行前の状態を aidlc_check.py で測り、ERROR/WARN の件数を計画に記録している",
|
|
19
|
+
"後続ステップの成果物(Unit 案・依存 DAG・ストーリーマップ・リスク台帳・静的/動的モデル・Bolt 計画案など)を計画の節として先取りしていない"
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": 2,
|
|
24
|
+
"prompt": "移行計画は承認した。ステップ 6 の Unit 分解をやって。docs/requirements/order/ のストーリーを Unit にまとめて、依存関係とストーリーマップも作って。決済まわりは外部サービスだから本番キーは絶対 AI に渡さない前提で。",
|
|
25
|
+
"expected_output": "docs/requirements/order/units.md に、各 Unit の目的・含まれるストーリー・NFR・リスク(リスク台帳の ID で参照、未作成なら暫定 ID)・測定基準・推奨 Bolt・エントロピー評価・AI の仮定、依存 DAG、ユースケース × Unit × ストーリーの対応表、未配置ストーリーを書く。決済は独立 Unit にし、本番キーを渡さない前提をリスク ID で対応づける。ガードレールの本文は units.md に書き写さない。Unit の境界は案として示し承認を求める。apply-okf(git 管理外なら手書き)でフロントマターと index/log を更新し、aidlc_check.py で units.md の項目を検証して報告する",
|
|
26
|
+
"files": [],
|
|
27
|
+
"assertions": [
|
|
28
|
+
"docs/requirements/order/units.md が作られている",
|
|
29
|
+
"各 Unit に目的・ストーリー・NFR・リスク・測定基準・推奨 Bolt がある",
|
|
30
|
+
"依存 DAG とストーリーマップがある",
|
|
31
|
+
"決済が独立 Unit で、本番キーを AI に渡さない前提と対応づいている",
|
|
32
|
+
"12 ストーリーすべてが配置または未配置として言及されている",
|
|
33
|
+
"units.md に OKF フロントマターがある",
|
|
34
|
+
"docs/log.md に記録がある",
|
|
35
|
+
"Unit 境界を案として示し承認を求めている",
|
|
36
|
+
"すべての Unit に「AI の仮定」がある",
|
|
37
|
+
"Unit のリスクをリスク台帳(risk_register.md)の ID で参照している",
|
|
38
|
+
"aidlc_check.py で units.md を検証し、結果を報告している"
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": 3,
|
|
43
|
+
"prompt": "AI-DLC への移行は一通り終わったつもりなんだけど、ちゃんと揃ってるか確認して。プロジェクトは order。",
|
|
44
|
+
"expected_output": "--check として aidlc_check.py --project order を実行し、ERROR/WARN の件数と各項目を報告する(受入条件はストーリー単位、フロントエンドの無いプロジェクトでは developing-frontend を対象外、verified・index 登録・未配置ストーリーの計画混入も含む)。続けてスクリプトが見ない点(成果物同士の矛盾、リスク台帳・用語集の中身、コードと受入条件の整合)を読んで確かめ、不足ごとに移行ステップ番号と直し方を示す。ファイルは変更しない",
|
|
45
|
+
"files": [],
|
|
46
|
+
"assertions": [
|
|
47
|
+
"U-03 決済連携の推奨 Bolt 欠けを指摘している",
|
|
48
|
+
"release_plan.md のテスト戦略欠けを指摘している",
|
|
49
|
+
"bolt_plan-3.md のゲート密度欠けを指摘している",
|
|
50
|
+
"受入条件の不足をストーリー単位(12 本中 3 本)で数えている",
|
|
51
|
+
"受入条件の Given/When/Then 不足を指摘している",
|
|
52
|
+
"存在する成果物(units/risk_register/glossary)を誤って欠けとしていない",
|
|
53
|
+
"不足を移行ステップに対応づけている",
|
|
54
|
+
"aidlc_check.py を実行し、ERROR/WARN の件数を報告している",
|
|
55
|
+
"AI 生成の移行成果物に人の承認記録(verified)が無いことを指摘している",
|
|
56
|
+
"未配置の US-11・US-12 がリリース計画に割り当てられている矛盾を指摘している"
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
# AI-DLC 移行で作る成果物のテンプレート
|
|
2
|
+
|
|
3
|
+
移行ステップで作成する文書の骨格。各ガイドのテンプレートを移行用に抜粋したもので、詳細な説明は各ガイドを参照する。
|
|
4
|
+
|
|
5
|
+
## 目次
|
|
6
|
+
|
|
7
|
+
1. リスク台帳(`docs/requirements/<project>/risk_register.md`)
|
|
8
|
+
2. Unit 定義・依存 DAG・ストーリーマップ(`docs/requirements/<project>/units.md`)
|
|
9
|
+
3. ユーザーストーリー(AI-DLC 版の項目)
|
|
10
|
+
4. リリース計画への追記(`docs/development/<project>/release_plan.md`)
|
|
11
|
+
5. Bolt 計画(`docs/development/<project>/bolt_plan-N.md`)
|
|
12
|
+
6. 静的モデル・動的モデル(`docs/design/<project>/`)
|
|
13
|
+
7. ガードレール(各スキルの `PROJECT.md`)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 1. リスク台帳
|
|
18
|
+
|
|
19
|
+
```markdown
|
|
20
|
+
# リスク台帳:<project>
|
|
21
|
+
|
|
22
|
+
## AI に渡せる範囲(In/Out)
|
|
23
|
+
|
|
24
|
+
| トピック | In | Out | AI に任せる | 備考 |
|
|
25
|
+
| :--- | :---: | :---: | :---: | :--- |
|
|
26
|
+
| ユーザー認証 | ✓ | | 設計と実装 | 認証方式の選択は人が承認(確認必須) |
|
|
27
|
+
| 決済処理 | | ✓ | — | 外部サービス。契約テストのみ AI が生成。本番キーは渡さない |
|
|
28
|
+
| 本番データ | | ✓ | — | AI には渡さない。テストはマスク済みデータで行う |
|
|
29
|
+
|
|
30
|
+
## 確認必須の操作
|
|
31
|
+
|
|
32
|
+
- 新規ファイル作成(計画に無いもの)
|
|
33
|
+
- アーキテクチャ・フォルダ構造の変更
|
|
34
|
+
- 外部 API・外部ライブラリの導入
|
|
35
|
+
- 認証・認可の実装
|
|
36
|
+
- スキーマ変更・マイグレーション
|
|
37
|
+
- デプロイ設定・環境変数・本番環境への操作
|
|
38
|
+
|
|
39
|
+
## リスク一覧
|
|
40
|
+
|
|
41
|
+
| ID | リスク | 組織台帳との対応 | 対策 | 承認ゲート |
|
|
42
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
43
|
+
| R-01 | 決済情報の取り扱い | SEC-03 | テスト用モックで実装 | 決済ステップは必ず人が検証 |
|
|
44
|
+
| R-02 | DB スキーマ変更 | CHG-01 | マイグレーションは人が確認してから適用 | スキーマ変更ステップで停止 |
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 2. Unit 定義・依存 DAG・ストーリーマップ
|
|
50
|
+
|
|
51
|
+
````markdown
|
|
52
|
+
# Unit 定義:<project>
|
|
53
|
+
|
|
54
|
+
## Unit 一覧
|
|
55
|
+
|
|
56
|
+
### U-01:注文処理
|
|
57
|
+
|
|
58
|
+
- **Intent**: <このユニットが寄与する Intent>
|
|
59
|
+
- **目的**: 購入者が商品を注文し、注文を確定できる
|
|
60
|
+
- **含まれるストーリー**: US-03 カートに追加する、US-04 配送先を入力する、US-06 注文を確定する
|
|
61
|
+
- **NFR**: 注文確定は 2 秒以内。同一注文の二重送信を防ぐ
|
|
62
|
+
- **リスク**: R-02(スキーマ変更)
|
|
63
|
+
- **測定基準**: 注文完了率、カート放棄率
|
|
64
|
+
- **推奨 Bolt**: Bolt 1(ウォーキングスケルトン:カート追加 → 注文確定を API から DB まで通す)、Bolt 2(配送先・確認メール)
|
|
65
|
+
- **エントロピー評価**: 意図 LOW/構造 MED/検証 LOW/リスク MED/仮定 LOW
|
|
66
|
+
- **AI の仮定**: 在庫引当は注文確定時に行う(要確認)
|
|
67
|
+
|
|
68
|
+
### U-02:決済連携
|
|
69
|
+
...
|
|
70
|
+
|
|
71
|
+
## 依存 DAG
|
|
72
|
+
|
|
73
|
+
```plantuml
|
|
74
|
+
@startuml
|
|
75
|
+
rectangle "U-01 注文処理" as u1
|
|
76
|
+
rectangle "U-02 決済連携" as u2
|
|
77
|
+
rectangle "U-03 商品カタログ" as u3
|
|
78
|
+
u3 --> u1
|
|
79
|
+
u1 --> u2
|
|
80
|
+
@enduml
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
並列に回せる Unit: U-03 完了後に U-01 と U-04(在庫管理)
|
|
84
|
+
|
|
85
|
+
## ストーリーマップ
|
|
86
|
+
|
|
87
|
+
| ユースケース | Unit | ストーリー | 受入条件の書式 |
|
|
88
|
+
| :--- | :--- | :--- | :--- |
|
|
89
|
+
| UC-001 商品を注文する | U-03 商品カタログ | US-01 商品を検索する | Given/When/Then |
|
|
90
|
+
| UC-001 商品を注文する | U-01 注文処理 | US-03 カートに追加する | Given/When/Then |
|
|
91
|
+
| UC-001 商品を注文する | U-02 決済連携 | US-05 支払い方法を選択する | 要書き直し |
|
|
92
|
+
|
|
93
|
+
未配置のストーリー: US-09(管理者向けレポート。Unit の追加を要判断)
|
|
94
|
+
````
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 3. ユーザーストーリー(AI-DLC 版の項目)
|
|
99
|
+
|
|
100
|
+
既存のストーリーに次の欄を加える。
|
|
101
|
+
|
|
102
|
+
```markdown
|
|
103
|
+
# US-03 カートに追加する
|
|
104
|
+
|
|
105
|
+
**Unit**: U-01 注文処理
|
|
106
|
+
**ユースケース**: UC-001
|
|
107
|
+
|
|
108
|
+
**として**: 購入者
|
|
109
|
+
**したい**: 商品をカートに追加する
|
|
110
|
+
**なぜなら**: まとめて注文したい
|
|
111
|
+
|
|
112
|
+
**受入条件**:
|
|
113
|
+
|
|
114
|
+
- [ ] Given 在庫が 10 個の商品 / When 3 個をカートに追加する / Then カートの数量が 3 になる
|
|
115
|
+
- [ ] Given 在庫が 2 個の商品 / When 3 個をカートに追加する / Then 在庫不足が通知され、カートは変わらない
|
|
116
|
+
|
|
117
|
+
**参照する成果物**:
|
|
118
|
+
|
|
119
|
+
- ドメインモデル: docs/design/<project>/domain_model.md
|
|
120
|
+
- 既存実装: apps/<project>/src/.../Order.java(同じ方式で実装する)
|
|
121
|
+
- ドメイン用語: docs/design/<project>/glossary.md
|
|
122
|
+
|
|
123
|
+
**確認ポイント**: カートテーブルの追加(スキーマ変更)
|
|
124
|
+
|
|
125
|
+
**AI の仮定**: カートはセッション単位ではなく購入者単位で永続化する(要確認)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 4. リリース計画への追記
|
|
131
|
+
|
|
132
|
+
既存の `release_plan.md` に次の節を加える。ストーリーポイントの列は「参考」として残す。
|
|
133
|
+
|
|
134
|
+
```markdown
|
|
135
|
+
## Unit のエントロピー評価とテスト戦略
|
|
136
|
+
|
|
137
|
+
| Unit | 意図 | 構造 | 検証 | リスク | 仮定 | AI 自律度 | スコープ | 深さ | テスト戦略 |
|
|
138
|
+
| :--- | :---: | :---: | :---: | :---: | :---: | :--- | :--- | :--- | :--- |
|
|
139
|
+
| U-03 商品カタログ | LOW | LOW | LOW | LOW | LOW | 高 | 実装中心 | Standard | Standard |
|
|
140
|
+
| U-01 注文処理 | LOW | MED | LOW | MED | LOW | 中 | 全ステージ | Standard | Standard |
|
|
141
|
+
| U-02 決済連携 | MED | HIGH | MED | HIGH | MED | 低 | 全ステージ | Comprehensive | Comprehensive |
|
|
142
|
+
|
|
143
|
+
## Bolt の並び
|
|
144
|
+
|
|
145
|
+
| Bolt | Unit | ゴール | 確認したい仮説 | 並列 |
|
|
146
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
147
|
+
| 1 | U-03 | ウォーキングスケルトン:検索を API から DB まで通す | AI が生成するリポジトリの品質が十分か | — |
|
|
148
|
+
| 2 | U-01 | カート追加 → 注文確定 | 在庫引当のタイミング | Bolt 3 と並列 |
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## 5. Bolt 計画
|
|
154
|
+
|
|
155
|
+
```markdown
|
|
156
|
+
# Bolt 3 計画:<project>
|
|
157
|
+
|
|
158
|
+
## Bolt ゴール
|
|
159
|
+
注文 Unit の「カートに商品を追加する」ストーリーを、API からデータベースまで通して動かす。
|
|
160
|
+
これで AI が生成するドメインモデルとリポジトリの品質がこのコードベースで十分かどうかが分かる。
|
|
161
|
+
|
|
162
|
+
## 対象
|
|
163
|
+
- Unit: U-01 注文処理
|
|
164
|
+
- ストーリー: US-03(受入条件 AC-01, AC-02)
|
|
165
|
+
- アプローチ: インサイドアウト
|
|
166
|
+
- ゲート密度: 各ステップでゲート(ウォーキングスケルトンの結果で見直す)
|
|
167
|
+
|
|
168
|
+
## ステップ計画(AI が作成、人が承認)
|
|
169
|
+
- [ ] 1. カート集約のドメインモデルを設計する
|
|
170
|
+
- [ ] 2. カートへの追加のテストを書く(Red)
|
|
171
|
+
- [ ] 3. カート追加を実装する(Green)
|
|
172
|
+
- [ ] 4. リファクタリングする
|
|
173
|
+
- [ ] 5. リポジトリのテストを書く(Red) ※スキーマ変更のため要確認
|
|
174
|
+
- [ ] 6. リポジトリを実装する(Green)
|
|
175
|
+
|
|
176
|
+
## AI の仮定
|
|
177
|
+
- 数量は値オブジェクトにする(要確認)
|
|
178
|
+
|
|
179
|
+
## 読み替え元
|
|
180
|
+
iteration_plan-3.md(deprecated、replaced_by: /development/<project>/bolt_plan-3.md)
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## 6. 静的モデル・動的モデル(ブラウンフィールド)
|
|
186
|
+
|
|
187
|
+
```markdown
|
|
188
|
+
# 静的モデル:<project>
|
|
189
|
+
|
|
190
|
+
| コンポーネント | 責務 | 依存先 | 備考 |
|
|
191
|
+
| :--- | :--- | :--- | :--- |
|
|
192
|
+
| OrderService | 注文の確定と在庫引当の呼び出し | OrderRepository, InventoryClient | 在庫引当の失敗時に注文を破棄する分岐あり(業務ルール候補 BR-01) |
|
|
193
|
+
| OrderRepository | 注文の永続化 | JDBC | |
|
|
194
|
+
|
|
195
|
+
## 業務ルール候補(コードから抽出)
|
|
196
|
+
|
|
197
|
+
| ID | コード上の条件 | 業務ルールとしての解釈 | 状態 |
|
|
198
|
+
| :--- | :--- | :--- | :--- |
|
|
199
|
+
| BR-01 | `if (stock < qty) throw` | 在庫不足の注文は確定できない | 確認済み |
|
|
200
|
+
| BR-02 | `if (total > 100000) requireApproval()` | 10 万円超の注文は承認が要る | 要確認(現行業務に存在するか不明) |
|
|
201
|
+
|
|
202
|
+
## 使われていない経路
|
|
203
|
+
- `OrderService.reopen()`:呼び出し元なし。要確認
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
````markdown
|
|
207
|
+
# 動的モデル:<project>
|
|
208
|
+
|
|
209
|
+
## UC-001 商品を注文する
|
|
210
|
+
|
|
211
|
+
```plantuml
|
|
212
|
+
@startuml
|
|
213
|
+
actor 購入者
|
|
214
|
+
participant OrderController
|
|
215
|
+
participant OrderService
|
|
216
|
+
participant InventoryClient
|
|
217
|
+
participant OrderRepository
|
|
218
|
+
購入者 -> OrderController : POST /orders
|
|
219
|
+
OrderController -> OrderService : confirm(order)
|
|
220
|
+
OrderService -> InventoryClient : reserve(items)
|
|
221
|
+
InventoryClient --> OrderService : reserved
|
|
222
|
+
OrderService -> OrderRepository : save(order)
|
|
223
|
+
OrderRepository --> OrderService : saved
|
|
224
|
+
OrderService --> OrderController : confirmed
|
|
225
|
+
@enduml
|
|
226
|
+
```
|
|
227
|
+
````
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## 7. ガードレール(各スキルの `PROJECT.md`)
|
|
232
|
+
|
|
233
|
+
`developing-backend/PROJECT.md` の追記例。
|
|
234
|
+
|
|
235
|
+
```markdown
|
|
236
|
+
## AI-DLC の規律(本プロジェクト固有)
|
|
237
|
+
|
|
238
|
+
### TDD の三原則をプロンプトに明示する
|
|
239
|
+
AI は一度にたくさん書けるため、放っておくとテストを書かずに実装し、失敗を確認せずに進み、
|
|
240
|
+
テストが要求する以上の機能を先回りして実装する。ステップ計画を書かせるとき、
|
|
241
|
+
「テストを書き、失敗を確認してから最小限を実装する。先回りしない」を必ず含める。
|
|
242
|
+
|
|
243
|
+
### ステップ計画の置き場所
|
|
244
|
+
docs/development/<project>/bolt_plan-N.md。承認前に実装を始めない。
|
|
245
|
+
|
|
246
|
+
### 既存を参照させる
|
|
247
|
+
- 値オブジェクト: apps/<project>/src/main/java/.../domain/
|
|
248
|
+
- テストフィクスチャ: apps/<project>/src/test/java/.../fixture/
|
|
249
|
+
- 命名規則: テストは「<振る舞い>_<条件>_<期待結果>」の日本語名
|
|
250
|
+
AI は既存を探さず似た実装を作りやすい。新規に作る前に上記を参照させる。
|
|
251
|
+
|
|
252
|
+
### 確認必須の操作
|
|
253
|
+
risk_register.md の「確認必須の操作」に従う。該当ステップでは計画に注記し、実行前に停止する。
|
|
254
|
+
|
|
255
|
+
### 修正の反映先
|
|
256
|
+
人が AI の振る舞いを修正したら、全プロジェクト共通は CLAUDE.md、本プロジェクト固有はこのファイル、
|
|
257
|
+
特定 Unit の判断は bolt_plan の「AI の仮定」欄と docs/journal/ に書く。
|
|
258
|
+
```
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""AI-DLC 移行の適合性検査。
|
|
3
|
+
|
|
4
|
+
対象プロジェクトの docs/ と CLAUDE.md、apps/、各スキルの PROJECT.md を読み、
|
|
5
|
+
AI-DLC の運用に必要な成果物とガードレールが揃っているかを報告する。
|
|
6
|
+
|
|
7
|
+
ERROR: 移行が完了していない(必須の成果物が無い)
|
|
8
|
+
WARN : 運用の中で埋めればよい(欄の欠け、割合の不足、承認記録・索引の漏れ、成果物間の矛盾の一部)
|
|
9
|
+
|
|
10
|
+
本スクリプトはファイルとキーワードの有無を見る。成果物同士の矛盾や中身の妥当性の多くは
|
|
11
|
+
見ないので、SKILL.md の「スクリプトが見ない点を読んで確かめる」に従って人が読む。
|
|
12
|
+
|
|
13
|
+
使い方:
|
|
14
|
+
python aidlc_check.py --project <project> [--docs docs] [--apps apps] [--claude-md CLAUDE.md] [--skills .claude/skills]
|
|
15
|
+
--project を省略すると docs/<category>/ 直下を単一プロジェクトとして検査する。
|
|
16
|
+
終了コード: ERROR があれば 1、無ければ 0。
|
|
17
|
+
"""
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import argparse
|
|
21
|
+
import re
|
|
22
|
+
import sys
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
|
|
25
|
+
REQUIRED_GUIDES = [
|
|
26
|
+
"AI-DLC導入ガイド.md",
|
|
27
|
+
"開発ガイド_AI-DLC版.md",
|
|
28
|
+
"リリース・イテレーション計画ガイド_AI-DLC版.md",
|
|
29
|
+
"ユースケース作成ガイド_AI-DLC版.md",
|
|
30
|
+
"コーディングとテストガイド_AI-DLC版.md",
|
|
31
|
+
"AI-DLC用語集.md",
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
UNIT_FIELDS = ["目的", "ストーリー", "NFR", "リスク", "測定基準", "推奨 Bolt", "エントロピー", "AI の仮定"]
|
|
35
|
+
|
|
36
|
+
TDD_KEYWORDS = ["三原則", "Three Laws", "失敗するテスト"]
|
|
37
|
+
|
|
38
|
+
FRONTEND_FILES = {"package.json"}
|
|
39
|
+
FRONTEND_EXTS = {".tsx", ".jsx", ".vue", ".svelte"}
|
|
40
|
+
|
|
41
|
+
NON_STORY_DOCS = {"index.md", "units.md", "risk_register.md"}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class Report:
|
|
45
|
+
def __init__(self) -> None:
|
|
46
|
+
self.errors: list[str] = []
|
|
47
|
+
self.warns: list[str] = []
|
|
48
|
+
self.oks: list[str] = []
|
|
49
|
+
|
|
50
|
+
def error(self, msg: str) -> None:
|
|
51
|
+
self.errors.append(msg)
|
|
52
|
+
|
|
53
|
+
def warn(self, msg: str) -> None:
|
|
54
|
+
self.warns.append(msg)
|
|
55
|
+
|
|
56
|
+
def ok(self, msg: str) -> None:
|
|
57
|
+
self.oks.append(msg)
|
|
58
|
+
|
|
59
|
+
def print(self) -> None:
|
|
60
|
+
for m in self.oks:
|
|
61
|
+
print(f"OK {m}")
|
|
62
|
+
for m in self.warns:
|
|
63
|
+
print(f"WARN {m}")
|
|
64
|
+
for m in self.errors:
|
|
65
|
+
print(f"ERROR {m}")
|
|
66
|
+
print()
|
|
67
|
+
print(f"ERROR {len(self.errors)} / WARN {len(self.warns)}")
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def read(path: Path) -> str:
|
|
71
|
+
try:
|
|
72
|
+
return path.read_text(encoding="utf-8")
|
|
73
|
+
except (FileNotFoundError, IsADirectoryError, UnicodeDecodeError):
|
|
74
|
+
return ""
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def project_dir(base: Path, project: str | None) -> Path:
|
|
78
|
+
return base / project if project else base
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def frontmatter(text: str) -> str:
|
|
82
|
+
if not text.startswith("---"):
|
|
83
|
+
return ""
|
|
84
|
+
parts = text.split("---", 2)
|
|
85
|
+
return parts[1] if len(parts) >= 3 else ""
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def check_claude_md(rep: Report, claude_md: Path) -> None:
|
|
89
|
+
text = read(claude_md)
|
|
90
|
+
if not text:
|
|
91
|
+
rep.error(f"{claude_md}: 見つからない")
|
|
92
|
+
return
|
|
93
|
+
if "AI-DLC を採用" in text:
|
|
94
|
+
rep.ok(f"{claude_md}: AI-DLC 採用の節がある")
|
|
95
|
+
else:
|
|
96
|
+
rep.error(f"{claude_md}: 「AI-DLC を採用する」節が無い(移行ステップ 1)")
|
|
97
|
+
if "開発ガイド_AI-DLC版.md" in text:
|
|
98
|
+
rep.ok(f"{claude_md}: ペルソナが開発ガイド(AI-DLC 版)を参照している")
|
|
99
|
+
else:
|
|
100
|
+
rep.warn(f"{claude_md}: ペルソナの参照先が開発ガイド(AI-DLC 版)になっていない(移行ステップ 1)")
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def check_guides(rep: Report, docs: Path) -> None:
|
|
104
|
+
ref = docs / "reference"
|
|
105
|
+
missing = [g for g in REQUIRED_GUIDES if not (ref / g).exists()]
|
|
106
|
+
if missing:
|
|
107
|
+
rep.error(f"{ref}: AI-DLC ガイドが不足: {', '.join(missing)}(npx boost --update を先に実行する)")
|
|
108
|
+
else:
|
|
109
|
+
rep.ok(f"{ref}: AI-DLC ガイド {len(REQUIRED_GUIDES)} 本が揃っている")
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def check_migration_plan(rep: Report, docs: Path, project: str | None) -> None:
|
|
113
|
+
path = project_dir(docs / "development", project) / "aidlc_migration_plan.md"
|
|
114
|
+
if path.exists():
|
|
115
|
+
rep.ok(f"{path}: 移行計画がある")
|
|
116
|
+
else:
|
|
117
|
+
rep.warn(f"{path}: 移行計画が無い(--plan で作る)")
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def check_risk_register(rep: Report, docs: Path, project: str | None) -> None:
|
|
121
|
+
path = project_dir(docs / "requirements", project) / "risk_register.md"
|
|
122
|
+
text = read(path)
|
|
123
|
+
if not text:
|
|
124
|
+
rep.error(f"{path}: 見つからない(移行ステップ 2)")
|
|
125
|
+
return
|
|
126
|
+
rep.ok(f"{path}: ある")
|
|
127
|
+
if "In/Out" in text or "渡せる範囲" in text or "渡せない" in text:
|
|
128
|
+
rep.ok(f"{path}: AI に渡せる範囲が書かれている")
|
|
129
|
+
else:
|
|
130
|
+
rep.error(f"{path}: AI に渡せる範囲(In/Out)が書かれていない(移行ステップ 2)")
|
|
131
|
+
if "確認必須" in text:
|
|
132
|
+
rep.ok(f"{path}: 確認必須の操作が書かれている")
|
|
133
|
+
else:
|
|
134
|
+
rep.error(f"{path}: 確認必須の操作が書かれていない(移行ステップ 2)")
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def check_glossary(rep: Report, docs: Path, project: str | None) -> None:
|
|
138
|
+
ddir = project_dir(docs / "design", project)
|
|
139
|
+
candidates = (list(ddir.glob("*glossary*.md")) + list(ddir.glob("*用語集*.md"))) if ddir.exists() else []
|
|
140
|
+
if candidates:
|
|
141
|
+
rep.ok(f"{candidates[0]}: ドメイン用語集がある")
|
|
142
|
+
else:
|
|
143
|
+
rep.warn(f"{ddir}: ドメイン用語集(glossary.md)が無い(移行ステップ 3)")
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def app_dirs(apps: Path, project: str | None) -> list[Path]:
|
|
147
|
+
if not apps.exists():
|
|
148
|
+
return []
|
|
149
|
+
if project:
|
|
150
|
+
return [d for d in sorted(apps.iterdir()) if d.is_dir() and d.name.startswith(project)]
|
|
151
|
+
return [apps]
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def has_frontend(dirs: list[Path]) -> bool:
|
|
155
|
+
for d in dirs:
|
|
156
|
+
for p in d.rglob("*"):
|
|
157
|
+
if "node_modules" in p.parts:
|
|
158
|
+
return True
|
|
159
|
+
if p.is_file() and (p.name in FRONTEND_FILES or p.suffix in FRONTEND_EXTS):
|
|
160
|
+
return True
|
|
161
|
+
return False
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def check_brownfield(rep: Report, docs: Path, dirs: list[Path], project: str | None) -> None:
|
|
165
|
+
if not any(any(p.is_file() for p in d.rglob("*")) for d in dirs):
|
|
166
|
+
rep.ok("apps: コード無し(グリーンフィールド)。静的・動的モデルは不要")
|
|
167
|
+
return
|
|
168
|
+
ddir = project_dir(docs / "design", project)
|
|
169
|
+
static = (list(ddir.glob("*static*.md")) + list(ddir.glob("*静的モデル*.md"))) if ddir.exists() else []
|
|
170
|
+
dynamic = (list(ddir.glob("*dynamic*.md")) + list(ddir.glob("*動的モデル*.md"))) if ddir.exists() else []
|
|
171
|
+
if static and dynamic:
|
|
172
|
+
rep.ok(f"{ddir}: 静的モデルと動的モデルがある")
|
|
173
|
+
else:
|
|
174
|
+
rep.warn(f"{ddir}: ブラウンフィールドだが静的・動的モデルが揃っていない(移行ステップ 4)")
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def story_sections(text: str, id_pattern: re.Pattern) -> dict[str, str]:
|
|
178
|
+
"""見出しにストーリー ID を含む節を ID ごとに返す。"""
|
|
179
|
+
sections: dict[str, str] = {}
|
|
180
|
+
parts = re.split(r"^(#{1,4}\s+.*)$", text, flags=re.M)
|
|
181
|
+
# parts = [前置き, 見出し1, 本文1, 見出し2, 本文2, ...]
|
|
182
|
+
for i in range(1, len(parts) - 1, 2):
|
|
183
|
+
heading, body = parts[i], parts[i + 1]
|
|
184
|
+
m = id_pattern.search(heading)
|
|
185
|
+
if m:
|
|
186
|
+
sections[m.group(0)] = sections.get(m.group(0), "") + body
|
|
187
|
+
return sections
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def check_stories(rep: Report, docs: Path, project: str | None, id_pattern: re.Pattern) -> None:
|
|
191
|
+
rdir = project_dir(docs / "requirements", project)
|
|
192
|
+
if not rdir.exists():
|
|
193
|
+
rep.warn(f"{rdir}: requirements ディレクトリが無い")
|
|
194
|
+
return
|
|
195
|
+
files = [p for p in rdir.glob("*.md") if p.name not in NON_STORY_DOCS]
|
|
196
|
+
all_ids: set[str] = set()
|
|
197
|
+
sections: dict[str, str] = {}
|
|
198
|
+
for p in files:
|
|
199
|
+
t = read(p)
|
|
200
|
+
all_ids.update(id_pattern.findall(t))
|
|
201
|
+
for k, v in story_sections(t, id_pattern).items():
|
|
202
|
+
sections[k] = sections.get(k, "") + v
|
|
203
|
+
if not all_ids:
|
|
204
|
+
rep.warn(f"{rdir}: ストーリー ID({id_pattern.pattern})が見つからない。--story-id で ID の形式を指定する")
|
|
205
|
+
return
|
|
206
|
+
with_ac = sorted(i for i, s in sections.items() if "受入条件" in s or "受け入れ条件" in s)
|
|
207
|
+
with_gwt = sorted(i for i in with_ac if re.search(r"Given.*When.*Then", sections[i], flags=re.S))
|
|
208
|
+
total = len(all_ids)
|
|
209
|
+
msg = f"{rdir}: ストーリー {total} 本のうち受入条件あり {len(with_ac)} 本、Given/When/Then {len(with_gwt)} 本"
|
|
210
|
+
if len(with_gwt) == total:
|
|
211
|
+
rep.ok(msg)
|
|
212
|
+
else:
|
|
213
|
+
rep.warn(msg + "(移行ステップ 5)")
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def check_units(rep: Report, docs: Path, project: str | None, id_pattern: re.Pattern) -> set[str]:
|
|
217
|
+
"""units.md を検査し、未配置のストーリー ID を返す。"""
|
|
218
|
+
units = project_dir(docs / "requirements", project) / "units.md"
|
|
219
|
+
text = read(units)
|
|
220
|
+
if not text:
|
|
221
|
+
rep.error(f"{units}: 見つからない(移行ステップ 6)")
|
|
222
|
+
return set()
|
|
223
|
+
rep.ok(f"{units}: ある")
|
|
224
|
+
sections = re.split(r"^###\s+", text, flags=re.M)[1:]
|
|
225
|
+
unit_sections = [s for s in sections if re.match(r"(U-\d+|Unit)", s)]
|
|
226
|
+
if not unit_sections:
|
|
227
|
+
rep.warn(f"{units}: Unit の見出し(### U-01:…)が見つからない")
|
|
228
|
+
for s in unit_sections:
|
|
229
|
+
name = s.splitlines()[0].strip()
|
|
230
|
+
lacking = [f for f in UNIT_FIELDS if f not in s]
|
|
231
|
+
if lacking:
|
|
232
|
+
rep.warn(f"{units}: {name} に欄が欠けている: {', '.join(lacking)}(移行ステップ 6)")
|
|
233
|
+
if "依存 DAG" in text or "依存DAG" in text:
|
|
234
|
+
rep.ok(f"{units}: 依存 DAG がある")
|
|
235
|
+
else:
|
|
236
|
+
rep.warn(f"{units}: 依存 DAG が無い(移行ステップ 6)")
|
|
237
|
+
if "ストーリーマップ" in text:
|
|
238
|
+
rep.ok(f"{units}: ストーリーマップがある")
|
|
239
|
+
else:
|
|
240
|
+
rep.warn(f"{units}: ストーリーマップが無い(移行ステップ 6)")
|
|
241
|
+
unplaced: set[str] = set()
|
|
242
|
+
for line in text.splitlines():
|
|
243
|
+
if "未配置" in line:
|
|
244
|
+
unplaced.update(id_pattern.findall(line))
|
|
245
|
+
return unplaced
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def check_release_plan(rep: Report, docs: Path, project: str | None, unplaced: set[str]) -> None:
|
|
249
|
+
ddir = project_dir(docs / "development", project)
|
|
250
|
+
path = ddir / "release_plan.md"
|
|
251
|
+
text = read(path)
|
|
252
|
+
if not text:
|
|
253
|
+
rep.warn(f"{path}: 見つからない")
|
|
254
|
+
return
|
|
255
|
+
if "エントロピー" in text:
|
|
256
|
+
rep.ok(f"{path}: エントロピー評価がある")
|
|
257
|
+
else:
|
|
258
|
+
rep.warn(f"{path}: エントロピー評価が無い(移行ステップ 7)")
|
|
259
|
+
if "テスト戦略" in text:
|
|
260
|
+
rep.ok(f"{path}: テスト戦略の選択がある")
|
|
261
|
+
else:
|
|
262
|
+
rep.warn(f"{path}: テスト戦略の選択が無い(移行ステップ 7)")
|
|
263
|
+
scheduled = sorted(i for i in unplaced if re.search(re.escape(i) + r"(?!\d)", text))
|
|
264
|
+
if scheduled:
|
|
265
|
+
rep.warn(f"{path}: units.md で未配置のストーリーが計画に割り当てられている: {', '.join(scheduled)}(移行ステップ 6・7)")
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def check_bolt_plans(rep: Report, docs: Path, project: str | None) -> None:
|
|
269
|
+
ddir = project_dir(docs / "development", project)
|
|
270
|
+
plans = sorted(ddir.glob("bolt_plan-*.md")) if ddir.exists() else []
|
|
271
|
+
if not plans:
|
|
272
|
+
rep.warn(f"{ddir}: bolt_plan-N.md が無い(移行ステップ 8。進行中のイテレーションが無ければ不要)")
|
|
273
|
+
return
|
|
274
|
+
for p in plans:
|
|
275
|
+
t = read(p)
|
|
276
|
+
lacking = [label for key, label in (("仮説", "確認したい仮説"), ("ゲート", "ゲート密度")) if key not in t]
|
|
277
|
+
if lacking:
|
|
278
|
+
rep.warn(f"{p}: 欠けている: {', '.join(lacking)}(移行ステップ 8)")
|
|
279
|
+
else:
|
|
280
|
+
rep.ok(f"{p}: 仮説とゲート密度がある")
|
|
281
|
+
n = p.stem.split("-")[-1]
|
|
282
|
+
old = ddir / f"iteration_plan-{n}.md"
|
|
283
|
+
if old.exists() and "deprecated" not in frontmatter(read(old)):
|
|
284
|
+
rep.warn(f"{old}: bolt_plan-{n}.md に読み替えたが deprecated になっていない(移行ステップ 8)")
|
|
285
|
+
if not any("ウォーキングスケルトン" in read(p) for p in plans):
|
|
286
|
+
rep.warn(f"{ddir}: ウォーキングスケルトンを明記した Bolt 計画が無い(移行ステップ 8)")
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
def migration_artifacts(docs: Path, project: str | None) -> list[Path]:
|
|
290
|
+
req = project_dir(docs / "requirements", project)
|
|
291
|
+
des = project_dir(docs / "design", project)
|
|
292
|
+
dev = project_dir(docs / "development", project)
|
|
293
|
+
paths = [req / "units.md", req / "risk_register.md", dev / "aidlc_migration_plan.md"]
|
|
294
|
+
if des.exists():
|
|
295
|
+
paths += list(des.glob("*glossary*.md")) + list(des.glob("*static*.md")) + list(des.glob("*dynamic*.md"))
|
|
296
|
+
if dev.exists():
|
|
297
|
+
paths += sorted(dev.glob("bolt_plan-*.md"))
|
|
298
|
+
return [p for p in paths if p.exists()]
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
def check_verified_and_index(rep: Report, docs: Path, project: str | None) -> None:
|
|
302
|
+
artifacts = migration_artifacts(docs, project)
|
|
303
|
+
unverified = [p.name for p in artifacts if "verified" not in frontmatter(read(p))]
|
|
304
|
+
if not artifacts:
|
|
305
|
+
return
|
|
306
|
+
if unverified:
|
|
307
|
+
rep.warn(f"移行成果物に人の承認記録(verified)が無い: {', '.join(unverified)}(apply-okf verify)")
|
|
308
|
+
else:
|
|
309
|
+
rep.ok(f"移行成果物 {len(artifacts)} 件すべてに verified がある")
|
|
310
|
+
unindexed = []
|
|
311
|
+
for p in artifacts:
|
|
312
|
+
index = p.parent / "index.md"
|
|
313
|
+
if index.exists() and p.name not in read(index):
|
|
314
|
+
unindexed.append(f"{p.parent.name}/{p.name}")
|
|
315
|
+
if unindexed:
|
|
316
|
+
rep.warn(f"index.md に登録されていない移行成果物: {', '.join(unindexed)}(移行ステップ 10)")
|
|
317
|
+
else:
|
|
318
|
+
rep.ok("移行成果物はすべて index.md に登録されている")
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
def check_guardrails(rep: Report, skills: Path, frontend: bool) -> None:
|
|
322
|
+
targets = ["developing-backend"] + (["developing-frontend"] if frontend else [])
|
|
323
|
+
if not frontend:
|
|
324
|
+
rep.ok("apps: フロントエンドが見つからないため developing-frontend は検査対象外")
|
|
325
|
+
for s in targets:
|
|
326
|
+
path = skills / s / "PROJECT.md"
|
|
327
|
+
text = read(path)
|
|
328
|
+
if not text:
|
|
329
|
+
rep.warn(f"{path}: 無い(移行ステップ 9)")
|
|
330
|
+
continue
|
|
331
|
+
if any(k in text for k in TDD_KEYWORDS):
|
|
332
|
+
rep.ok(f"{path}: TDD の三原則が書かれている")
|
|
333
|
+
else:
|
|
334
|
+
rep.warn(f"{path}: TDD の三原則が書かれていない(移行ステップ 9)")
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
def main() -> int:
|
|
338
|
+
try:
|
|
339
|
+
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
|
|
340
|
+
except Exception: # noqa: BLE001
|
|
341
|
+
pass
|
|
342
|
+
ap = argparse.ArgumentParser(description="AI-DLC 移行の適合性検査")
|
|
343
|
+
ap.add_argument("--project", default=None, help="プロジェクト識別子(docs/<category>/<project>/ のサブディレクトリ名)")
|
|
344
|
+
ap.add_argument("--docs", default="docs", help="ドキュメントバンドルのルート(既定 docs)")
|
|
345
|
+
ap.add_argument("--apps", default="apps", help="アプリケーションのルート(既定 apps)")
|
|
346
|
+
ap.add_argument("--claude-md", default="CLAUDE.md", help="CLAUDE.md のパス")
|
|
347
|
+
ap.add_argument("--skills", default=".claude/skills", help="スキルディレクトリ")
|
|
348
|
+
ap.add_argument("--story-id", default=r"US-\d+", help="ストーリー ID の正規表現(既定 US-\\d+)")
|
|
349
|
+
args = ap.parse_args()
|
|
350
|
+
|
|
351
|
+
docs = Path(args.docs)
|
|
352
|
+
id_pattern = re.compile(args.story_id)
|
|
353
|
+
dirs = app_dirs(Path(args.apps), args.project)
|
|
354
|
+
rep = Report()
|
|
355
|
+
check_claude_md(rep, Path(args.claude_md))
|
|
356
|
+
check_guides(rep, docs)
|
|
357
|
+
check_migration_plan(rep, docs, args.project)
|
|
358
|
+
check_risk_register(rep, docs, args.project)
|
|
359
|
+
check_glossary(rep, docs, args.project)
|
|
360
|
+
check_brownfield(rep, docs, dirs, args.project)
|
|
361
|
+
check_stories(rep, docs, args.project, id_pattern)
|
|
362
|
+
unplaced = check_units(rep, docs, args.project, id_pattern)
|
|
363
|
+
check_release_plan(rep, docs, args.project, unplaced)
|
|
364
|
+
check_bolt_plans(rep, docs, args.project)
|
|
365
|
+
check_verified_and_index(rep, docs, args.project)
|
|
366
|
+
check_guardrails(rep, Path(args.skills), has_frontend(dirs))
|
|
367
|
+
rep.print()
|
|
368
|
+
return 1 if rep.errors else 0
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
if __name__ == "__main__":
|
|
372
|
+
sys.exit(main())
|
package/lib/assets/CLAUDE.md
CHANGED
|
@@ -130,6 +130,7 @@ AI-DLC で守ること:
|
|
|
130
130
|
| `creating-release-report` | リリース完了報告書作成 |
|
|
131
131
|
| `creating-iteration-report` | イテレーション完了報告書作成 |
|
|
132
132
|
| `migrating-okf` | プロジェクトドキュメントの OKF 知識バンドルへの移行・仕様バージョンアップ・適合性検証 |
|
|
133
|
+
| `migrating-ai-dlc` | XP ベースの既存プロジェクトを AI-DLC の運用(Unit 分解・Bolt 計画・リスク台帳・ガードレール)へ移行・適合性検証 |
|
|
133
134
|
| `apply-okf` | 文書の作成・更新・レビュー・廃止時に OKF 規約(フロントマター・verified・index/log)を適用 |
|
|
134
135
|
| `apply-docs-structure` | ドキュメント構成ガイド(単一企業・統合戦略・複数プロジェクト)に基づく配置判断・新プロジェクトのディレクトリ一式作成・構成検証 |
|
|
135
136
|
|