@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.
Files changed (116) hide show
  1. package/README.md +30 -2
  2. package/dist/adapters/ClaudeCodeAdapter.d.ts +1 -0
  3. package/dist/adapters/ClaudeCodeAdapter.js.map +1 -1
  4. package/dist/adapters/KiroAdapter.d.ts +14 -0
  5. package/dist/adapters/KiroAdapter.js +180 -0
  6. package/dist/adapters/KiroAdapter.js.map +1 -0
  7. package/dist/adapters/index.d.ts +1 -0
  8. package/dist/adapters/index.js +3 -0
  9. package/dist/adapters/index.js.map +1 -1
  10. package/dist/api/cli.js +396 -5
  11. package/dist/api/cli.js.map +1 -1
  12. package/dist/api/doctor.d.ts +12 -0
  13. package/dist/api/doctor.js +232 -5
  14. package/dist/api/doctor.js.map +1 -1
  15. package/dist/api/quickstart.d.ts +19 -1
  16. package/dist/api/quickstart.js +103 -2
  17. package/dist/api/quickstart.js.map +1 -1
  18. package/dist/artifact/types.d.ts +16 -2
  19. package/dist/artifact/types.js.map +1 -1
  20. package/dist/cli/phaseCommands.d.ts +61 -0
  21. package/dist/cli/phaseCommands.js +559 -39
  22. package/dist/cli/phaseCommands.js.map +1 -1
  23. package/dist/cli/vibeCommands.d.ts +44 -0
  24. package/dist/cli/vibeCommands.js +244 -0
  25. package/dist/cli/vibeCommands.js.map +1 -0
  26. package/dist/guardrails/detectors.d.ts +9 -0
  27. package/dist/guardrails/detectors.js +102 -0
  28. package/dist/guardrails/detectors.js.map +1 -1
  29. package/dist/hooks/HookGeneratorEnhanced.js +29 -0
  30. package/dist/hooks/HookGeneratorEnhanced.js.map +1 -1
  31. package/dist/hooks/WorkflowHooksManager.js +20 -1
  32. package/dist/hooks/WorkflowHooksManager.js.map +1 -1
  33. package/dist/index.d.ts +6 -0
  34. package/dist/index.js +4 -0
  35. package/dist/index.js.map +1 -1
  36. package/dist/output/BrandThemeLoader.d.ts +54 -0
  37. package/dist/output/BrandThemeLoader.js +340 -0
  38. package/dist/output/BrandThemeLoader.js.map +1 -0
  39. package/dist/output/HTMLDocumentRenderer.d.ts +83 -0
  40. package/dist/output/HTMLDocumentRenderer.js +717 -0
  41. package/dist/output/HTMLDocumentRenderer.js.map +1 -0
  42. package/dist/output/UIPrototypeRenderer.d.ts +61 -0
  43. package/dist/output/UIPrototypeRenderer.js +500 -0
  44. package/dist/output/UIPrototypeRenderer.js.map +1 -0
  45. package/dist/output/index.d.ts +6 -0
  46. package/dist/output/index.js +6 -0
  47. package/dist/output/index.js.map +1 -0
  48. package/dist/prompts/PhasePromptRegistry.d.ts +53 -0
  49. package/dist/prompts/PhasePromptRegistry.js +517 -0
  50. package/dist/prompts/PhasePromptRegistry.js.map +1 -0
  51. package/dist/skills/SkillDiscovery.js +2 -1
  52. package/dist/skills/SkillDiscovery.js.map +1 -1
  53. package/dist/skills/index.d.ts +1 -0
  54. package/dist/skills/index.js +1 -0
  55. package/dist/skills/index.js.map +1 -1
  56. package/dist/skills/routing/SkillGate.d.ts +11 -0
  57. package/dist/skills/routing/SkillGate.js +76 -0
  58. package/dist/skills/routing/SkillGate.js.map +1 -0
  59. package/dist/skills/routing/SkillPlanner.d.ts +8 -0
  60. package/dist/skills/routing/SkillPlanner.js +91 -0
  61. package/dist/skills/routing/SkillPlanner.js.map +1 -0
  62. package/dist/skills/routing/SkillPolicy.d.ts +6 -0
  63. package/dist/skills/routing/SkillPolicy.js +146 -0
  64. package/dist/skills/routing/SkillPolicy.js.map +1 -0
  65. package/dist/skills/routing/SkillRoutingTypes.d.ts +72 -0
  66. package/dist/skills/routing/SkillRoutingTypes.js +2 -0
  67. package/dist/skills/routing/SkillRoutingTypes.js.map +1 -0
  68. package/dist/skills/routing/TaskIntentClassifier.d.ts +6 -0
  69. package/dist/skills/routing/TaskIntentClassifier.js +79 -0
  70. package/dist/skills/routing/TaskIntentClassifier.js.map +1 -0
  71. package/dist/skills/routing/index.d.ts +5 -0
  72. package/dist/skills/routing/index.js +6 -0
  73. package/dist/skills/routing/index.js.map +1 -0
  74. package/dist/workflow/GovernanceTemplates.d.ts +12 -0
  75. package/dist/workflow/GovernanceTemplates.js +515 -0
  76. package/dist/workflow/GovernanceTemplates.js.map +1 -0
  77. package/dist/workflow/PhaseMarkerTracker.d.ts +63 -0
  78. package/dist/workflow/PhaseMarkerTracker.js +291 -0
  79. package/dist/workflow/PhaseMarkerTracker.js.map +1 -0
  80. package/dist/workflow/SessionStateTracker.d.ts +74 -0
  81. package/dist/workflow/SessionStateTracker.js +270 -0
  82. package/dist/workflow/SessionStateTracker.js.map +1 -0
  83. package/dist/workflow/TaskArtifactScaffolder.d.ts +47 -0
  84. package/dist/workflow/TaskArtifactScaffolder.js +237 -0
  85. package/dist/workflow/TaskArtifactScaffolder.js.map +1 -0
  86. package/dist/workflow/TaskMetricsStore.d.ts +49 -0
  87. package/dist/workflow/TaskMetricsStore.js +149 -0
  88. package/dist/workflow/TaskMetricsStore.js.map +1 -0
  89. package/dist/workflow/VerificationCommands.d.ts +2 -0
  90. package/dist/workflow/VerificationCommands.js +7 -4
  91. package/dist/workflow/VerificationCommands.js.map +1 -1
  92. package/dist/workflow/VerificationProfile.d.ts +55 -0
  93. package/dist/workflow/VerificationProfile.js +133 -0
  94. package/dist/workflow/VerificationProfile.js.map +1 -0
  95. package/dist/workflow/WorkflowArtifactWriter.d.ts +113 -0
  96. package/dist/workflow/WorkflowArtifactWriter.js +241 -0
  97. package/dist/workflow/WorkflowArtifactWriter.js.map +1 -0
  98. package/dist/workflow/WorkflowEngine.d.ts +20 -2
  99. package/dist/workflow/WorkflowEngine.js +37 -8
  100. package/dist/workflow/WorkflowEngine.js.map +1 -1
  101. package/dist/workflow/autonomous/AutonomousDevLoop.d.ts +88 -0
  102. package/dist/workflow/autonomous/AutonomousDevLoop.js +381 -0
  103. package/dist/workflow/autonomous/AutonomousDevLoop.js.map +1 -0
  104. package/dist/workflow/autonomous/WorklogManager.d.ts +50 -0
  105. package/dist/workflow/autonomous/WorklogManager.js +264 -0
  106. package/dist/workflow/autonomous/WorklogManager.js.map +1 -0
  107. package/dist/workflow/autonomous/index.d.ts +2 -0
  108. package/dist/workflow/autonomous/index.js +4 -0
  109. package/dist/workflow/autonomous/index.js.map +1 -0
  110. package/dist/workflow/gates/GateSystem.d.ts +12 -3
  111. package/dist/workflow/gates/GateSystem.js +185 -41
  112. package/dist/workflow/gates/GateSystem.js.map +1 -1
  113. package/dist/workflow/index.d.ts +7 -0
  114. package/dist/workflow/index.js +7 -0
  115. package/dist/workflow/index.js.map +1 -1
  116. package/package.json +3 -3
@@ -0,0 +1,133 @@
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
+ ...(profile?.commands ?? {}),
41
+ ...(service?.commands ?? {}),
42
+ };
43
+ return {
44
+ config: {
45
+ cwd,
46
+ build: commands.build,
47
+ lint: commands.lint,
48
+ test: commands.test,
49
+ coverage: commands.coverage,
50
+ },
51
+ profileName,
52
+ service,
53
+ matrix,
54
+ policy: resolveVerificationPolicy(matrix),
55
+ warnings,
56
+ };
57
+ }
58
+ export function resolveVerificationTargets(options = {}) {
59
+ const projectDir = resolve(options.projectDir ?? process.cwd());
60
+ const scaleDir = options.scaleDir ?? '.scale';
61
+ const matrix = loadVerificationMatrix(projectDir, scaleDir);
62
+ if (!matrix) {
63
+ const target = resolveVerificationProfile(options);
64
+ return {
65
+ targets: [target],
66
+ profileName: target.profileName,
67
+ policy: target.policy,
68
+ warnings: target.warnings,
69
+ };
70
+ }
71
+ const profileName = options.profile ?? matrix.defaultProfile ?? 'default';
72
+ const profile = matrix.profiles?.[profileName];
73
+ const serviceNames = selectServiceNames(matrix, profile, options.service);
74
+ if (serviceNames.length === 0) {
75
+ const target = resolveVerificationProfile({ ...options, profile: profileName, service: undefined });
76
+ return {
77
+ targets: [target],
78
+ profileName,
79
+ matrix,
80
+ policy: resolveVerificationPolicy(matrix),
81
+ warnings: target.warnings,
82
+ };
83
+ }
84
+ const targets = serviceNames.map(service => resolveVerificationProfile({
85
+ ...options,
86
+ profile: profileName,
87
+ service,
88
+ }));
89
+ return {
90
+ targets,
91
+ profileName,
92
+ matrix,
93
+ policy: resolveVerificationPolicy(matrix),
94
+ warnings: targets.flatMap(target => target.warnings),
95
+ };
96
+ }
97
+ export function resolveVerificationPolicy(matrix) {
98
+ const policy = matrix?.policy ?? {};
99
+ return {
100
+ ...DEFAULT_VERIFICATION_POLICY,
101
+ ...policy,
102
+ artifactGate: normalizeArtifactGate(policy.artifactGate) ?? DEFAULT_VERIFICATION_POLICY.artifactGate,
103
+ artifactGateLevels: normalizeArtifactGateLevels(policy.artifactGateLevels),
104
+ };
105
+ }
106
+ function selectServiceNames(matrix, profile, requestedService) {
107
+ if (requestedService && requestedService !== 'all')
108
+ return [requestedService];
109
+ if (requestedService === 'all') {
110
+ if (profile?.services?.length)
111
+ return profile.services;
112
+ return (matrix.services ?? [])
113
+ .filter(service => service.required !== false)
114
+ .map(service => service.name);
115
+ }
116
+ return profile?.services ?? [];
117
+ }
118
+ function verificationMatrixPath(projectDir, scaleDir) {
119
+ const root = isAbsolute(scaleDir) ? scaleDir : join(projectDir, scaleDir);
120
+ return join(root, 'verification.json');
121
+ }
122
+ function normalizeArtifactGate(value) {
123
+ if (value === 'off' || value === 'warn' || value === 'block')
124
+ return value;
125
+ return undefined;
126
+ }
127
+ function normalizeArtifactGateLevels(value) {
128
+ if (!Array.isArray(value))
129
+ return DEFAULT_VERIFICATION_POLICY.artifactGateLevels ?? ['M', 'L', 'CRITICAL'];
130
+ const levels = value.filter((level) => level === 'M' || level === 'L' || level === 'CRITICAL');
131
+ return levels.length > 0 ? levels : DEFAULT_VERIFICATION_POLICY.artifactGateLevels ?? ['M', 'L', 'CRITICAL'];
132
+ }
133
+ //# 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
+ }
@@ -0,0 +1,241 @@
1
+ // SCALE Engine — Workflow Artifact Writer
2
+ // 将工作流各阶段结果写入标准化 JSON 文件,供 Gate 系统验证
3
+ // 设计参考:工作流优化方案 — "内容 + 执行 + 检查" 三者闭环
4
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync, unlinkSync } from 'node:fs';
5
+ import { join } from 'node:path';
6
+ import { logger } from '../core/logger.js';
7
+ // ============================================================================
8
+ // Artifact Writer
9
+ // ============================================================================
10
+ export class WorkflowArtifactWriter {
11
+ constructor(scaleDir = '.scale') {
12
+ this.stateDir = join(scaleDir, 'state');
13
+ }
14
+ // ─────────────────────────────────────────────────────────────
15
+ // Ensure directory
16
+ // ─────────────────────────────────────────────────────────────
17
+ ensureDir() {
18
+ if (!existsSync(this.stateDir)) {
19
+ mkdirSync(this.stateDir, { recursive: true });
20
+ }
21
+ }
22
+ // ─────────────────────────────────────────────────────────────
23
+ // Explore Artifact
24
+ // ─────────────────────────────────────────────────────────────
25
+ /** Write explore result to .scale/state/explore.json */
26
+ writeExploreResult(result) {
27
+ this.ensureDir();
28
+ const filePath = join(this.stateDir, 'explore.json');
29
+ writeFileSync(filePath, JSON.stringify(result, null, 2), 'utf-8');
30
+ this.updateCurrentState({
31
+ phase: 'explore',
32
+ exploredFiles: result.files,
33
+ fileCount: result.fileCount,
34
+ mainContradiction: result.mainContradiction,
35
+ });
36
+ logger.info({ files: result.fileCount, contradiction: result.mainContradiction }, 'Explore artifact written');
37
+ }
38
+ /** Read explore artifact from .scale/state/explore.json */
39
+ readExploreResult() {
40
+ return this.readJson(join(this.stateDir, 'explore.json'));
41
+ }
42
+ /** Check if explore artifact exists and is valid */
43
+ hasValidExploreResult(minFiles = 3) {
44
+ const artifact = this.readExploreResult();
45
+ if (!artifact)
46
+ return false;
47
+ return artifact.fileCount >= minFiles && artifact.mainContradiction.length > 0;
48
+ }
49
+ // ─────────────────────────────────────────────────────────────
50
+ // Plan Artifact
51
+ // ─────────────────────────────────────────────────────────────
52
+ /** Write plan result to .scale/state/plan-{planId}.json */
53
+ writePlanResult(result) {
54
+ this.ensureDir();
55
+ const filePath = join(this.stateDir, `plan-${result.planId}.json`);
56
+ writeFileSync(filePath, JSON.stringify(result, null, 2), 'utf-8');
57
+ this.updateCurrentState({
58
+ phase: 'plan',
59
+ lastSpecId: result.specId || undefined,
60
+ lastPlanId: result.planId,
61
+ });
62
+ logger.info({ planId: result.planId, verdict: result.verdict }, 'Plan artifact written');
63
+ }
64
+ /** Read plan artifact by ID */
65
+ readPlanResult(planId) {
66
+ return this.readJson(join(this.stateDir, `plan-${planId}.json`));
67
+ }
68
+ /** Read the most recent plan artifact */
69
+ readLatestPlanResult() {
70
+ const planFiles = this.listFiles('plan-');
71
+ if (planFiles.length === 0)
72
+ return null;
73
+ // Sort by timestamp in filename, take latest
74
+ const sorted = planFiles.sort().reverse();
75
+ return this.readJson(join(this.stateDir, sorted[0]));
76
+ }
77
+ /** Check if a valid plan artifact exists */
78
+ hasValidPlanResult() {
79
+ const artifact = this.readLatestPlanResult();
80
+ if (!artifact)
81
+ return false;
82
+ return artifact.hasBoundaryAnalysis && artifact.hasRollbackStrategy;
83
+ }
84
+ // ─────────────────────────────────────────────────────────────
85
+ // TDD Evidence
86
+ // ─────────────────────────────────────────────────────────────
87
+ /** Write TDD evidence to .scale/state/tdd-{taskId}.json */
88
+ writeTDDEvidence(evidence) {
89
+ this.ensureDir();
90
+ const filePath = join(this.stateDir, `tdd-${evidence.taskId}.json`);
91
+ writeFileSync(filePath, JSON.stringify(evidence, null, 2), 'utf-8');
92
+ this.updateCurrentState({
93
+ phase: 'verify',
94
+ lastTaskId: evidence.taskId,
95
+ });
96
+ logger.info({ taskId: evidence.taskId }, 'TDD evidence written');
97
+ }
98
+ /** Read TDD evidence by task ID */
99
+ readTDDEvidence(taskId) {
100
+ return this.readJson(join(this.stateDir, `tdd-${taskId}.json`));
101
+ }
102
+ /** Read the most recent TDD evidence */
103
+ readLatestTDDEvidence() {
104
+ const tddFiles = this.listFiles('tdd-');
105
+ if (tddFiles.length === 0)
106
+ return null;
107
+ const sorted = tddFiles.sort().reverse();
108
+ return this.readJson(join(this.stateDir, sorted[0]));
109
+ }
110
+ /** Check if valid TDD evidence exists for a task */
111
+ hasValidTDDEvidence(taskId) {
112
+ const artifact = taskId
113
+ ? this.readTDDEvidence(taskId)
114
+ : this.readLatestTDDEvidence();
115
+ if (!artifact)
116
+ return false;
117
+ return artifact.red && artifact.green && artifact.refactor && artifact.testFirst;
118
+ }
119
+ // ─────────────────────────────────────────────────────────────
120
+ // Checkpoint
121
+ // ─────────────────────────────────────────────────────────────
122
+ /** Write checkpoint to .scale/state/checkpoint.json */
123
+ writeCheckpoint(data) {
124
+ this.ensureDir();
125
+ const filePath = join(this.stateDir, 'checkpoint.json');
126
+ writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
127
+ if (this.isWorkflowPhase(data.phase)) {
128
+ this.updateCurrentState({ phase: data.phase });
129
+ }
130
+ logger.info({ phase: data.phase }, 'Checkpoint written');
131
+ }
132
+ /** Read checkpoint */
133
+ readCheckpoint() {
134
+ return this.readJson(join(this.stateDir, 'checkpoint.json'));
135
+ }
136
+ // ─────────────────────────────────────────────────────────────
137
+ // Generic Helpers
138
+ // ─────────────────────────────────────────────────────────────
139
+ /** Clear all artifacts (for testing or reset) */
140
+ clearAll() {
141
+ if (!existsSync(this.stateDir))
142
+ return;
143
+ const files = readdirSync(this.stateDir);
144
+ for (const file of files) {
145
+ if (file.endsWith('.json')) {
146
+ unlinkSync(join(this.stateDir, file));
147
+ }
148
+ }
149
+ logger.info('All workflow artifacts cleared');
150
+ }
151
+ /** Get state directory path */
152
+ getStateDir() { return this.stateDir; }
153
+ /** Write authoritative workflow state to .scale/state/current.json */
154
+ writeCurrentState(state) {
155
+ this.ensureDir();
156
+ const normalized = this.normalizeState(state);
157
+ writeFileSync(join(this.stateDir, 'current.json'), JSON.stringify(normalized, null, 2), 'utf-8');
158
+ }
159
+ /** Read authoritative workflow state from .scale/state/current.json */
160
+ readCurrentState() {
161
+ return this.readJson(join(this.stateDir, 'current.json'));
162
+ }
163
+ /** Merge a patch into .scale/state/current.json. */
164
+ updateCurrentState(patch) {
165
+ const current = this.readCurrentState();
166
+ const next = this.normalizeState({
167
+ ...(current ?? this.createDefaultState()),
168
+ ...patch,
169
+ updatedAt: patch.updatedAt ?? new Date().toISOString(),
170
+ });
171
+ this.writeCurrentState(next);
172
+ return next;
173
+ }
174
+ // ─────────────────────────────────────────────────────────────
175
+ // Private Helpers
176
+ // ─────────────────────────────────────────────────────────────
177
+ readJson(filePath) {
178
+ if (!existsSync(filePath))
179
+ return null;
180
+ try {
181
+ const content = readFileSync(filePath, 'utf-8');
182
+ return JSON.parse(content);
183
+ }
184
+ catch (e) {
185
+ logger.warn({ path: filePath, error: e.message }, 'Failed to read artifact');
186
+ return null;
187
+ }
188
+ }
189
+ listFiles(prefix) {
190
+ if (!existsSync(this.stateDir))
191
+ return [];
192
+ return readdirSync(this.stateDir)
193
+ .filter(f => f.startsWith(prefix) && f.endsWith('.json'));
194
+ }
195
+ createDefaultState() {
196
+ return {
197
+ schemaVersion: 1,
198
+ taskId: `task-${Date.now()}`,
199
+ level: 'M',
200
+ phase: 'define',
201
+ exploredFiles: [],
202
+ fileCount: 0,
203
+ mainContradiction: '',
204
+ completedGates: [],
205
+ openTasks: [],
206
+ filesModified: [],
207
+ updatedAt: new Date().toISOString(),
208
+ };
209
+ }
210
+ normalizeState(state) {
211
+ return {
212
+ schemaVersion: 1,
213
+ taskId: state.taskId || `task-${Date.now()}`,
214
+ level: state.level ?? 'M',
215
+ phase: state.phase ?? 'define',
216
+ artifactsDir: state.artifactsDir,
217
+ exploredFiles: state.exploredFiles ?? [],
218
+ fileCount: state.fileCount ?? state.exploredFiles?.length ?? 0,
219
+ mainContradiction: state.mainContradiction ?? '',
220
+ completedGates: state.completedGates ?? [],
221
+ openTasks: state.openTasks ?? [],
222
+ filesModified: state.filesModified ?? [],
223
+ skillIntents: state.skillIntents ?? [],
224
+ skillRoutingMode: state.skillRoutingMode,
225
+ skillPlanRequired: state.skillPlanRequired,
226
+ skillPlanPath: state.skillPlanPath,
227
+ requiredSkills: state.requiredSkills ?? [],
228
+ recommendedSkills: state.recommendedSkills ?? [],
229
+ requiredSkillArtifacts: state.requiredSkillArtifacts ?? [],
230
+ requiredSkillVerification: state.requiredSkillVerification ?? [],
231
+ lastSpecId: state.lastSpecId,
232
+ lastPlanId: state.lastPlanId,
233
+ lastTaskId: state.lastTaskId,
234
+ updatedAt: state.updatedAt ?? new Date().toISOString(),
235
+ };
236
+ }
237
+ isWorkflowPhase(phase) {
238
+ return ['define', 'explore', 'plan', 'build', 'verify', 'review', 'ship', 'done'].includes(phase);
239
+ }
240
+ }
241
+ //# sourceMappingURL=WorkflowArtifactWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowArtifactWriter.js","sourceRoot":"","sources":["../../src/workflow/WorkflowArtifactWriter.ts"],"names":[],"mappings":"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"}
@@ -9,12 +9,28 @@ import { SocraticQuestioner } from './cognitive/SocraticQuestioner.js';
9
9
  import { RalphEngine, PRDManager } from './execution/RalphEngine.js';
10
10
  import { UltraworkEngine } from './execution/UltraworkEngine.js';
11
11
  import { KarpathyEvaluator } from './quality/KarpathyEvaluator.js';
12
+ import { WorkflowArtifactWriter } from './WorkflowArtifactWriter.js';
12
13
  import type { PRDDocument, UserStory, TaskDefinition, SocraticSession } from './types.js';
13
14
  export interface WorkflowEngineConfig {
14
15
  eventBus: IEventBus;
15
16
  capabilityRegistry?: ICapabilityRegistry;
16
17
  skillRegistry?: ISkillRegistry;
17
18
  verificationCommands?: VerificationCommandConfig;
19
+ scaleDir?: string;
20
+ }
21
+ export interface ExploreOptions {
22
+ files?: string[];
23
+ mainContradiction?: string;
24
+ persistArtifact?: boolean;
25
+ runGate?: boolean;
26
+ }
27
+ export interface PlanOptions {
28
+ planId?: string;
29
+ specId?: string;
30
+ rollbackStrategy?: string;
31
+ modules?: string[];
32
+ persistArtifact?: boolean;
33
+ runGate?: boolean;
18
34
  }
19
35
  export declare class WorkflowEngine {
20
36
  private eventBus;
@@ -29,15 +45,16 @@ export declare class WorkflowEngine {
29
45
  private prdManager;
30
46
  private modelRouter;
31
47
  private karpathyEvaluator;
48
+ private artifactWriter;
32
49
  constructor(config: WorkflowEngineConfig);
33
- explore(requirement: string): Promise<{
50
+ explore(requirement: string, options?: ExploreOptions): Promise<{
34
51
  ambiguityScore: number;
35
52
  gateResult: unknown;
36
53
  socraticSession?: SocraticSession;
37
54
  }>;
38
55
  refineRequirement(session: SocraticSession, questionId: string, answer: string): SocraticSession;
39
56
  getNextQuestion(session: SocraticSession): import('./types.js').SocraticQuestion | null;
40
- plan(requirement: string): Promise<unknown>;
57
+ plan(requirement: string, options?: PlanOptions): Promise<unknown>;
41
58
  build(tasks: TaskDefinition[]): Promise<Map<string, unknown>>;
42
59
  verify(commandOverrides?: VerificationCommandConfig): Promise<import('./types.js').GateResult[]>;
43
60
  executePRD(title: string, stories: UserStory[]): Promise<PRDDocument>;
@@ -59,4 +76,5 @@ export declare class WorkflowEngine {
59
76
  getUltraworkEngine(): UltraworkEngine;
60
77
  getPRDManager(): PRDManager;
61
78
  getKarpathyEvaluator(): KarpathyEvaluator;
79
+ getArtifactWriter(): WorkflowArtifactWriter;
62
80
  }
@@ -7,13 +7,17 @@ import { SocraticQuestioner } from './cognitive/SocraticQuestioner.js';
7
7
  import { RalphEngine, PRDManager } from './execution/RalphEngine.js';
8
8
  import { UltraworkEngine, ModelRouter } from './execution/UltraworkEngine.js';
9
9
  import { KarpathyEvaluator } from './quality/KarpathyEvaluator.js';
10
+ import { WorkflowArtifactWriter } from './WorkflowArtifactWriter.js';
10
11
  export class WorkflowEngine {
11
12
  constructor(config) {
12
13
  this.eventBus = config.eventBus;
13
14
  this.capabilityRegistry = config.capabilityRegistry;
14
15
  this.skillRegistry = config.skillRegistry;
16
+ // Initialize artifact writer (shared with GateSystem)
17
+ const scaleDir = config.scaleDir ?? '.scale';
18
+ this.artifactWriter = new WorkflowArtifactWriter(scaleDir);
15
19
  // Initialize workflow modules
16
- this.gateSystem = new GateSystem(this.eventBus, config.verificationCommands);
20
+ this.gateSystem = new GateSystem(this.eventBus, config.verificationCommands, this.artifactWriter);
17
21
  this.ambiguityScorer = new AmbiguityScorer();
18
22
  this.consensusPlanner = new ConsensusPlanner(this.eventBus);
19
23
  this.socraticQuestioner = new SocraticQuestioner(this.eventBus);
@@ -24,9 +28,7 @@ export class WorkflowEngine {
24
28
  this.karpathyEvaluator = new KarpathyEvaluator();
25
29
  }
26
30
  // Phase 1: Exploration with Gate G1
27
- async explore(requirement) {
28
- // G1: Exploration gate
29
- const gateResult = await this.gateSystem.executeGate('G1');
31
+ async explore(requirement, options = {}) {
30
32
  // Analyze requirement ambiguity
31
33
  const ambiguityResult = this.ambiguityScorer.analyzeRequirement(requirement);
32
34
  // If ambiguity > 20%, start Socratic session
@@ -34,6 +36,19 @@ export class WorkflowEngine {
34
36
  if (ambiguityResult.requiresQuestioning) {
35
37
  socraticSession = this.socraticQuestioner.startSession(requirement, ambiguityResult);
36
38
  }
39
+ const files = options.files ?? [];
40
+ const mainContradiction = options.mainContradiction ?? '';
41
+ if (options.persistArtifact !== false) {
42
+ this.artifactWriter.writeExploreResult({
43
+ timestamp: new Date().toISOString(),
44
+ files,
45
+ fileCount: files.length,
46
+ mainContradiction,
47
+ ambiguityScore: ambiguityResult.totalScore,
48
+ socraticCompleted: !ambiguityResult.requiresQuestioning
49
+ });
50
+ }
51
+ const gateResult = options.runGate === false ? undefined : await this.gateSystem.executeGate('G1');
37
52
  return {
38
53
  ambiguityScore: ambiguityResult.totalScore,
39
54
  gateResult,
@@ -60,11 +75,24 @@ export class WorkflowEngine {
60
75
  return this.socraticQuestioner.askNextQuestion(session);
61
76
  }
62
77
  // Phase 2: Planning with Consensus
63
- async plan(requirement) {
78
+ async plan(requirement, options = {}) {
64
79
  // Run consensus planner
65
80
  const consensusResult = await this.consensusPlanner.execute(requirement);
66
- // G2: Planning gate (if L-level task)
67
- if (consensusResult.viableOptions.length > 1) {
81
+ const planId = options.planId ?? `engine-${Date.now()}`;
82
+ if (options.persistArtifact !== false) {
83
+ this.artifactWriter.writePlanResult({
84
+ timestamp: new Date().toISOString(),
85
+ planId,
86
+ specId: options.specId ?? '',
87
+ hasBoundaryAnalysis: consensusResult.viableOptions.length > 1,
88
+ hasExceptionHandling: consensusResult.preMortem?.rootCauses?.length > 0,
89
+ hasRollbackStrategy: Boolean(options.rollbackStrategy),
90
+ modules: options.modules ?? [],
91
+ consensusRounds: consensusResult.iterationCount,
92
+ verdict: consensusResult.verdict
93
+ });
94
+ }
95
+ if (options.runGate !== false && consensusResult.viableOptions.length > 1) {
68
96
  await this.gateSystem.executeGate('G2');
69
97
  }
70
98
  return consensusResult;
@@ -77,7 +105,7 @@ export class WorkflowEngine {
77
105
  // Phase 4: Verify with build and quality gates
78
106
  async verify(commandOverrides) {
79
107
  if (commandOverrides) {
80
- this.gateSystem = new GateSystem(this.eventBus, commandOverrides);
108
+ this.gateSystem = new GateSystem(this.eventBus, commandOverrides, this.artifactWriter);
81
109
  }
82
110
  const results = await this.gateSystem.executeAll(['G3', 'G0', 'G4', 'G5', 'G6', 'G7']);
83
111
  return results;
@@ -147,5 +175,6 @@ export class WorkflowEngine {
147
175
  getUltraworkEngine() { return this.ultraworkEngine; }
148
176
  getPRDManager() { return this.prdManager; }
149
177
  getKarpathyEvaluator() { return this.karpathyEvaluator; }
178
+ getArtifactWriter() { return this.artifactWriter; }
150
179
  }
151
180
  //# sourceMappingURL=WorkflowEngine.js.map