@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.
Files changed (157) hide show
  1. package/dist/adapters/AiderAdapter.js +1 -1
  2. package/dist/adapters/AiderAdapter.js.map +1 -1
  3. package/dist/adapters/ClaudeCodeAdapter.d.ts +1 -0
  4. package/dist/adapters/ClaudeCodeAdapter.js +5 -3
  5. package/dist/adapters/ClaudeCodeAdapter.js.map +1 -1
  6. package/dist/adapters/CodexAdapter.js +1 -1
  7. package/dist/adapters/CodexAdapter.js.map +1 -1
  8. package/dist/adapters/CursorAdapter.js +1 -1
  9. package/dist/adapters/CursorAdapter.js.map +1 -1
  10. package/dist/adapters/DeepSeekTuiAdapter.js +5 -3
  11. package/dist/adapters/DeepSeekTuiAdapter.js.map +1 -1
  12. package/dist/adapters/DoubaoAdapter.js +1 -1
  13. package/dist/adapters/DoubaoAdapter.js.map +1 -1
  14. package/dist/adapters/GeminiAdapter.js +1 -1
  15. package/dist/adapters/GeminiAdapter.js.map +1 -1
  16. package/dist/adapters/HermesAdapter.js +1 -1
  17. package/dist/adapters/HermesAdapter.js.map +1 -1
  18. package/dist/adapters/KimiAdapter.js +1 -1
  19. package/dist/adapters/KimiAdapter.js.map +1 -1
  20. package/dist/adapters/KiroAdapter.d.ts +14 -0
  21. package/dist/adapters/KiroAdapter.js +180 -0
  22. package/dist/adapters/KiroAdapter.js.map +1 -0
  23. package/dist/adapters/OpenClawAdapter.js +1 -1
  24. package/dist/adapters/OpenClawAdapter.js.map +1 -1
  25. package/dist/adapters/OpenCodeAdapter.js +1 -1
  26. package/dist/adapters/OpenCodeAdapter.js.map +1 -1
  27. package/dist/adapters/QCoderAdapter.js +1 -1
  28. package/dist/adapters/QCoderAdapter.js.map +1 -1
  29. package/dist/adapters/TraeAdapter.js +1 -1
  30. package/dist/adapters/TraeAdapter.js.map +1 -1
  31. package/dist/adapters/VSCAdapter.js +1 -1
  32. package/dist/adapters/VSCAdapter.js.map +1 -1
  33. package/dist/adapters/WindsurfAdapter.js +1 -1
  34. package/dist/adapters/WindsurfAdapter.js.map +1 -1
  35. package/dist/adapters/WorkBuddyAdapter.js +1 -1
  36. package/dist/adapters/WorkBuddyAdapter.js.map +1 -1
  37. package/dist/adapters/index.d.ts +1 -0
  38. package/dist/adapters/index.js +3 -0
  39. package/dist/adapters/index.js.map +1 -1
  40. package/dist/api/cli.js +690 -9
  41. package/dist/api/cli.js.map +1 -1
  42. package/dist/api/doctor.d.ts +13 -0
  43. package/dist/api/doctor.js +261 -5
  44. package/dist/api/doctor.js.map +1 -1
  45. package/dist/api/quickstart.d.ts +20 -1
  46. package/dist/api/quickstart.js +104 -3
  47. package/dist/api/quickstart.js.map +1 -1
  48. package/dist/artifact/types.d.ts +16 -2
  49. package/dist/artifact/types.js.map +1 -1
  50. package/dist/cli/phaseCommands.d.ts +66 -0
  51. package/dist/cli/phaseCommands.js +695 -51
  52. package/dist/cli/phaseCommands.js.map +1 -1
  53. package/dist/guardrails/detectors.d.ts +9 -0
  54. package/dist/guardrails/detectors.js +102 -0
  55. package/dist/guardrails/detectors.js.map +1 -1
  56. package/dist/hooks/HookGeneratorEnhanced.js +29 -0
  57. package/dist/hooks/HookGeneratorEnhanced.js.map +1 -1
  58. package/dist/hooks/WorkflowHooksManager.js +20 -1
  59. package/dist/hooks/WorkflowHooksManager.js.map +1 -1
  60. package/dist/index.d.ts +6 -0
  61. package/dist/index.js +4 -0
  62. package/dist/index.js.map +1 -1
  63. package/dist/output/BrandThemeLoader.d.ts +54 -0
  64. package/dist/output/BrandThemeLoader.js +340 -0
  65. package/dist/output/BrandThemeLoader.js.map +1 -0
  66. package/dist/output/HTMLDocumentRenderer.d.ts +83 -0
  67. package/dist/output/HTMLDocumentRenderer.js +717 -0
  68. package/dist/output/HTMLDocumentRenderer.js.map +1 -0
  69. package/dist/output/UIPrototypeRenderer.d.ts +61 -0
  70. package/dist/output/UIPrototypeRenderer.js +500 -0
  71. package/dist/output/UIPrototypeRenderer.js.map +1 -0
  72. package/dist/output/index.d.ts +6 -0
  73. package/dist/output/index.js +6 -0
  74. package/dist/output/index.js.map +1 -0
  75. package/dist/skills/ExternalSkills.js +2 -0
  76. package/dist/skills/ExternalSkills.js.map +1 -1
  77. package/dist/skills/SkillCatalog.d.ts +13 -0
  78. package/dist/skills/SkillCatalog.js +184 -0
  79. package/dist/skills/SkillCatalog.js.map +1 -0
  80. package/dist/skills/SkillDiscovery.js +2 -1
  81. package/dist/skills/SkillDiscovery.js.map +1 -1
  82. package/dist/skills/SkillDoctor.d.ts +37 -0
  83. package/dist/skills/SkillDoctor.js +90 -0
  84. package/dist/skills/SkillDoctor.js.map +1 -0
  85. package/dist/skills/index.d.ts +2 -0
  86. package/dist/skills/index.js +2 -0
  87. package/dist/skills/index.js.map +1 -1
  88. package/dist/skills/routing/SkillGate.d.ts +12 -0
  89. package/dist/skills/routing/SkillGate.js +93 -0
  90. package/dist/skills/routing/SkillGate.js.map +1 -0
  91. package/dist/skills/routing/SkillPlanner.d.ts +8 -0
  92. package/dist/skills/routing/SkillPlanner.js +91 -0
  93. package/dist/skills/routing/SkillPlanner.js.map +1 -0
  94. package/dist/skills/routing/SkillPolicy.d.ts +6 -0
  95. package/dist/skills/routing/SkillPolicy.js +173 -0
  96. package/dist/skills/routing/SkillPolicy.js.map +1 -0
  97. package/dist/skills/routing/SkillRoutingTypes.d.ts +72 -0
  98. package/dist/skills/routing/SkillRoutingTypes.js +2 -0
  99. package/dist/skills/routing/SkillRoutingTypes.js.map +1 -0
  100. package/dist/skills/routing/TaskIntentClassifier.d.ts +6 -0
  101. package/dist/skills/routing/TaskIntentClassifier.js +79 -0
  102. package/dist/skills/routing/TaskIntentClassifier.js.map +1 -0
  103. package/dist/skills/routing/index.d.ts +5 -0
  104. package/dist/skills/routing/index.js +6 -0
  105. package/dist/skills/routing/index.js.map +1 -0
  106. package/dist/workflow/GovernanceLock.d.ts +35 -0
  107. package/dist/workflow/GovernanceLock.js +58 -0
  108. package/dist/workflow/GovernanceLock.js.map +1 -0
  109. package/dist/workflow/GovernanceTemplatePacks.d.ts +24 -0
  110. package/dist/workflow/GovernanceTemplatePacks.js +83 -0
  111. package/dist/workflow/GovernanceTemplatePacks.js.map +1 -0
  112. package/dist/workflow/GovernanceTemplates.d.ts +17 -0
  113. package/dist/workflow/GovernanceTemplates.js +686 -0
  114. package/dist/workflow/GovernanceTemplates.js.map +1 -0
  115. package/dist/workflow/PhaseMarkerTracker.d.ts +63 -0
  116. package/dist/workflow/PhaseMarkerTracker.js +291 -0
  117. package/dist/workflow/PhaseMarkerTracker.js.map +1 -0
  118. package/dist/workflow/SessionStateTracker.d.ts +74 -0
  119. package/dist/workflow/SessionStateTracker.js +270 -0
  120. package/dist/workflow/SessionStateTracker.js.map +1 -0
  121. package/dist/workflow/TaskArtifactScaffolder.d.ts +47 -0
  122. package/dist/workflow/TaskArtifactScaffolder.js +237 -0
  123. package/dist/workflow/TaskArtifactScaffolder.js.map +1 -0
  124. package/dist/workflow/TaskMetricsStore.d.ts +49 -0
  125. package/dist/workflow/TaskMetricsStore.js +149 -0
  126. package/dist/workflow/TaskMetricsStore.js.map +1 -0
  127. package/dist/workflow/VerificationCommands.d.ts +2 -0
  128. package/dist/workflow/VerificationCommands.js +8 -12
  129. package/dist/workflow/VerificationCommands.js.map +1 -1
  130. package/dist/workflow/VerificationProfile.d.ts +56 -0
  131. package/dist/workflow/VerificationProfile.js +170 -0
  132. package/dist/workflow/VerificationProfile.js.map +1 -0
  133. package/dist/workflow/WorkflowArtifactWriter.d.ts +113 -0
  134. package/dist/workflow/WorkflowArtifactWriter.js +241 -0
  135. package/dist/workflow/WorkflowArtifactWriter.js.map +1 -0
  136. package/dist/workflow/WorkflowEngine.d.ts +26 -5
  137. package/dist/workflow/WorkflowEngine.js +38 -9
  138. package/dist/workflow/WorkflowEngine.js.map +1 -1
  139. package/dist/workflow/WorkspaceLifecycle.d.ts +51 -0
  140. package/dist/workflow/WorkspaceLifecycle.js +259 -0
  141. package/dist/workflow/WorkspaceLifecycle.js.map +1 -0
  142. package/dist/workflow/autonomous/AutonomousDevLoop.d.ts +88 -0
  143. package/dist/workflow/autonomous/AutonomousDevLoop.js +381 -0
  144. package/dist/workflow/autonomous/AutonomousDevLoop.js.map +1 -0
  145. package/dist/workflow/autonomous/WorklogManager.d.ts +50 -0
  146. package/dist/workflow/autonomous/WorklogManager.js +264 -0
  147. package/dist/workflow/autonomous/WorklogManager.js.map +1 -0
  148. package/dist/workflow/autonomous/index.d.ts +2 -0
  149. package/dist/workflow/autonomous/index.js +4 -0
  150. package/dist/workflow/autonomous/index.js.map +1 -0
  151. package/dist/workflow/gates/GateSystem.d.ts +12 -3
  152. package/dist/workflow/gates/GateSystem.js +185 -41
  153. package/dist/workflow/gates/GateSystem.js.map +1 -1
  154. package/dist/workflow/index.d.ts +10 -0
  155. package/dist/workflow/index.js +10 -0
  156. package/dist/workflow/index.js.map +1 -1
  157. 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 neither "coverage" nor "test" script',
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":"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"}
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
+ }