phasegate 0.69.0 → 0.71.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/CHANGELOG.md CHANGED
@@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.71.0] - 2026-04-22
11
+
12
+ ### Changed (breaking-ish)
13
+
14
+ - ISSUE-007 Wave 6 — `baseline.enabled` の default を `false` → **`true`** に変更。ISSUE-007 の趣旨(retrofit 導入時の摩擦解消)と整合させるため。`.phasegate/baseline.json` が存在しないプロジェクトでは従来通り何も grandfather されない(`ci-governance-baseline-grandfather-adapter.ts` が defensive に early-return する)ため、新規プロジェクトへの影響なし。`baseline` をオフにしたい場合は `phasegate.config.json` に `baseline.enabled: false` を明示。
15
+ - `npx phasegate baseline --dry-run --json` の出力キーを `entries` → `files` に変更(保存ファイル `.phasegate/baseline.json` のキー `files` と整合)。同時に `CreateBaselineOutput.entries` → `CreateBaselineOutput.files` にリネーム。`.phasegate/baseline.json` 自体のオンディスク形式は変更なし。
16
+
17
+ ### Fixed
18
+
19
+ - dogfooding で判明していた「`npx phasegate init` → `npx phasegate baseline` の 2 手を踏んでも pre-tool-use hook で grandfather が効かない」問題を解消(上記の `enabled` default 変更により)。
20
+
21
+ ## [0.70.0] - 2026-04-22
22
+
23
+ ### Added
24
+
25
+ - ISSUE-007 Wave 5 — `docs/guide/retrofit-adoption.md` を追加。既存プロジェクトへの phasegate 後付け導入チュートリアル(`init` → `baseline` → `scaffold-design` の 4 ステップ、phase-gate エラーの読み方、baseline 卒業手順、よくある詰まり方の QA)。
26
+
10
27
  ## [0.69.0] - 2026-04-22
11
28
 
12
29
  ### Added
@@ -0,0 +1,241 @@
1
+ # Retrofit Adoption Guide
2
+
3
+ 既に動いているプロジェクトに phasegate を後付け導入するためのチュートリアル。
4
+
5
+ ## このガイドの対象
6
+
7
+ - 既存コードベースに phasegate を導入したいメンテナ
8
+ - 設計文書(logical_design.md / domain_model.md 等)が未整備のまま保守と新規開発を並行したい状態
9
+ - 「phase-gate が既存コード編集で発火して保守が詰む」ことを避けたい
10
+
11
+ phasegate は本来「新規プロジェクトをゼロから AIDLC で組む」前提で設計されている。
12
+ 既存コードに後付けすると、設計文書の無いファイルを触るたびに pre-tool-use hook が発火し、
13
+ 通常の保守作業が block される。このガイドは ISSUE-007 で導入した **baseline grandfather** と
14
+ **scaffold-design CLI** を組み合わせて、段階的に phasegate 管理下に取り込む手順を示す。
15
+
16
+ ---
17
+
18
+ ## 前提
19
+
20
+ - Node.js >= 18.0.0
21
+ - 既存プロジェクトのソースコードが git で管理されている
22
+ - phasegate >= v0.69.0(scaffold-design CLI 含む)
23
+
24
+ ```bash
25
+ npm install --save-dev phasegate
26
+ ```
27
+
28
+ ---
29
+
30
+ ## 4 ステップ後付け導入
31
+
32
+ ```
33
+ Step 1: npx phasegate init # 雛形・スキル配布
34
+ Step 2: npx phasegate baseline # 既存コードを grandfather 登録
35
+ Step 3: 既存ファイルの保守は gate をスキップ
36
+ Step 4: 新規 Unit / 構造変更は scaffold-design で設計文書を起こしてから実装
37
+ ```
38
+
39
+ ---
40
+
41
+ ## Step 1: 初期化
42
+
43
+ ```bash
44
+ npx phasegate init --name <project-name>
45
+ ```
46
+
47
+ - `.claude/skills/` に 28 スキルを配置
48
+ - `phasegate.config.json` を生成
49
+ - `phasegate.config.json` の `baseline` セクションは既定で `enabled: true`
50
+
51
+ `phasegate.config.json` の該当部分(デフォルト):
52
+
53
+ ```json
54
+ {
55
+ "baseline": {
56
+ "enabled": true,
57
+ "path": ".phasegate/baseline.json"
58
+ }
59
+ }
60
+ ```
61
+
62
+ `baseline.enabled` を `false` にすると grandfather が無効化され、既存ファイルも全て
63
+ gate 対象になる(後付け導入では推奨しない)。
64
+
65
+ ---
66
+
67
+ ## Step 2: 既存コードを baseline に登録
68
+
69
+ ```bash
70
+ npx phasegate baseline
71
+ ```
72
+
73
+ 実行すると、現時点の全 TS/JS ソースファイルの相対パスと sha1 ハッシュを
74
+ `.phasegate/baseline.json` に保存する。
75
+
76
+ ```jsonc
77
+ {
78
+ "version": 1,
79
+ "createdAt": "2026-04-22T10:00:00Z",
80
+ "entries": [
81
+ { "path": "src/foo.ts", "sha1": "abc123..." },
82
+ { "path": "src/bar.ts", "sha1": "def456..." }
83
+ ]
84
+ }
85
+ ```
86
+
87
+ ### 確認だけしたい場合
88
+
89
+ ```bash
90
+ npx phasegate baseline --dry-run --json
91
+ ```
92
+
93
+ ### 特定ディレクトリだけ登録
94
+
95
+ ```bash
96
+ npx phasegate baseline --paths "src/**/*.ts,scripts/**/*.ts"
97
+ ```
98
+
99
+ ### `.phasegate/baseline.json` は commit する
100
+
101
+ grandfather 対象はチーム全員で共有するため、`.phasegate/baseline.json` は
102
+ `.gitignore` に入れず commit する。
103
+
104
+ ---
105
+
106
+ ## Step 3: 既存ファイルの保守
107
+
108
+ baseline に登録されたファイルは pre-tool-use hook で gate をスキップする。
109
+
110
+ - ファイル内容を編集しても sha1 が一致していれば許可(タイポ修正・コメント追加等)
111
+ - 構造的変更(新規 export 追加・レイヤー変更等)で sha1 がズレた瞬間、grandfather
112
+ が外れて通常の gate 対象に戻る。その時は Step 4 に進む
113
+
114
+ この段階では `logical_design.md` 等の設計文書が存在しなくても、既存ファイルの
115
+ 保守は通常通り行える。
116
+
117
+ ---
118
+
119
+ ## Step 4: 新規 Unit / 構造変更は scaffold-design
120
+
121
+ 新しい Unit を作る、あるいは baseline を外して既存 Unit を phasegate 管理下に
122
+ 取り込む場合、設計文書を先に起こす。
123
+
124
+ ### 4-1: phase-gate 発火時のエラーを読む
125
+
126
+ 設計文書が存在しない Unit に新規ファイルを作ろうとすると、pre-tool-use hook が
127
+ 以下の形式で block する(v0.67.0 以降):
128
+
129
+ ```
130
+ 成果物が不足しています: docs/product/construction/harness-api/logical_design.md
131
+ → phase gate prerequisites are not met
132
+
133
+ 次のアクション: /story-implementor スキルを使用して設計フェーズから開始してください。
134
+ scaffold: npx phasegate scaffold-design --unit harness-api --phase logical
135
+ テンプレ: templates/logical_design.template.md
136
+ ```
137
+
138
+ - **次のアクション**: `suggestedSkill` — 本格的に設計するなら Claude Code でこのスキルを呼ぶ
139
+ - **scaffold**: `scaffoldCommand` — テンプレだけ先に生成して placeholder で埋めたい時はこちら
140
+ - **テンプレ**: `templatePath` — 手書きしたい場合の参照元
141
+
142
+ ### 4-2: scaffold-design で雛形を生成
143
+
144
+ ```bash
145
+ npx phasegate scaffold-design --unit harness-api --phase logical
146
+ ```
147
+
148
+ 出力例:
149
+
150
+ ```
151
+ 設計文書を生成しました: docs/product/construction/harness-api/logical_design.md
152
+ テンプレ: /path/to/project/templates/logical_design.template.md
153
+ Unit: harness-api / phase: logical
154
+ TODO プレースホルダを実体で埋めてください。
155
+ ```
156
+
157
+ 生成されるファイルは `{{unit}}` が Unit ID に置換済みで、`TODO:` コメントが
158
+ 各セクションに残る。人間 / AI エージェントがこの TODO を埋めて設計を実体化する。
159
+
160
+ ### 対応する phase
161
+
162
+ | `--phase` | 生成先 |
163
+ |---|---|
164
+ | `logical` | `docs/product/construction/{unit}/logical_design.md` |
165
+ | `domain` | `docs/product/construction/{unit}/domain_model.md` |
166
+ | `uiux` | `docs/product/construction/{unit}/uiux_design.md` |
167
+ | `unit-test` | `docs/product/construction/{unit}/unit_test_design.md` |
168
+ | `it-test` | `docs/product/construction/{unit}/it_test_design.md` |
169
+
170
+ ### 4-3: 既存ファイルがある場合
171
+
172
+ 既定では scaffold は既存ファイルを上書きしない:
173
+
174
+ ```
175
+ 既に存在します: docs/product/construction/harness-api/logical_design.md
176
+ 上書きするには --force を指定してください。
177
+ ```
178
+
179
+ 意図的に再生成したい場合のみ `--force` を付ける:
180
+
181
+ ```bash
182
+ npx phasegate scaffold-design --unit harness-api --phase logical --force
183
+ ```
184
+
185
+ ### 4-4: JSON 出力(CI / スクリプト向け)
186
+
187
+ ```bash
188
+ npx phasegate scaffold-design --unit harness-api --phase logical --json
189
+ ```
190
+
191
+ exit code:
192
+
193
+ | 状況 | code |
194
+ |---|---|
195
+ | 生成成功 / 上書き成功 | 0 |
196
+ | 既存ファイルあり(--force なし) | 2 |
197
+ | 引数不正 / テンプレ不在 | 2 |
198
+
199
+ ---
200
+
201
+ ## baseline から外して phasegate 管理下に取り込む
202
+
203
+ Unit の設計文書が揃い、phasegate フル管理に昇格させたい場合の手順:
204
+
205
+ 1. `scaffold-design` で logical_design.md / domain_model.md を生成 → TODO を埋める
206
+ 2. 対象ファイルを `.phasegate/baseline.json` から削除(手動編集 or `--paths` で対象外にして再生成)
207
+ 3. 以降、構造変更のたびに phase-gate が走る通常の運用に移行
208
+
209
+ ---
210
+
211
+ ## よくある詰まり方
212
+
213
+ ### Q. `baseline` 作成後も gate が発火する
214
+
215
+ **確認**: `phasegate.config.json` の `baseline.enabled` が `true` か。
216
+ `baseline.path` と実ファイルの配置が一致しているか。
217
+
218
+ ### Q. scaffold した直後に L1 lint が失敗する
219
+
220
+ scaffold は markdown テンプレのみ生成する。**TS/JS ソースファイルは生成しない**。
221
+ ソースコードの雛形が必要な場合は `/story-implementor` スキルを使う。
222
+
223
+ ### Q. チームメイトの環境で baseline がズレる
224
+
225
+ `.phasegate/baseline.json` は commit する必要がある。`.gitignore` に
226
+ 入れていないか確認。
227
+
228
+ ### Q. 既存ファイルを少し触っただけで grandfather が外れた
229
+
230
+ sha1 一致で判定しているため、**フォーマット変更・インポート順序変更でも外れる**。
231
+ 意図的な編集であればそのまま設計文書を起こすフローに移る。自動フォーマッタが
232
+ 大量変更を起こす場合は、`baseline` を `--force` で取り直す運用も可。
233
+
234
+ ---
235
+
236
+ ## 関連
237
+
238
+ - `docs/guide/cli-reference.md` — `baseline` / `scaffold-design` のフラグ一覧
239
+ - `docs/guide/layer-model.md` — L0-L4 防御モデルと phase-gate の位置付け
240
+ - `docs/ADR/ADR-013-story-reflection-gate.md` — phase-gate の思想的背景
241
+ - ISSUE-007 — 本ガイドが対応する起票 issue(`docs/inception/issues/ISSUE-007/`)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "phasegate",
3
- "version": "0.69.0",
3
+ "version": "0.71.0",
4
4
  "packageManager": "pnpm@10.30.1",
5
5
  "description": "Phasegate — AI-agnostic quality defense toolkit. Enforces structural integrity between design intent and code.",
6
6
  "license": "Apache-2.0",
@@ -124,7 +124,7 @@ export class HarnessConfigConfigQueryAdapter implements ConfigQueryPort {
124
124
  const config = this.loadConfig();
125
125
  const baseline = config.baseline ?? {};
126
126
  return {
127
- enabled: baseline.enabled ?? false,
127
+ enabled: baseline.enabled ?? true,
128
128
  path: baseline.path ?? '.phasegate/baseline.json',
129
129
  };
130
130
  }
@@ -1,7 +1,7 @@
1
1
  // @unit ci-governance
2
2
  // @layer application
3
3
 
4
- export interface CreateBaselineOutputEntry {
4
+ export interface CreateBaselineOutputFile {
5
5
  readonly path: string;
6
6
  readonly sha1: string;
7
7
  }
@@ -11,5 +11,5 @@ export interface CreateBaselineOutput {
11
11
  readonly entryCount: number;
12
12
  readonly dryRun: boolean;
13
13
  readonly overwriteBlocked: boolean;
14
- readonly entries: readonly CreateBaselineOutputEntry[];
14
+ readonly files: readonly CreateBaselineOutputFile[];
15
15
  }
@@ -52,7 +52,7 @@ export class CreateBaselineUseCase {
52
52
  entryCount: 0,
53
53
  dryRun: false,
54
54
  overwriteBlocked: true,
55
- entries: [],
55
+ files: [],
56
56
  };
57
57
  }
58
58
 
@@ -71,7 +71,7 @@ export class CreateBaselineUseCase {
71
71
  entries,
72
72
  });
73
73
 
74
- const outputEntries = entries.map((e) => ({ path: e.path, sha1: e.sha1 }));
74
+ const outputFiles = entries.map((e) => ({ path: e.path, sha1: e.sha1 }));
75
75
 
76
76
  if (dryRun) {
77
77
  return {
@@ -79,7 +79,7 @@ export class CreateBaselineUseCase {
79
79
  entryCount: snapshot.entryCount,
80
80
  dryRun: true,
81
81
  overwriteBlocked: false,
82
- entries: outputEntries,
82
+ files: outputFiles,
83
83
  };
84
84
  }
85
85
 
@@ -89,7 +89,7 @@ export class CreateBaselineUseCase {
89
89
  entryCount: snapshot.entryCount,
90
90
  dryRun: false,
91
91
  overwriteBlocked: false,
92
- entries: outputEntries,
92
+ files: outputFiles,
93
93
  };
94
94
  }
95
95
  }