@hongmaple0820/scale-engine 0.47.0 → 0.48.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.en.md +8 -2
- package/README.md +9 -3
- package/dist/api/cli.js +975 -6222
- package/dist/api/cli.js.map +1 -1
- package/dist/cli/artifactCrudCommands.d.ts +67 -0
- package/dist/cli/artifactCrudCommands.js +182 -0
- package/dist/cli/artifactCrudCommands.js.map +1 -0
- package/dist/cli/codegraphCommands.d.ts +1 -0
- package/dist/cli/codegraphCommands.js +241 -0
- package/dist/cli/codegraphCommands.js.map +1 -0
- package/dist/cli/contextCommands.d.ts +1 -0
- package/dist/cli/contextCommands.js +415 -0
- package/dist/cli/contextCommands.js.map +1 -0
- package/dist/cli/dependencyTddCommands.d.ts +92 -0
- package/dist/cli/dependencyTddCommands.js +174 -0
- package/dist/cli/dependencyTddCommands.js.map +1 -0
- package/dist/cli/diagnoseHuntCommands.d.ts +135 -0
- package/dist/cli/diagnoseHuntCommands.js +224 -0
- package/dist/cli/diagnoseHuntCommands.js.map +1 -0
- package/dist/cli/engineBootstrap.d.ts +39 -0
- package/dist/cli/engineBootstrap.js +129 -0
- package/dist/cli/engineBootstrap.js.map +1 -0
- package/dist/cli/evalCommands.d.ts +1 -0
- package/dist/cli/evalCommands.js +262 -0
- package/dist/cli/evalCommands.js.map +1 -0
- package/dist/cli/evolveDoctorCommands.d.ts +18 -0
- package/dist/cli/evolveDoctorCommands.js +59 -0
- package/dist/cli/evolveDoctorCommands.js.map +1 -0
- package/dist/cli/gateInlineCommands.d.ts +43 -0
- package/dist/cli/gateInlineCommands.js +74 -0
- package/dist/cli/gateInlineCommands.js.map +1 -0
- package/dist/cli/initConfigCommands.d.ts +138 -0
- package/dist/cli/initConfigCommands.js +602 -0
- package/dist/cli/initConfigCommands.js.map +1 -0
- package/dist/cli/metaGovernanceCommands.d.ts +11 -0
- package/dist/cli/metaGovernanceCommands.js +55 -0
- package/dist/cli/metaGovernanceCommands.js.map +1 -0
- package/dist/cli/runtimeSkillCommands.d.ts +6 -0
- package/dist/cli/runtimeSkillCommands.js +1515 -0
- package/dist/cli/runtimeSkillCommands.js.map +1 -0
- package/dist/cli/sessionCommands.d.ts +17 -0
- package/dist/cli/sessionCommands.js +38 -0
- package/dist/cli/sessionCommands.js.map +1 -0
- package/dist/cli/toolAgentCommands.d.ts +3 -0
- package/dist/cli/toolAgentCommands.js +441 -0
- package/dist/cli/toolAgentCommands.js.map +1 -0
- package/dist/cli/transitionCommands.d.ts +62 -0
- package/dist/cli/transitionCommands.js +174 -0
- package/dist/cli/transitionCommands.js.map +1 -0
- package/dist/cli/upgradeAssetsCommands.d.ts +44 -0
- package/dist/cli/upgradeAssetsCommands.js +933 -0
- package/dist/cli/upgradeAssetsCommands.js.map +1 -0
- package/dist/cli/workflowEvidenceCommands.d.ts +34 -0
- package/dist/cli/workflowEvidenceCommands.js +130 -0
- package/dist/cli/workflowEvidenceCommands.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// SCALE Engine — CLI Engine Bootstrap (shared singleton)
|
|
2
|
+
// All command modules import getEngine() from here instead of creating their own instances.
|
|
3
|
+
import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { isAbsolute, join } from 'node:path';
|
|
5
|
+
import { EventBus } from '../core/eventBus.js';
|
|
6
|
+
import { SQLiteArtifactStore } from '../artifact/sqliteStore.js';
|
|
7
|
+
import { FSM } from '../artifact/fsm.js';
|
|
8
|
+
import { registerAllFSMs } from '../artifact/fsmDefinitions.js';
|
|
9
|
+
import { Gateway } from '../guardrails/Gateway.js';
|
|
10
|
+
import { BruteRetryDetector, PrematureDoneDetector, BlameShiftDetector } from '../guardrails/detectors.js';
|
|
11
|
+
import { DangerousCommandDetector, SecretLeakDetector, RoleGateDetector, ScopeCreepDetector } from '../guardrails/advancedDetectors.js';
|
|
12
|
+
import { GraphifyKnowledgeBase } from '../knowledge/GraphifyKnowledgeBase.js';
|
|
13
|
+
import { ContextBuilder } from '../context/ContextBuilder.js';
|
|
14
|
+
import { FSMAgentBridge } from '../fsm/FSMAgentBridge.js';
|
|
15
|
+
import { CapabilityRegistry } from '../capabilities/CapabilityRegistry.js';
|
|
16
|
+
import { SkillRegistry } from '../skills/SkillRegistry.js';
|
|
17
|
+
import { registerCoreSkills } from '../skills/coreSkills.js';
|
|
18
|
+
import { registerExternalSkills } from '../skills/ExternalSkills.js';
|
|
19
|
+
import { WorkflowEngine } from '../workflow/WorkflowEngine.js';
|
|
20
|
+
import { generateConfigForProfile } from '../config/profiles.js';
|
|
21
|
+
export const SCALE_DIR = process.env.SCALE_DIR ?? '.scale';
|
|
22
|
+
export const PROJECT_DIR = process.env.SCALE_PROJECT_DIR ?? process.cwd();
|
|
23
|
+
export const DB_PATH = join(SCALE_DIR, 'scale.db');
|
|
24
|
+
export function ensureDir(dir) {
|
|
25
|
+
if (!existsSync(dir))
|
|
26
|
+
mkdirSync(dir, { recursive: true });
|
|
27
|
+
}
|
|
28
|
+
export function isTruthyFlag(value) {
|
|
29
|
+
return value === true || value === '' || value === 'true' || value === '1';
|
|
30
|
+
}
|
|
31
|
+
export function governanceModeFromScenario(scenario) {
|
|
32
|
+
if (scenario === 'critical')
|
|
33
|
+
return 'critical';
|
|
34
|
+
if (scenario === 'sandbox')
|
|
35
|
+
return 'minimal';
|
|
36
|
+
return 'standard';
|
|
37
|
+
}
|
|
38
|
+
export function profileFromScenario(scenario) {
|
|
39
|
+
if (scenario === 'sandbox')
|
|
40
|
+
return 'minimal';
|
|
41
|
+
if (scenario === 'critical')
|
|
42
|
+
return 'advanced';
|
|
43
|
+
return 'standard';
|
|
44
|
+
}
|
|
45
|
+
export function writeConfigYaml(projectDir, profileId, projectName, agents) {
|
|
46
|
+
const configPath = join(projectDir, '.scale', 'config.yaml');
|
|
47
|
+
const content = generateConfigForProfile(profileId, { name: projectName, agents });
|
|
48
|
+
writeFileSync(configPath, content, 'utf-8');
|
|
49
|
+
return configPath;
|
|
50
|
+
}
|
|
51
|
+
export function commandEvidence(command, exitCode, summary) {
|
|
52
|
+
if (exitCode === undefined || exitCode === null || exitCode === '')
|
|
53
|
+
return undefined;
|
|
54
|
+
const parsed = Number.parseInt(String(exitCode), 10);
|
|
55
|
+
if (Number.isNaN(parsed))
|
|
56
|
+
return undefined;
|
|
57
|
+
return {
|
|
58
|
+
command,
|
|
59
|
+
exitCode: parsed,
|
|
60
|
+
outputSummary: summary ? String(summary) : `Command exited ${parsed}`,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export function normalizePreflightProfile(value) {
|
|
64
|
+
const normalized = String(value ?? 'quick').trim().toLowerCase();
|
|
65
|
+
if (normalized === 'full' || normalized === 'ci')
|
|
66
|
+
return normalized;
|
|
67
|
+
return 'quick';
|
|
68
|
+
}
|
|
69
|
+
export function gatesForPreflightProfile(profile) {
|
|
70
|
+
const { preflightGateStages } = require('../workflow/GateCatalog.js');
|
|
71
|
+
return preflightGateStages(profile);
|
|
72
|
+
}
|
|
73
|
+
export function resolveScaleDirForProject(projectDir) {
|
|
74
|
+
return isAbsolute(SCALE_DIR) ? SCALE_DIR : join(projectDir, SCALE_DIR);
|
|
75
|
+
}
|
|
76
|
+
let _engine = null;
|
|
77
|
+
export function getEngine() {
|
|
78
|
+
if (!_engine)
|
|
79
|
+
_engine = createEngine();
|
|
80
|
+
return _engine;
|
|
81
|
+
}
|
|
82
|
+
function createEngine() {
|
|
83
|
+
ensureDir(SCALE_DIR);
|
|
84
|
+
const eventBus = new EventBus({ eventsDir: join(SCALE_DIR, 'events') });
|
|
85
|
+
const store = new SQLiteArtifactStore(eventBus, {
|
|
86
|
+
dbPath: DB_PATH,
|
|
87
|
+
artifactsDir: join(SCALE_DIR, 'artifacts'),
|
|
88
|
+
});
|
|
89
|
+
const fsm = new FSM(store, eventBus);
|
|
90
|
+
registerAllFSMs(fsm);
|
|
91
|
+
const gateway = new Gateway(eventBus);
|
|
92
|
+
const roleGate = new RoleGateDetector();
|
|
93
|
+
gateway.registerDetector(new DangerousCommandDetector(), 'preTool');
|
|
94
|
+
gateway.registerDetector(new SecretLeakDetector(), 'preTool');
|
|
95
|
+
gateway.registerDetector(roleGate, 'preTool');
|
|
96
|
+
gateway.registerDetector(new BruteRetryDetector(), 'preTool');
|
|
97
|
+
gateway.registerDetector(new ScopeCreepDetector(), 'preTool');
|
|
98
|
+
gateway.registerDetector(new PrematureDoneDetector(), 'beforeStop');
|
|
99
|
+
gateway.registerDetector(new BlameShiftDetector(), 'postTool');
|
|
100
|
+
const kb = new GraphifyKnowledgeBase(eventBus, { projectDir: PROJECT_DIR, scaleDir: SCALE_DIR });
|
|
101
|
+
const ctx = new ContextBuilder(store, kb, eventBus);
|
|
102
|
+
const fsmAgentBridge = new FSMAgentBridge(fsm, store);
|
|
103
|
+
const capabilityRegistry = new CapabilityRegistry(eventBus);
|
|
104
|
+
const skillRegistry = new SkillRegistry(eventBus);
|
|
105
|
+
registerCoreSkills(skillRegistry);
|
|
106
|
+
registerExternalSkills(skillRegistry, eventBus);
|
|
107
|
+
const workflowEngine = new WorkflowEngine({
|
|
108
|
+
eventBus,
|
|
109
|
+
capabilityRegistry,
|
|
110
|
+
skillRegistry,
|
|
111
|
+
scaleDir: SCALE_DIR,
|
|
112
|
+
});
|
|
113
|
+
return { eventBus, store, fsm, gateway, roleGate, kb, ctx, fsmAgentBridge, workflowEngine };
|
|
114
|
+
}
|
|
115
|
+
export function createVerificationWorkflowEngine(scaleDir) {
|
|
116
|
+
ensureDir(scaleDir);
|
|
117
|
+
const eventBus = new EventBus({ eventsDir: join(scaleDir, 'events') });
|
|
118
|
+
const capabilityRegistry = new CapabilityRegistry(eventBus);
|
|
119
|
+
const skillRegistry = new SkillRegistry(eventBus);
|
|
120
|
+
registerCoreSkills(skillRegistry);
|
|
121
|
+
registerExternalSkills(skillRegistry, eventBus);
|
|
122
|
+
return new WorkflowEngine({
|
|
123
|
+
eventBus,
|
|
124
|
+
capabilityRegistry,
|
|
125
|
+
skillRegistry,
|
|
126
|
+
scaleDir,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=engineBootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engineBootstrap.js","sourceRoot":"","sources":["../../src/cli/engineBootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const evalCommand: import("citty").CommandDef<import("citty").ArgsDef>;
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
// SCALE Engine — Eval CLI Commands
|
|
2
|
+
// Extracted from api/cli.ts: workflow eval baseline, failure replay, and comparison commands.
|
|
3
|
+
import { defineCommand } from 'citty';
|
|
4
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import { dirname, resolve } from 'node:path';
|
|
6
|
+
import { WorkflowEvalStore, compareWorkflowEvalRuns, renderWorkflowEvalReport, runWorkflowEvalSuite, } from '../eval/WorkflowEval.js';
|
|
7
|
+
import { PROJECT_DIR, isTruthyFlag, resolveScaleDirForProject } from './engineBootstrap.js';
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Helpers
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
function parseSinceDays(value) {
|
|
12
|
+
const text = String(value ?? '').trim().toLowerCase();
|
|
13
|
+
if (!text || text === 'all')
|
|
14
|
+
return undefined;
|
|
15
|
+
const match = text.match(/^(\d+)(d|day|days)?$/);
|
|
16
|
+
if (!match)
|
|
17
|
+
return undefined;
|
|
18
|
+
const days = Number.parseInt(match[1], 10);
|
|
19
|
+
return Number.isFinite(days) && days > 0 ? days : undefined;
|
|
20
|
+
}
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Sub-commands
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
const evalInit = defineCommand({
|
|
25
|
+
meta: { name: 'init', description: 'Create a lightweight workflow eval suite under .scale/evals' },
|
|
26
|
+
args: {
|
|
27
|
+
dir: { type: 'string', default: PROJECT_DIR, description: 'Project directory' },
|
|
28
|
+
suite: { type: 'string', default: 'workflow-baseline', description: 'Suite id' },
|
|
29
|
+
force: { type: 'boolean', default: false, description: 'Overwrite the existing suite file' },
|
|
30
|
+
json: { type: 'boolean', default: false },
|
|
31
|
+
},
|
|
32
|
+
run({ args }) {
|
|
33
|
+
const projectDir = resolve(String(args.dir ?? PROJECT_DIR));
|
|
34
|
+
const scaleDir = resolveScaleDirForProject(projectDir);
|
|
35
|
+
const store = new WorkflowEvalStore({
|
|
36
|
+
projectDir,
|
|
37
|
+
scaleDir,
|
|
38
|
+
});
|
|
39
|
+
const result = store.initSuite(String(args.suite ?? 'workflow-baseline'), isTruthyFlag(args.force));
|
|
40
|
+
if (args.json) {
|
|
41
|
+
console.log(JSON.stringify(result, null, 2));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
console.log(`SCALE Workflow Eval Suite: ${result.written ? 'written' : 'exists'}`);
|
|
45
|
+
console.log(` Suite: ${result.suite.id}`);
|
|
46
|
+
console.log(` Path: ${result.path}`);
|
|
47
|
+
console.log(` Cases: ${result.suite.cases.length}`);
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
const evalRun = defineCommand({
|
|
51
|
+
meta: { name: 'run', description: 'Run a workflow eval suite and preserve failure replay artifacts' },
|
|
52
|
+
args: {
|
|
53
|
+
dir: { type: 'string', default: PROJECT_DIR, description: 'Project directory' },
|
|
54
|
+
suite: { type: 'string', default: 'workflow-baseline', description: 'Suite id or JSON path' },
|
|
55
|
+
json: { type: 'boolean', default: false },
|
|
56
|
+
},
|
|
57
|
+
async run({ args }) {
|
|
58
|
+
const projectDir = resolve(String(args.dir ?? PROJECT_DIR));
|
|
59
|
+
const scaleDir = resolveScaleDirForProject(projectDir);
|
|
60
|
+
const result = await runWorkflowEvalSuite({
|
|
61
|
+
projectDir,
|
|
62
|
+
scaleDir,
|
|
63
|
+
suite: String(args.suite ?? 'workflow-baseline'),
|
|
64
|
+
});
|
|
65
|
+
if (args.json) {
|
|
66
|
+
console.log(JSON.stringify(result, null, 2));
|
|
67
|
+
if (!result.run.ok)
|
|
68
|
+
process.exitCode = 1;
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
console.log(`SCALE Workflow Eval: ${result.run.ok ? 'PASS' : 'FAIL'}`);
|
|
72
|
+
console.log(` Run: ${result.run.id}`);
|
|
73
|
+
console.log(` Suite: ${result.run.suiteId}`);
|
|
74
|
+
console.log(` Pass@1: ${(result.run.metrics.passAt1Rate * 100).toFixed(1)}%`);
|
|
75
|
+
console.log(` Pass@3: ${(result.run.metrics.passAt3Rate * 100).toFixed(1)}%`);
|
|
76
|
+
console.log(` Tool calls: ${result.run.metrics.totalToolCalls}`);
|
|
77
|
+
console.log(` Estimated tokens: ${result.run.metrics.estimatedTokens}`);
|
|
78
|
+
console.log(` Failures: ${result.run.metrics.failureReplayCount}`);
|
|
79
|
+
console.log(` Run path: ${result.runPath}`);
|
|
80
|
+
for (const failurePath of result.failurePaths)
|
|
81
|
+
console.log(` Failure replay: ${failurePath}`);
|
|
82
|
+
if (!result.run.ok)
|
|
83
|
+
process.exitCode = 1;
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
const evalCompare = defineCommand({
|
|
87
|
+
meta: { name: 'compare', description: 'Compare two workflow eval runs by pass rate, iterations, tool calls, and token estimate' },
|
|
88
|
+
args: {
|
|
89
|
+
dir: { type: 'string', default: PROJECT_DIR, description: 'Project directory' },
|
|
90
|
+
baseline: { type: 'string', required: true, description: 'Baseline run id or JSON path' },
|
|
91
|
+
candidate: { type: 'string', required: true, description: 'Candidate run id or JSON path' },
|
|
92
|
+
json: { type: 'boolean', default: false },
|
|
93
|
+
},
|
|
94
|
+
run({ args }) {
|
|
95
|
+
const projectDir = resolve(String(args.dir ?? PROJECT_DIR));
|
|
96
|
+
const scaleDir = resolveScaleDirForProject(projectDir);
|
|
97
|
+
const comparison = compareWorkflowEvalRuns({
|
|
98
|
+
projectDir,
|
|
99
|
+
scaleDir,
|
|
100
|
+
baseline: String(args.baseline),
|
|
101
|
+
candidate: String(args.candidate),
|
|
102
|
+
});
|
|
103
|
+
if (args.json) {
|
|
104
|
+
console.log(JSON.stringify(comparison, null, 2));
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
console.log(`SCALE Workflow Eval Compare: ${comparison.recommendation}`);
|
|
108
|
+
console.log(` Baseline: ${comparison.baseline.id}`);
|
|
109
|
+
console.log(` Candidate: ${comparison.candidate.id}`);
|
|
110
|
+
console.log(` Delta Pass@1: ${(comparison.delta.passAt1Rate * 100).toFixed(1)}%`);
|
|
111
|
+
console.log(` Delta Pass@3: ${(comparison.delta.passAt3Rate * 100).toFixed(1)}%`);
|
|
112
|
+
console.log(` Delta fix iterations: ${comparison.delta.averageFixIterations.toFixed(2)}`);
|
|
113
|
+
console.log(` Delta tool calls: ${comparison.delta.totalToolCalls}`);
|
|
114
|
+
console.log(` Delta estimated tokens: ${comparison.delta.estimatedTokens}`);
|
|
115
|
+
console.log(` Delta human corrections: ${comparison.delta.humanCorrections}`);
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
const evalReport = defineCommand({
|
|
119
|
+
meta: { name: 'report', description: 'Render a Markdown workflow eval report from a saved run' },
|
|
120
|
+
args: {
|
|
121
|
+
dir: { type: 'string', default: PROJECT_DIR, description: 'Project directory' },
|
|
122
|
+
run: { type: 'string', required: true, description: 'Run id or JSON path' },
|
|
123
|
+
output: { type: 'string', alias: 'o', description: 'Write report to a Markdown file' },
|
|
124
|
+
json: { type: 'boolean', default: false },
|
|
125
|
+
},
|
|
126
|
+
run({ args }) {
|
|
127
|
+
const projectDir = resolve(String(args.dir ?? PROJECT_DIR));
|
|
128
|
+
const scaleDir = resolveScaleDirForProject(projectDir);
|
|
129
|
+
const store = new WorkflowEvalStore({ projectDir, scaleDir });
|
|
130
|
+
const run = store.loadRun(String(args.run));
|
|
131
|
+
const markdown = renderWorkflowEvalReport(run);
|
|
132
|
+
const outputPath = args.output ? resolve(projectDir, String(args.output)) : undefined;
|
|
133
|
+
if (outputPath) {
|
|
134
|
+
mkdirSync(dirname(outputPath), { recursive: true });
|
|
135
|
+
writeFileSync(outputPath, markdown, 'utf-8');
|
|
136
|
+
}
|
|
137
|
+
if (args.json) {
|
|
138
|
+
console.log(JSON.stringify({ runId: run.id, outputPath, markdown }, null, 2));
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (outputPath)
|
|
142
|
+
console.log(`Workflow eval report written: ${outputPath}`);
|
|
143
|
+
else
|
|
144
|
+
console.log(markdown);
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
const evalFailures = defineCommand({
|
|
148
|
+
meta: { name: 'failures', description: 'List failure replay records for workflow improvement' },
|
|
149
|
+
args: {
|
|
150
|
+
dir: { type: 'string', default: PROJECT_DIR, description: 'Project directory' },
|
|
151
|
+
'task-id': { type: 'string', description: 'Filter by task/case id' },
|
|
152
|
+
since: { type: 'string', default: '30d', description: 'Window such as 30d; use all for no date filter' },
|
|
153
|
+
json: { type: 'boolean', default: false },
|
|
154
|
+
},
|
|
155
|
+
run({ args }) {
|
|
156
|
+
const projectDir = resolve(String(args.dir ?? PROJECT_DIR));
|
|
157
|
+
const scaleDir = resolveScaleDirForProject(projectDir);
|
|
158
|
+
const store = new WorkflowEvalStore({
|
|
159
|
+
projectDir,
|
|
160
|
+
scaleDir,
|
|
161
|
+
});
|
|
162
|
+
const failures = store.listFailures({
|
|
163
|
+
taskId: args['task-id'] ? String(args['task-id']) : undefined,
|
|
164
|
+
sinceDays: parseSinceDays(args.since),
|
|
165
|
+
});
|
|
166
|
+
if (args.json) {
|
|
167
|
+
console.log(JSON.stringify({ count: failures.length, failures }, null, 2));
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
console.log(`SCALE Failure Replays: ${failures.length}`);
|
|
171
|
+
for (const failure of failures) {
|
|
172
|
+
console.log(` [${failure.status}] ${failure.id} ${failure.category} task=${failure.taskId}`);
|
|
173
|
+
console.log(` prevention: ${failure.prevention}`);
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
const evalReplay = defineCommand({
|
|
178
|
+
meta: { name: 'replay', description: 'Show failure replay records by failure id or task id' },
|
|
179
|
+
args: {
|
|
180
|
+
id: { type: 'positional', description: 'Failure replay id' },
|
|
181
|
+
dir: { type: 'string', default: PROJECT_DIR, description: 'Project directory' },
|
|
182
|
+
'task-id': { type: 'string', description: 'Task/case id to replay' },
|
|
183
|
+
json: { type: 'boolean', default: false },
|
|
184
|
+
},
|
|
185
|
+
run({ args }) {
|
|
186
|
+
const projectDir = resolve(String(args.dir ?? PROJECT_DIR));
|
|
187
|
+
const scaleDir = resolveScaleDirForProject(projectDir);
|
|
188
|
+
const store = new WorkflowEvalStore({
|
|
189
|
+
projectDir,
|
|
190
|
+
scaleDir,
|
|
191
|
+
});
|
|
192
|
+
const failures = args.id
|
|
193
|
+
? [store.getFailure(String(args.id))].filter(Boolean)
|
|
194
|
+
: store.listFailures({ taskId: args['task-id'] ? String(args['task-id']) : undefined });
|
|
195
|
+
if (args.json) {
|
|
196
|
+
console.log(JSON.stringify({ count: failures.length, failures }, null, 2));
|
|
197
|
+
if (failures.length === 0)
|
|
198
|
+
process.exitCode = 1;
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
if (failures.length === 0) {
|
|
202
|
+
console.log('No failure replay records found.');
|
|
203
|
+
process.exitCode = 1;
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
for (const failure of failures) {
|
|
207
|
+
if (!failure)
|
|
208
|
+
continue;
|
|
209
|
+
console.log(`Failure Replay: ${failure.id}`);
|
|
210
|
+
console.log(` Task: ${failure.task}`);
|
|
211
|
+
console.log(` Category: ${failure.category}`);
|
|
212
|
+
console.log(` Phase: ${failure.phase}`);
|
|
213
|
+
console.log(` Wrong turn: ${failure.wrongTurn}`);
|
|
214
|
+
console.log(` Evidence: ${failure.evidence}`);
|
|
215
|
+
console.log(` Correction: ${failure.correction}`);
|
|
216
|
+
console.log(` Prevention: ${failure.prevention}`);
|
|
217
|
+
if (failure.replayCommand)
|
|
218
|
+
console.log(` Replay command: ${failure.replayCommand}`);
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
const evalPromoteFailure = defineCommand({
|
|
223
|
+
meta: { name: 'promote-failure', description: 'Promote a failure replay into a workflow improvement candidate' },
|
|
224
|
+
args: {
|
|
225
|
+
id: { type: 'positional', required: true, description: 'Failure replay id' },
|
|
226
|
+
dir: { type: 'string', default: PROJECT_DIR, description: 'Project directory' },
|
|
227
|
+
json: { type: 'boolean', default: false },
|
|
228
|
+
},
|
|
229
|
+
run({ args }) {
|
|
230
|
+
const projectDir = resolve(String(args.dir ?? PROJECT_DIR));
|
|
231
|
+
const scaleDir = resolveScaleDirForProject(projectDir);
|
|
232
|
+
const store = new WorkflowEvalStore({
|
|
233
|
+
projectDir,
|
|
234
|
+
scaleDir,
|
|
235
|
+
});
|
|
236
|
+
const candidate = store.promoteFailure(String(args.id));
|
|
237
|
+
if (args.json) {
|
|
238
|
+
console.log(JSON.stringify(candidate, null, 2));
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
console.log(`Workflow improvement candidate: ${candidate.id}`);
|
|
242
|
+
console.log(` Failure: ${candidate.failureId}`);
|
|
243
|
+
console.log(` Category: ${candidate.category}`);
|
|
244
|
+
console.log(` Recommendation: ${candidate.recommendation}`);
|
|
245
|
+
},
|
|
246
|
+
});
|
|
247
|
+
// ---------------------------------------------------------------------------
|
|
248
|
+
// Composite eval command (exported)
|
|
249
|
+
// ---------------------------------------------------------------------------
|
|
250
|
+
export const evalCommand = defineCommand({
|
|
251
|
+
meta: { name: 'eval', description: 'Workflow eval harness, pass@k metrics, and failure replay' },
|
|
252
|
+
subCommands: {
|
|
253
|
+
init: evalInit,
|
|
254
|
+
run: evalRun,
|
|
255
|
+
compare: evalCompare,
|
|
256
|
+
report: evalReport,
|
|
257
|
+
failures: evalFailures,
|
|
258
|
+
replay: evalReplay,
|
|
259
|
+
'promote-failure': evalPromoteFailure,
|
|
260
|
+
},
|
|
261
|
+
});
|
|
262
|
+
//# sourceMappingURL=evalCommands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evalCommands.js","sourceRoot":"","sources":["../../src/cli/evalCommands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const evolveCommand: import("citty").CommandDef<{}>;
|
|
2
|
+
export declare const doctorCommand: import("citty").CommandDef<{
|
|
3
|
+
scope: {
|
|
4
|
+
type: "positional";
|
|
5
|
+
required: false;
|
|
6
|
+
description: string;
|
|
7
|
+
};
|
|
8
|
+
dir: {
|
|
9
|
+
type: "string";
|
|
10
|
+
default: string;
|
|
11
|
+
description: string;
|
|
12
|
+
};
|
|
13
|
+
json: {
|
|
14
|
+
type: "boolean";
|
|
15
|
+
default: false;
|
|
16
|
+
description: string;
|
|
17
|
+
};
|
|
18
|
+
}>;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// SCALE Engine — Evolve and Doctor Commands
|
|
2
|
+
import { defineCommand } from 'citty';
|
|
3
|
+
import { getEngine, SCALE_DIR } from './engineBootstrap.js';
|
|
4
|
+
import { LessonExtractor, RuleProposer, HookGenerator, EvolutionEngine } from '../evolution/EvolutionEngine.js';
|
|
5
|
+
import { Doctor } from '../api/doctor.js';
|
|
6
|
+
import { inspectEnvironment, renderEnvironmentDoctor } from '../env/EnvironmentDoctor.js';
|
|
7
|
+
function runEnvironmentDoctor(json) {
|
|
8
|
+
const report = inspectEnvironment();
|
|
9
|
+
if (json) {
|
|
10
|
+
console.log(JSON.stringify(report, null, 2));
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
console.log(renderEnvironmentDoctor(report));
|
|
14
|
+
}
|
|
15
|
+
process.exitCode = report.ok ? 0 : 1;
|
|
16
|
+
}
|
|
17
|
+
export const evolveCommand = defineCommand({
|
|
18
|
+
meta: { name: 'evolve', description: 'Run evolution cycle (Defect→Lesson→Rule→Hook)' },
|
|
19
|
+
args: {},
|
|
20
|
+
async run() {
|
|
21
|
+
const { store, kb, eventBus } = getEngine();
|
|
22
|
+
const extractor = new LessonExtractor(store, kb, eventBus);
|
|
23
|
+
const proposer = new RuleProposer(kb, eventBus);
|
|
24
|
+
const generator = new HookGenerator(eventBus);
|
|
25
|
+
const engine = new EvolutionEngine(extractor, proposer, generator, eventBus, SCALE_DIR);
|
|
26
|
+
const stats = await engine.runCycle();
|
|
27
|
+
console.log(JSON.stringify(stats, null, 2));
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
export const doctorCommand = defineCommand({
|
|
31
|
+
meta: { name: 'doctor', description: 'Diagnose SCALE Engine health' },
|
|
32
|
+
args: {
|
|
33
|
+
scope: { type: 'positional', required: false, description: 'Optional diagnostic scope: env' },
|
|
34
|
+
dir: { type: 'string', default: '.', description: 'Project directory' },
|
|
35
|
+
json: { type: 'boolean', default: false, description: 'Output as JSON' },
|
|
36
|
+
},
|
|
37
|
+
async run({ args }) {
|
|
38
|
+
const scope = String(args.scope ?? '').trim().toLowerCase();
|
|
39
|
+
if (scope === 'env' || scope === 'environment') {
|
|
40
|
+
runEnvironmentDoctor(args.json);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (scope) {
|
|
44
|
+
console.error(`Unknown doctor scope: ${scope}. Supported scope: env.`);
|
|
45
|
+
process.exitCode = 1;
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const doc = new Doctor(args.dir);
|
|
49
|
+
const report = await doc.diagnose();
|
|
50
|
+
if (args.json) {
|
|
51
|
+
console.log(JSON.stringify(report, null, 2));
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
console.log(doc.formatReport(report));
|
|
55
|
+
}
|
|
56
|
+
process.exitCode = report.overall === 'broken' ? 1 : 0;
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=evolveDoctorCommands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evolveDoctorCommands.js","sourceRoot":"","sources":["../../src/cli/evolveDoctorCommands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export declare const gatePreTool: import("citty").CommandDef<{
|
|
2
|
+
tool: {
|
|
3
|
+
type: "positional";
|
|
4
|
+
required: true;
|
|
5
|
+
};
|
|
6
|
+
'args-json': {
|
|
7
|
+
type: "string";
|
|
8
|
+
default: string;
|
|
9
|
+
};
|
|
10
|
+
'session-id': {
|
|
11
|
+
type: "string";
|
|
12
|
+
required: true;
|
|
13
|
+
};
|
|
14
|
+
}>;
|
|
15
|
+
export declare const gatePostTool: import("citty").CommandDef<{
|
|
16
|
+
tool: {
|
|
17
|
+
type: "positional";
|
|
18
|
+
required: true;
|
|
19
|
+
};
|
|
20
|
+
'args-json': {
|
|
21
|
+
type: "string";
|
|
22
|
+
default: string;
|
|
23
|
+
};
|
|
24
|
+
'output-json': {
|
|
25
|
+
type: "string";
|
|
26
|
+
default: string;
|
|
27
|
+
};
|
|
28
|
+
'exit-code': {
|
|
29
|
+
type: "string";
|
|
30
|
+
default: string;
|
|
31
|
+
};
|
|
32
|
+
'session-id': {
|
|
33
|
+
type: "string";
|
|
34
|
+
required: true;
|
|
35
|
+
};
|
|
36
|
+
}>;
|
|
37
|
+
export declare const gateBeforeStop: import("citty").CommandDef<{
|
|
38
|
+
'session-id': {
|
|
39
|
+
type: "string";
|
|
40
|
+
required: true;
|
|
41
|
+
};
|
|
42
|
+
}>;
|
|
43
|
+
export declare const gateCommand: import("citty").CommandDef<import("citty").ArgsDef>;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// SCALE Engine — Gate Inline Commands (Hook 入口)
|
|
2
|
+
import { defineCommand } from 'citty';
|
|
3
|
+
import { getEngine } from './engineBootstrap.js';
|
|
4
|
+
export const gatePreTool = defineCommand({
|
|
5
|
+
meta: { name: 'pre-tool', description: 'Pre-tool gate check' },
|
|
6
|
+
args: {
|
|
7
|
+
tool: { type: 'positional', required: true },
|
|
8
|
+
'args-json': { type: 'string', default: '{}' },
|
|
9
|
+
'session-id': { type: 'string', required: true },
|
|
10
|
+
},
|
|
11
|
+
async run({ args }) {
|
|
12
|
+
const { gateway } = getEngine();
|
|
13
|
+
let toolArgs = {};
|
|
14
|
+
try {
|
|
15
|
+
toolArgs = JSON.parse(args['args-json']);
|
|
16
|
+
}
|
|
17
|
+
catch { /* empty */ }
|
|
18
|
+
const decision = await gateway.preTool({
|
|
19
|
+
sessionId: args['session-id'],
|
|
20
|
+
tool: args.tool,
|
|
21
|
+
args: toolArgs,
|
|
22
|
+
});
|
|
23
|
+
if (!decision.allow) {
|
|
24
|
+
process.stderr.write(decision.reason ?? 'Blocked by SCALE guardrail');
|
|
25
|
+
if (decision.suggestion)
|
|
26
|
+
process.stderr.write(`\nSuggestion: ${decision.suggestion}`);
|
|
27
|
+
process.exit(2);
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
export const gatePostTool = defineCommand({
|
|
32
|
+
meta: { name: 'post-tool', description: 'Post-tool event recording' },
|
|
33
|
+
args: {
|
|
34
|
+
tool: { type: 'positional', required: true },
|
|
35
|
+
'args-json': { type: 'string', default: '{}' },
|
|
36
|
+
'output-json': { type: 'string', default: '' },
|
|
37
|
+
'exit-code': { type: 'string', default: '0' },
|
|
38
|
+
'session-id': { type: 'string', required: true },
|
|
39
|
+
},
|
|
40
|
+
async run({ args }) {
|
|
41
|
+
const { gateway } = getEngine();
|
|
42
|
+
let toolArgs = {};
|
|
43
|
+
try {
|
|
44
|
+
toolArgs = JSON.parse(args['args-json']);
|
|
45
|
+
}
|
|
46
|
+
catch { /* empty */ }
|
|
47
|
+
await gateway.postTool({
|
|
48
|
+
sessionId: args['session-id'],
|
|
49
|
+
tool: args.tool,
|
|
50
|
+
args: toolArgs,
|
|
51
|
+
exitCode: parseInt(args['exit-code'], 10),
|
|
52
|
+
output: args['output-json'],
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
export const gateBeforeStop = defineCommand({
|
|
57
|
+
meta: { name: 'before-stop', description: 'Before-stop gate check' },
|
|
58
|
+
args: { 'session-id': { type: 'string', required: true } },
|
|
59
|
+
async run({ args }) {
|
|
60
|
+
const { gateway } = getEngine();
|
|
61
|
+
const decision = await gateway.beforeStop({ sessionId: args['session-id'] });
|
|
62
|
+
if (!decision.allow) {
|
|
63
|
+
process.stderr.write(decision.reason ?? 'Cannot stop yet');
|
|
64
|
+
if (decision.suggestion)
|
|
65
|
+
process.stderr.write(`\nSuggestion: ${decision.suggestion}`);
|
|
66
|
+
process.exit(2);
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
export const gateCommand = defineCommand({
|
|
71
|
+
meta: { name: 'gate', description: 'Guardrail gate commands' },
|
|
72
|
+
subCommands: { 'pre-tool': gatePreTool, 'post-tool': gatePostTool, 'before-stop': gateBeforeStop },
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=gateInlineCommands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateInlineCommands.js","sourceRoot":"","sources":["../../src/cli/gateInlineCommands.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAEhD,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;IACvC,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,qBAAqB,EAAE;IAC9D,IAAI,EAAE;QACJ,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC5C,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE;QAC9C,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;KACjD;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAAA;QAC/B,IAAI,QAAQ,GAA4B,EAAE,CAAA;QAC1C,IAAI,CAAC;YAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC;YACrC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC;YAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,QAAQ;SACf,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,IAAI,4BAA4B,CAAC,CAAA;YACrE,IAAI,QAAQ,CAAC,UAAU;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;YACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC;IACxC,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,2BAA2B,EAAE;IACrE,IAAI,EAAE;QACJ,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC5C,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE;QAC9C,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;QAC9C,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE;QAC7C,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;KACjD;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAAA;QAC/B,IAAI,QAAQ,GAA4B,EAAE,CAAA;QAC1C,IAAI,CAAC;YAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC;QACtE,MAAM,OAAO,CAAC,QAAQ,CAAC;YACrB,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC;YAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC;SAC5B,CAAC,CAAA;IACJ,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;IAC1C,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,wBAAwB,EAAE;IACpE,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;IAC1D,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAAA;QAC/B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;QAC5E,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,IAAI,iBAAiB,CAAC,CAAA;YAC1D,IAAI,QAAQ,CAAC,UAAU;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;YACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;IACvC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,yBAAyB,EAAE;IAC9D,WAAW,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE;CACnG,CAAC,CAAA"}
|