phasegate 0.32.0 → 0.44.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 +87 -1
- package/README.ja.md +498 -660
- package/README.md +8 -11
- package/docs/folder_management_rules.md +251 -0
- package/docs/guide/cli-reference.md +15 -0
- package/package.json +3 -1
- package/scripts/delegate-sonnet.sh +105 -0
- package/scripts/harness/ci-governance/application/usecases/generate-ci-template-usecase.ts +6 -2
- package/scripts/harness/harness-api/infrastructure/adapters/validator-system-execution-adapter.ts +11 -2
- package/scripts/harness/integrations/pre-commit.ts +64 -130
- package/scripts/harness/main.ts +134 -9
- package/scripts/harness/phase2-extensions/infrastructure/adapters/git-log-document-age-adapter.ts +7 -1
- package/scripts/harness/quick-mode/infrastructure/adapters/git-diff-changed-files-adapter.ts +20 -1
- package/scripts/harness/regression-suite/composition-root.ts +4 -1
- package/scripts/harness/setup/skill-deployer.ts +99 -0
- package/scripts/harness/validator-system/application/dto/run-full-validation-input.ts +5 -0
- package/scripts/harness/validator-system/application/use-cases/run-full-validation-usecase.ts +40 -12
- package/scripts/harness/validator-system/composition-root.ts +2 -0
- package/scripts/harness/validator-system/domain/services/l4/drift-detection-service.ts +29 -2
- package/scripts/harness/validator-system/infrastructure/adapters/biome-ast-source-code-analyzer-adapter.ts +17 -0
- package/scripts/harness/validator-system/infrastructure/adapters/markdown-design-document-adapter.ts +65 -5
- package/scripts/harness/validator-system/presentation/handlers/run-validators-handler.ts +9 -0
- package/skills/environment-designer/SKILL.md +1 -1
- package/skills/implementation-planner/SKILL.md +1 -1
- package/skills/it-test-designer/SKILL.md +3 -3
- package/skills/it-test-logic-designer/SKILL.md +2 -2
- package/skills/mock-designer/SKILL.md +1 -1
- package/skills/scenario-test-designer/SKILL.md +3 -3
- package/skills/scenario-test-logic-designer/SKILL.md +2 -2
- package/skills/story-mapper/SKILL.md +1 -1
- package/skills/story-writer/SKILL.md +1 -1
- package/skills/unit-designer/SKILL.md +1 -1
- package/skills/unit-test-designer/SKILL.md +3 -3
- package/skills/unit-test-logic-designer/SKILL.md +2 -2
- package/templates/.claude/settings.json +3 -3
- package/templates/.husky/pre-commit +1 -1
- package/templates/phasegate.config.json +0 -30
package/scripts/harness/validator-system/application/use-cases/run-full-validation-usecase.ts
CHANGED
|
@@ -32,22 +32,50 @@ export class RunFullValidationUseCase {
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
async execute(input: RunFullValidationInput): Promise<AggregatedValidationReport> {
|
|
35
|
+
// ISSUE-005 P1-4: targetLayers で絞り込み。未指定時は従来の includeL4 挙動を維持。
|
|
35
36
|
const includeL4 = input.includeL4 !== false;
|
|
37
|
+
const defaultLayers: readonly ('L2' | 'L3' | 'L4')[] = includeL4
|
|
38
|
+
? ['L2', 'L3', 'L4']
|
|
39
|
+
: ['L2', 'L3'];
|
|
40
|
+
const effectiveLayers = input.targetLayers ?? defaultLayers;
|
|
41
|
+
const runL2 = effectiveLayers.includes('L2');
|
|
42
|
+
const runL3 = effectiveLayers.includes('L3');
|
|
43
|
+
const runL4 = effectiveLayers.includes('L4');
|
|
36
44
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
45
|
+
type Result = {
|
|
46
|
+
validatorId: string;
|
|
47
|
+
passed: boolean;
|
|
48
|
+
errors: readonly {
|
|
49
|
+
code: string;
|
|
50
|
+
severity: string;
|
|
51
|
+
message: string;
|
|
52
|
+
suggestion: string;
|
|
53
|
+
[key: string]: unknown;
|
|
54
|
+
}[];
|
|
55
|
+
durationMs: number;
|
|
56
|
+
skipped?: boolean;
|
|
57
|
+
};
|
|
42
58
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
59
|
+
let l2Results: readonly Result[] = [];
|
|
60
|
+
if (runL2) {
|
|
61
|
+
l2Results = await this.l2UseCase.execute({
|
|
62
|
+
targetPaths: input.targetPaths,
|
|
63
|
+
unitName: input.unitName,
|
|
64
|
+
currentPhase: input.currentPhase,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
let l3Results: readonly Result[] = [];
|
|
69
|
+
if (runL3) {
|
|
70
|
+
l3Results = await this.l3UseCase.execute({
|
|
71
|
+
targetPaths: input.targetPaths,
|
|
72
|
+
coverageReportPath: input.coverageReportPath,
|
|
73
|
+
requirementMatrixPath: input.requirementMatrixPath,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
48
76
|
|
|
49
|
-
let l4Results: readonly
|
|
50
|
-
if (
|
|
77
|
+
let l4Results: readonly Result[] = [];
|
|
78
|
+
if (runL4) {
|
|
51
79
|
l4Results = await this.l4UseCase.execute({
|
|
52
80
|
targetUnits: input.targetUnits,
|
|
53
81
|
});
|
|
@@ -100,6 +100,7 @@ export interface ValidatorSystemModule {
|
|
|
100
100
|
runQuickModeUseCase: RunQuickModeUseCase;
|
|
101
101
|
aggregateValidationResultsUseCase: AggregateValidationResultsUseCase;
|
|
102
102
|
runFullValidationUseCase: RunFullValidationUseCase;
|
|
103
|
+
driftDetectionService: DriftDetectionService;
|
|
103
104
|
handlers: {
|
|
104
105
|
runValidators: RunValidatorsHandler;
|
|
105
106
|
runQuickMode: RunQuickModeHandler;
|
|
@@ -229,6 +230,7 @@ export function createValidatorSystemModule(config?: object): ValidatorSystemMod
|
|
|
229
230
|
runQuickModeUseCase,
|
|
230
231
|
aggregateValidationResultsUseCase,
|
|
231
232
|
runFullValidationUseCase,
|
|
233
|
+
driftDetectionService,
|
|
232
234
|
handlers,
|
|
233
235
|
};
|
|
234
236
|
}
|
|
@@ -9,10 +9,20 @@ import { DriftReport } from '../../value-objects/drift-report.js';
|
|
|
9
9
|
|
|
10
10
|
export interface DriftDetectionDesignDocumentPort {
|
|
11
11
|
getElements(targetUnits?: readonly string[]): Promise<string[]>;
|
|
12
|
+
/**
|
|
13
|
+
* ISSUE-005 P3-9: element → unit 名のマップ。
|
|
14
|
+
* 実装されていれば DriftReport.unitName の解決に使われる (fallback: 'unknown')。
|
|
15
|
+
*/
|
|
16
|
+
getElementUnitMap?(targetUnits?: readonly string[]): Promise<Record<string, string>>;
|
|
12
17
|
}
|
|
13
18
|
|
|
14
19
|
export interface DriftDetectionSourceCodeAnalyzerPort {
|
|
15
20
|
getElements(targetUnits?: readonly string[]): Promise<string[]>;
|
|
21
|
+
/**
|
|
22
|
+
* ISSUE-005 P3-9: element → unit 名のマップ。
|
|
23
|
+
* 実装されていれば DriftReport.unitName の解決に使われる (fallback: 'unknown')。
|
|
24
|
+
*/
|
|
25
|
+
getElementUnitMap?(targetUnits?: readonly string[]): Promise<Record<string, string>>;
|
|
16
26
|
}
|
|
17
27
|
|
|
18
28
|
export interface DriftDetectionServiceDeps {
|
|
@@ -33,6 +43,23 @@ export class DriftDetectionService {
|
|
|
33
43
|
const designElements = await this.designDocumentPort.getElements(targetUnits);
|
|
34
44
|
const codeElements = await this.sourceCodeAnalyzerPort.getElements(targetUnits);
|
|
35
45
|
|
|
46
|
+
// ISSUE-005 P3-9: element → unit のマップを取得し、DriftReport.unitName の解決に使う
|
|
47
|
+
const designUnitMap = this.designDocumentPort.getElementUnitMap
|
|
48
|
+
? await this.designDocumentPort.getElementUnitMap(targetUnits)
|
|
49
|
+
: {};
|
|
50
|
+
const codeUnitMap = this.sourceCodeAnalyzerPort.getElementUnitMap
|
|
51
|
+
? await this.sourceCodeAnalyzerPort.getElementUnitMap(targetUnits)
|
|
52
|
+
: {};
|
|
53
|
+
|
|
54
|
+
const resolveUnit = (element: string): string => {
|
|
55
|
+
return (
|
|
56
|
+
designUnitMap[element] ??
|
|
57
|
+
codeUnitMap[element] ??
|
|
58
|
+
targetUnits?.[0] ??
|
|
59
|
+
'unknown'
|
|
60
|
+
);
|
|
61
|
+
};
|
|
62
|
+
|
|
36
63
|
const designSet = new Set(designElements);
|
|
37
64
|
const codeSet = new Set(codeElements);
|
|
38
65
|
|
|
@@ -44,7 +71,7 @@ export class DriftDetectionService {
|
|
|
44
71
|
reports.push(
|
|
45
72
|
DriftReport.create({
|
|
46
73
|
direction: 'design→code',
|
|
47
|
-
unitName: (
|
|
74
|
+
unitName: resolveUnit(element),
|
|
48
75
|
element,
|
|
49
76
|
description: `設計に存在するがコードに存在しない: ${element}`,
|
|
50
77
|
recommendation: `${element} をコードに実装してください`,
|
|
@@ -59,7 +86,7 @@ export class DriftDetectionService {
|
|
|
59
86
|
reports.push(
|
|
60
87
|
DriftReport.create({
|
|
61
88
|
direction: 'code→design',
|
|
62
|
-
unitName: (
|
|
89
|
+
unitName: resolveUnit(element),
|
|
63
90
|
element,
|
|
64
91
|
description: `コードに存在するが設計に存在しない: ${element}`,
|
|
65
92
|
recommendation: `${element} を設計文書に追記するか、コードから削除してください`,
|
|
@@ -44,6 +44,23 @@ export class BiomeAstSourceCodeAnalyzerAdapter implements SourceCodeAnalyzerPort
|
|
|
44
44
|
const results = await this.analyzeExports(targetUnits);
|
|
45
45
|
return results.flatMap((result) => result.exports.map((entry) => entry.name));
|
|
46
46
|
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* ISSUE-005 P3-9: element 名から unit 名を引けるマップを返す。
|
|
50
|
+
* 同名 export が複数 unit に存在する場合は最初に見つかった unit を採用する。
|
|
51
|
+
*/
|
|
52
|
+
async getElementUnitMap(targetUnits?: readonly string[]): Promise<Record<string, string>> {
|
|
53
|
+
const results = await this.analyzeExports(targetUnits);
|
|
54
|
+
const map: Record<string, string> = {};
|
|
55
|
+
for (const result of results) {
|
|
56
|
+
for (const entry of result.exports) {
|
|
57
|
+
if (!(entry.name in map)) {
|
|
58
|
+
map[entry.name] = result.unitName;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return map;
|
|
63
|
+
}
|
|
47
64
|
}
|
|
48
65
|
|
|
49
66
|
type ExportType = SourceAnalysisResult['exports'][number]['type'];
|
package/scripts/harness/validator-system/infrastructure/adapters/markdown-design-document-adapter.ts
CHANGED
|
@@ -8,9 +8,55 @@ import type { DesignDocumentPort, StructuredDesignDoc } from '../../domain/ports
|
|
|
8
8
|
import { readFile, readdir } from 'node:fs/promises';
|
|
9
9
|
import { join } from 'node:path';
|
|
10
10
|
|
|
11
|
-
const SECTION_PATTERN = /^#{2,3}\s+(.+)/gm;
|
|
12
11
|
const ADR_PATTERN = /ADR-\d{3}/g;
|
|
13
12
|
|
|
13
|
+
// ISSUE-005 P3-8: メタ見出し / 議論用セクションを drift 対象から除外するマーカー。
|
|
14
|
+
// 見出し行の直後 (同一行末 or 次の非空行) に置かれたコメントを拾う。
|
|
15
|
+
const SKIP_MARKER = /<!--\s*@drift-check\s*:\s*skip\s*-->/i;
|
|
16
|
+
|
|
17
|
+
// 見出し文字列のうち、デフォルトで drift 対象から外す既知のメタパターン。
|
|
18
|
+
// Unit 設計ドキュメントで頻出する「議論用」「自己評価」系セクション。
|
|
19
|
+
const DEFAULT_META_HEADING_PATTERNS = [
|
|
20
|
+
/engineering[- ]perspective/i,
|
|
21
|
+
/自己評価/,
|
|
22
|
+
/レビュー(観点|コメント)/,
|
|
23
|
+
/議論/,
|
|
24
|
+
/TODO|未決事項|Open\s+Questions?/i,
|
|
25
|
+
/変更履歴|Change\s*Log/i,
|
|
26
|
+
/参考文献|References?/i,
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
function isMetaHeading(name: string): boolean {
|
|
30
|
+
return DEFAULT_META_HEADING_PATTERNS.some((p) => p.test(name));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function extractConceptNames(markdown: string): string[] {
|
|
34
|
+
const lines = markdown.split(/\r?\n/);
|
|
35
|
+
const headings: string[] = [];
|
|
36
|
+
const headingRegex = /^(#{2,3})\s+(.+?)\s*$/;
|
|
37
|
+
for (let i = 0; i < lines.length; i++) {
|
|
38
|
+
const m = headingRegex.exec(lines[i]);
|
|
39
|
+
if (!m) continue;
|
|
40
|
+
const name = m[2].trim();
|
|
41
|
+
// 見出し行自体にスキップマーカーが付いている
|
|
42
|
+
if (SKIP_MARKER.test(lines[i])) continue;
|
|
43
|
+
// 次の非空行にスキップマーカーが付いている
|
|
44
|
+
// ただし、次行が新しい見出しの場合はそれ自身の注釈なので無視する
|
|
45
|
+
let j = i + 1;
|
|
46
|
+
while (j < lines.length && lines[j].trim() === '') j++;
|
|
47
|
+
if (
|
|
48
|
+
j < lines.length &&
|
|
49
|
+
!headingRegex.test(lines[j]) &&
|
|
50
|
+
SKIP_MARKER.test(lines[j])
|
|
51
|
+
) continue;
|
|
52
|
+
// 既知のメタ見出しは暗黙的にスキップ
|
|
53
|
+
if (isMetaHeading(name)) continue;
|
|
54
|
+
// 名前から末尾のスキップマーカーを落とす (念のため)
|
|
55
|
+
headings.push(name.replace(SKIP_MARKER, '').trim());
|
|
56
|
+
}
|
|
57
|
+
return headings;
|
|
58
|
+
}
|
|
59
|
+
|
|
14
60
|
export class MarkdownDesignDocumentAdapter implements DesignDocumentPort {
|
|
15
61
|
private readonly docsRoot: string;
|
|
16
62
|
private readonly cache = new Map<string, StructuredDesignDoc>();
|
|
@@ -38,10 +84,7 @@ export class MarkdownDesignDocumentAdapter implements DesignDocumentPort {
|
|
|
38
84
|
const doc: StructuredDesignDoc = {
|
|
39
85
|
unitName,
|
|
40
86
|
docPath,
|
|
41
|
-
concepts:
|
|
42
|
-
name: match[1].trim(),
|
|
43
|
-
type: 'class',
|
|
44
|
-
})),
|
|
87
|
+
concepts: extractConceptNames(markdown).map((name) => ({ name, type: 'class' })),
|
|
45
88
|
layerDependencies: [],
|
|
46
89
|
adrRefs: Array.from(new Set(markdown.match(ADR_PATTERN) ?? [])),
|
|
47
90
|
};
|
|
@@ -64,6 +107,23 @@ export class MarkdownDesignDocumentAdapter implements DesignDocumentPort {
|
|
|
64
107
|
return docs.flatMap((doc) => doc.concepts.map((concept) => concept.name));
|
|
65
108
|
}
|
|
66
109
|
|
|
110
|
+
/**
|
|
111
|
+
* ISSUE-005 P3-9: element 名から unit 名を引けるマップを返す。
|
|
112
|
+
* 同名 element が複数 unit に存在する場合は最初に見つかった unit を採用する。
|
|
113
|
+
*/
|
|
114
|
+
async getElementUnitMap(targetUnits?: readonly string[]): Promise<Record<string, string>> {
|
|
115
|
+
const docs = await this.loadDesignDocuments(targetUnits);
|
|
116
|
+
const map: Record<string, string> = {};
|
|
117
|
+
for (const doc of docs) {
|
|
118
|
+
for (const concept of doc.concepts) {
|
|
119
|
+
if (!(concept.name in map)) {
|
|
120
|
+
map[concept.name] = doc.unitName;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return map;
|
|
125
|
+
}
|
|
126
|
+
|
|
67
127
|
private async listUnitNames(): Promise<string[]> {
|
|
68
128
|
try {
|
|
69
129
|
const entries = await readdir(this.docsRoot, { withFileTypes: true });
|
|
@@ -110,12 +110,21 @@ export class RunValidatorsHandler {
|
|
|
110
110
|
return { output, exitCode: l1Report.overallPassed ? 0 : 1 };
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
+
// ISSUE-005 P1-4: args.layer を targetLayers にマップ
|
|
114
|
+
let targetLayers: readonly ('L2' | 'L3' | 'L4')[] | undefined;
|
|
115
|
+
if (args.layer === 'L2') targetLayers = ['L2'];
|
|
116
|
+
else if (args.layer === 'L3') targetLayers = ['L3'];
|
|
117
|
+
else if (args.layer === 'L4') targetLayers = ['L4'];
|
|
118
|
+
else if (args.layer === 'all') targetLayers = ['L2', 'L3', 'L4'];
|
|
119
|
+
// undefined → フィルタなし(従来挙動)
|
|
120
|
+
|
|
113
121
|
const report = await this.useCase.execute({
|
|
114
122
|
targetPaths: args.targetPaths ?? [],
|
|
115
123
|
unitName: args.unit ?? '',
|
|
116
124
|
currentPhase: args.phase ?? '',
|
|
117
125
|
includeL4: !args.noL4,
|
|
118
126
|
failOnWarning: args.failOnWarning,
|
|
127
|
+
targetLayers,
|
|
119
128
|
});
|
|
120
129
|
|
|
121
130
|
const format = args.format ?? 'human';
|
|
@@ -68,7 +68,7 @@ review: opus
|
|
|
68
68
|
|
|
69
69
|
**このスキルは3フェーズで実行する。**
|
|
70
70
|
- **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
|
|
71
|
-
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`
|
|
71
|
+
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
|
|
72
72
|
- **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
|
|
73
73
|
|
|
74
74
|
**Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
|
|
@@ -26,7 +26,7 @@ UnitドキュメントとConstructionのドメインモデル設計を元に、*
|
|
|
26
26
|
|
|
27
27
|
**このスキルは3フェーズで実行する。**
|
|
28
28
|
- **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
|
|
29
|
-
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`
|
|
29
|
+
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
|
|
30
30
|
- **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
|
|
31
31
|
|
|
32
32
|
**Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
|
|
@@ -18,7 +18,7 @@ review: opus
|
|
|
18
18
|
### 任意インプット(あれば参照)
|
|
19
19
|
- **ドメインモデル** — `docs/product/construction/{unit}/domain_model.md`
|
|
20
20
|
- **環境設計** — `docs/product/environment_contract.md`
|
|
21
|
-
- **テスト規約** — `docs/principles/
|
|
21
|
+
- **テスト規約** — `docs/principles/testing-rules.md`
|
|
22
22
|
- **既存ITテスト** — 既存パターンの参考
|
|
23
23
|
|
|
24
24
|
---
|
|
@@ -68,7 +68,7 @@ review: opus
|
|
|
68
68
|
|
|
69
69
|
**このスキルは3フェーズで実行する。**
|
|
70
70
|
- **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
|
|
71
|
-
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`
|
|
71
|
+
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
|
|
72
72
|
- **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
|
|
73
73
|
|
|
74
74
|
**Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
|
|
@@ -183,7 +183,7 @@ ITテスト設計のスコープ・テスト対象・不明点を整理し、人
|
|
|
183
183
|
- **テストコードは生成しない**(設計文書のみ)— 実装は `story-implementor` スキル(codex-delegator経由、またはメインセッションで直接実行)が行う
|
|
184
184
|
- 論理設計のすべてのユースケース・エンドポイントをカバーする
|
|
185
185
|
- TDDプロセスの「正しくRED」になる状態を目指す設計を行う
|
|
186
|
-
- テスト規約(`docs/principles/
|
|
186
|
+
- テスト規約(`docs/principles/testing-rules.md`)がある場合は遵守する
|
|
187
187
|
- AAAパターン(Arrange-Act-Assert)を前提としたケース設計を行う
|
|
188
188
|
|
|
189
189
|
---
|
|
@@ -38,7 +38,7 @@ TDD実装フェーズ
|
|
|
38
38
|
### 推奨インプット(あれば参照)
|
|
39
39
|
- **カバレッジレポート** — `docs/product/construction/{unit}/coverage_report.md`
|
|
40
40
|
- **既存ITテスト** — `backend/test/integration/**/*.test.ts`(パターン参考)
|
|
41
|
-
- **テスト規約** — `docs/principles/
|
|
41
|
+
- **テスト規約** — `docs/principles/testing-rules.md`
|
|
42
42
|
- **ストーリー固有論理設計** — `docs/inception/{unit}/{story_id}/logical_design.md`
|
|
43
43
|
|
|
44
44
|
---
|
|
@@ -71,7 +71,7 @@ TDD実装フェーズ
|
|
|
71
71
|
|
|
72
72
|
**このスキルは3フェーズで実行する。**
|
|
73
73
|
- **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
|
|
74
|
-
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`
|
|
74
|
+
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
|
|
75
75
|
- **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
|
|
76
76
|
|
|
77
77
|
**Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
|
|
@@ -64,7 +64,7 @@ review: opus
|
|
|
64
64
|
|
|
65
65
|
**このスキルは3フェーズで実行する。**
|
|
66
66
|
- **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
|
|
67
|
-
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`
|
|
67
|
+
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
|
|
68
68
|
- **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
|
|
69
69
|
|
|
70
70
|
**Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
|
|
@@ -17,7 +17,7 @@ review: opus
|
|
|
17
17
|
|
|
18
18
|
### 任意インプット(あれば参照)
|
|
19
19
|
- **UIモック** — `/mock/*.html`(画面フローの参考)
|
|
20
|
-
- **テスト規約** — `docs/principles/
|
|
20
|
+
- **テスト規約** — `docs/principles/testing-rules.md`
|
|
21
21
|
- **既存シナリオテスト** — 既存パターンの参考
|
|
22
22
|
|
|
23
23
|
---
|
|
@@ -95,7 +95,7 @@ story-implementor ← TDD実装
|
|
|
95
95
|
|
|
96
96
|
**このスキルは3フェーズで実行する。**
|
|
97
97
|
- **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
|
|
98
|
-
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`
|
|
98
|
+
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
|
|
99
99
|
- **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
|
|
100
100
|
|
|
101
101
|
**Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
|
|
@@ -200,7 +200,7 @@ story-implementor ← TDD実装
|
|
|
200
200
|
- **テストコードは生成しない**(設計文書のみ)— 実装は `story-implementor` スキル(codex-delegator経由、またはメインセッションで直接実行)が行う
|
|
201
201
|
- 受け入れ基準を漏れなくカバーする
|
|
202
202
|
- TDDプロセスの「正しくRED」になる状態を目指す設計を行う
|
|
203
|
-
- テスト規約(`docs/principles/
|
|
203
|
+
- テスト規約(`docs/principles/testing-rules.md`)がある場合は遵守する
|
|
204
204
|
- Playwrightの使用を前提とする(プロジェクト固有の要件がある場合は調整)
|
|
205
205
|
|
|
206
206
|
---
|
|
@@ -37,7 +37,7 @@ TDD実装フェーズ
|
|
|
37
37
|
- **カバレッジレポート** — `docs/product/construction/{unit}/coverage_report.md`
|
|
38
38
|
- **既存シナリオテスト** — `e2e/tests/**/*.spec.ts`(パターン参考)
|
|
39
39
|
- **UIUX設計** — `docs/inception/{unit}/{story_id}/uiux_design.md`
|
|
40
|
-
- **テスト規約** — `docs/principles/
|
|
40
|
+
- **テスト規約** — `docs/principles/testing-rules.md`
|
|
41
41
|
|
|
42
42
|
---
|
|
43
43
|
|
|
@@ -62,7 +62,7 @@ TDD実装フェーズ
|
|
|
62
62
|
## 3フェーズ実行ルール
|
|
63
63
|
|
|
64
64
|
- **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
|
|
65
|
-
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`
|
|
65
|
+
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
|
|
66
66
|
- **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
|
|
67
67
|
|
|
68
68
|
**Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
|
|
@@ -65,7 +65,7 @@ review: opus
|
|
|
65
65
|
|
|
66
66
|
**このスキルは3フェーズで実行する。**
|
|
67
67
|
- **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
|
|
68
|
-
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`
|
|
68
|
+
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
|
|
69
69
|
- **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
|
|
70
70
|
|
|
71
71
|
**Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
|
|
@@ -24,7 +24,7 @@ review: opus
|
|
|
24
24
|
|
|
25
25
|
**このスキルは3フェーズで実行する。**
|
|
26
26
|
- **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
|
|
27
|
-
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`
|
|
27
|
+
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
|
|
28
28
|
- **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
|
|
29
29
|
|
|
30
30
|
**Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
|
|
@@ -64,7 +64,7 @@ review: opus
|
|
|
64
64
|
|
|
65
65
|
**このスキルは3フェーズで実行する。**
|
|
66
66
|
- **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
|
|
67
|
-
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`
|
|
67
|
+
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
|
|
68
68
|
- **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
|
|
69
69
|
|
|
70
70
|
**Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
|
|
@@ -16,7 +16,7 @@ review: opus
|
|
|
16
16
|
|
|
17
17
|
### 任意インプット(あれば参照)
|
|
18
18
|
- **論理設計** — `docs/product/construction/{unit}/logical_design.md`
|
|
19
|
-
- **テスト規約** — `docs/principles/
|
|
19
|
+
- **テスト規約** — `docs/principles/testing-rules.md`
|
|
20
20
|
- **既存ユニットテスト** — 既存パターンの参考
|
|
21
21
|
|
|
22
22
|
---
|
|
@@ -77,7 +77,7 @@ story-implementor ← TDD実装
|
|
|
77
77
|
|
|
78
78
|
**このスキルは3フェーズで実行する。**
|
|
79
79
|
- **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
|
|
80
|
-
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`
|
|
80
|
+
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
|
|
81
81
|
- **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
|
|
82
82
|
|
|
83
83
|
**Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
|
|
@@ -182,7 +182,7 @@ story-implementor ← TDD実装
|
|
|
182
182
|
- **テストコードは生成しない**(設計文書のみ)— 実装は `story-implementor` スキル(codex-delegator経由、またはメインセッションで直接実行)が行う
|
|
183
183
|
- ドメインモデルの不変条件を漏れなくカバーする
|
|
184
184
|
- TDDプロセスの「正しくRED」になる状態を目指す設計を行う
|
|
185
|
-
- テスト規約(`docs/principles/
|
|
185
|
+
- テスト規約(`docs/principles/testing-rules.md`)がある場合は遵守する
|
|
186
186
|
- Vitest/Jest等のテストフレームワークを前提とする
|
|
187
187
|
|
|
188
188
|
---
|
|
@@ -36,7 +36,7 @@ TDD実装フェーズ
|
|
|
36
36
|
### 推奨インプット(あれば参照)
|
|
37
37
|
- **カバレッジレポート** — `docs/product/construction/{unit}/coverage_report.md`
|
|
38
38
|
- **既存ユニットテスト** — `backend/test/unit/**/*.test.ts`(パターン参考)
|
|
39
|
-
- **テスト規約** — `docs/principles/
|
|
39
|
+
- **テスト規約** — `docs/principles/testing-rules.md`
|
|
40
40
|
|
|
41
41
|
---
|
|
42
42
|
|
|
@@ -60,7 +60,7 @@ TDD実装フェーズ
|
|
|
60
60
|
## 3フェーズ実行ルール
|
|
61
61
|
|
|
62
62
|
- **Phase 1(計画)**: Opus がスコープ・方針・不明点を整理し、人間の承認を得る
|
|
63
|
-
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`
|
|
63
|
+
- **Phase 2(実行)**: Sonnet 4.6 に委任して成果物を生成する(`npx phasegate delegate-sonnet` 経由)
|
|
64
64
|
- **Phase 3(レビュー)**: Opus が成果物を検証し、問題があれば直接修正する
|
|
65
65
|
|
|
66
66
|
**Phase 1/2/3を同時に実行してはならない。モデルルーティングの詳細は `docs/principles/model-routing.md` を参照。**
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"hooks": [
|
|
16
16
|
{
|
|
17
17
|
"type": "command",
|
|
18
|
-
"command": "npx
|
|
18
|
+
"command": "npx phasegate hook pre-tool-use"
|
|
19
19
|
}
|
|
20
20
|
]
|
|
21
21
|
}
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
},
|
|
39
39
|
{
|
|
40
40
|
"type": "command",
|
|
41
|
-
"command": "npx
|
|
41
|
+
"command": "npx phasegate hook post-tool-use"
|
|
42
42
|
}
|
|
43
43
|
]
|
|
44
44
|
}
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"hooks": [
|
|
50
50
|
{
|
|
51
51
|
"type": "command",
|
|
52
|
-
"command": "npx
|
|
52
|
+
"command": "npx phasegate hook stop"
|
|
53
53
|
}
|
|
54
54
|
]
|
|
55
55
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
npx lint-staged
|
|
2
|
-
npx
|
|
2
|
+
npx phasegate pre-commit
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": "1.0",
|
|
3
|
-
"preset": "standard",
|
|
4
|
-
"project": {
|
|
5
|
-
"name": "my-project",
|
|
6
|
-
"architecture": "clean-architecture",
|
|
7
|
-
"paths": {
|
|
8
|
-
"source": [
|
|
9
|
-
"backend/src",
|
|
10
|
-
"frontend/src"
|
|
11
|
-
],
|
|
12
|
-
"docs": {
|
|
13
|
-
"units": "docs/product/units",
|
|
14
|
-
"inception": "docs/inception",
|
|
15
|
-
"construction": "docs/product/construction"
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
"naming": {
|
|
19
|
-
"fileCase": "kebab-case",
|
|
20
|
-
"classCase": "PascalCase",
|
|
21
|
-
"unitToPath": "kebab-to-snake"
|
|
22
|
-
}
|
|
23
|
-
},
|
|
24
|
-
"layers": {
|
|
25
|
-
"L1_editor": { "enabled": true },
|
|
26
|
-
"L2_precommit": { "enabled": true },
|
|
27
|
-
"L3_ci": { "enabled": true },
|
|
28
|
-
"L4_scheduled": { "enabled": false }
|
|
29
|
-
}
|
|
30
|
-
}
|