@hongmaple0820/scale-engine 0.12.3 → 0.14.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/dist/adapters/AiderAdapter.js +1 -1
- package/dist/adapters/AiderAdapter.js.map +1 -1
- package/dist/adapters/ClaudeCodeAdapter.d.ts +1 -0
- package/dist/adapters/ClaudeCodeAdapter.js +5 -3
- package/dist/adapters/ClaudeCodeAdapter.js.map +1 -1
- package/dist/adapters/CodexAdapter.js +1 -1
- package/dist/adapters/CodexAdapter.js.map +1 -1
- package/dist/adapters/CursorAdapter.js +1 -1
- package/dist/adapters/CursorAdapter.js.map +1 -1
- package/dist/adapters/DeepSeekTuiAdapter.js +5 -3
- package/dist/adapters/DeepSeekTuiAdapter.js.map +1 -1
- package/dist/adapters/DoubaoAdapter.js +1 -1
- package/dist/adapters/DoubaoAdapter.js.map +1 -1
- package/dist/adapters/GeminiAdapter.js +1 -1
- package/dist/adapters/GeminiAdapter.js.map +1 -1
- package/dist/adapters/HermesAdapter.js +1 -1
- package/dist/adapters/HermesAdapter.js.map +1 -1
- package/dist/adapters/KimiAdapter.js +1 -1
- package/dist/adapters/KimiAdapter.js.map +1 -1
- package/dist/adapters/KiroAdapter.d.ts +14 -0
- package/dist/adapters/KiroAdapter.js +180 -0
- package/dist/adapters/KiroAdapter.js.map +1 -0
- package/dist/adapters/OpenClawAdapter.js +1 -1
- package/dist/adapters/OpenClawAdapter.js.map +1 -1
- package/dist/adapters/OpenCodeAdapter.js +1 -1
- package/dist/adapters/OpenCodeAdapter.js.map +1 -1
- package/dist/adapters/QCoderAdapter.js +1 -1
- package/dist/adapters/QCoderAdapter.js.map +1 -1
- package/dist/adapters/TraeAdapter.js +1 -1
- package/dist/adapters/TraeAdapter.js.map +1 -1
- package/dist/adapters/VSCAdapter.js +1 -1
- package/dist/adapters/VSCAdapter.js.map +1 -1
- package/dist/adapters/WindsurfAdapter.js +1 -1
- package/dist/adapters/WindsurfAdapter.js.map +1 -1
- package/dist/adapters/WorkBuddyAdapter.js +1 -1
- package/dist/adapters/WorkBuddyAdapter.js.map +1 -1
- package/dist/adapters/index.d.ts +1 -0
- package/dist/adapters/index.js +3 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/api/cli.js +690 -9
- package/dist/api/cli.js.map +1 -1
- package/dist/api/doctor.d.ts +13 -0
- package/dist/api/doctor.js +261 -5
- package/dist/api/doctor.js.map +1 -1
- package/dist/api/quickstart.d.ts +20 -1
- package/dist/api/quickstart.js +104 -3
- package/dist/api/quickstart.js.map +1 -1
- package/dist/artifact/types.d.ts +16 -2
- package/dist/artifact/types.js.map +1 -1
- package/dist/cli/phaseCommands.d.ts +66 -0
- package/dist/cli/phaseCommands.js +695 -51
- package/dist/cli/phaseCommands.js.map +1 -1
- package/dist/guardrails/detectors.d.ts +9 -0
- package/dist/guardrails/detectors.js +102 -0
- package/dist/guardrails/detectors.js.map +1 -1
- package/dist/hooks/HookGeneratorEnhanced.js +29 -0
- package/dist/hooks/HookGeneratorEnhanced.js.map +1 -1
- package/dist/hooks/WorkflowHooksManager.js +20 -1
- package/dist/hooks/WorkflowHooksManager.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/output/BrandThemeLoader.d.ts +54 -0
- package/dist/output/BrandThemeLoader.js +340 -0
- package/dist/output/BrandThemeLoader.js.map +1 -0
- package/dist/output/HTMLDocumentRenderer.d.ts +83 -0
- package/dist/output/HTMLDocumentRenderer.js +717 -0
- package/dist/output/HTMLDocumentRenderer.js.map +1 -0
- package/dist/output/UIPrototypeRenderer.d.ts +61 -0
- package/dist/output/UIPrototypeRenderer.js +500 -0
- package/dist/output/UIPrototypeRenderer.js.map +1 -0
- package/dist/output/index.d.ts +6 -0
- package/dist/output/index.js +6 -0
- package/dist/output/index.js.map +1 -0
- package/dist/skills/ExternalSkills.js +2 -0
- package/dist/skills/ExternalSkills.js.map +1 -1
- package/dist/skills/SkillCatalog.d.ts +13 -0
- package/dist/skills/SkillCatalog.js +184 -0
- package/dist/skills/SkillCatalog.js.map +1 -0
- package/dist/skills/SkillDiscovery.js +2 -1
- package/dist/skills/SkillDiscovery.js.map +1 -1
- package/dist/skills/SkillDoctor.d.ts +37 -0
- package/dist/skills/SkillDoctor.js +90 -0
- package/dist/skills/SkillDoctor.js.map +1 -0
- package/dist/skills/index.d.ts +2 -0
- package/dist/skills/index.js +2 -0
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/routing/SkillGate.d.ts +12 -0
- package/dist/skills/routing/SkillGate.js +93 -0
- package/dist/skills/routing/SkillGate.js.map +1 -0
- package/dist/skills/routing/SkillPlanner.d.ts +8 -0
- package/dist/skills/routing/SkillPlanner.js +91 -0
- package/dist/skills/routing/SkillPlanner.js.map +1 -0
- package/dist/skills/routing/SkillPolicy.d.ts +6 -0
- package/dist/skills/routing/SkillPolicy.js +173 -0
- package/dist/skills/routing/SkillPolicy.js.map +1 -0
- package/dist/skills/routing/SkillRoutingTypes.d.ts +72 -0
- package/dist/skills/routing/SkillRoutingTypes.js +2 -0
- package/dist/skills/routing/SkillRoutingTypes.js.map +1 -0
- package/dist/skills/routing/TaskIntentClassifier.d.ts +6 -0
- package/dist/skills/routing/TaskIntentClassifier.js +79 -0
- package/dist/skills/routing/TaskIntentClassifier.js.map +1 -0
- package/dist/skills/routing/index.d.ts +5 -0
- package/dist/skills/routing/index.js +6 -0
- package/dist/skills/routing/index.js.map +1 -0
- package/dist/workflow/GovernanceLock.d.ts +35 -0
- package/dist/workflow/GovernanceLock.js +58 -0
- package/dist/workflow/GovernanceLock.js.map +1 -0
- package/dist/workflow/GovernanceTemplatePacks.d.ts +24 -0
- package/dist/workflow/GovernanceTemplatePacks.js +83 -0
- package/dist/workflow/GovernanceTemplatePacks.js.map +1 -0
- package/dist/workflow/GovernanceTemplates.d.ts +17 -0
- package/dist/workflow/GovernanceTemplates.js +686 -0
- package/dist/workflow/GovernanceTemplates.js.map +1 -0
- package/dist/workflow/PhaseMarkerTracker.d.ts +63 -0
- package/dist/workflow/PhaseMarkerTracker.js +291 -0
- package/dist/workflow/PhaseMarkerTracker.js.map +1 -0
- package/dist/workflow/SessionStateTracker.d.ts +74 -0
- package/dist/workflow/SessionStateTracker.js +270 -0
- package/dist/workflow/SessionStateTracker.js.map +1 -0
- package/dist/workflow/TaskArtifactScaffolder.d.ts +47 -0
- package/dist/workflow/TaskArtifactScaffolder.js +237 -0
- package/dist/workflow/TaskArtifactScaffolder.js.map +1 -0
- package/dist/workflow/TaskMetricsStore.d.ts +49 -0
- package/dist/workflow/TaskMetricsStore.js +149 -0
- package/dist/workflow/TaskMetricsStore.js.map +1 -0
- package/dist/workflow/VerificationCommands.d.ts +2 -0
- package/dist/workflow/VerificationCommands.js +8 -12
- package/dist/workflow/VerificationCommands.js.map +1 -1
- package/dist/workflow/VerificationProfile.d.ts +56 -0
- package/dist/workflow/VerificationProfile.js +170 -0
- package/dist/workflow/VerificationProfile.js.map +1 -0
- package/dist/workflow/WorkflowArtifactWriter.d.ts +113 -0
- package/dist/workflow/WorkflowArtifactWriter.js +241 -0
- package/dist/workflow/WorkflowArtifactWriter.js.map +1 -0
- package/dist/workflow/WorkflowEngine.d.ts +26 -5
- package/dist/workflow/WorkflowEngine.js +38 -9
- package/dist/workflow/WorkflowEngine.js.map +1 -1
- package/dist/workflow/WorkspaceLifecycle.d.ts +51 -0
- package/dist/workflow/WorkspaceLifecycle.js +259 -0
- package/dist/workflow/WorkspaceLifecycle.js.map +1 -0
- package/dist/workflow/autonomous/AutonomousDevLoop.d.ts +88 -0
- package/dist/workflow/autonomous/AutonomousDevLoop.js +381 -0
- package/dist/workflow/autonomous/AutonomousDevLoop.js.map +1 -0
- package/dist/workflow/autonomous/WorklogManager.d.ts +50 -0
- package/dist/workflow/autonomous/WorklogManager.js +264 -0
- package/dist/workflow/autonomous/WorklogManager.js.map +1 -0
- package/dist/workflow/autonomous/index.d.ts +2 -0
- package/dist/workflow/autonomous/index.js +4 -0
- package/dist/workflow/autonomous/index.js.map +1 -0
- package/dist/workflow/gates/GateSystem.d.ts +12 -3
- package/dist/workflow/gates/GateSystem.js +185 -41
- package/dist/workflow/gates/GateSystem.js.map +1 -1
- package/dist/workflow/index.d.ts +10 -0
- package/dist/workflow/index.js +10 -0
- package/dist/workflow/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export class TaskMetricsStore {
|
|
4
|
+
constructor(scaleDir = process.env.SCALE_DIR ?? '.scale') {
|
|
5
|
+
this.metricsDir = join(scaleDir, 'metrics');
|
|
6
|
+
this.recordsPath = join(this.metricsDir, 'tasks.jsonl');
|
|
7
|
+
}
|
|
8
|
+
append(record) {
|
|
9
|
+
if (!existsSync(this.metricsDir))
|
|
10
|
+
mkdirSync(this.metricsDir, { recursive: true });
|
|
11
|
+
appendFileSync(this.recordsPath, JSON.stringify(record) + '\n', 'utf-8');
|
|
12
|
+
}
|
|
13
|
+
upsert(record) {
|
|
14
|
+
const records = this.list();
|
|
15
|
+
const index = records.findIndex(candidate => candidate.taskId === record.taskId);
|
|
16
|
+
if (index >= 0)
|
|
17
|
+
records[index] = record;
|
|
18
|
+
else
|
|
19
|
+
records.push(record);
|
|
20
|
+
this.writeAll(records);
|
|
21
|
+
}
|
|
22
|
+
recordVerification(input) {
|
|
23
|
+
const previous = this.findByTaskId(input.taskId);
|
|
24
|
+
const finalGateStatus = input.finalGateStatus ?? (input.passed ? 'passed' : 'failed');
|
|
25
|
+
const additionalIteration = previous && !(previous.finalGateStatus === 'passed' && finalGateStatus === 'passed') ? 1 : 0;
|
|
26
|
+
const firstVerificationPass = previous?.firstVerificationPass ?? input.passed;
|
|
27
|
+
const fixIterations = (previous?.fixIterations ?? 0) + additionalIteration;
|
|
28
|
+
const record = {
|
|
29
|
+
date: input.date ?? currentDate(),
|
|
30
|
+
taskId: input.taskId,
|
|
31
|
+
taskName: input.taskName,
|
|
32
|
+
level: input.level,
|
|
33
|
+
services: input.services ?? [],
|
|
34
|
+
filesChanged: input.filesChanged ?? 0,
|
|
35
|
+
firstVerificationPass,
|
|
36
|
+
fixIterations,
|
|
37
|
+
reworkNeeded: !firstVerificationPass || fixIterations > 0,
|
|
38
|
+
artifactComplete: input.artifactComplete ?? false,
|
|
39
|
+
residualRisk: input.residualRisk ?? '',
|
|
40
|
+
finalGateStatus,
|
|
41
|
+
};
|
|
42
|
+
this.upsert(record);
|
|
43
|
+
return record;
|
|
44
|
+
}
|
|
45
|
+
list() {
|
|
46
|
+
if (!existsSync(this.recordsPath))
|
|
47
|
+
return [];
|
|
48
|
+
return readFileSync(this.recordsPath, 'utf-8')
|
|
49
|
+
.split('\n')
|
|
50
|
+
.map(line => line.trim())
|
|
51
|
+
.filter(Boolean)
|
|
52
|
+
.map(line => JSON.parse(line));
|
|
53
|
+
}
|
|
54
|
+
findByTaskId(taskId) {
|
|
55
|
+
const records = this.list();
|
|
56
|
+
for (let i = records.length - 1; i >= 0; i -= 1) {
|
|
57
|
+
if (records[i].taskId === taskId)
|
|
58
|
+
return records[i];
|
|
59
|
+
}
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
summarize() {
|
|
63
|
+
const records = this.list();
|
|
64
|
+
if (records.length === 0) {
|
|
65
|
+
return {
|
|
66
|
+
total: 0,
|
|
67
|
+
firstPassRate: 0,
|
|
68
|
+
averageFixIterations: 0,
|
|
69
|
+
artifactCompletenessRate: 0,
|
|
70
|
+
residualRiskClarityRate: 0,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
total: records.length,
|
|
75
|
+
firstPassRate: ratio(records.filter(record => record.firstVerificationPass).length, records.length),
|
|
76
|
+
averageFixIterations: records.reduce((sum, record) => sum + record.fixIterations, 0) / records.length,
|
|
77
|
+
artifactCompletenessRate: ratio(records.filter(record => record.artifactComplete).length, records.length),
|
|
78
|
+
residualRiskClarityRate: ratio(records.filter(record => record.residualRisk.trim().length > 0).length, records.length),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
toMarkdownRow(record) {
|
|
82
|
+
return [
|
|
83
|
+
record.date,
|
|
84
|
+
record.taskName,
|
|
85
|
+
record.level,
|
|
86
|
+
record.services.join(', '),
|
|
87
|
+
String(record.filesChanged),
|
|
88
|
+
record.firstVerificationPass ? 'yes' : 'no',
|
|
89
|
+
String(record.fixIterations),
|
|
90
|
+
record.reworkNeeded ? 'yes' : 'no',
|
|
91
|
+
record.artifactComplete ? 'yes' : 'no',
|
|
92
|
+
record.residualRisk || 'none stated',
|
|
93
|
+
record.finalGateStatus,
|
|
94
|
+
].map(escapeCell).join(' | ');
|
|
95
|
+
}
|
|
96
|
+
writeMarkdownReport(projectDir = process.cwd()) {
|
|
97
|
+
const target = join(projectDir, 'docs', 'worklog', 'metrics.md');
|
|
98
|
+
const dir = join(projectDir, 'docs', 'worklog');
|
|
99
|
+
if (!existsSync(dir))
|
|
100
|
+
mkdirSync(dir, { recursive: true });
|
|
101
|
+
const section = this.renderGeneratedMarkdownSection();
|
|
102
|
+
const existing = existsSync(target) ? readFileSync(target, 'utf-8') : '# Workflow Metrics\n\n';
|
|
103
|
+
const next = replaceGeneratedSection(existing, section);
|
|
104
|
+
writeFileSync(target, next, 'utf-8');
|
|
105
|
+
return target;
|
|
106
|
+
}
|
|
107
|
+
renderGeneratedMarkdownSection() {
|
|
108
|
+
const summary = this.summarize();
|
|
109
|
+
const rows = this.list().map(record => `| ${this.toMarkdownRow(record)} |`);
|
|
110
|
+
return [
|
|
111
|
+
'<!-- SCALE_METRICS:START -->',
|
|
112
|
+
`Total tasks: ${summary.total}`,
|
|
113
|
+
`First-pass verification rate: ${(summary.firstPassRate * 100).toFixed(1)}%`,
|
|
114
|
+
`Average fix iterations: ${summary.averageFixIterations.toFixed(2)}`,
|
|
115
|
+
`Artifact completeness: ${(summary.artifactCompletenessRate * 100).toFixed(1)}%`,
|
|
116
|
+
'',
|
|
117
|
+
'| Date | Task | Level | Services | Files Changed | First Verification Pass | Fix Iterations | Rework Needed | Artifact Complete | Residual Risk | Final Gate |',
|
|
118
|
+
'| --- | --- | --- | --- | ---: | --- | ---: | --- | --- | --- | --- |',
|
|
119
|
+
...(rows.length ? rows : ['| | | | | | | | | | | |']),
|
|
120
|
+
'<!-- SCALE_METRICS:END -->',
|
|
121
|
+
].join('\n');
|
|
122
|
+
}
|
|
123
|
+
writeAll(records) {
|
|
124
|
+
if (!existsSync(this.metricsDir))
|
|
125
|
+
mkdirSync(this.metricsDir, { recursive: true });
|
|
126
|
+
const body = records.map(record => JSON.stringify(record)).join('\n');
|
|
127
|
+
writeFileSync(this.recordsPath, body ? `${body}\n` : '', 'utf-8');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function replaceGeneratedSection(existing, generatedSection) {
|
|
131
|
+
const marker = /<!-- SCALE_METRICS:START -->[\s\S]*?<!-- SCALE_METRICS:END -->/;
|
|
132
|
+
if (marker.test(existing))
|
|
133
|
+
return existing.replace(marker, generatedSection);
|
|
134
|
+
const titleMatch = existing.match(/^# .+\n/);
|
|
135
|
+
if (titleMatch) {
|
|
136
|
+
return existing.replace(titleMatch[0], `${titleMatch[0]}\n${generatedSection}\n`);
|
|
137
|
+
}
|
|
138
|
+
return `# Workflow Metrics\n\n${generatedSection}\n\n${existing}`;
|
|
139
|
+
}
|
|
140
|
+
function currentDate() {
|
|
141
|
+
return new Date().toISOString().slice(0, 10);
|
|
142
|
+
}
|
|
143
|
+
function ratio(part, total) {
|
|
144
|
+
return total === 0 ? 0 : Math.round((part / total) * 1000) / 1000;
|
|
145
|
+
}
|
|
146
|
+
function escapeCell(value) {
|
|
147
|
+
return value.replace(/\|/g, '\\|');
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=TaskMetricsStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskMetricsStore.js","sourceRoot":"","sources":["../../src/workflow/TaskMetricsStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,11 +5,13 @@ export interface VerificationCommandConfig {
|
|
|
5
5
|
coverage?: string;
|
|
6
6
|
tddEvidence?: string;
|
|
7
7
|
tddStrict?: boolean;
|
|
8
|
+
cwd?: string;
|
|
8
9
|
}
|
|
9
10
|
export interface ResolvedVerificationCommand {
|
|
10
11
|
command?: string;
|
|
11
12
|
source: 'override' | 'package-script' | 'fallback' | 'missing';
|
|
12
13
|
reason: string;
|
|
14
|
+
cwd?: string;
|
|
13
15
|
}
|
|
14
16
|
export interface ResolvedVerificationCommands {
|
|
15
17
|
packageManager: string;
|
|
@@ -6,14 +6,17 @@ export function detectVerificationCommands(cwd = process.cwd(), overrides = {})
|
|
|
6
6
|
const packageManager = detectPackageManager(cwd, pkg);
|
|
7
7
|
return {
|
|
8
8
|
packageManager,
|
|
9
|
-
build: resolveBuildCommand(packageManager, scripts, overrides.build),
|
|
10
|
-
lint: resolveScriptCommand(packageManager, scripts, 'lint', overrides.lint),
|
|
11
|
-
test: resolveScriptCommand(packageManager, scripts, 'test', overrides.test),
|
|
12
|
-
coverage: resolveCoverageCommand(packageManager, scripts, overrides.coverage),
|
|
9
|
+
build: withCwd(resolveBuildCommand(packageManager, scripts, overrides.build), cwd),
|
|
10
|
+
lint: withCwd(resolveScriptCommand(packageManager, scripts, 'lint', overrides.lint), cwd),
|
|
11
|
+
test: withCwd(resolveScriptCommand(packageManager, scripts, 'test', overrides.test), cwd),
|
|
12
|
+
coverage: withCwd(resolveCoverageCommand(packageManager, scripts, overrides.coverage), cwd),
|
|
13
13
|
tddEvidence: overrides.tddEvidence,
|
|
14
14
|
tddStrict: overrides.tddStrict,
|
|
15
15
|
};
|
|
16
16
|
}
|
|
17
|
+
function withCwd(command, cwd) {
|
|
18
|
+
return { ...command, cwd };
|
|
19
|
+
}
|
|
17
20
|
function readPackageJson(cwd) {
|
|
18
21
|
try {
|
|
19
22
|
return JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8'));
|
|
@@ -71,16 +74,9 @@ function resolveCoverageCommand(packageManager, scripts, override) {
|
|
|
71
74
|
reason: 'detected package.json "coverage" script',
|
|
72
75
|
};
|
|
73
76
|
}
|
|
74
|
-
if (scripts.test) {
|
|
75
|
-
return {
|
|
76
|
-
command: `${runScriptCommand(packageManager, 'test')} -- --coverage`,
|
|
77
|
-
source: 'fallback',
|
|
78
|
-
reason: 'no "coverage" script; using test script with coverage flag',
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
77
|
return {
|
|
82
78
|
source: 'missing',
|
|
83
|
-
reason: 'package.json has
|
|
79
|
+
reason: 'package.json has no "coverage" script; add one or pass --coverage-cmd for full coverage gates',
|
|
84
80
|
};
|
|
85
81
|
}
|
|
86
82
|
function resolveBuildCommand(packageManager, scripts, override) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VerificationCommands.js","sourceRoot":"","sources":["../../src/workflow/VerificationCommands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"VerificationCommands.js","sourceRoot":"","sources":["../../src/workflow/VerificationCommands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { VerificationCommandConfig } from './VerificationCommands.js';
|
|
2
|
+
export type VerificationCommandName = 'build' | 'lint' | 'test' | 'coverage';
|
|
3
|
+
export type VerificationArtifactGateMode = 'off' | 'warn' | 'block';
|
|
4
|
+
export type VerificationArtifactGateLevel = 'M' | 'L' | 'CRITICAL';
|
|
5
|
+
export interface VerificationService {
|
|
6
|
+
name: string;
|
|
7
|
+
path: string;
|
|
8
|
+
type?: 'node' | 'go' | 'python' | 'custom';
|
|
9
|
+
required?: boolean;
|
|
10
|
+
commands?: Partial<Record<VerificationCommandName, string>>;
|
|
11
|
+
}
|
|
12
|
+
export interface VerificationProfileEntry {
|
|
13
|
+
commands?: Partial<Record<VerificationCommandName, string>>;
|
|
14
|
+
services?: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface VerificationPolicy {
|
|
17
|
+
mode?: string;
|
|
18
|
+
optionalToolsWarnOnly?: boolean;
|
|
19
|
+
artifactGate?: VerificationArtifactGateMode;
|
|
20
|
+
artifactGateLevels?: VerificationArtifactGateLevel[];
|
|
21
|
+
}
|
|
22
|
+
export interface VerificationMatrix {
|
|
23
|
+
version?: number;
|
|
24
|
+
defaultProfile?: string;
|
|
25
|
+
profiles?: Record<string, VerificationProfileEntry>;
|
|
26
|
+
services?: VerificationService[];
|
|
27
|
+
exclude?: string[];
|
|
28
|
+
policy?: VerificationPolicy;
|
|
29
|
+
}
|
|
30
|
+
export interface ResolveVerificationProfileOptions {
|
|
31
|
+
projectDir?: string;
|
|
32
|
+
scaleDir?: string;
|
|
33
|
+
profile?: string;
|
|
34
|
+
service?: string;
|
|
35
|
+
services?: string[];
|
|
36
|
+
}
|
|
37
|
+
export interface ResolvedVerificationProfile {
|
|
38
|
+
config: VerificationCommandConfig;
|
|
39
|
+
profileName: string;
|
|
40
|
+
service?: VerificationService;
|
|
41
|
+
matrix?: VerificationMatrix;
|
|
42
|
+
policy: VerificationPolicy;
|
|
43
|
+
warnings: string[];
|
|
44
|
+
}
|
|
45
|
+
export interface ResolvedVerificationTargets {
|
|
46
|
+
targets: ResolvedVerificationProfile[];
|
|
47
|
+
profileName: string;
|
|
48
|
+
matrix?: VerificationMatrix;
|
|
49
|
+
policy: VerificationPolicy;
|
|
50
|
+
warnings: string[];
|
|
51
|
+
}
|
|
52
|
+
export declare const DEFAULT_VERIFICATION_POLICY: VerificationPolicy;
|
|
53
|
+
export declare function loadVerificationMatrix(projectDir?: string, scaleDir?: string): VerificationMatrix | null;
|
|
54
|
+
export declare function resolveVerificationProfile(options?: ResolveVerificationProfileOptions): ResolvedVerificationProfile;
|
|
55
|
+
export declare function resolveVerificationTargets(options?: ResolveVerificationProfileOptions): ResolvedVerificationTargets;
|
|
56
|
+
export declare function resolveVerificationPolicy(matrix: VerificationMatrix | null | undefined): VerificationPolicy;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { isAbsolute, join, resolve } from 'node:path';
|
|
3
|
+
export const DEFAULT_VERIFICATION_POLICY = {
|
|
4
|
+
optionalToolsWarnOnly: true,
|
|
5
|
+
artifactGate: 'warn',
|
|
6
|
+
artifactGateLevels: ['M', 'L', 'CRITICAL'],
|
|
7
|
+
};
|
|
8
|
+
export function loadVerificationMatrix(projectDir = process.cwd(), scaleDir = '.scale') {
|
|
9
|
+
const path = verificationMatrixPath(projectDir, scaleDir);
|
|
10
|
+
if (!existsSync(path))
|
|
11
|
+
return null;
|
|
12
|
+
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
13
|
+
}
|
|
14
|
+
export function resolveVerificationProfile(options = {}) {
|
|
15
|
+
const projectDir = resolve(options.projectDir ?? process.cwd());
|
|
16
|
+
const scaleDir = options.scaleDir ?? '.scale';
|
|
17
|
+
const matrix = loadVerificationMatrix(projectDir, scaleDir);
|
|
18
|
+
const warnings = [];
|
|
19
|
+
if (!matrix) {
|
|
20
|
+
return {
|
|
21
|
+
config: { cwd: projectDir },
|
|
22
|
+
profileName: options.profile ?? 'auto',
|
|
23
|
+
policy: resolveVerificationPolicy(null),
|
|
24
|
+
warnings: [`No verification matrix found at ${verificationMatrixPath(projectDir, scaleDir)}; using package script auto-detection.`],
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
const profileName = options.profile ?? matrix.defaultProfile ?? 'default';
|
|
28
|
+
const profile = matrix.profiles?.[profileName];
|
|
29
|
+
if (options.profile && !profile) {
|
|
30
|
+
warnings.push(`Verification profile "${options.profile}" was not found; using service or auto-detected commands.`);
|
|
31
|
+
}
|
|
32
|
+
const service = options.service
|
|
33
|
+
? matrix.services?.find(candidate => candidate.name === options.service)
|
|
34
|
+
: undefined;
|
|
35
|
+
if (options.service && !service) {
|
|
36
|
+
warnings.push(`Verification service "${options.service}" was not found; using project root.`);
|
|
37
|
+
}
|
|
38
|
+
const cwd = service ? resolve(projectDir, service.path) : projectDir;
|
|
39
|
+
const commands = {
|
|
40
|
+
...defaultCommandsForService(service),
|
|
41
|
+
...(profile?.commands ?? {}),
|
|
42
|
+
...(service?.commands ?? {}),
|
|
43
|
+
};
|
|
44
|
+
return {
|
|
45
|
+
config: {
|
|
46
|
+
cwd,
|
|
47
|
+
build: commands.build,
|
|
48
|
+
lint: commands.lint,
|
|
49
|
+
test: commands.test,
|
|
50
|
+
coverage: commands.coverage,
|
|
51
|
+
},
|
|
52
|
+
profileName,
|
|
53
|
+
service,
|
|
54
|
+
matrix,
|
|
55
|
+
policy: resolveVerificationPolicy(matrix),
|
|
56
|
+
warnings,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export function resolveVerificationTargets(options = {}) {
|
|
60
|
+
const projectDir = resolve(options.projectDir ?? process.cwd());
|
|
61
|
+
const scaleDir = options.scaleDir ?? '.scale';
|
|
62
|
+
const matrix = loadVerificationMatrix(projectDir, scaleDir);
|
|
63
|
+
if (!matrix) {
|
|
64
|
+
const target = resolveVerificationProfile(options);
|
|
65
|
+
return {
|
|
66
|
+
targets: [target],
|
|
67
|
+
profileName: target.profileName,
|
|
68
|
+
policy: target.policy,
|
|
69
|
+
warnings: target.warnings,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const profileName = options.profile ?? matrix.defaultProfile ?? 'default';
|
|
73
|
+
const profile = matrix.profiles?.[profileName];
|
|
74
|
+
const serviceNames = selectServiceNames(matrix, profile, options.service, options.services);
|
|
75
|
+
if (serviceNames.length === 0) {
|
|
76
|
+
const target = resolveVerificationProfile({ ...options, profile: profileName, service: undefined });
|
|
77
|
+
return {
|
|
78
|
+
targets: [target],
|
|
79
|
+
profileName,
|
|
80
|
+
matrix,
|
|
81
|
+
policy: resolveVerificationPolicy(matrix),
|
|
82
|
+
warnings: target.warnings,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const targets = serviceNames.map(service => resolveVerificationProfile({
|
|
86
|
+
...options,
|
|
87
|
+
profile: profileName,
|
|
88
|
+
service,
|
|
89
|
+
}));
|
|
90
|
+
return {
|
|
91
|
+
targets,
|
|
92
|
+
profileName,
|
|
93
|
+
matrix,
|
|
94
|
+
policy: resolveVerificationPolicy(matrix),
|
|
95
|
+
warnings: targets.flatMap(target => target.warnings),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export function resolveVerificationPolicy(matrix) {
|
|
99
|
+
const policy = matrix?.policy ?? {};
|
|
100
|
+
return {
|
|
101
|
+
...DEFAULT_VERIFICATION_POLICY,
|
|
102
|
+
...policy,
|
|
103
|
+
artifactGate: normalizeArtifactGate(policy.artifactGate) ?? DEFAULT_VERIFICATION_POLICY.artifactGate,
|
|
104
|
+
artifactGateLevels: normalizeArtifactGateLevels(policy.artifactGateLevels),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function selectServiceNames(matrix, profile, requestedService, requestedServices = []) {
|
|
108
|
+
const requested = unique([
|
|
109
|
+
...requestedServices,
|
|
110
|
+
...splitServiceNames(requestedService),
|
|
111
|
+
]);
|
|
112
|
+
if (requested.includes('all')) {
|
|
113
|
+
if (profile?.services?.length)
|
|
114
|
+
return profile.services;
|
|
115
|
+
return (matrix.services ?? [])
|
|
116
|
+
.filter(service => service.required !== false)
|
|
117
|
+
.map(service => service.name);
|
|
118
|
+
}
|
|
119
|
+
if (requested.length > 0)
|
|
120
|
+
return requested;
|
|
121
|
+
return profile?.services ?? [];
|
|
122
|
+
}
|
|
123
|
+
function splitServiceNames(value) {
|
|
124
|
+
if (!value)
|
|
125
|
+
return [];
|
|
126
|
+
return value
|
|
127
|
+
.split(',')
|
|
128
|
+
.map(service => service.trim())
|
|
129
|
+
.filter(Boolean);
|
|
130
|
+
}
|
|
131
|
+
function defaultCommandsForService(service) {
|
|
132
|
+
if (!service?.type || service.type === 'node' || service.type === 'custom')
|
|
133
|
+
return {};
|
|
134
|
+
if (service.type === 'go') {
|
|
135
|
+
return {
|
|
136
|
+
build: 'go build ./...',
|
|
137
|
+
lint: 'go vet ./...',
|
|
138
|
+
test: 'go test ./...',
|
|
139
|
+
coverage: 'go test ./... -cover',
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
if (service.type === 'python') {
|
|
143
|
+
return {
|
|
144
|
+
build: 'python -m compileall .',
|
|
145
|
+
lint: 'python -m ruff check .',
|
|
146
|
+
test: 'python -m pytest',
|
|
147
|
+
coverage: 'python -m pytest --cov=.',
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
return {};
|
|
151
|
+
}
|
|
152
|
+
function unique(items) {
|
|
153
|
+
return [...new Set(items)];
|
|
154
|
+
}
|
|
155
|
+
function verificationMatrixPath(projectDir, scaleDir) {
|
|
156
|
+
const root = isAbsolute(scaleDir) ? scaleDir : join(projectDir, scaleDir);
|
|
157
|
+
return join(root, 'verification.json');
|
|
158
|
+
}
|
|
159
|
+
function normalizeArtifactGate(value) {
|
|
160
|
+
if (value === 'off' || value === 'warn' || value === 'block')
|
|
161
|
+
return value;
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
function normalizeArtifactGateLevels(value) {
|
|
165
|
+
if (!Array.isArray(value))
|
|
166
|
+
return DEFAULT_VERIFICATION_POLICY.artifactGateLevels ?? ['M', 'L', 'CRITICAL'];
|
|
167
|
+
const levels = value.filter((level) => level === 'M' || level === 'L' || level === 'CRITICAL');
|
|
168
|
+
return levels.length > 0 ? levels : DEFAULT_VERIFICATION_POLICY.artifactGateLevels ?? ['M', 'L', 'CRITICAL'];
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=VerificationProfile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VerificationProfile.js","sourceRoot":"","sources":["../../src/workflow/VerificationProfile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
export interface ExploreArtifact {
|
|
2
|
+
timestamp: string;
|
|
3
|
+
files: string[];
|
|
4
|
+
fileCount: number;
|
|
5
|
+
mainContradiction: string;
|
|
6
|
+
ambiguityScore: number;
|
|
7
|
+
socraticCompleted: boolean;
|
|
8
|
+
graphNodes?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface PlanArtifact {
|
|
11
|
+
timestamp: string;
|
|
12
|
+
planId: string;
|
|
13
|
+
specId: string;
|
|
14
|
+
hasBoundaryAnalysis: boolean;
|
|
15
|
+
hasExceptionHandling: boolean;
|
|
16
|
+
hasRollbackStrategy: boolean;
|
|
17
|
+
modules: string[];
|
|
18
|
+
consensusRounds: number;
|
|
19
|
+
verdict: string;
|
|
20
|
+
}
|
|
21
|
+
export interface TDDEvidence {
|
|
22
|
+
timestamp: string;
|
|
23
|
+
taskId: string;
|
|
24
|
+
red: boolean;
|
|
25
|
+
green: boolean;
|
|
26
|
+
refactor: boolean;
|
|
27
|
+
testFirst: boolean;
|
|
28
|
+
testFile: string;
|
|
29
|
+
implFile: string;
|
|
30
|
+
coverage?: number;
|
|
31
|
+
}
|
|
32
|
+
export interface CheckpointData {
|
|
33
|
+
timestamp: string;
|
|
34
|
+
phase: string;
|
|
35
|
+
sessionId?: string;
|
|
36
|
+
data: Record<string, unknown>;
|
|
37
|
+
}
|
|
38
|
+
export type WorkflowTaskLevel = 'S' | 'M' | 'L' | 'CRITICAL';
|
|
39
|
+
export type WorkflowPhase = 'define' | 'explore' | 'plan' | 'build' | 'verify' | 'review' | 'ship' | 'done';
|
|
40
|
+
export interface WorkflowState {
|
|
41
|
+
schemaVersion: 1;
|
|
42
|
+
taskId: string;
|
|
43
|
+
level: WorkflowTaskLevel;
|
|
44
|
+
phase: WorkflowPhase;
|
|
45
|
+
artifactsDir?: string;
|
|
46
|
+
exploredFiles: string[];
|
|
47
|
+
fileCount: number;
|
|
48
|
+
mainContradiction: string;
|
|
49
|
+
completedGates: string[];
|
|
50
|
+
openTasks: string[];
|
|
51
|
+
filesModified: string[];
|
|
52
|
+
skillIntents?: string[];
|
|
53
|
+
skillRoutingMode?: 'off' | 'warn' | 'block';
|
|
54
|
+
skillPlanRequired?: boolean;
|
|
55
|
+
skillPlanPath?: string;
|
|
56
|
+
requiredSkills?: string[];
|
|
57
|
+
recommendedSkills?: string[];
|
|
58
|
+
requiredSkillArtifacts?: string[];
|
|
59
|
+
requiredSkillVerification?: string[];
|
|
60
|
+
lastSpecId?: string;
|
|
61
|
+
lastPlanId?: string;
|
|
62
|
+
lastTaskId?: string;
|
|
63
|
+
updatedAt: string;
|
|
64
|
+
}
|
|
65
|
+
export type WorkflowStatePatch = Partial<Omit<WorkflowState, 'schemaVersion' | 'updatedAt'>> & {
|
|
66
|
+
updatedAt?: string;
|
|
67
|
+
};
|
|
68
|
+
export declare class WorkflowArtifactWriter {
|
|
69
|
+
private stateDir;
|
|
70
|
+
constructor(scaleDir?: string);
|
|
71
|
+
private ensureDir;
|
|
72
|
+
/** Write explore result to .scale/state/explore.json */
|
|
73
|
+
writeExploreResult(result: ExploreArtifact): void;
|
|
74
|
+
/** Read explore artifact from .scale/state/explore.json */
|
|
75
|
+
readExploreResult(): ExploreArtifact | null;
|
|
76
|
+
/** Check if explore artifact exists and is valid */
|
|
77
|
+
hasValidExploreResult(minFiles?: number): boolean;
|
|
78
|
+
/** Write plan result to .scale/state/plan-{planId}.json */
|
|
79
|
+
writePlanResult(result: PlanArtifact): void;
|
|
80
|
+
/** Read plan artifact by ID */
|
|
81
|
+
readPlanResult(planId: string): PlanArtifact | null;
|
|
82
|
+
/** Read the most recent plan artifact */
|
|
83
|
+
readLatestPlanResult(): PlanArtifact | null;
|
|
84
|
+
/** Check if a valid plan artifact exists */
|
|
85
|
+
hasValidPlanResult(): boolean;
|
|
86
|
+
/** Write TDD evidence to .scale/state/tdd-{taskId}.json */
|
|
87
|
+
writeTDDEvidence(evidence: TDDEvidence): void;
|
|
88
|
+
/** Read TDD evidence by task ID */
|
|
89
|
+
readTDDEvidence(taskId: string): TDDEvidence | null;
|
|
90
|
+
/** Read the most recent TDD evidence */
|
|
91
|
+
readLatestTDDEvidence(): TDDEvidence | null;
|
|
92
|
+
/** Check if valid TDD evidence exists for a task */
|
|
93
|
+
hasValidTDDEvidence(taskId?: string): boolean;
|
|
94
|
+
/** Write checkpoint to .scale/state/checkpoint.json */
|
|
95
|
+
writeCheckpoint(data: CheckpointData): void;
|
|
96
|
+
/** Read checkpoint */
|
|
97
|
+
readCheckpoint(): CheckpointData | null;
|
|
98
|
+
/** Clear all artifacts (for testing or reset) */
|
|
99
|
+
clearAll(): void;
|
|
100
|
+
/** Get state directory path */
|
|
101
|
+
getStateDir(): string;
|
|
102
|
+
/** Write authoritative workflow state to .scale/state/current.json */
|
|
103
|
+
writeCurrentState(state: WorkflowState): void;
|
|
104
|
+
/** Read authoritative workflow state from .scale/state/current.json */
|
|
105
|
+
readCurrentState(): WorkflowState | null;
|
|
106
|
+
/** Merge a patch into .scale/state/current.json. */
|
|
107
|
+
updateCurrentState(patch: WorkflowStatePatch): WorkflowState;
|
|
108
|
+
private readJson;
|
|
109
|
+
private listFiles;
|
|
110
|
+
private createDefaultState;
|
|
111
|
+
private normalizeState;
|
|
112
|
+
private isWorkflowPhase;
|
|
113
|
+
}
|