@hongmaple0820/scale-engine 0.12.2 → 0.13.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/README.md +30 -2
- package/dist/adapters/ClaudeCodeAdapter.d.ts +1 -0
- package/dist/adapters/ClaudeCodeAdapter.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/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 +396 -5
- package/dist/api/cli.js.map +1 -1
- package/dist/api/doctor.d.ts +12 -0
- package/dist/api/doctor.js +232 -5
- package/dist/api/doctor.js.map +1 -1
- package/dist/api/quickstart.d.ts +19 -1
- package/dist/api/quickstart.js +103 -2
- 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 +61 -0
- package/dist/cli/phaseCommands.js +559 -39
- package/dist/cli/phaseCommands.js.map +1 -1
- package/dist/cli/vibeCommands.d.ts +44 -0
- package/dist/cli/vibeCommands.js +244 -0
- package/dist/cli/vibeCommands.js.map +1 -0
- 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/prompts/PhasePromptRegistry.d.ts +53 -0
- package/dist/prompts/PhasePromptRegistry.js +517 -0
- package/dist/prompts/PhasePromptRegistry.js.map +1 -0
- package/dist/skills/SkillDiscovery.js +2 -1
- package/dist/skills/SkillDiscovery.js.map +1 -1
- package/dist/skills/index.d.ts +1 -0
- package/dist/skills/index.js +1 -0
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/routing/SkillGate.d.ts +11 -0
- package/dist/skills/routing/SkillGate.js +76 -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 +146 -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/GovernanceTemplates.d.ts +12 -0
- package/dist/workflow/GovernanceTemplates.js +515 -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 +7 -4
- package/dist/workflow/VerificationCommands.js.map +1 -1
- package/dist/workflow/VerificationProfile.d.ts +55 -0
- package/dist/workflow/VerificationProfile.js +133 -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 +20 -2
- package/dist/workflow/WorkflowEngine.js +37 -8
- package/dist/workflow/WorkflowEngine.js.map +1 -1
- 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 +7 -0
- package/dist/workflow/index.js +7 -0
- package/dist/workflow/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { GateResult } from './types.js';
|
|
2
|
+
import { type SkillPlan } from '../skills/routing/index.js';
|
|
3
|
+
export type TaskArtifactLevel = 'S' | 'M' | 'L' | 'CRITICAL';
|
|
4
|
+
export interface TaskArtifactScaffoldOptions {
|
|
5
|
+
projectDir?: string;
|
|
6
|
+
taskId: string;
|
|
7
|
+
taskName: string;
|
|
8
|
+
description: string;
|
|
9
|
+
level: TaskArtifactLevel;
|
|
10
|
+
services?: string[];
|
|
11
|
+
skillPlan?: SkillPlan;
|
|
12
|
+
}
|
|
13
|
+
export interface TaskArtifactScaffoldResult {
|
|
14
|
+
relativeDir?: string;
|
|
15
|
+
dir?: string;
|
|
16
|
+
created: string[];
|
|
17
|
+
skipped: string[];
|
|
18
|
+
}
|
|
19
|
+
export interface VerificationArtifactAppendOptions {
|
|
20
|
+
projectDir?: string;
|
|
21
|
+
artifactsDir?: string;
|
|
22
|
+
taskId: string;
|
|
23
|
+
profile: string;
|
|
24
|
+
services: string[];
|
|
25
|
+
gateResults: GateResult[];
|
|
26
|
+
passed: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface TaskArtifactCheckOptions {
|
|
29
|
+
projectDir?: string;
|
|
30
|
+
artifactsDir?: string;
|
|
31
|
+
level: TaskArtifactLevel;
|
|
32
|
+
skillRequiredArtifacts?: string[];
|
|
33
|
+
}
|
|
34
|
+
export interface TaskArtifactIncompleteItem {
|
|
35
|
+
file: string;
|
|
36
|
+
reason: string;
|
|
37
|
+
}
|
|
38
|
+
export interface TaskArtifactCheckResult {
|
|
39
|
+
complete: boolean;
|
|
40
|
+
artifactsDir?: string;
|
|
41
|
+
required: string[];
|
|
42
|
+
missing: string[];
|
|
43
|
+
incomplete: TaskArtifactIncompleteItem[];
|
|
44
|
+
}
|
|
45
|
+
export declare function scaffoldTaskArtifacts(options: TaskArtifactScaffoldOptions): TaskArtifactScaffoldResult;
|
|
46
|
+
export declare function appendVerificationArtifact(options: VerificationArtifactAppendOptions): string | null;
|
|
47
|
+
export declare function checkTaskArtifactCompleteness(options: TaskArtifactCheckOptions): TaskArtifactCheckResult;
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { isAbsolute, join, resolve } from 'node:path';
|
|
3
|
+
import { governanceTemplateContent } from './GovernanceTemplates.js';
|
|
4
|
+
import { skillPlanMarkdown } from '../skills/routing/index.js';
|
|
5
|
+
const TASK_ARTIFACTS = [
|
|
6
|
+
'explore.md',
|
|
7
|
+
'mini-prd.md',
|
|
8
|
+
'skill-plan.md',
|
|
9
|
+
'plan.md',
|
|
10
|
+
'verification.md',
|
|
11
|
+
'review.md',
|
|
12
|
+
'summary.md',
|
|
13
|
+
];
|
|
14
|
+
export function scaffoldTaskArtifacts(options) {
|
|
15
|
+
if (options.level === 'S')
|
|
16
|
+
return { created: [], skipped: [] };
|
|
17
|
+
const projectDir = resolve(options.projectDir ?? process.cwd());
|
|
18
|
+
const relativeDir = join('docs', 'worklog', 'tasks', `${currentDate()}-${slugify(options.taskName || options.description || options.taskId)}`);
|
|
19
|
+
const dir = uniqueDirectory(projectDir, relativeDir, options.taskId);
|
|
20
|
+
const result = {
|
|
21
|
+
relativeDir: relativePath(projectDir, dir),
|
|
22
|
+
dir,
|
|
23
|
+
created: [],
|
|
24
|
+
skipped: [],
|
|
25
|
+
};
|
|
26
|
+
if (!existsSync(dir))
|
|
27
|
+
mkdirSync(dir, { recursive: true });
|
|
28
|
+
const artifacts = unique([
|
|
29
|
+
...TASK_ARTIFACTS,
|
|
30
|
+
...(options.skillPlan?.requiredArtifacts ?? []),
|
|
31
|
+
]);
|
|
32
|
+
for (const name of artifacts) {
|
|
33
|
+
const target = join(dir, name);
|
|
34
|
+
if (existsSync(target)) {
|
|
35
|
+
result.skipped.push(target);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const template = name === 'skill-plan.md' && options.skillPlan
|
|
39
|
+
? skillPlanMarkdown(options.skillPlan)
|
|
40
|
+
: readTemplate(projectDir, name);
|
|
41
|
+
const content = name === 'skill-plan.md' && options.skillPlan
|
|
42
|
+
? template
|
|
43
|
+
: injectTaskMetadata(template, options);
|
|
44
|
+
writeFileSync(target, content, 'utf-8');
|
|
45
|
+
result.created.push(target);
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
export function appendVerificationArtifact(options) {
|
|
50
|
+
if (!options.artifactsDir)
|
|
51
|
+
return null;
|
|
52
|
+
const projectDir = resolve(options.projectDir ?? process.cwd());
|
|
53
|
+
const dir = isAbsolute(options.artifactsDir) ? options.artifactsDir : resolve(projectDir, options.artifactsDir);
|
|
54
|
+
if (!existsSync(dir))
|
|
55
|
+
return null;
|
|
56
|
+
const target = join(dir, 'verification.md');
|
|
57
|
+
if (!existsSync(target)) {
|
|
58
|
+
writeFileSync(target, injectTaskMetadata(readTemplate(projectDir, 'verification.md'), {
|
|
59
|
+
projectDir,
|
|
60
|
+
taskId: options.taskId,
|
|
61
|
+
taskName: options.taskId,
|
|
62
|
+
description: '',
|
|
63
|
+
level: 'M',
|
|
64
|
+
services: options.services,
|
|
65
|
+
}), 'utf-8');
|
|
66
|
+
}
|
|
67
|
+
appendFileSync(target, verificationRunMarkdown(options), 'utf-8');
|
|
68
|
+
return target;
|
|
69
|
+
}
|
|
70
|
+
export function checkTaskArtifactCompleteness(options) {
|
|
71
|
+
if (options.level === 'S') {
|
|
72
|
+
return { complete: true, artifactsDir: options.artifactsDir, required: [], missing: [], incomplete: [] };
|
|
73
|
+
}
|
|
74
|
+
if (!options.artifactsDir) {
|
|
75
|
+
const required = requiredArtifactsForLevel(options.level, options.skillRequiredArtifacts);
|
|
76
|
+
return {
|
|
77
|
+
complete: false,
|
|
78
|
+
required,
|
|
79
|
+
missing: required,
|
|
80
|
+
incomplete: [],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const projectDir = resolve(options.projectDir ?? process.cwd());
|
|
84
|
+
const dir = isAbsolute(options.artifactsDir) ? options.artifactsDir : resolve(projectDir, options.artifactsDir);
|
|
85
|
+
const required = requiredArtifactsForLevel(options.level, options.skillRequiredArtifacts);
|
|
86
|
+
const missing = [];
|
|
87
|
+
const incomplete = [];
|
|
88
|
+
for (const file of required) {
|
|
89
|
+
const path = join(dir, file);
|
|
90
|
+
if (!existsSync(path)) {
|
|
91
|
+
missing.push(file);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const reason = incompleteReason(file, readFileSync(path, 'utf-8'));
|
|
95
|
+
if (reason)
|
|
96
|
+
incomplete.push({ file, reason });
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
complete: missing.length === 0 && incomplete.length === 0,
|
|
100
|
+
artifactsDir: dir,
|
|
101
|
+
required,
|
|
102
|
+
missing,
|
|
103
|
+
incomplete,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function verificationRunMarkdown(options) {
|
|
107
|
+
const rows = options.gateResults.flatMap(result => (result.evidenceItems ?? []).map(item => {
|
|
108
|
+
const command = item.command ?? item.label;
|
|
109
|
+
const resultText = item.passed ? 'PASS' : 'FAIL';
|
|
110
|
+
const notes = [
|
|
111
|
+
`gate=${result.gate}`,
|
|
112
|
+
item.cwd ? `cwd=${item.cwd}` : '',
|
|
113
|
+
typeof item.exitCode === 'number' ? `exit=${item.exitCode}` : '',
|
|
114
|
+
item.outputHash ? `hash=${item.outputHash}` : '',
|
|
115
|
+
].filter(Boolean).join('; ');
|
|
116
|
+
return `| ${escapeCell(command)} | ${resultText} | ${escapeCell(notes || item.detail)} |`;
|
|
117
|
+
}));
|
|
118
|
+
return `
|
|
119
|
+
## SCALE Verification Run - ${new Date().toISOString()}
|
|
120
|
+
|
|
121
|
+
Profile: ${options.profile}
|
|
122
|
+
Services: ${options.services.length ? options.services.join(', ') : 'root'}
|
|
123
|
+
Final Status: ${options.passed ? 'passed' : 'failed'}
|
|
124
|
+
|
|
125
|
+
| Command | Result | Notes |
|
|
126
|
+
| --- | --- | --- |
|
|
127
|
+
${rows.length ? rows.join('\n') : '| no command evidence | FAIL | no evidence items recorded |'}
|
|
128
|
+
`;
|
|
129
|
+
}
|
|
130
|
+
function readTemplate(projectDir, name) {
|
|
131
|
+
const templatePath = join(projectDir, 'docs', 'workflow', 'templates', name);
|
|
132
|
+
if (existsSync(templatePath))
|
|
133
|
+
return readFileSync(templatePath, 'utf-8');
|
|
134
|
+
return isGovernanceTemplateName(name)
|
|
135
|
+
? governanceTemplateContent(name)
|
|
136
|
+
: `# ${name}\n\n## Evidence\n\n\n`;
|
|
137
|
+
}
|
|
138
|
+
function requiredArtifactsForLevel(level, skillRequiredArtifacts = []) {
|
|
139
|
+
if (level === 'S')
|
|
140
|
+
return [];
|
|
141
|
+
const required = ['explore.md', 'skill-plan.md', 'plan.md', 'verification.md', 'review.md', 'summary.md'];
|
|
142
|
+
if (level === 'L' || level === 'CRITICAL')
|
|
143
|
+
required.splice(1, 0, 'mini-prd.md');
|
|
144
|
+
return unique([...required, ...skillRequiredArtifacts]);
|
|
145
|
+
}
|
|
146
|
+
function incompleteReason(file, content) {
|
|
147
|
+
if (file === 'skill-plan.md' && /## Detected Intents[\s\S]+## Required Skills/i.test(content)) {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
if (file === 'verification.md' && /SCALE Verification Run|Final Status:\s*(passed|failed)|\|\s*[^|\s][^|]*\|\s*(PASS|FAIL)/i.test(content)) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
const substantive = substantiveLines(content);
|
|
154
|
+
const minimumLines = file === 'mini-prd.md' ? 3 : 2;
|
|
155
|
+
if (substantive.length < minimumLines) {
|
|
156
|
+
return `contains only template placeholders (${substantive.length}/${minimumLines} substantive lines)`;
|
|
157
|
+
}
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
function substantiveLines(content) {
|
|
161
|
+
return content
|
|
162
|
+
.split(/\r?\n/)
|
|
163
|
+
.map(line => line.trim())
|
|
164
|
+
.filter(line => line.length > 0)
|
|
165
|
+
.filter(line => !line.startsWith('#'))
|
|
166
|
+
.filter(line => !line.startsWith('**Task ID**:'))
|
|
167
|
+
.filter(line => !line.startsWith('**Task**:'))
|
|
168
|
+
.filter(line => !line.startsWith('**Level**:'))
|
|
169
|
+
.filter(line => !line.startsWith('**Services**:'))
|
|
170
|
+
.filter(line => !line.startsWith('**Created**:'))
|
|
171
|
+
.filter(line => !/^\|?[\s:-]+\|[\s|:-]*$/.test(line))
|
|
172
|
+
.filter(line => !/^\|\s*\|/.test(line))
|
|
173
|
+
.filter(line => !/^[-*]\s*(\[ \])?\s*$/.test(line))
|
|
174
|
+
.filter(line => !/^\d+\.\s*$/.test(line))
|
|
175
|
+
.filter(line => !/^\*Generated by SCALE Engine/i.test(line));
|
|
176
|
+
}
|
|
177
|
+
function injectTaskMetadata(template, options) {
|
|
178
|
+
const metadata = [
|
|
179
|
+
`**Task ID**: ${options.taskId}`,
|
|
180
|
+
`**Task**: ${options.taskName}`,
|
|
181
|
+
`**Level**: ${options.level}`,
|
|
182
|
+
`**Services**: ${options.services?.length ? options.services.join(', ') : 'unspecified'}`,
|
|
183
|
+
`**Created**: ${new Date().toISOString()}`,
|
|
184
|
+
'',
|
|
185
|
+
].join('\n');
|
|
186
|
+
return template.replace(/^(# .+\n)/, `$1\n${metadata}`);
|
|
187
|
+
}
|
|
188
|
+
function uniqueDirectory(projectDir, relativeDir, taskId) {
|
|
189
|
+
const preferred = resolve(projectDir, relativeDir);
|
|
190
|
+
if (!existsSync(preferred))
|
|
191
|
+
return preferred;
|
|
192
|
+
const summary = join(preferred, 'summary.md');
|
|
193
|
+
if (existsSync(summary) && readFileSync(summary, 'utf-8').includes(`**Task ID**: ${taskId}`)) {
|
|
194
|
+
return preferred;
|
|
195
|
+
}
|
|
196
|
+
return resolve(projectDir, `${relativeDir}-${slugify(taskId).slice(0, 16)}`);
|
|
197
|
+
}
|
|
198
|
+
function relativePath(projectDir, path) {
|
|
199
|
+
return path.startsWith(projectDir)
|
|
200
|
+
? path.slice(projectDir.length + 1).replace(/\\/g, '/')
|
|
201
|
+
: path.replace(/\\/g, '/');
|
|
202
|
+
}
|
|
203
|
+
function currentDate() {
|
|
204
|
+
return new Date().toISOString().slice(0, 10);
|
|
205
|
+
}
|
|
206
|
+
function slugify(value) {
|
|
207
|
+
const slug = value
|
|
208
|
+
.toLowerCase()
|
|
209
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
210
|
+
.replace(/^-+|-+$/g, '')
|
|
211
|
+
.slice(0, 48);
|
|
212
|
+
return slug || 'task';
|
|
213
|
+
}
|
|
214
|
+
function escapeCell(value) {
|
|
215
|
+
return value.replace(/\|/g, '\\|').replace(/\r?\n/g, ' ');
|
|
216
|
+
}
|
|
217
|
+
function isGovernanceTemplateName(name) {
|
|
218
|
+
return [
|
|
219
|
+
'explore.md',
|
|
220
|
+
'mini-prd.md',
|
|
221
|
+
'skill-plan.md',
|
|
222
|
+
'ui-spec.md',
|
|
223
|
+
'visual-review.md',
|
|
224
|
+
'api-contract.md',
|
|
225
|
+
'security-review.md',
|
|
226
|
+
'db-change-plan.md',
|
|
227
|
+
'e2e-plan.md',
|
|
228
|
+
'plan.md',
|
|
229
|
+
'verification.md',
|
|
230
|
+
'review.md',
|
|
231
|
+
'summary.md',
|
|
232
|
+
].includes(name);
|
|
233
|
+
}
|
|
234
|
+
function unique(items) {
|
|
235
|
+
return [...new Set(items)];
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=TaskArtifactScaffolder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskArtifactScaffolder.js","sourceRoot":"","sources":["../../src/workflow/TaskArtifactScaffolder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export type MetricTaskLevel = 'M' | 'L' | 'CRITICAL';
|
|
2
|
+
export interface TaskMetricRecord {
|
|
3
|
+
date: string;
|
|
4
|
+
taskId: string;
|
|
5
|
+
taskName: string;
|
|
6
|
+
level: MetricTaskLevel;
|
|
7
|
+
services: string[];
|
|
8
|
+
filesChanged: number;
|
|
9
|
+
firstVerificationPass: boolean;
|
|
10
|
+
fixIterations: number;
|
|
11
|
+
reworkNeeded: boolean;
|
|
12
|
+
artifactComplete: boolean;
|
|
13
|
+
residualRisk: string;
|
|
14
|
+
finalGateStatus: 'passed' | 'failed' | 'blocked';
|
|
15
|
+
}
|
|
16
|
+
export interface TaskMetricSummary {
|
|
17
|
+
total: number;
|
|
18
|
+
firstPassRate: number;
|
|
19
|
+
averageFixIterations: number;
|
|
20
|
+
artifactCompletenessRate: number;
|
|
21
|
+
residualRiskClarityRate: number;
|
|
22
|
+
}
|
|
23
|
+
export interface VerificationMetricInput {
|
|
24
|
+
taskId: string;
|
|
25
|
+
taskName: string;
|
|
26
|
+
level: MetricTaskLevel;
|
|
27
|
+
services?: string[];
|
|
28
|
+
filesChanged?: number;
|
|
29
|
+
passed: boolean;
|
|
30
|
+
artifactComplete?: boolean;
|
|
31
|
+
residualRisk?: string;
|
|
32
|
+
finalGateStatus?: TaskMetricRecord['finalGateStatus'];
|
|
33
|
+
date?: string;
|
|
34
|
+
}
|
|
35
|
+
export declare class TaskMetricsStore {
|
|
36
|
+
private metricsDir;
|
|
37
|
+
private recordsPath;
|
|
38
|
+
constructor(scaleDir?: string);
|
|
39
|
+
append(record: TaskMetricRecord): void;
|
|
40
|
+
upsert(record: TaskMetricRecord): void;
|
|
41
|
+
recordVerification(input: VerificationMetricInput): TaskMetricRecord;
|
|
42
|
+
list(): TaskMetricRecord[];
|
|
43
|
+
findByTaskId(taskId: string): TaskMetricRecord | undefined;
|
|
44
|
+
summarize(): TaskMetricSummary;
|
|
45
|
+
toMarkdownRow(record: TaskMetricRecord): string;
|
|
46
|
+
writeMarkdownReport(projectDir?: string): string;
|
|
47
|
+
private renderGeneratedMarkdownSection;
|
|
48
|
+
private writeAll;
|
|
49
|
+
}
|
|
@@ -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'));
|
|
@@ -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,55 @@
|
|
|
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
|
+
}
|
|
36
|
+
export interface ResolvedVerificationProfile {
|
|
37
|
+
config: VerificationCommandConfig;
|
|
38
|
+
profileName: string;
|
|
39
|
+
service?: VerificationService;
|
|
40
|
+
matrix?: VerificationMatrix;
|
|
41
|
+
policy: VerificationPolicy;
|
|
42
|
+
warnings: string[];
|
|
43
|
+
}
|
|
44
|
+
export interface ResolvedVerificationTargets {
|
|
45
|
+
targets: ResolvedVerificationProfile[];
|
|
46
|
+
profileName: string;
|
|
47
|
+
matrix?: VerificationMatrix;
|
|
48
|
+
policy: VerificationPolicy;
|
|
49
|
+
warnings: string[];
|
|
50
|
+
}
|
|
51
|
+
export declare const DEFAULT_VERIFICATION_POLICY: VerificationPolicy;
|
|
52
|
+
export declare function loadVerificationMatrix(projectDir?: string, scaleDir?: string): VerificationMatrix | null;
|
|
53
|
+
export declare function resolveVerificationProfile(options?: ResolveVerificationProfileOptions): ResolvedVerificationProfile;
|
|
54
|
+
export declare function resolveVerificationTargets(options?: ResolveVerificationProfileOptions): ResolvedVerificationTargets;
|
|
55
|
+
export declare function resolveVerificationPolicy(matrix: VerificationMatrix | null | undefined): VerificationPolicy;
|