@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.
Files changed (58) hide show
  1. package/README.en.md +8 -2
  2. package/README.md +9 -3
  3. package/dist/api/cli.js +975 -6222
  4. package/dist/api/cli.js.map +1 -1
  5. package/dist/cli/artifactCrudCommands.d.ts +67 -0
  6. package/dist/cli/artifactCrudCommands.js +182 -0
  7. package/dist/cli/artifactCrudCommands.js.map +1 -0
  8. package/dist/cli/codegraphCommands.d.ts +1 -0
  9. package/dist/cli/codegraphCommands.js +241 -0
  10. package/dist/cli/codegraphCommands.js.map +1 -0
  11. package/dist/cli/contextCommands.d.ts +1 -0
  12. package/dist/cli/contextCommands.js +415 -0
  13. package/dist/cli/contextCommands.js.map +1 -0
  14. package/dist/cli/dependencyTddCommands.d.ts +92 -0
  15. package/dist/cli/dependencyTddCommands.js +174 -0
  16. package/dist/cli/dependencyTddCommands.js.map +1 -0
  17. package/dist/cli/diagnoseHuntCommands.d.ts +135 -0
  18. package/dist/cli/diagnoseHuntCommands.js +224 -0
  19. package/dist/cli/diagnoseHuntCommands.js.map +1 -0
  20. package/dist/cli/engineBootstrap.d.ts +39 -0
  21. package/dist/cli/engineBootstrap.js +129 -0
  22. package/dist/cli/engineBootstrap.js.map +1 -0
  23. package/dist/cli/evalCommands.d.ts +1 -0
  24. package/dist/cli/evalCommands.js +262 -0
  25. package/dist/cli/evalCommands.js.map +1 -0
  26. package/dist/cli/evolveDoctorCommands.d.ts +18 -0
  27. package/dist/cli/evolveDoctorCommands.js +59 -0
  28. package/dist/cli/evolveDoctorCommands.js.map +1 -0
  29. package/dist/cli/gateInlineCommands.d.ts +43 -0
  30. package/dist/cli/gateInlineCommands.js +74 -0
  31. package/dist/cli/gateInlineCommands.js.map +1 -0
  32. package/dist/cli/initConfigCommands.d.ts +138 -0
  33. package/dist/cli/initConfigCommands.js +602 -0
  34. package/dist/cli/initConfigCommands.js.map +1 -0
  35. package/dist/cli/metaGovernanceCommands.d.ts +11 -0
  36. package/dist/cli/metaGovernanceCommands.js +55 -0
  37. package/dist/cli/metaGovernanceCommands.js.map +1 -0
  38. package/dist/cli/runtimeSkillCommands.d.ts +6 -0
  39. package/dist/cli/runtimeSkillCommands.js +1515 -0
  40. package/dist/cli/runtimeSkillCommands.js.map +1 -0
  41. package/dist/cli/sessionCommands.d.ts +17 -0
  42. package/dist/cli/sessionCommands.js +38 -0
  43. package/dist/cli/sessionCommands.js.map +1 -0
  44. package/dist/cli/toolAgentCommands.d.ts +3 -0
  45. package/dist/cli/toolAgentCommands.js +441 -0
  46. package/dist/cli/toolAgentCommands.js.map +1 -0
  47. package/dist/cli/transitionCommands.d.ts +62 -0
  48. package/dist/cli/transitionCommands.js +174 -0
  49. package/dist/cli/transitionCommands.js.map +1 -0
  50. package/dist/cli/upgradeAssetsCommands.d.ts +44 -0
  51. package/dist/cli/upgradeAssetsCommands.js +933 -0
  52. package/dist/cli/upgradeAssetsCommands.js.map +1 -0
  53. package/dist/cli/workflowEvidenceCommands.d.ts +34 -0
  54. package/dist/cli/workflowEvidenceCommands.js +130 -0
  55. package/dist/cli/workflowEvidenceCommands.js.map +1 -0
  56. package/dist/version.d.ts +1 -1
  57. package/dist/version.js +1 -1
  58. 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":"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"}