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 +17 -0
- package/docs/guide/retrofit-adoption.md +241 -0
- package/package.json +1 -1
- package/scripts/harness/agent-integration/infrastructure/adapters/harness-config-config-query-adapter.ts +1 -1
- package/scripts/harness/ci-governance/application/dto/create-baseline-output.ts +2 -2
- package/scripts/harness/ci-governance/application/usecases/create-baseline-usecase.ts +4 -4
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
|
@@ -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 ??
|
|
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
|
|
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
|
|
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
|
-
|
|
55
|
+
files: [],
|
|
56
56
|
};
|
|
57
57
|
}
|
|
58
58
|
|
|
@@ -71,7 +71,7 @@ export class CreateBaselineUseCase {
|
|
|
71
71
|
entries,
|
|
72
72
|
});
|
|
73
73
|
|
|
74
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
92
|
+
files: outputFiles,
|
|
93
93
|
};
|
|
94
94
|
}
|
|
95
95
|
}
|