phasegate 0.91.0 → 0.108.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 +255 -0
- package/README.ja.md +17 -7
- package/README.md +26 -4
- package/docs/ADR/ADR-015-architecture-preset.md +183 -0
- package/docs/guide/cli-reference.md +108 -0
- package/docs/guide/codex-integration.md +7 -2
- package/docs/guide/installation.md +10 -2
- package/docs/guide/preset-selection.md +170 -0
- package/docs/guide/quick-vs-full-mode.md +3 -3
- package/docs/guide/retrofit-adoption.md +19 -2
- package/docs/guide/skills-overview.md +1 -1
- package/package.json +7 -1
- package/scripts/harness/agent-integration/application/usecases/handle-pre-tool-use-usecase.ts +108 -100
- package/scripts/harness/agent-integration/domain/ports/phase-gate-query-port.ts +3 -3
- package/scripts/harness/agent-integration/domain/value-objects/write-target-scope.ts +26 -30
- package/scripts/harness/agent-integration/infrastructure/adapters/file-system-story-reflection-query-adapter.ts +6 -2
- package/scripts/harness/biome-ast-engine/application/dto/analyze-import-graph-input.ts +3 -0
- package/scripts/harness/biome-ast-engine/application/dto/resolve-enabled-rules-output.ts +2 -0
- package/scripts/harness/biome-ast-engine/application/mappers/resolve-enabled-rules-output-mapper.ts +4 -1
- package/scripts/harness/biome-ast-engine/application/usecases/analyze-import-graph-usecase.ts +4 -1
- package/scripts/harness/biome-ast-engine/application/usecases/execute-lint-usecase.ts +2 -0
- package/scripts/harness/biome-ast-engine/application/usecases/resolve-enabled-rules-usecase.ts +31 -3
- package/scripts/harness/biome-ast-engine/composition-root.ts +10 -2
- package/scripts/harness/biome-ast-engine/domain/ports/rule-config-provider-port.ts +16 -0
- package/scripts/harness/biome-ast-engine/domain/ports/source-module-analyzer-port.ts +5 -1
- package/scripts/harness/biome-ast-engine/domain/services/lint-runner.ts +5 -1
- package/scripts/harness/biome-ast-engine/domain/value-objects/architecture-spec.ts +38 -0
- package/scripts/harness/biome-ast-engine/domain/value-objects/layer-boundary.ts +7 -8
- package/scripts/harness/biome-ast-engine/domain/value-objects/layer-name.ts +15 -23
- package/scripts/harness/biome-ast-engine/domain/value-objects/source-module-snapshot.ts +11 -4
- package/scripts/harness/biome-ast-engine/infrastructure/adapters/harness-config-provider-adapter.ts +29 -3
- package/scripts/harness/biome-ast-engine/infrastructure/adapters/typescript-source-module-analyzer-adapter.ts +22 -15
- package/scripts/harness/biome-ast-engine/infrastructure/mappers/source-module-snapshot-mapper.ts +26 -17
- package/scripts/harness/config-foundation/application/dto/resolved-config-output.ts +1 -0
- package/scripts/harness/config-foundation/application/usecases/load-resolved-config-use-case.ts +34 -2
- package/scripts/harness/config-foundation/application/usecases/migrate-schema-use-case.ts +89 -0
- package/scripts/harness/config-foundation/composition-root.ts +8 -0
- package/scripts/harness/config-foundation/domain/harness-config.ts +6 -0
- package/scripts/harness/config-foundation/domain/services/architecture-resolution-service.ts +257 -0
- package/scripts/harness/config-foundation/domain/value-objects/architecture-config.ts +66 -0
- package/scripts/harness/config-foundation/domain/value-objects/architecture-preset-catalog.ts +75 -0
- package/scripts/harness/config-foundation/infrastructure/schemas/harness-config-v3.schema.json +546 -0
- package/scripts/harness/config-foundation/infrastructure/validators/ajv-config-schema-validator.ts +18 -6
- package/scripts/harness/config-foundation/presentation/cli/migrate-schema-command-handler.ts +83 -0
- package/scripts/harness/integrations/pre-commit.ts +211 -52
- package/scripts/harness/main.ts +460 -340
- package/scripts/harness/phase-dependency-model/domain/ports/story-reflection-file-system-port.ts +2 -4
- package/scripts/harness/phase-dependency-model/domain/services/story-reflection-checker.ts +54 -17
- package/scripts/harness/phase-dependency-model/infrastructure/filesystem/file-system-story-reflection-adapter.ts +154 -36
- package/scripts/harness/setup/skill-deployer.ts +140 -102
- package/scripts/harness/skill-quality/domain/errors/skill-quality-error.ts +24 -23
- package/scripts/harness/skill-quality/domain/value-objects/commit-message.ts +23 -7
- package/scripts/harness/traceability-model/application/usecases/apply-work-item-migration-usecase.ts +52 -0
- package/scripts/harness/traceability-model/application/usecases/plan-work-item-migration-usecase.ts +29 -0
- package/scripts/harness/traceability-model/application/usecases/validate-design-story-annotations-usecase.ts +83 -18
- package/scripts/harness/traceability-model/composition-root.ts +48 -30
- package/scripts/harness/traceability-model/domain/ports/design-document-port.ts +9 -15
- package/scripts/harness/traceability-model/domain/ports/work-item-migration-apply-port.ts +11 -0
- package/scripts/harness/traceability-model/domain/ports/work-item-migration-source-port.ts +9 -0
- package/scripts/harness/traceability-model/domain/services/work-item-migration-planner.ts +162 -0
- package/scripts/harness/traceability-model/domain/value-objects/work-item-frontmatter.ts +57 -0
- package/scripts/harness/traceability-model/domain/value-objects/work-item-migration-candidate.ts +47 -0
- package/scripts/harness/traceability-model/infrastructure/gateways/file-system-work-item-migration-apply-gateway.ts +110 -0
- package/scripts/harness/traceability-model/infrastructure/gateways/file-system-work-item-migration-source-gateway.ts +182 -0
- package/scripts/harness/traceability-model/infrastructure/gateways/markdown-design-document-gateway.ts +29 -43
- package/scripts/harness/traceability-model/infrastructure/parsers/work-item-frontmatter-parser.ts +136 -0
- package/scripts/harness/traceability-model/presentation/cli/migrate-work-items-command-handler.ts +186 -0
- package/skills/quick-implementor/SKILL.md +17 -1
- package/templates/.husky/commit-msg +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,261 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.108.0] - 2026-04-25
|
|
11
|
+
|
|
12
|
+
### Documentation
|
|
13
|
+
|
|
14
|
+
- **WI-028: `migrate work-items` + WI taxonomy のドキュメント整備** — WI-026 / WI-027 で導入された機能の公開ドキュメント整合。
|
|
15
|
+
- `CHANGELOG.md`: v0.101..v0.107 の 7 リリースを Keep-a-Changelog 形式で追記。
|
|
16
|
+
- `README.md` / `README.ja.md`: CLI Reference 表に `migrate work-items` を追加。
|
|
17
|
+
- `docs/guide/cli-reference.md`: **Work Item Migration** セクションを新設し、検出パターン(`ISSUE-XXX` / `WI-XXX` / `H{NN}-{NN}`)、sequential allocator の挙動、frontmatter 注入の冪等性、legacy_id grep 互換性、exit code を解説。
|
|
18
|
+
|
|
19
|
+
## [0.107.0] - 2026-04-25
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- **WI-027 root cause 修正**: `FileSystemWorkItemMigrationApplyGateway#ensureFrontmatter` が `---\n` で始まる既存 frontmatter を常に保持してしまい、旧 story-style frontmatter (`id: H02-06`, `unit: ...`, `issue: ...`, `phase: ...`, `created: ...`) を持つ H-ID directory に対して planner 生成 frontmatter が prepend されないバグを解消。
|
|
24
|
+
- 既存 frontmatter なし → 従来通り planner 生成版を prepend(変更なし)。
|
|
25
|
+
- 既存 frontmatter の `id` が target WI と不一致 / `legacy_id` 不在 → planner 生成 frontmatter で旧 frontmatter を **置換**し、本文は保持。
|
|
26
|
+
- 既存 frontmatter が target WI と一致 + `legacy_id` も一致 → byte-for-byte **冪等保持**(再 apply 安全)。
|
|
27
|
+
- 単体テスト追加: `apply-gateway` に「旧 frontmatter 置換」「冪等性」の 2 シナリオ + end-to-end dogfood で 3 シナリオ(stale 置換 / stub 生成 / 冪等保持)全 PASS。
|
|
28
|
+
|
|
29
|
+
## [0.106.0] - 2026-04-25
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
|
|
33
|
+
- **WI-027 dogfood follow-up**: v0.105.0 適用時、5 件の H-ID directory が旧 story-style frontmatter (`id: H02-06` 形式) を保持していたため、`legacy_id` が記録されず directory 名と `id:` フィールドの不整合が発生していたデータ修正。対象: `agent-integration/WI-033`, `phase-dependency-model/WI-053`, `phase-dependency-model/WI-054`, `quick-mode/WI-060`, `skill-quality/WI-072`。
|
|
34
|
+
- 各ファイルの frontmatter を planner 生成形式(`id: WI-XXX` / `type: story` / `severity: normal` / `status: drafted` / `legacy_id: H{NN}-{NN}`)に正規化。
|
|
35
|
+
|
|
36
|
+
## [0.105.0] - 2026-04-25
|
|
37
|
+
|
|
38
|
+
### Added
|
|
39
|
+
|
|
40
|
+
- **WI-027: `migrate work-items` を H-ID 旧ストーリーレイアウトに拡張** — WI-026 残作業 G2-1/G2-2 の切り出し。`docs/inception/{unit}/H{NN}-{NN}/` 形式 directory(57 件)を `migrate work-items` の対象に含め、空き番号の若い順に `WI-XXX` へ採番する。
|
|
41
|
+
- **`WorkItemMigrationSourcePort#listExistingWorkItemIds()` 追加**: 既存 `_cross/WI-XXX/` + `{unit}/WI-XXX/` directory の ID を列挙。planner が採番時に予約番号として使用。
|
|
42
|
+
- **`WorkItemMigrationPlanner` の sequential allocator**: `existingWorkItemIds` + 同一 plan 内 ISSUE-XXX の embedded number を `usedNumbers` に登録し、H-ID には未使用の最小 WI 番号を割り当てる。ISSUE-XXX → WI-XXX の embedded mapping は変更なし(後方互換)。
|
|
43
|
+
- **H-ID 由来 candidate の frontmatter**: `type: story`(issue ではなく)+ `legacy_id: H{NN}-{NN}` を生成。`affects` は付かない(unit-scoped のため)。
|
|
44
|
+
- **`FileSystemWorkItemMigrationSourceGateway` の H-ID directory walker**: `^H\d{2}-\d{2}$` パターンで unit 配下の H-ID directory を列挙、`SKIPPED_INCEPTION_DIRS` (`_shared` / `_operation` / `_cross` / `issues`) は引き続き skip。
|
|
45
|
+
- **適用結果**: phasegate 自身の dogfood で 57 件の H-ID directory を `WI-028..WI-084` に物理 rename + frontmatter 注入。`description.md` 不在の 44 件には stub `# {legacyId}\n` を自動生成。
|
|
46
|
+
|
|
47
|
+
### Fixed
|
|
48
|
+
|
|
49
|
+
- **同梱修正: reflection adapter の unit-scoped legacy_id 解決** — `FileSystemStoryReflectionAdapter#readLegacyId` が `_cross/{WI-XXX}/description.md` のみを参照していたため、H-ID 移行で初出した unit-scoped WI(traceability-model/WI-074 等)に対する `@story-id H{NN}-{NN}` annotation が legacy_id 経由で反映認識されず、source 書込時に dead-lock を起こしていた。`{unit}/{WI-XXX}/description.md` も走査するよう拡張し、product 側既存 `@story-id H{NN}-{NN}` annotation が継続利用可能に。
|
|
50
|
+
- 単体テスト UT-PD-169 追加(unit-scoped WI の legacy_id 経由 reflection 検出)。
|
|
51
|
+
|
|
52
|
+
### Tests
|
|
53
|
+
|
|
54
|
+
- planner: 5 ケース追加(H-ID 単独 / existingWorkItemIds skip / type: story frontmatter / ISSUE 混在 skip / 連続 H-ID 採番)。
|
|
55
|
+
- gateway: 4 ケース追加(H-ID directory 列挙 / 既存 issues との混在 / `listExistingWorkItemIds` _cross+unit 併合 / 空 inception)。
|
|
56
|
+
- plan use case: existingWorkItemIds を planner に渡すケース追加。
|
|
57
|
+
- reflection adapter: UT-PD-169 (unit-scoped WI legacy_id 解決)。
|
|
58
|
+
- 全 3440 tests green。
|
|
59
|
+
|
|
60
|
+
## [0.104.0] - 2026-04-25
|
|
61
|
+
|
|
62
|
+
### Fixed
|
|
63
|
+
|
|
64
|
+
- **WI-026 残作業 G2-3〜G2-5 / G3 / G4** — Phase A-3 / G1 の続編として ISSUE-026 残債を清掃。
|
|
65
|
+
- **G2-3**: 空の `docs/inception/issues/` を物理削除(cross issue 旧 layout)。
|
|
66
|
+
- **G2-4**: `WriteTargetScope.fromPath` の legacy `issues` 分岐を撤去(`{unit}/issues/{ISSUE-XXX}` パスは全 WI 移行済のため不要)。
|
|
67
|
+
- **G2-5**: `FileSystemStoryReflectionAdapter#listUnitWorkItemDirectories` の `name !== "issues"` filter を撤去。
|
|
68
|
+
- **G3**: L2-STORY-REFLECTION のメッセージで storyId が `WI-` 始まりの場合 `@work-item-id` を出力(旧 `@story-id` 表記を統一)。
|
|
69
|
+
- **G4-1〜G4-3**: `_cross/WI-026/description.md` の `status` を `implemented` → `drafted` に戻し、AC checkbox を実態と一致させ、Phase 3 仕様文言を G1 採用案 B に合わせて訂正。
|
|
70
|
+
|
|
71
|
+
## [0.103.0] - 2026-04-24
|
|
72
|
+
|
|
73
|
+
### Fixed
|
|
74
|
+
|
|
75
|
+
- **WI-026 残作業 G1: `_cross/WI-XXX/` inception 編集 dead-lock 解消** — `HandlePreToolUseUseCase#resolveStoryReflectionScope` で `docs/inception/**` への書込を reflection check 対象外にする(採用案 B)。`_cross/WI-XXX/{description,logical_design}.md` を新規作成しても `affects` 不一致による Level 3 reflection 要求でブロックされなくなる。`scripts/harness/{unit}/...` 書込での reflection check は維持。
|
|
76
|
+
- integration test: `_cross/WI-099/{description,logical_design}.md` の新規作成が pass、agent-integration ソース書込で WI-001 reflection が依然要求されることを確認。
|
|
77
|
+
|
|
78
|
+
## [0.102.0] - 2026-04-24
|
|
79
|
+
|
|
80
|
+
### Added
|
|
81
|
+
|
|
82
|
+
- **ISSUE-026 Phase A-2 (H03-04): WorkItem frontmatter parser** — 設計文書 frontmatter から WI メタデータを抽出する専用 parser を `traceability-model` に追加。既存 `parseFrontmatterFlags` は無変更・後方互換維持。
|
|
83
|
+
- 新規 API: `WorkItemFrontmatter` interface (`id` / `type` / `affects` / `severity` / `status` / `source` / `legacyId`、すべて readonly)、`WorkItemType` / `WorkItemSeverity` / `WorkItemStatus` string union、`parseWorkItemFrontmatter(content: string): WorkItemFrontmatter | null`、`WorkItemFrontmatterValidationError`、`WORK_ITEM_ID_PATTERN` (`WI-\d+` / `H\d{2}-\d{2}` / `HF\d+-\d{2}` / `ISSUE-\d+`)。
|
|
84
|
+
- UT-TM-W01〜W10 の 10 ケースで AC-1〜AC-10 を 1:1 カバー、3390 tests green。
|
|
85
|
+
|
|
86
|
+
## [0.101.0] - 2026-04-24
|
|
87
|
+
|
|
88
|
+
### Added
|
|
89
|
+
|
|
90
|
+
- **ISSUE-026 Phase A-1 (H02-04): `@work-item-id` annotation parser 併存対応** — `FileSystemStoryReflectionAdapter#fileContainsStoryAnnotation` の regex を `/@(story-id|issue-id|work-item-id)[ \t]+([^\n\r]+)/g` に拡張し、`@story-id` / `@issue-id` / `@work-item-id` の 3 系統を同一規約で認識(後方互換維持)。HTML コメント形式 (`<!-- @work-item-id WI-001 -->`) およびカンマ/空白区切りの複数 ID 列挙にも対応。
|
|
91
|
+
|
|
92
|
+
### Fixed
|
|
93
|
+
|
|
94
|
+
- pre-commit の unitName 導出バグ修正。
|
|
95
|
+
|
|
96
|
+
## [0.100.0] - 2026-04-23
|
|
97
|
+
|
|
98
|
+
### Added
|
|
99
|
+
|
|
100
|
+
- **ISSUE-014 Wave 6: preset 選定ガイド + `migrate` CLI + 呼称分離 + v0.86.0 未満警告** — Wave 5.5 までの実装を user 導線と docs に接続し ISSUE-014 を CLOSE する。
|
|
101
|
+
- **`docs/guide/preset-selection.md` 新設**: 7 preset(clean / strict-ddd / onion / hexagonal / layered / flat / custom)の早見表 + 選択フローチャート + 設定例 + override / custom の書式 + v2 → v3 移行手順。
|
|
102
|
+
- **README.md**: Presets 節を「Defense preset(`project.preset`)」「Architecture preset(`architecture.preset`)」の 2 テーブルに分け、preset-selection.md への導線を追加 + 呼称分離の補足。
|
|
103
|
+
- **CLAUDE.md**: 「防御プリセット(CI strict/lenient)」と「アーキプリセット(clean/onion/hex...)」の呼称分離ガイドを追記。issue / PR / チャットで「preset」とだけ書かず必ず種類を明示するルール化。
|
|
104
|
+
- **retrofit-adoption.md**: Step 1 に architecture preset 選定節を追加、`npx phasegate migrate --schema v3` の導線。
|
|
105
|
+
- **`phasegate migrate --schema v3` CLI 新設** (`scripts/harness/config-foundation/`): `MigrateSchemaUseCase` + `MigrateSchemaCommandHandler` + `main.ts` の switch-case `migrate` + ヘルプ追記。`phasegate.config.json` を読んで `architecture` キーが無ければ `{ preset: "clean" }` を追記して v3 化(idempotent)。
|
|
106
|
+
- **v0.86.0 未満警告**: `LoadResolvedConfigUseCase` が source document の `architecture` 有無で `schemaVersion: 'v2' | 'v3'` を判定して output DTO に追加。`main.ts` の `loadResolvedConfig()` が v2 検出時に `npx phasegate migrate --schema v3` の案内を **一度だけ** stderr に出力(同一プロセスで多重 load されても重複警告しない)。
|
|
107
|
+
|
|
108
|
+
### Tests
|
|
109
|
+
|
|
110
|
+
- 新規 `scripts/harness/__tests__/unit/config-foundation/migrate-schema-use-case.test.ts` で 6 テスト: v2→v3 変換 / v3 no-op / array document で InvalidConfigShapeError / null document / 未対応 targetVersion / configPath 透過。
|
|
111
|
+
- 新規 `scripts/harness/__tests__/integration/config-foundation/migrate-schema-use-case.test.ts` で 2 テスト: tmp dir round-trip(v2 config → 永続化検証 / v3 config → mtime 不変で no-op 確認)。
|
|
112
|
+
- 既存 `load-resolved-config-use-case.test.ts` と `load-config-facade.test.ts` の toEqual 期待値に `schemaVersion: 'v2'` を追加。
|
|
113
|
+
- 全 3387 tests green(3368 unit/integration + 19 forks、+8 新規)、`npx phasegate lint` violations 0(1301 ファイル scan)。
|
|
114
|
+
|
|
115
|
+
### Notes
|
|
116
|
+
|
|
117
|
+
- これにより ISSUE-014(アーキテクチャスタイルの config 対応)は Wave 1〜6 完走 → **CLOSED**。v0.86.0〜v0.99.0 の 14 バージョンで段階的に構築: Wave 1 設計文書 → Wave 2 VO 注入 → Wave 3 schema v3 → Wave 4 flat preset + biome-ast-engine 配線 → Wave 5 pipeline 全体に spec 配線 → Wave 5.5 3 preset dogfood integration test → Wave 6 guide + migrate CLI + 警告。
|
|
118
|
+
- `phasegate migrate --schema v3` は破壊的変更ではなく additive(既存フィールドは保持、`architecture` だけ追加)。本リポジトリ自身は Wave 3 時点で dogfood 済のため migrate 対象外。
|
|
119
|
+
|
|
120
|
+
## [0.99.0] - 2026-04-23
|
|
121
|
+
|
|
122
|
+
### Added
|
|
123
|
+
|
|
124
|
+
- **ISSUE-014 Wave 5.5: 3 preset(onion / hexagonal / layered)dogfood を vitest integration test で自動化** — Wave 5 で pipeline 配線は完成したが、外部 PJ 相当の end-to-end 検証は pre-tool-use-hook の `/tmp/**/src/domain/**` blocking で deferred していた。本 Wave では `/tmp/` への Claude Write を諦め、**テストランタイムの `fs.writeFileSync`(hook 対象外)で `os.tmpdir()` に fixture 展開する方針**に切り替えて解消。
|
|
125
|
+
- `scripts/harness/__tests__/integration/biome-ast-engine/preset-dogfood.integration.test.ts` を新設(`@story ISSUE-014`)。
|
|
126
|
+
- 各 preset につき「許容方向 import → violation 0 件」と「違反方向 import → `no-layer-violation` で検出」の 2 テスト × 3 preset = 計 6 テストを `createBiomeAstEngineModule(rootDir, { architecture })` 経由で `ExecuteLintUseCase.execute({ targets: ['src'], includeBiomeNative: false })` を呼び出して検証。
|
|
127
|
+
- 検証内容: onion(interface→domain 許容 / domain→interface 検出)、hexagonal(adapters→core 許容 / core→adapters 検出)、layered(presentation→business→data 許容 / data→presentation 検出)。
|
|
128
|
+
|
|
129
|
+
### Tests
|
|
130
|
+
|
|
131
|
+
- 新規 `preset-dogfood.integration.test.ts` で 6 テスト追加(3354 → 3360)。
|
|
132
|
+
- 全 3379 tests green(3360 unit/integration + 19 forks)、`npx phasegate lint` violations 0(1297 ファイル scan)。
|
|
133
|
+
|
|
134
|
+
### Notes
|
|
135
|
+
|
|
136
|
+
- 本 Wave は当初「`/tmp/phasegate-dogfood-*/` に実際のディレクトリを切って `npx phasegate lint` を走らせる外部検証」を想定していたが、pre-tool-use-hook が Claude の Write 経路で `/tmp/**/src/domain/**` を Full-mode 必須カテゴリと判定して blocking するため実行不能。hook の scope を narrow する修正は independent の refactoring スコープになるため、本 Wave では integration test ベースでの dogfood に切替(Claude が関与しない Node.js ランタイム書き込みは hook 対象外)。CLI 経由で phasegate.config.json を読み込む経路の検証は Wave 6 の `migrate` CLI テストで補完予定。
|
|
137
|
+
- ISSUE-014 は Wave 5.5 まで完了。残り Wave 6(ガイド追記 + `migrate` CLI + 呼称分離)で CLOSE 予定。
|
|
138
|
+
|
|
139
|
+
## [0.98.0] - 2026-04-23
|
|
140
|
+
|
|
141
|
+
### Added
|
|
142
|
+
|
|
143
|
+
- **ISSUE-014 Wave 5: `no-layer-violation` への `architecture.allowedDependencies` 注入 + pipeline 全体への spec 配線** — Wave 4 で flat preset 配線を作った後の、非 clean preset(onion / hexagonal / layered / strict-ddd / custom)を実際に lint 判定へ反映する改修。
|
|
144
|
+
- `ResolveEnabledRulesUseCase` 出力に `architectureSpec: ArchitectureSpec` を追加(DTO + mapper 拡張)。config-foundation の `preset / layers / allowedDependencies` を `freezeArchitectureSpec` で ArchitectureSpec に変換して下流へ伝播。
|
|
145
|
+
- `LintRunner.run(params)` の params に optional `architecture` を追加。`no-layer-violation` rule 内の `LayerBoundary.standardMatrix()` ハードコード呼び出しを `LayerBoundary.standardMatrix(architecture)` に置換(未指定時は `CLEAN_PRESET_SPEC` で後方互換)。
|
|
146
|
+
- `SourceModuleSnapshot.create(props, spec?)` で `@layer` tag の正規化が spec 経由になり、`core` / `interface` / `ports` 等の非 clean 層名が LayerName として認識可能に。
|
|
147
|
+
- `SourceModuleAnalyzerPort.analyzeMany(files, architecture?)` + `TypeScriptSourceModuleAnalyzerAdapter` + `source-module-snapshot-mapper.toSourceModuleSnapshot(raw, architecture?)` の 3 箇所に spec 伝播。
|
|
148
|
+
- `AnalyzeImportGraphUseCase` 入力 DTO に `architecture?` を追加、`ExecuteLintUseCase` が `resolvedRules.architectureSpec` を analyze/lintRunner の両方へ配線。
|
|
149
|
+
|
|
150
|
+
### Tests
|
|
151
|
+
|
|
152
|
+
- 新規 `lint-runner.test.ts` に onion preset 2 件(`domain → interface` 違反検出 / `interface → domain` 許容)を追加 — architecture 注入経路を end-to-end で検証。
|
|
153
|
+
- 新規 `source-module-snapshot.test.ts` に hexagonal spec 正規化 2 件(`core` 値が LayerName として通る / spec 省略時は clean default で `null` に落ちる)を追加。
|
|
154
|
+
- 新規 `resolve-enabled-rules-usecase.test.ts` に onion architecture の architectureSpec 透過 1 件を追加。
|
|
155
|
+
- 既存 `analyze-import-graph-usecase.test.ts` / `execute-lint-usecase.test.ts` の mock 期待値を新シグネチャに更新。
|
|
156
|
+
- 全 3373 tests green(3354 unit + 19 forks、+5)、`npx phasegate lint` violations 0。
|
|
157
|
+
|
|
158
|
+
### Notes
|
|
159
|
+
|
|
160
|
+
- 「外部 dogfood(`/tmp/phasegate-dogfood-onion` 等の 3 preset)」は pre-tool-use-hook が `/tmp/**/src/domain/**` への書き込みを quick-mode 外カテゴリとして blocking するため Wave 5.5 に延期。コード経路は unit test で end-to-end 検証済み。
|
|
161
|
+
- Wave 6(ガイド追記 + `migrate` CLI + v0.86.0 境界警告)は本 Wave の範囲外。
|
|
162
|
+
|
|
163
|
+
## [0.97.0] - 2026-04-23
|
|
164
|
+
|
|
165
|
+
### Added
|
|
166
|
+
|
|
167
|
+
- **ISSUE-014 Wave 4: `flat` preset auto-disable + user override 優先度 + architecture 配線** — Wave 3 で config-foundation がエクスポートした `architecture` を biome-ast-engine の L1 rule pipeline に接続した初回。
|
|
168
|
+
- `RuleConfigProviderPort` に `getArchitecture()` を追加し、`preset / layers / allowedDependencies` を供給。
|
|
169
|
+
- `HarnessConfigProviderAdapter` が architecture を保持・返却。未注入時は clean default に fallback。
|
|
170
|
+
- `createBiomeAstEngineModule` の `BiomeAstEngineModuleOptions` に `architecture?` を追加。
|
|
171
|
+
- `ResolveEnabledRulesUseCase` が `preset === 'flat'` 時に `require-unit-comment / require-layer-comment / no-layer-violation / enforce-folder-structure` を自動 `off` 扱い。**user 明示設定(rules or overrideRules)が存在する rule は preset 既定より優先**。
|
|
172
|
+
- `main.ts` が `resolvedConfig.architecture` を抽出し `createBiomeAstEngineModule` に渡す配線を追加。
|
|
173
|
+
- flat preset は `@layer` タグが残っていても L1-001/002/003/004 が skipped なので違反を発火しない(option A: 残存 tag は ignore)。
|
|
174
|
+
|
|
175
|
+
### Tests
|
|
176
|
+
|
|
177
|
+
- `unit/biome-ast-engine/resolve-enabled-rules-usecase.test.ts` に 4 件追加(flat preset 未指定時の 4 rule skipped / user `error` 明示優先 / user overrideRules `off` 明示 / clean preset は既定で auto-disable されない)。
|
|
178
|
+
|
|
179
|
+
### Notes
|
|
180
|
+
|
|
181
|
+
- Wave 5(`onion / hexagonal / layered / strict-ddd / custom` の実体活用 + dogfood)と Wave 6(ガイド追記 + migrate CLI)は別 Wave に送り、Wave 4 は flat 有効化のみに絞る。
|
|
182
|
+
- 現状 `no-layer-violation` rule は `LayerBoundary.standardMatrix()` をハードコード呼び出し中(`LintRunner`)。Wave 5 で architecture.allowedDependencies を注入する改修を予定。
|
|
183
|
+
|
|
184
|
+
## [0.96.0] - 2026-04-23
|
|
185
|
+
|
|
186
|
+
### Added
|
|
187
|
+
|
|
188
|
+
- **ISSUE-014 Wave 3: schema v3 + config-foundation による architecture preset のロード基盤** — Wave 2 で VO に注入口を用意した後の、config レイヤーでの実体化フェーズ。biome-ast-engine 側の配線は Wave 4 以降で担当する。
|
|
189
|
+
- 新規 `scripts/harness/config-foundation/infrastructure/schemas/harness-config-v3.schema.json` — v2 schema に `architecture` セクション(`preset` 必須、`custom` 時は `layers` + `allowedDependencies` 必須の `allOf/if/then`)を optional で追加。
|
|
190
|
+
- 新規 `domain/value-objects/architecture-config.ts` — `ArchitecturePresetId` / `ArchitectureConfigSource` / `ArchitectureConfigDocument` / `freezeArchitectureDocument` / `isArchitecturePresetId`。
|
|
191
|
+
- 新規 `domain/value-objects/architecture-preset-catalog.ts` — `clean / strict-ddd / onion / hexagonal / layered / flat` の 6 preset 定義(`custom` は source 側で明示)。
|
|
192
|
+
- 新規 `domain/services/architecture-resolution-service.ts` — preset 展開 + 明示 override マージ + semantic validation(C1 自己参照欠落は auto-fill + warn、C2 キー不整合は error、C3 値不整合は error、C4 layer 欠落は `{self}` auto-fill + warn、C5 循環依存は warn)+ layerDetection precedence(byPath=false+byTag=false は error)。
|
|
193
|
+
- `AjvConfigSchemaValidator` に構造検出(`architecture` キー有無)を追加し、v2/v3 schema を自動選択。
|
|
194
|
+
- `HarnessConfigResolvedDocument` に optional `architecture` を追加。`LoadResolvedConfigUseCase` が architecture を常時 resolve し、v2 config は `{ preset: "clean" }` 既定を synthesize。
|
|
195
|
+
- **phasegate レポ自身の `phasegate.config.json` に `architecture: { preset: "clean" }` dogfood 明示追記** — Wave 2 から移送された項目。v3 schema + loader が揃った本 Wave で初めて安全に追記可能。
|
|
196
|
+
|
|
197
|
+
### Changed
|
|
198
|
+
|
|
199
|
+
- 既存 `load-resolved-config-use-case.test.ts` の `createMinimalResolvedDocument()` に clean デフォルトの architecture セクションを追加(新契約への追従)。
|
|
200
|
+
|
|
201
|
+
### Tests
|
|
202
|
+
|
|
203
|
+
- 新規 `unit/config-foundation/architecture-resolution-service.test.ts` — 17 件。7 preset 展開 / custom explicit 必須 / preset+override merge / C1〜C5 semantic validation / layerDetection precedence / metadataTags override。
|
|
204
|
+
- 新規 `integration/config-foundation/ajv-config-schema-validator-v3.test.ts` — 5 件。v2 document / v3 document / 未知 preset / custom without layers のケース。
|
|
205
|
+
- 全 3345 tests green(3323 → +22)、`npx phasegate lint` violations 0。
|
|
206
|
+
|
|
207
|
+
## [0.95.0] - 2026-04-23
|
|
208
|
+
|
|
209
|
+
### Changed
|
|
210
|
+
|
|
211
|
+
- **ISSUE-014 Wave 2: `LayerName` / `LayerBoundary` VO を `ArchitectureSpec` 注入形式に改修** — Clean Architecture 固定値(`domain / application / infrastructure / presentation` と依存行列)を VO 内部から分離し、`ArchitectureSpec` 型 + `CLEAN_PRESET_SPEC` 定数として `scripts/harness/biome-ast-engine/domain/value-objects/architecture-spec.ts` に抽出。`LayerName.fromString` / `tryFromString` / `LayerBoundary.standardMatrix` が任意の spec を受け付けるようになった(default は `CLEAN_PRESET_SPEC` で既存挙動を維持)。
|
|
212
|
+
- `LayerNameValue` を `string` に緩和(外部参照が無い前提での型緩和)、`canDependOn` はインスタンスが保持する spec の `allowedDependencies` を参照する形式へ変更。
|
|
213
|
+
- 新規テスト 12 件追加(`architecture-spec.test.ts` 4 件 + `layer-name.test.ts` に onion preset 注入ケース 5 件 + `layer-boundary.test.ts` に onion 3×3 matrix ケース 3 件)。全 3323 テスト green、`npx phasegate lint` violations 0。
|
|
214
|
+
|
|
215
|
+
### Plan re-sync
|
|
216
|
+
|
|
217
|
+
- Wave 2 計画の小さな穴を是正: 当初「`phasegate.config.json` に `architecture: { preset: "clean" }` を dogfood 明示追記」を Wave 2 に含めていたが、現行 schema v2 が root レベルで `additionalProperties: false` を指定しているため `architecture` キー追加は validation error になる。v3 schema + loader が提供される Wave 3 まで dogfood 更新を**移送**。`wave1_schema_proposal.md` §4 と `issue_description.md` の Wave 表を同期更新。
|
|
218
|
+
|
|
219
|
+
## [0.94.0] - 2026-04-23
|
|
220
|
+
|
|
221
|
+
### Changed
|
|
222
|
+
|
|
223
|
+
- **ISSUE-014 Wave 1 計画の再同期** — レビュー補修で追加された制約を Wave 分割計画に取り込み漏れがないか検証。以下 3 件を追加反映:
|
|
224
|
+
- Wave 3 に「§1.2 preset + 明示 override 解決ロジック」を明示追加(semantic validation とは別軸)
|
|
225
|
+
- Wave 6 に「防御プリセット / アーキプリセットの呼称分離ガイド」を明示追加(レビュー穴 #3 の plan 反映漏れ)
|
|
226
|
+
- 推定工数を再計算: Wave 3 は 1d → **1.5d**(preset override + semantic validation C1〜C5 + precedence を盛り込んだため)。合計 4.5d → **5d**
|
|
227
|
+
- `wave1_schema_proposal.md` §4 の Wave 分割表と `issue_description.md` 推奨実装順表を同期更新
|
|
228
|
+
|
|
229
|
+
## [0.93.0] - 2026-04-23
|
|
230
|
+
|
|
231
|
+
### Changed
|
|
232
|
+
|
|
233
|
+
- **ISSUE-014 Wave 1 レビュー補修** — v0.92.0 で起票した設計文書を批判的レビューにより 12 項目修正。詳細は v0.92.0 の "Review / Hardening" セクション参照(修正差分は v0.93.0 リリースで統合)。実装コード変更なし、設計文書のみ。
|
|
234
|
+
|
|
235
|
+
## [0.92.0] - 2026-04-23
|
|
236
|
+
|
|
237
|
+
### Added
|
|
238
|
+
|
|
239
|
+
- **ISSUE-014 Wave 1: アーキテクチャ preset 化の設計着地** — PhaseGate を Clean Architecture 固定から preset 選択式に拡張するための Wave 1(設計・文書作成)を完了。実装コードは含まない。
|
|
240
|
+
- `docs/ADR/ADR-015-architecture-preset.md` を Accepted 状態で起票。preset **7 種**(`clean` / `strict-ddd` / `onion` / `hexagonal` / `layered` / `flat` / `custom`)を採択し、`flat` 時の L1-001〜004 自動無効化、`metadataTags` での `@layer` / `@unit` タグ差し替え、schema v3 への下位互換マイグレーション戦略を決定。
|
|
241
|
+
- `docs/inception/issues/ISSUE-014/wave1_schema_proposal.md` を追加。`architecture` セクションの JSON Schema 断片、各 preset の層・`allowedDependencies` 定義、Wave 2〜6 の実装順序(推定 4.5d)を明文化。
|
|
242
|
+
- `docs/inception/issues/ISSUE-014/issue_description.md` の状態を `IN PROGRESS` に更新し、Wave 2 以降の入り口を記述。
|
|
243
|
+
|
|
244
|
+
### Review / Hardening(批判的レビューによる穴補修)
|
|
245
|
+
|
|
246
|
+
Wave 1 成果物を批判的にレビューし、以下の穴を修正:
|
|
247
|
+
|
|
248
|
+
- **カウント誤り**: `preset 6 種` → **7 種** に修正(`clean` + `strict-ddd` + `onion` + `hexagonal` + `layered` + `flat` + `custom`)
|
|
249
|
+
- **schema 識別機構**: loader が v2 / v3 を判別する手段を構造検出(`architecture` キーの有無)に決定。明示的な `$schemaVersion` フィールドは追加しない方針を ADR-015 / §1.0 に明記
|
|
250
|
+
- **`project.preset` vs `architecture.preset` の直交性**: 既存 `project.preset`(防御プリセット)と新設 `architecture.preset`(アーキプリセット)の概念を ADR-015 で分離説明。CLI メッセージ・ドキュメントで区別呼称する方針を Wave 6 ガイドに委譲
|
|
251
|
+
- **semantic validation 穴**: `custom` preset の JSON Schema では validate できない制約(C1: 層名の自己参照、C2/C3: allowedDependencies キー/値の `layers` 配列整合、C4: 全 layer カバレッジ、C5: 循環依存警告)を §1.3 に列挙、Wave 3 実装に委譲
|
|
252
|
+
- **preset override 規則**: `preset` + 明示 `layers` / `allowedDependencies` 併記時のルール(明示値 override、partial override 許容)を §1.2 に追加
|
|
253
|
+
- **`layerDetection` precedence**: `byPath` / `byTag` の全組み合わせ(4 通り)の挙動を §3.4 の表に明示。`byPath: false, byTag: false` は schema error に
|
|
254
|
+
- **`flat` preset の残存 `@layer` tag 扱い**: 案 A(無視)/ B(warn)/ C(error)を列挙、Wave 4 で案 A 採用を推奨
|
|
255
|
+
- **preset vs user 個別設定の優先度**: `flat` preset が L1-001〜004 を無効化する場面で user の明示 `layers.L1.rules["L1-001"]: "error"` が上書きする規則を §2.8 に追加
|
|
256
|
+
- **ADR-005 矛盾の解消**: PhaseGate 自身が `clean` preset を名乗ることと ADR-005(Hexagonal 採用)の両立を「`domain` が Hexagonal の `core` に相当する」という哲学的整合で ADR-015 に明記
|
|
257
|
+
- **ADR-014 境界警告**: v0.86.0 未満から upgrade する user への「暗黙デフォルト変更」警告を Wave 6 ガイド + migrate CLI に入れる方針を明記
|
|
258
|
+
- **`@story` タグのスコープ定義**: test ファイルで使われる `@story` タグが本 Wave の `metadataTags` で扱われない理由(traceability-model 管轄)を §3.3 に追加
|
|
259
|
+
- **Wave 受け入れ基準の再設計**: 物理的な成果物存在と user レビュー完了を分離。物理 [x] / レビュー [ ] で Wave 1 完了判定の厳密性を確保
|
|
260
|
+
|
|
261
|
+
### Scope notes
|
|
262
|
+
|
|
263
|
+
- Wave 1 は **設計・文書のみ**。`scripts/harness/` 配下のコード改修は含まず、既存テストへの影響なし。`LayerName` / `LayerBoundary` の config 注入改修は Wave 2、schema v3 実装は Wave 3、dogfood 検証は Wave 4〜5、ガイド追記は Wave 6 で順次実施予定。
|
|
264
|
+
|
|
10
265
|
## [0.91.0] - 2026-04-23
|
|
11
266
|
|
|
12
267
|
### Fixed
|
package/README.ja.md
CHANGED
|
@@ -56,7 +56,7 @@ npm install --save-dev phasegate
|
|
|
56
56
|
npx phasegate init --name <プロジェクト名> --preset standard
|
|
57
57
|
```
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
`skills/` に28スキルを展開し、`.claude/skills` / `.codex/skills` などの agent 向け導線を作成し、設計原則ドキュメント(`docs/principles/*.md`・`docs/folder_management_rules.md`)を配置し、`phasegate.config.json` を生成します。
|
|
60
60
|
|
|
61
61
|
`--preset` で初期構成を選択できます: `minimal`(プロトタイプ)/ `standard`(推奨)/ `strict`(本番)
|
|
62
62
|
|
|
@@ -443,6 +443,8 @@ npx phasegate <command> [options]
|
|
|
443
443
|
| `validate-adr` | ADR 検証(`--all` または `<adrRef>`) |
|
|
444
444
|
| `list-errors` | エラー定義一覧(`--layer L0-L4`) |
|
|
445
445
|
| `ci:generate-template` | CI/CD テンプレート生成(`--type <type>`) |
|
|
446
|
+
| `migrate work-items` | `docs/inception/` 配下の旧 `ISSUE-XXX` / `H{NN}-{NN}` directory を統一 `WI-XXX` レイアウトへ移行(v0.100.0 で導入、v0.105.0 で H-ID 検出に拡張)。frontmatter に `type` / `legacy_id` / `affects` を注入し、空き番号の若い順に sequential 採番(既存 WI 番号は予約)。`--dry-run` / `--apply` / `--json`。詳細は [CLI Reference -- Work Item Migration](docs/guide/cli-reference.md#work-item-migration) |
|
|
447
|
+
| `migrate --schema v3` | `phasegate.config.json` を v3 スキーマへ昇格(`architecture` キーを追加、既存設定は保持)。冪等。 |
|
|
446
448
|
|
|
447
449
|
### Hook / 委任ラッパー
|
|
448
450
|
|
|
@@ -606,15 +608,17 @@ Phasegate は [OpenAI Codex CLI](https://developers.openai.com/codex/cli) でも
|
|
|
606
608
|
### セットアップ(2 ステップ)
|
|
607
609
|
|
|
608
610
|
```bash
|
|
609
|
-
# 1. Codex
|
|
611
|
+
# 1. Codex 向けにプロジェクトを初期化(.codex/hooks.json や .codex/skills など project 内ファイルを作成)
|
|
610
612
|
npx phasegate init --name my-project --agent codex --with-husky
|
|
611
613
|
|
|
612
|
-
# 2. Codex
|
|
614
|
+
# 2. Codex CLI 側の feature flag を手動で有効化
|
|
613
615
|
codex features enable codex_hooks
|
|
614
616
|
```
|
|
615
617
|
|
|
616
618
|
Claude + Codex 両対応プロジェクトは `--agent both` を指定してください。
|
|
617
619
|
|
|
620
|
+
`init` が担当するのは project 内のセットアップです。`codex_hooks` の有効化は Codex 本体のユーザー設定なので、明示的に手動実行します。
|
|
621
|
+
|
|
618
622
|
### カバレッジと既知の制約
|
|
619
623
|
|
|
620
624
|
Codex のネイティブ `apply_patch` ツールは内部の `ApplyPatchHandler` 経由で実行され hook を発火しません([openai/codex#16732](https://github.com/openai/codex/issues/16732))。このため pre-edit hard block は Bash 経由の書き込みに限定され、ネイティブ `apply_patch` の違反は **pre-commit (L2)** で commit 時にブロックされます。
|
|
@@ -786,16 +790,22 @@ your-project/
|
|
|
786
790
|
│ │ └── {unit}/{US-XXX}/ # Level 2/3(Unit・ストーリー単位)
|
|
787
791
|
│ └── ADR/
|
|
788
792
|
├── src/ # 実装コード(@unit/@layer 必須)
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
793
|
+
├── .claude/
|
|
794
|
+
│ ├── settings.json # Hooks 設定
|
|
795
|
+
│ └── skills/ # ../skills への symlink
|
|
796
|
+
├── .codex/
|
|
797
|
+
│ ├── hooks.json # Codex hooks 設定
|
|
798
|
+
│ └── skills/ # ../skills への symlink(Codex有効時)
|
|
799
|
+
└── skills/ # npx phasegate init で再生成可能
|
|
792
800
|
```
|
|
793
801
|
|
|
794
802
|
### 推奨 .gitignore
|
|
795
803
|
|
|
796
804
|
```
|
|
797
805
|
node_modules/
|
|
798
|
-
|
|
806
|
+
skills/ # npx phasegate init で再生成可能
|
|
807
|
+
.claude/skills/ # skills/ への symlink
|
|
808
|
+
.codex/skills/ # skills/ への symlink
|
|
799
809
|
dist/
|
|
800
810
|
reports/
|
|
801
811
|
```
|
package/README.md
CHANGED
|
@@ -49,7 +49,7 @@ npm install --save-dev phasegate
|
|
|
49
49
|
npx phasegate init --name my-project
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
-
This deploys 28 skills
|
|
52
|
+
This deploys 28 skills to `skills/`, creates agent-specific links such as `.claude/skills` or `.codex/skills`, installs design principles docs (`docs/principles/*.md`, `docs/folder_management_rules.md`), and generates `phasegate.config.json`.
|
|
53
53
|
|
|
54
54
|
Optional: add `--with-husky` to also install a `.husky/pre-commit` hook that runs L2 validators.
|
|
55
55
|
|
|
@@ -155,7 +155,9 @@ Skills cover the full **AIDLC (AI-Driven Development Life Cycle)**, enforcing ph
|
|
|
155
155
|
|
|
156
156
|
### Presets
|
|
157
157
|
|
|
158
|
-
|
|
158
|
+
Phasegate has two orthogonal preset families — defense and architecture. See the note at the end of this section for naming conventions.
|
|
159
|
+
|
|
160
|
+
**Defense preset** (`project.preset`) -- overall layer strictness:
|
|
159
161
|
|
|
160
162
|
| Preset | Layers | Coverage | Use Case |
|
|
161
163
|
|---|---|---|---|
|
|
@@ -163,6 +165,22 @@ Skills cover the full **AIDLC (AI-Driven Development Life Cycle)**, enforcing ph
|
|
|
163
165
|
| `standard` | L1 - L3 | 90% | Production development (default) |
|
|
164
166
|
| `strict` | L1 - L4 | 95% | Mission-critical systems |
|
|
165
167
|
|
|
168
|
+
**Architecture preset** (`architecture.preset`) -- layer names and dependency directions used by L1-003 / L1-004:
|
|
169
|
+
|
|
170
|
+
| Preset | Layers | Use Case |
|
|
171
|
+
|---|---|---|
|
|
172
|
+
| `clean` (default) | `domain / application / infrastructure / presentation` | Clean Architecture / AIDLC full harness |
|
|
173
|
+
| `strict-ddd` | `clean` layers + stricter cycle detection | DDD-focused new projects |
|
|
174
|
+
| `onion` | `domain / application / interface` | Onion Architecture |
|
|
175
|
+
| `hexagonal` | `core / ports / adapters` | Hexagonal / Ports-and-Adapters |
|
|
176
|
+
| `layered` | `presentation / business / data` | Classic 3-tier layered |
|
|
177
|
+
| `flat` | No layers | Small scripts / CLI tools / retrofit start |
|
|
178
|
+
| `custom` | User-defined `layers` + `allowedDependencies` | Any other shape |
|
|
179
|
+
|
|
180
|
+
For selection guidance and config examples see [Preset Selection Guide](docs/guide/preset-selection.md).
|
|
181
|
+
|
|
182
|
+
> **Naming convention**: "defense preset" refers to CI strictness (`strict` / `standard` / `minimal`). "architecture preset" refers to layer topology (`clean` / `onion` / `hexagonal` / `layered` / `flat` / `strict-ddd` / `custom`). They are set independently.
|
|
183
|
+
|
|
166
184
|
`phaseDependencies.preset` -- phase-gate shape and storyReflection defaults (independent of `project.preset`):
|
|
167
185
|
|
|
168
186
|
| Preset | Phase 3 gates | storyReflection default | Use Case |
|
|
@@ -274,15 +292,17 @@ Phasegate also integrates with [OpenAI Codex CLI](https://developers.openai.com/
|
|
|
274
292
|
### Quick setup
|
|
275
293
|
|
|
276
294
|
```bash
|
|
277
|
-
# 1. Initialize
|
|
295
|
+
# 1. Initialize the project for Codex (creates project-local files such as .codex/hooks.json and .codex/skills)
|
|
278
296
|
npx phasegate init --name my-project --agent codex --with-husky
|
|
279
297
|
|
|
280
|
-
# 2. Enable Codex
|
|
298
|
+
# 2. Enable the Codex CLI feature flag manually on your machine
|
|
281
299
|
codex features enable codex_hooks
|
|
282
300
|
```
|
|
283
301
|
|
|
284
302
|
For dual-agent projects (Claude + Codex), use `--agent both`.
|
|
285
303
|
|
|
304
|
+
`init` sets up files inside the project. The Codex CLI user-level setting (`codex_hooks`) remains an explicit manual step.
|
|
305
|
+
|
|
286
306
|
### Coverage and known limitation
|
|
287
307
|
|
|
288
308
|
Because Codex's native `apply_patch` tool is routed through an internal `ApplyPatchHandler` and does not emit hook events ([openai/codex#16732](https://github.com/openai/codex/issues/16732)), pre-edit hard-block coverage is limited to Bash-based writes. Native `apply_patch` violations are caught at commit time by the pre-commit layer.
|
|
@@ -319,6 +339,8 @@ npx phasegate <command> [options]
|
|
|
319
339
|
| `hook <pre-tool-use\|post-tool-use\|stop>` | Run a Claude Code hook (reads JSON from stdin) |
|
|
320
340
|
| `pre-commit` | Run L2 pre-commit validators on staged files |
|
|
321
341
|
| `delegate-sonnet [...args]` | Delegate task to Sonnet 4.6 (transparent wrapper) |
|
|
342
|
+
| `migrate work-items --dry-run` / `--apply` | Migrate legacy `ISSUE-XXX` / `H{NN}-{NN}` directories under `docs/inception/` to the unified `WI-XXX` layout (frontmatter `type` / `legacy_id` / `affects` injected). Sequential allocator skips numbers already used by existing WIs. See [CLI Reference -- Work Item Migration](docs/guide/cli-reference.md#work-item-migration). |
|
|
343
|
+
| `migrate --schema v3` | Upgrade `phasegate.config.json` to v3 schema by adding the `architecture` key (idempotent). |
|
|
322
344
|
|
|
323
345
|
See the [Japanese README](README.ja.md) for the complete CLI reference.
|
|
324
346
|
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# ADR-015: アーキテクチャスタイルを preset 化し、PhaseGate を複数アーキに対応させる
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
|
|
5
|
+
Accepted — 2026-04-23
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
PhaseGate は「AI 非依存の品質防御ツールキット」を標榜するが、L1 層(Biome AST rule)の依存方向検査は Clean Architecture 4 層(`domain / application / infrastructure / presentation`)を前提として**ハードコード**されている。
|
|
10
|
+
|
|
11
|
+
### ハードコードの実体(ISSUE-014 発見契機)
|
|
12
|
+
|
|
13
|
+
**`scripts/harness/biome-ast-engine/domain/value-objects/layer-name.ts:6`**:
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
export type LayerNameValue = 'domain' | 'application' | 'infrastructure' | 'presentation';
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**同ファイル:15-20**(ADR-014 適用後):
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
const ALLOWED_DEPENDENCIES = {
|
|
23
|
+
domain: ['domain'],
|
|
24
|
+
application: ['application', 'domain'],
|
|
25
|
+
infrastructure: ['infrastructure', 'application', 'domain'],
|
|
26
|
+
presentation: ['presentation', 'application', 'domain'],
|
|
27
|
+
};
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
層名・依存方向のいずれもコード内固定で、`phasegate.config.json` から変更する手段がない。
|
|
31
|
+
|
|
32
|
+
### 影響範囲
|
|
33
|
+
|
|
34
|
+
| 導入対象 PJ | 発生する摩擦 |
|
|
35
|
+
|---|---|
|
|
36
|
+
| Onion(`domain / application / interface`) | `@layer interface` で `InvalidLayerNameError` |
|
|
37
|
+
| Hexagonal(`core / ports / adapters`) | 層名が全て未知、L1-001/L1-002 全件違反 |
|
|
38
|
+
| MVC / N-tier(`controller / service / repository`) | L1-003/L1-004 が無意味に発火 |
|
|
39
|
+
| Flat スクリプト・CLI ツール | `@layer` 強制が過剰 |
|
|
40
|
+
| 既存 PJ への retrofit(ISSUE-007) | baseline で grandfather できるが、新規ファイルに Clean 形状を強制 |
|
|
41
|
+
|
|
42
|
+
「AI 非依存」という標語は達成済みだが、「Clean Architecture 前提」という暗黙制約が残存しており、PhaseGate の採用範囲を狭めている。
|
|
43
|
+
|
|
44
|
+
### 関連する先行決定
|
|
45
|
+
|
|
46
|
+
- **ADR-005** — Hexagonal Architecture の採用。PhaseGate 自身の構造的選択としては維持
|
|
47
|
+
- **ADR-014** — `presentation → domain` を Robert C. Martin 版 Clean Architecture 解釈で許容。本 ADR と整合(`clean` preset の既定挙動として組み込み)
|
|
48
|
+
|
|
49
|
+
## Decision
|
|
50
|
+
|
|
51
|
+
`phasegate.config.json` に `architecture` セクションを新設し、**アーキテクチャスタイルを preset ベースで選択可能**にする。
|
|
52
|
+
|
|
53
|
+
### schema v3 概要
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"architecture": {
|
|
58
|
+
"preset": "clean",
|
|
59
|
+
"layers": ["domain", "application", "infrastructure", "presentation"],
|
|
60
|
+
"allowedDependencies": {
|
|
61
|
+
"domain": ["domain"],
|
|
62
|
+
"application": ["application", "domain"],
|
|
63
|
+
"infrastructure": ["infrastructure", "application", "domain"],
|
|
64
|
+
"presentation": ["presentation", "application", "domain"]
|
|
65
|
+
},
|
|
66
|
+
"metadataTags": {
|
|
67
|
+
"layer": "@layer",
|
|
68
|
+
"unit": "@unit"
|
|
69
|
+
},
|
|
70
|
+
"layerDetection": {
|
|
71
|
+
"byPath": true,
|
|
72
|
+
"byTag": true
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
`preset` を指定すれば層構成と依存規則がプリセットから注入され、`custom` 選択時のみ `layers` / `allowedDependencies` のユーザー定義が必須となる。
|
|
79
|
+
|
|
80
|
+
詳細なスキーマ案と各 preset の層・依存定義は [`docs/inception/issues/ISSUE-014/wave1_schema_proposal.md`](../inception/issues/ISSUE-014/wave1_schema_proposal.md) を参照。
|
|
81
|
+
|
|
82
|
+
### 採用する preset(7 種)
|
|
83
|
+
|
|
84
|
+
| `preset` | 層構成 | 想定用途 |
|
|
85
|
+
|---|---|---|
|
|
86
|
+
| `clean`(default) | domain / application / infrastructure / presentation | 大規模 BE、DDD 採用 PJ(PhaseGate 自身の構造、ADR-014 準拠) |
|
|
87
|
+
| `strict-ddd` | 同上(依存ルールのみ厳格) | Presentation → Domain 直接依存を禁じたい PJ(ADR-014 opt-out) |
|
|
88
|
+
| `onion` | domain / application / interface | Onion Architecture PJ |
|
|
89
|
+
| `hexagonal` | core / ports / adapters | Ports & Adapters 採用 PJ |
|
|
90
|
+
| `layered` | controller / service / repository | MVC / N-tier PJ |
|
|
91
|
+
| `flat` | (層なし) | 小規模スクリプト、CLI ツール、プロトタイプ |
|
|
92
|
+
| `custom` | ユーザー定義 | 独自アーキ |
|
|
93
|
+
|
|
94
|
+
### `project.preset` との関係(直交)
|
|
95
|
+
|
|
96
|
+
既存 schema v2 には `project.preset: "minimal" | "standard" | "strict"` が存在するが、本 ADR で追加する `architecture.preset` とは**完全に直交**する概念である:
|
|
97
|
+
|
|
98
|
+
| 既存 `project.preset` | 新設 `architecture.preset` |
|
|
99
|
+
|---|---|
|
|
100
|
+
| L0〜L4 レイヤー**各防御段**の有効化プリセット(どの validator を使うか) | 依存方向検査の**アーキスタイル**プリセット(どの層構成を採るか) |
|
|
101
|
+
| 例: `strict` = L0-L4 全有効 | 例: `clean` = 4 層 Clean Architecture |
|
|
102
|
+
|
|
103
|
+
両者は独立に選択可能で、例えば `project.preset: "minimal"` + `architecture.preset: "hexagonal"` の組み合わせは有効。混同を避けるため、ドキュメント・CLI メッセージでは「防御プリセット / アーキプリセット」と区別して呼称する方針とする(Wave 6 のガイドで徹底)。
|
|
104
|
+
|
|
105
|
+
### ADR-005(Hexagonal 採用)との関係
|
|
106
|
+
|
|
107
|
+
ADR-005 では「PhaseGate は Hexagonal Architecture を採用する」と記録したが、実際のコードは `domain / application / infrastructure / presentation` の 4 層構成で、これは Clean Architecture の一般的な命名。**本 ADR は ADR-005 を否定しない**:Hexagonal の「core を外部詳細から隔離する」哲学は 4 層構成でも成立し、PhaseGate の `domain` は Hexagonal の `core` に相当する。preset 名としては命名が近い `clean` を選ぶことで、ADR-005 の哲学を維持しつつ preset カテゴリにフィットさせる。外部 PJ が真に 3 層 Hexagonal(`core / ports / adapters`)で記述したい場合は `hexagonal` preset を選べる。
|
|
108
|
+
|
|
109
|
+
### preset + 明示 layers 併記時の解決規則
|
|
110
|
+
|
|
111
|
+
- **`preset: "custom"` 以外 + 明示 `layers` / `allowedDependencies`**: **ユーザー明示値が preset 既定を override** する(partial override も許容)。`preset` は「出発点」として扱われ、明示フィールドで上書きできるが、整合性は引き続き schema v3 の semantic validation で検査される
|
|
112
|
+
- **`preset: "custom"`**: `layers` と `allowedDependencies` は必須入力。schema validation で required として強制
|
|
113
|
+
|
|
114
|
+
### ADR-014 暗黙デフォルト変更との連続性
|
|
115
|
+
|
|
116
|
+
v0.86.0(ADR-014 適用)以降、`ALLOWED_DEPENDENCIES.presentation` に `'domain'` が追加され、既定挙動として `presentation → domain` が許容化された。本 ADR はこの挙動を `clean` preset の既定として**そのまま引き継ぐ**。v0.85.0 以前の厳格 DDD 挙動を継続したい導入 PJ は、v0.92.0 以降明示的に `architecture.preset: "strict-ddd"` を指定する必要がある点を Wave 6 ガイドで警告する。
|
|
117
|
+
|
|
118
|
+
### `flat` preset の挙動
|
|
119
|
+
|
|
120
|
+
層関連 L1 rule を自動で無効化し、汎用 rule のみ残す:
|
|
121
|
+
|
|
122
|
+
| rule | flat での挙動 |
|
|
123
|
+
|---|---|
|
|
124
|
+
| L1-001 require-unit-comment | 自動無効化 |
|
|
125
|
+
| L1-002 require-layer-comment | 自動無効化 |
|
|
126
|
+
| L1-003 no-layer-violation | 自動無効化 |
|
|
127
|
+
| L1-004 enforce-folder-structure | 自動無効化 |
|
|
128
|
+
| L1-005 no-any-abuse | 有効維持 |
|
|
129
|
+
| L1-006 no-ghost-file | 有効維持 |
|
|
130
|
+
| L1-007 no-comment-flood | 有効維持 |
|
|
131
|
+
| L1-008 no-code-duplication | 有効維持 |
|
|
132
|
+
|
|
133
|
+
### メタデータタグの可変化
|
|
134
|
+
|
|
135
|
+
`@layer` / `@unit` というタグ名自体も `metadataTags` で差し替え可能とする。これにより、社内規約で `@tier` / `@module` 等を使う PJ にも対応できる。
|
|
136
|
+
|
|
137
|
+
### 下位互換戦略
|
|
138
|
+
|
|
139
|
+
- **schema v2 → v3 識別**: 設定ファイルに明示的な `$schemaVersion` フィールドは**追加しない**(既存 config の無害変更を避ける)。代わりに**構造検出**を採用し、`architecture` キーが存在すれば v3 ロード、存在しなければ v2 互換モード(`preset: "clean"` を暗黙適用)とする。Wave 3 で loader に `detectSchemaVersion()` を実装
|
|
140
|
+
- **自動マイグレーション**: `architecture` セクション未指定時は `preset: "clean"` 相当のデフォルトが自動適用される(挙動不変)。ただし v0.86.0 未満から upgrade する user は ADR-014 の既定変更で暗黙に presentation→domain が許容されるため、明示的な変更通知を CHANGELOG / Wave 6 ガイドで提示
|
|
141
|
+
- **Phase 毎 rollout**: Wave 2〜6 で段階的に `LayerName` / `LayerBoundary` / schema validator を移行。各 Wave 独立にリリース可能
|
|
142
|
+
- **PhaseGate レポ自身**: `preset: "clean"` を明示設定(ドッグフード)。既存の Hexagonal 哲学(ADR-005)は `domain` 層を `core` とみなすことで整合
|
|
143
|
+
|
|
144
|
+
## Consequences
|
|
145
|
+
|
|
146
|
+
### ポジティブ
|
|
147
|
+
|
|
148
|
+
- Onion / Hexagonal / MVC / 小規模スクリプトなど、Clean 以外のアーキを採用する PJ への導入障壁が消滅
|
|
149
|
+
- retrofit-adoption(ISSUE-007)の延長で「既存アーキを尊重しつつ PhaseGate を被せる」ユースケースが成立
|
|
150
|
+
- メタデータタグ可変化で社内規約と衝突せず導入可能
|
|
151
|
+
- ADR-014(`presentation → domain` 許容)の厳格派向け opt-out が `strict-ddd` preset として提供可能になる(Philosophical tension の解消)
|
|
152
|
+
|
|
153
|
+
### ネガティブ / トレードオフ
|
|
154
|
+
|
|
155
|
+
- **実装負荷**: `LayerName` / `LayerBoundary` / `biome-ast-engine` 配下の全 rule が config 注入を受けるため、影響範囲は広い(推定 ~4d、Wave 分割で管理)
|
|
156
|
+
- **preset の選定判断コスト**: 導入 PJ 側が「どの preset を選ぶか」を初回に判断する必要がある
|
|
157
|
+
- **緩和策**: README / retrofit-adoption.md に preset 選定フローチャートを追加(Wave 6)
|
|
158
|
+
- **フレームワーク固有構造(Django apps/, Rails MVC 等)の自動検出は非対応**: 層名とパス対応は `architecture.layers` で宣言ベース
|
|
159
|
+
- **判断**: 自動検出は phasegate の「明示的な品質防御」哲学と整合しない。宣言を強制する方が誤検出が少ない
|
|
160
|
+
|
|
161
|
+
### スコープ外(本 ADR で扱わない)
|
|
162
|
+
|
|
163
|
+
- フレームワーク固有の自動層推論(Django / Rails / NestJS 等)
|
|
164
|
+
- ランタイム強制(依存方向違反の実行時 throw)— lint 時のみ
|
|
165
|
+
- 既存コードの層名リネーム自動変換ツール(`@layer domain` → `@tier core` 等)
|
|
166
|
+
- DDD 戦術パターン(Aggregate / Repository / UseCase 命名規約)の preset 化 — 別 issue
|
|
167
|
+
|
|
168
|
+
## Migration
|
|
169
|
+
|
|
170
|
+
schema v3 移行の詳細は Wave 2 で `config-foundation` の migration script として実装する。本 ADR 時点での移行方針:
|
|
171
|
+
|
|
172
|
+
1. `architecture` セクション未指定 → `preset: "clean"` を暗黙適用(既存挙動維持)
|
|
173
|
+
2. `architecture.preset` のみ指定 → preset から layers / allowedDependencies を展開
|
|
174
|
+
3. `architecture.preset: "custom"` → `layers` と `allowedDependencies` を必須入力として validate
|
|
175
|
+
|
|
176
|
+
## 関連
|
|
177
|
+
|
|
178
|
+
- **ADR-005** — Hexagonal Architecture 採用(PhaseGate 自身の構造として維持、他 PJ には preset 化で選択肢提供)
|
|
179
|
+
- **ADR-014** — `presentation → domain` 許容。`clean` preset の既定挙動として組み込み、`strict-ddd` で opt-out 提供
|
|
180
|
+
- **ISSUE-014** — 本 ADR を駆動する issue。Wave 分割実装(Wave 1: 本 ADR + schema 設計, Wave 2: LayerName 注入, Wave 3: schema v3 実装, Wave 4: dogfood, Wave 5: custom/ドキュメント)
|
|
181
|
+
- **ISSUE-007 retrofit-adoption** — 既存 PJ への phasegate 導入。本 ADR により Clean 以外でも受け入れ可能になり、retrofit の適用範囲が拡大
|
|
182
|
+
- **`scripts/harness/biome-ast-engine/domain/value-objects/layer-name.ts:6,15-20`** — 現状のハードコード実体、Wave 2 の改修対象
|
|
183
|
+
- **`scripts/harness/config-foundation/infrastructure/schemas/harness-config-v2.schema.json`** — schema v3 の拡張対象、Wave 3 で改修
|