@hongmaple0820/scale-engine 0.9.0 → 0.10.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 +18 -1
- package/README.md +22 -2
- package/dist/agents/AgentSourceLoader.js +1 -1
- package/dist/agents/AgentSourceLoader.js.map +1 -1
- package/dist/agents/types.d.ts +1 -1
- package/dist/api/cli.js +222 -6
- package/dist/api/cli.js.map +1 -1
- package/dist/api/quickstart.d.ts +23 -0
- package/dist/api/quickstart.js +57 -0
- package/dist/api/quickstart.js.map +1 -0
- package/dist/artifact/types.d.ts +5 -1
- package/dist/artifact/types.js.map +1 -1
- package/dist/capabilities/BrowserCapability.d.ts +30 -0
- package/dist/capabilities/BrowserCapability.js +73 -0
- package/dist/capabilities/BrowserCapability.js.map +1 -0
- package/dist/capabilities/CapabilityRegistry.d.ts +17 -0
- package/dist/capabilities/CapabilityRegistry.js +65 -0
- package/dist/capabilities/CapabilityRegistry.js.map +1 -0
- package/dist/capabilities/ComputerCapability.d.ts +28 -0
- package/dist/capabilities/ComputerCapability.js +40 -0
- package/dist/capabilities/ComputerCapability.js.map +1 -0
- package/dist/capabilities/InstalledSkillsIntegration.d.ts +66 -0
- package/dist/capabilities/InstalledSkillsIntegration.js +188 -0
- package/dist/capabilities/InstalledSkillsIntegration.js.map +1 -0
- package/dist/capabilities/SearchCapability.d.ts +46 -0
- package/dist/capabilities/SearchCapability.js +88 -0
- package/dist/capabilities/SearchCapability.js.map +1 -0
- package/dist/capabilities/index.d.ts +6 -0
- package/dist/capabilities/index.js +9 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/capabilities/types.d.ts +92 -0
- package/dist/capabilities/types.js +7 -0
- package/dist/capabilities/types.js.map +1 -0
- package/dist/cli/liteCommands.js +1 -1
- package/dist/cli/liteCommands.js.map +1 -1
- package/dist/cli/phaseCommands.d.ts +33 -3
- package/dist/cli/phaseCommands.js +398 -144
- package/dist/cli/phaseCommands.js.map +1 -1
- package/dist/core/logger.js +9 -2
- package/dist/core/logger.js.map +1 -1
- package/dist/hooks/HookGeneratorEnhanced.js +84 -5
- package/dist/hooks/HookGeneratorEnhanced.js.map +1 -1
- package/dist/hooks/WorkflowHooksManager.d.ts +30 -0
- package/dist/hooks/WorkflowHooksManager.js +117 -0
- package/dist/hooks/WorkflowHooksManager.js.map +1 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.js +2 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/skills/SkillExecutor.d.ts +11 -1
- package/dist/skills/SkillExecutor.js +160 -5
- package/dist/skills/SkillExecutor.js.map +1 -1
- package/dist/workflow/EvidenceStore.d.ts +20 -0
- package/dist/workflow/EvidenceStore.js +48 -0
- package/dist/workflow/EvidenceStore.js.map +1 -0
- package/dist/workflow/ReviewAnalyzer.d.ts +28 -0
- package/dist/workflow/ReviewAnalyzer.js +80 -0
- package/dist/workflow/ReviewAnalyzer.js.map +1 -0
- package/dist/workflow/ReviewStore.d.ts +32 -0
- package/dist/workflow/ReviewStore.js +42 -0
- package/dist/workflow/ReviewStore.js.map +1 -0
- package/dist/workflow/VerificationCommands.d.ts +19 -0
- package/dist/workflow/VerificationCommands.js +123 -0
- package/dist/workflow/VerificationCommands.js.map +1 -0
- package/dist/workflow/WorkflowEngine.d.ts +62 -0
- package/dist/workflow/WorkflowEngine.js +151 -0
- package/dist/workflow/WorkflowEngine.js.map +1 -0
- package/dist/workflow/cognitive/AmbiguityScorer.d.ts +17 -0
- package/dist/workflow/cognitive/AmbiguityScorer.js +107 -0
- package/dist/workflow/cognitive/AmbiguityScorer.js.map +1 -0
- package/dist/workflow/cognitive/ConsensusPlanner.d.ts +26 -0
- package/dist/workflow/cognitive/ConsensusPlanner.js +141 -0
- package/dist/workflow/cognitive/ConsensusPlanner.js.map +1 -0
- package/dist/workflow/cognitive/SocraticQuestioner.d.ts +33 -0
- package/dist/workflow/cognitive/SocraticQuestioner.js +276 -0
- package/dist/workflow/cognitive/SocraticQuestioner.js.map +1 -0
- package/dist/workflow/execution/RalphEngine.d.ts +36 -0
- package/dist/workflow/execution/RalphEngine.js +123 -0
- package/dist/workflow/execution/RalphEngine.js.map +1 -0
- package/dist/workflow/execution/UltraworkEngine.d.ts +43 -0
- package/dist/workflow/execution/UltraworkEngine.js +135 -0
- package/dist/workflow/execution/UltraworkEngine.js.map +1 -0
- package/dist/workflow/gates/GateSystem.d.ts +104 -0
- package/dist/workflow/gates/GateSystem.js +579 -0
- package/dist/workflow/gates/GateSystem.js.map +1 -0
- package/dist/workflow/index.d.ts +12 -0
- package/dist/workflow/index.js +14 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/quality/HonestDelivery.d.ts +19 -0
- package/dist/workflow/quality/HonestDelivery.js +77 -0
- package/dist/workflow/quality/HonestDelivery.js.map +1 -0
- package/dist/workflow/quality/KarpathyEvaluator.d.ts +18 -0
- package/dist/workflow/quality/KarpathyEvaluator.js +76 -0
- package/dist/workflow/quality/KarpathyEvaluator.js.map +1 -0
- package/dist/workflow/types.d.ts +139 -0
- package/dist/workflow/types.js +4 -0
- package/dist/workflow/types.js.map +1 -0
- package/dist/workflows/DAGBuilder.js +1 -1
- package/dist/workflows/DAGBuilder.js.map +1 -1
- package/dist/workflows/WorkflowOrchestrator.js +1 -1
- package/dist/workflows/WorkflowOrchestrator.js.map +1 -1
- package/dist/workflows/index.js +1 -1
- package/dist/workflows/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export function detectVerificationCommands(cwd = process.cwd(), overrides = {}) {
|
|
4
|
+
const pkg = readPackageJson(cwd);
|
|
5
|
+
const scripts = pkg?.scripts ?? {};
|
|
6
|
+
const packageManager = detectPackageManager(cwd, pkg);
|
|
7
|
+
return {
|
|
8
|
+
packageManager,
|
|
9
|
+
build: resolveBuildCommand(packageManager, scripts, overrides.build),
|
|
10
|
+
lint: resolveScriptCommand(packageManager, scripts, 'lint', overrides.lint),
|
|
11
|
+
test: resolveScriptCommand(packageManager, scripts, 'test', overrides.test),
|
|
12
|
+
coverage: resolveCoverageCommand(packageManager, scripts, overrides.coverage),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function readPackageJson(cwd) {
|
|
16
|
+
try {
|
|
17
|
+
return JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf8'));
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function detectPackageManager(cwd, pkg) {
|
|
24
|
+
const declared = pkg?.packageManager?.split('@')[0];
|
|
25
|
+
if (declared)
|
|
26
|
+
return declared;
|
|
27
|
+
if (existsSync(join(cwd, 'package-lock.json')))
|
|
28
|
+
return 'npm';
|
|
29
|
+
if (existsSync(join(cwd, 'pnpm-lock.yaml')))
|
|
30
|
+
return 'pnpm';
|
|
31
|
+
if (existsSync(join(cwd, 'yarn.lock')))
|
|
32
|
+
return 'yarn';
|
|
33
|
+
if (existsSync(join(cwd, 'bun.lock')) || existsSync(join(cwd, 'bun.lockb')))
|
|
34
|
+
return 'bun';
|
|
35
|
+
return 'npm';
|
|
36
|
+
}
|
|
37
|
+
function resolveScriptCommand(packageManager, scripts, scriptName, override) {
|
|
38
|
+
if (override?.trim()) {
|
|
39
|
+
return {
|
|
40
|
+
command: override.trim(),
|
|
41
|
+
source: 'override',
|
|
42
|
+
reason: `provided by CLI/config override for ${scriptName}`,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
if (!scripts[scriptName]) {
|
|
46
|
+
return {
|
|
47
|
+
source: 'missing',
|
|
48
|
+
reason: `package.json has no "${scriptName}" script`,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
command: runScriptCommand(packageManager, scriptName),
|
|
53
|
+
source: 'package-script',
|
|
54
|
+
reason: `detected package.json "${scriptName}" script`,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function resolveCoverageCommand(packageManager, scripts, override) {
|
|
58
|
+
if (override?.trim()) {
|
|
59
|
+
return {
|
|
60
|
+
command: override.trim(),
|
|
61
|
+
source: 'override',
|
|
62
|
+
reason: 'provided by CLI/config override for coverage',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if (scripts.coverage) {
|
|
66
|
+
return {
|
|
67
|
+
command: runScriptCommand(packageManager, 'coverage'),
|
|
68
|
+
source: 'package-script',
|
|
69
|
+
reason: 'detected package.json "coverage" script',
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
if (scripts.test) {
|
|
73
|
+
return {
|
|
74
|
+
command: `${runScriptCommand(packageManager, 'test')} -- --coverage`,
|
|
75
|
+
source: 'fallback',
|
|
76
|
+
reason: 'no "coverage" script; using test script with coverage flag',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
source: 'missing',
|
|
81
|
+
reason: 'package.json has neither "coverage" nor "test" script',
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function resolveBuildCommand(packageManager, scripts, override) {
|
|
85
|
+
if (override?.trim()) {
|
|
86
|
+
return {
|
|
87
|
+
command: override.trim(),
|
|
88
|
+
source: 'override',
|
|
89
|
+
reason: 'provided by CLI/config override for build',
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
if (scripts.build) {
|
|
93
|
+
return {
|
|
94
|
+
command: runScriptCommand(packageManager, 'build'),
|
|
95
|
+
source: 'package-script',
|
|
96
|
+
reason: 'detected package.json "build" script',
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (scripts.typecheck) {
|
|
100
|
+
return {
|
|
101
|
+
command: runScriptCommand(packageManager, 'typecheck'),
|
|
102
|
+
source: 'fallback',
|
|
103
|
+
reason: 'no "build" script; using package.json "typecheck" script',
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
source: 'missing',
|
|
108
|
+
reason: 'package.json has neither "build" nor "typecheck" script',
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function runScriptCommand(packageManager, scriptName) {
|
|
112
|
+
if (packageManager === 'npm') {
|
|
113
|
+
return scriptName === 'test' ? 'npm test' : `npm run ${scriptName}`;
|
|
114
|
+
}
|
|
115
|
+
if (packageManager === 'yarn') {
|
|
116
|
+
return `yarn ${scriptName}`;
|
|
117
|
+
}
|
|
118
|
+
if (packageManager === 'bun') {
|
|
119
|
+
return `bun run ${scriptName}`;
|
|
120
|
+
}
|
|
121
|
+
return scriptName === 'test' ? `${packageManager} test` : `${packageManager} run ${scriptName}`;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=VerificationCommands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VerificationCommands.js","sourceRoot":"","sources":["../../src/workflow/VerificationCommands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { IEventBus } from '../core/eventBus.js';
|
|
2
|
+
import type { ICapabilityRegistry } from '../capabilities/types.js';
|
|
3
|
+
import type { ISkillRegistry } from '../skills/SkillRegistry.js';
|
|
4
|
+
import { GateSystem } from './gates/GateSystem.js';
|
|
5
|
+
import type { VerificationCommandConfig } from './VerificationCommands.js';
|
|
6
|
+
import { AmbiguityScorer } from './cognitive/AmbiguityScorer.js';
|
|
7
|
+
import { ConsensusPlanner } from './cognitive/ConsensusPlanner.js';
|
|
8
|
+
import { SocraticQuestioner } from './cognitive/SocraticQuestioner.js';
|
|
9
|
+
import { RalphEngine, PRDManager } from './execution/RalphEngine.js';
|
|
10
|
+
import { UltraworkEngine } from './execution/UltraworkEngine.js';
|
|
11
|
+
import { KarpathyEvaluator } from './quality/KarpathyEvaluator.js';
|
|
12
|
+
import type { PRDDocument, UserStory, TaskDefinition, SocraticSession } from './types.js';
|
|
13
|
+
export interface WorkflowEngineConfig {
|
|
14
|
+
eventBus: IEventBus;
|
|
15
|
+
capabilityRegistry?: ICapabilityRegistry;
|
|
16
|
+
skillRegistry?: ISkillRegistry;
|
|
17
|
+
verificationCommands?: VerificationCommandConfig;
|
|
18
|
+
}
|
|
19
|
+
export declare class WorkflowEngine {
|
|
20
|
+
private eventBus;
|
|
21
|
+
private capabilityRegistry?;
|
|
22
|
+
private skillRegistry?;
|
|
23
|
+
private gateSystem;
|
|
24
|
+
private ambiguityScorer;
|
|
25
|
+
private consensusPlanner;
|
|
26
|
+
private socraticQuestioner;
|
|
27
|
+
private ralphEngine;
|
|
28
|
+
private ultraworkEngine;
|
|
29
|
+
private prdManager;
|
|
30
|
+
private modelRouter;
|
|
31
|
+
private karpathyEvaluator;
|
|
32
|
+
constructor(config: WorkflowEngineConfig);
|
|
33
|
+
explore(requirement: string): Promise<{
|
|
34
|
+
ambiguityScore: number;
|
|
35
|
+
gateResult: unknown;
|
|
36
|
+
socraticSession?: SocraticSession;
|
|
37
|
+
}>;
|
|
38
|
+
refineRequirement(session: SocraticSession, questionId: string, answer: string): SocraticSession;
|
|
39
|
+
getNextQuestion(session: SocraticSession): import('./types.js').SocraticQuestion | null;
|
|
40
|
+
plan(requirement: string): Promise<unknown>;
|
|
41
|
+
build(tasks: TaskDefinition[]): Promise<Map<string, unknown>>;
|
|
42
|
+
verify(commandOverrides?: VerificationCommandConfig): Promise<import('./types.js').GateResult[]>;
|
|
43
|
+
executePRD(title: string, stories: UserStory[]): Promise<PRDDocument>;
|
|
44
|
+
checkKarpathy(context: {
|
|
45
|
+
hypothesesListed: boolean;
|
|
46
|
+
hasExtraFeatures: boolean;
|
|
47
|
+
changesTraceable: boolean;
|
|
48
|
+
hasVerifiableGoal: boolean;
|
|
49
|
+
}): unknown;
|
|
50
|
+
generateDeliveryReport(): string;
|
|
51
|
+
executeSkill(skillId: string, input: Record<string, unknown>): Promise<unknown>;
|
|
52
|
+
executeMCPCapability(toolName: string, input: Record<string, unknown>): Promise<unknown>;
|
|
53
|
+
routeModel(taskType: string): string;
|
|
54
|
+
getGates(): GateSystem;
|
|
55
|
+
getAmbiguityScorer(): AmbiguityScorer;
|
|
56
|
+
getConsensusPlanner(): ConsensusPlanner;
|
|
57
|
+
getSocraticQuestioner(): SocraticQuestioner;
|
|
58
|
+
getRalphEngine(): RalphEngine;
|
|
59
|
+
getUltraworkEngine(): UltraworkEngine;
|
|
60
|
+
getPRDManager(): PRDManager;
|
|
61
|
+
getKarpathyEvaluator(): KarpathyEvaluator;
|
|
62
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// SCALE Engine — Workflow Integration
|
|
2
|
+
// 工作流与 CLI/MCP 的集成层
|
|
3
|
+
import { GateSystem } from './gates/GateSystem.js';
|
|
4
|
+
import { AmbiguityScorer } from './cognitive/AmbiguityScorer.js';
|
|
5
|
+
import { ConsensusPlanner } from './cognitive/ConsensusPlanner.js';
|
|
6
|
+
import { SocraticQuestioner } from './cognitive/SocraticQuestioner.js';
|
|
7
|
+
import { RalphEngine, PRDManager } from './execution/RalphEngine.js';
|
|
8
|
+
import { UltraworkEngine, ModelRouter } from './execution/UltraworkEngine.js';
|
|
9
|
+
import { KarpathyEvaluator } from './quality/KarpathyEvaluator.js';
|
|
10
|
+
export class WorkflowEngine {
|
|
11
|
+
constructor(config) {
|
|
12
|
+
this.eventBus = config.eventBus;
|
|
13
|
+
this.capabilityRegistry = config.capabilityRegistry;
|
|
14
|
+
this.skillRegistry = config.skillRegistry;
|
|
15
|
+
// Initialize workflow modules
|
|
16
|
+
this.gateSystem = new GateSystem(this.eventBus, config.verificationCommands);
|
|
17
|
+
this.ambiguityScorer = new AmbiguityScorer();
|
|
18
|
+
this.consensusPlanner = new ConsensusPlanner(this.eventBus);
|
|
19
|
+
this.socraticQuestioner = new SocraticQuestioner(this.eventBus);
|
|
20
|
+
this.ralphEngine = new RalphEngine(this.eventBus);
|
|
21
|
+
this.ultraworkEngine = new UltraworkEngine(this.eventBus);
|
|
22
|
+
this.prdManager = new PRDManager();
|
|
23
|
+
this.modelRouter = new ModelRouter();
|
|
24
|
+
this.karpathyEvaluator = new KarpathyEvaluator();
|
|
25
|
+
}
|
|
26
|
+
// Phase 1: Exploration with Gate G1
|
|
27
|
+
async explore(requirement) {
|
|
28
|
+
// G1: Exploration gate
|
|
29
|
+
const gateResult = await this.gateSystem.executeGate('G1');
|
|
30
|
+
// Analyze requirement ambiguity
|
|
31
|
+
const ambiguityResult = this.ambiguityScorer.analyzeRequirement(requirement);
|
|
32
|
+
// If ambiguity > 20%, start Socratic session
|
|
33
|
+
let socraticSession = undefined;
|
|
34
|
+
if (ambiguityResult.requiresQuestioning) {
|
|
35
|
+
socraticSession = this.socraticQuestioner.startSession(requirement, ambiguityResult);
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
ambiguityScore: ambiguityResult.totalScore,
|
|
39
|
+
gateResult,
|
|
40
|
+
socraticSession
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// Continue Socratic refinement session
|
|
44
|
+
refineRequirement(session, questionId, answer) {
|
|
45
|
+
this.socraticQuestioner.recordAnswer(session.sessionId, questionId, answer);
|
|
46
|
+
const progress = this.socraticQuestioner.evaluateProgress(session);
|
|
47
|
+
// If refined, generate refined requirement
|
|
48
|
+
if (progress.refined) {
|
|
49
|
+
const refined = this.socraticQuestioner.generateRefinedRequirement(session);
|
|
50
|
+
session.status = 'refined';
|
|
51
|
+
// Store refined requirement in session
|
|
52
|
+
if (session.finalAmbiguity) {
|
|
53
|
+
session.finalAmbiguity.totalScore = progress.newAmbiguity;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return session;
|
|
57
|
+
}
|
|
58
|
+
// Get next question for refinement
|
|
59
|
+
getNextQuestion(session) {
|
|
60
|
+
return this.socraticQuestioner.askNextQuestion(session);
|
|
61
|
+
}
|
|
62
|
+
// Phase 2: Planning with Consensus
|
|
63
|
+
async plan(requirement) {
|
|
64
|
+
// Run consensus planner
|
|
65
|
+
const consensusResult = await this.consensusPlanner.execute(requirement);
|
|
66
|
+
// G2: Planning gate (if L-level task)
|
|
67
|
+
if (consensusResult.viableOptions.length > 1) {
|
|
68
|
+
await this.gateSystem.executeGate('G2');
|
|
69
|
+
}
|
|
70
|
+
return consensusResult;
|
|
71
|
+
}
|
|
72
|
+
// Phase 3: Build with Task orchestration
|
|
73
|
+
async build(tasks) {
|
|
74
|
+
this.ultraworkEngine.addTasks(tasks);
|
|
75
|
+
return await this.ultraworkEngine.executeParallel();
|
|
76
|
+
}
|
|
77
|
+
// Phase 4: Verify with build and quality gates
|
|
78
|
+
async verify(commandOverrides) {
|
|
79
|
+
if (commandOverrides) {
|
|
80
|
+
this.gateSystem = new GateSystem(this.eventBus, commandOverrides);
|
|
81
|
+
}
|
|
82
|
+
const results = await this.gateSystem.executeAll(['G0', 'G4', 'G5', 'G6', 'G7']);
|
|
83
|
+
return results;
|
|
84
|
+
}
|
|
85
|
+
// Phase 5: PRD-driven execution with Ralph
|
|
86
|
+
async executePRD(title, stories) {
|
|
87
|
+
const prd = this.prdManager.createPRD(title, stories);
|
|
88
|
+
this.ralphEngine.setPRD(prd);
|
|
89
|
+
return await this.ralphEngine.run();
|
|
90
|
+
}
|
|
91
|
+
// Karpathy principles check
|
|
92
|
+
checkKarpathy(context) {
|
|
93
|
+
return this.karpathyEvaluator.evaluateAll(context);
|
|
94
|
+
}
|
|
95
|
+
// Generate honest delivery report
|
|
96
|
+
generateDeliveryReport() {
|
|
97
|
+
return this.ralphEngine.generateDeliveryReport();
|
|
98
|
+
}
|
|
99
|
+
// Execute skill (MCP integration)
|
|
100
|
+
async executeSkill(skillId, input) {
|
|
101
|
+
if (!this.skillRegistry) {
|
|
102
|
+
throw new Error('Skill registry not configured');
|
|
103
|
+
}
|
|
104
|
+
// This would integrate with SkillExecutor
|
|
105
|
+
const skill = this.skillRegistry.get(skillId);
|
|
106
|
+
if (!skill) {
|
|
107
|
+
throw new Error(`Skill not found: ${skillId}`);
|
|
108
|
+
}
|
|
109
|
+
return { skillId, input, status: 'delegated' };
|
|
110
|
+
}
|
|
111
|
+
// Execute MCP capability
|
|
112
|
+
async executeMCPCapability(toolName, input) {
|
|
113
|
+
if (!this.capabilityRegistry) {
|
|
114
|
+
throw new Error('Capability registry not configured');
|
|
115
|
+
}
|
|
116
|
+
// Route to appropriate capability
|
|
117
|
+
if (toolName.includes('browser')) {
|
|
118
|
+
const browser = this.capabilityRegistry.getBrowser();
|
|
119
|
+
if (!browser)
|
|
120
|
+
throw new Error('Browser capability not available');
|
|
121
|
+
return { capability: 'browser', toolName, input };
|
|
122
|
+
}
|
|
123
|
+
if (toolName.includes('search') || toolName.includes('fetch')) {
|
|
124
|
+
const search = this.capabilityRegistry.getSearch();
|
|
125
|
+
if (!search)
|
|
126
|
+
throw new Error('Search capability not available');
|
|
127
|
+
return { capability: 'search', toolName, input };
|
|
128
|
+
}
|
|
129
|
+
if (toolName.includes('exa')) {
|
|
130
|
+
const exa = this.capabilityRegistry.getExa();
|
|
131
|
+
if (!exa)
|
|
132
|
+
throw new Error('Exa capability not available');
|
|
133
|
+
return { capability: 'exa', toolName, input };
|
|
134
|
+
}
|
|
135
|
+
throw new Error(`Unknown MCP tool: ${toolName}`);
|
|
136
|
+
}
|
|
137
|
+
// Model routing for task execution
|
|
138
|
+
routeModel(taskType) {
|
|
139
|
+
return this.modelRouter.route(taskType);
|
|
140
|
+
}
|
|
141
|
+
// Getters for individual modules
|
|
142
|
+
getGates() { return this.gateSystem; }
|
|
143
|
+
getAmbiguityScorer() { return this.ambiguityScorer; }
|
|
144
|
+
getConsensusPlanner() { return this.consensusPlanner; }
|
|
145
|
+
getSocraticQuestioner() { return this.socraticQuestioner; }
|
|
146
|
+
getRalphEngine() { return this.ralphEngine; }
|
|
147
|
+
getUltraworkEngine() { return this.ultraworkEngine; }
|
|
148
|
+
getPRDManager() { return this.prdManager; }
|
|
149
|
+
getKarpathyEvaluator() { return this.karpathyEvaluator; }
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=WorkflowEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowEngine.js","sourceRoot":"","sources":["../../src/workflow/WorkflowEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AmbiguityScoreResult } from '../types.js';
|
|
2
|
+
export declare class AmbiguityScorer {
|
|
3
|
+
private dimensions;
|
|
4
|
+
private threshold;
|
|
5
|
+
setThreshold(value: number): void;
|
|
6
|
+
setGoalClarity(score: number): void;
|
|
7
|
+
setInputOutputBoundary(score: number): void;
|
|
8
|
+
setTechStackConstraints(score: number): void;
|
|
9
|
+
setTimeConstraints(score: number): void;
|
|
10
|
+
setQualityStandards(score: number): void;
|
|
11
|
+
setRiskBoundaries(score: number): void;
|
|
12
|
+
setAcceptanceCriteria(score: number): void;
|
|
13
|
+
calculate(): AmbiguityScoreResult;
|
|
14
|
+
private calculateWeightedSum;
|
|
15
|
+
analyzeRequirement(requirement: string): AmbiguityScoreResult;
|
|
16
|
+
formatReport(result: AmbiguityScoreResult): string;
|
|
17
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// SCALE Engine - Ambiguity Scorer
|
|
2
|
+
// Requirement ambiguity scorer with seven weighted dimensions.
|
|
3
|
+
const WEIGHTS = {
|
|
4
|
+
goalClarity: 0.20,
|
|
5
|
+
inputOutputBoundary: 0.15,
|
|
6
|
+
techStackConstraints: 0.15,
|
|
7
|
+
timeConstraints: 0.10,
|
|
8
|
+
qualityStandards: 0.15,
|
|
9
|
+
riskBoundaries: 0.10,
|
|
10
|
+
acceptanceCriteria: 0.15
|
|
11
|
+
};
|
|
12
|
+
export class AmbiguityScorer {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.dimensions = {
|
|
15
|
+
goalClarity: 0,
|
|
16
|
+
inputOutputBoundary: 0,
|
|
17
|
+
techStackConstraints: 0,
|
|
18
|
+
timeConstraints: 0,
|
|
19
|
+
qualityStandards: 0,
|
|
20
|
+
riskBoundaries: 0,
|
|
21
|
+
acceptanceCriteria: 0
|
|
22
|
+
};
|
|
23
|
+
this.threshold = 0.20;
|
|
24
|
+
}
|
|
25
|
+
setThreshold(value) {
|
|
26
|
+
this.threshold = value;
|
|
27
|
+
}
|
|
28
|
+
setGoalClarity(score) {
|
|
29
|
+
this.dimensions.goalClarity = Math.max(0, Math.min(1, score));
|
|
30
|
+
}
|
|
31
|
+
setInputOutputBoundary(score) {
|
|
32
|
+
this.dimensions.inputOutputBoundary = Math.max(0, Math.min(1, score));
|
|
33
|
+
}
|
|
34
|
+
setTechStackConstraints(score) {
|
|
35
|
+
this.dimensions.techStackConstraints = Math.max(0, Math.min(1, score));
|
|
36
|
+
}
|
|
37
|
+
setTimeConstraints(score) {
|
|
38
|
+
this.dimensions.timeConstraints = Math.max(0, Math.min(1, score));
|
|
39
|
+
}
|
|
40
|
+
setQualityStandards(score) {
|
|
41
|
+
this.dimensions.qualityStandards = Math.max(0, Math.min(1, score));
|
|
42
|
+
}
|
|
43
|
+
setRiskBoundaries(score) {
|
|
44
|
+
this.dimensions.riskBoundaries = Math.max(0, Math.min(1, score));
|
|
45
|
+
}
|
|
46
|
+
setAcceptanceCriteria(score) {
|
|
47
|
+
this.dimensions.acceptanceCriteria = Math.max(0, Math.min(1, score));
|
|
48
|
+
}
|
|
49
|
+
calculate() {
|
|
50
|
+
const totalScore = this.calculateWeightedSum();
|
|
51
|
+
const shouldProceed = totalScore <= this.threshold;
|
|
52
|
+
const requiresQuestioning = totalScore > this.threshold && totalScore <= 0.40;
|
|
53
|
+
const blocked = totalScore > 0.40;
|
|
54
|
+
return {
|
|
55
|
+
totalScore,
|
|
56
|
+
dimensions: this.dimensions,
|
|
57
|
+
threshold: this.threshold,
|
|
58
|
+
shouldProceed,
|
|
59
|
+
requiresQuestioning,
|
|
60
|
+
blocked
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
calculateWeightedSum() {
|
|
64
|
+
return (this.dimensions.goalClarity * WEIGHTS.goalClarity +
|
|
65
|
+
this.dimensions.inputOutputBoundary * WEIGHTS.inputOutputBoundary +
|
|
66
|
+
this.dimensions.techStackConstraints * WEIGHTS.techStackConstraints +
|
|
67
|
+
this.dimensions.timeConstraints * WEIGHTS.timeConstraints +
|
|
68
|
+
this.dimensions.qualityStandards * WEIGHTS.qualityStandards +
|
|
69
|
+
this.dimensions.riskBoundaries * WEIGHTS.riskBoundaries +
|
|
70
|
+
this.dimensions.acceptanceCriteria * WEIGHTS.acceptanceCriteria);
|
|
71
|
+
}
|
|
72
|
+
analyzeRequirement(requirement) {
|
|
73
|
+
// Simple heuristic analysis
|
|
74
|
+
const normalized = requirement.toLowerCase();
|
|
75
|
+
const hasAny = (keywords) => keywords.some(keyword => normalized.includes(keyword.toLowerCase()));
|
|
76
|
+
const hasGoal = hasAny(['implement', 'build', 'create', 'deliver', '实现', '完成', '构建']);
|
|
77
|
+
const hasInput = hasAny(['input', 'receive', 'accept', 'argument', '输入', '接收', '参数']);
|
|
78
|
+
const hasOutput = hasAny(['output', 'return', 'persist', 'emit', '输出', '返回', '持久化']);
|
|
79
|
+
const hasTech = hasAny(['react', 'typescript', 'node', 'cli', 'vitest', '技术栈', '使用']);
|
|
80
|
+
const hasTime = hasAny(['deadline', 'time', 'duration', 'today', '期限', '时间']);
|
|
81
|
+
const hasQuality = hasAny(['quality', 'standard', 'performance', 'lint', 'typecheck', '质量', '标准', '性能']);
|
|
82
|
+
const hasRisk = hasAny(['risk', 'boundary', 'constraint', 'rollback', '风险', '边界', '约束', '回滚']);
|
|
83
|
+
const hasAcceptance = hasAny(['acceptance', 'test', 'verify', 'verification', 'evidence', '验收', '测试', '验证']);
|
|
84
|
+
this.setGoalClarity(hasGoal ? 0.1 : 0.8);
|
|
85
|
+
this.setInputOutputBoundary((hasInput && hasOutput) ? 0.1 : 0.7);
|
|
86
|
+
this.setTechStackConstraints(hasTech ? 0.1 : 0.6);
|
|
87
|
+
this.setTimeConstraints(hasTime ? 0.1 : 0.5);
|
|
88
|
+
this.setQualityStandards(hasQuality ? 0.1 : 0.6);
|
|
89
|
+
this.setRiskBoundaries(hasRisk ? 0.1 : 0.7);
|
|
90
|
+
this.setAcceptanceCriteria(hasAcceptance ? 0.1 : 0.8);
|
|
91
|
+
return this.calculate();
|
|
92
|
+
}
|
|
93
|
+
formatReport(result) {
|
|
94
|
+
const lines = ['=== Ambiguity Score Report ==='];
|
|
95
|
+
lines.push(`Total Score: ${result.totalScore.toFixed(2)} (threshold: ${result.threshold})`);
|
|
96
|
+
lines.push('');
|
|
97
|
+
lines.push('Dimensions:');
|
|
98
|
+
Object.entries(result.dimensions).forEach(([key, value]) => {
|
|
99
|
+
const weight = WEIGHTS[key];
|
|
100
|
+
lines.push(` ${key}: ${value.toFixed(2)} (weight: ${weight})`);
|
|
101
|
+
});
|
|
102
|
+
lines.push('');
|
|
103
|
+
lines.push(`Status: ${result.blocked ? 'BLOCKED' : result.requiresQuestioning ? 'QUESTIONING REQUIRED' : 'PROCEED'}`);
|
|
104
|
+
return lines.join('\n');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=AmbiguityScorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AmbiguityScorer.js","sourceRoot":"","sources":["../../../src/workflow/cognitive/AmbiguityScorer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { IEventBus } from '../../core/eventBus.js';
|
|
2
|
+
import type { RALPLANOutput, ConsensusRound } from '../types.js';
|
|
3
|
+
export interface IConsensusRole {
|
|
4
|
+
name: string;
|
|
5
|
+
process(input: string): Promise<string>;
|
|
6
|
+
}
|
|
7
|
+
export declare class ConsensusPlanner {
|
|
8
|
+
private eventBus;
|
|
9
|
+
private maxIterations;
|
|
10
|
+
private rounds;
|
|
11
|
+
private planner;
|
|
12
|
+
private architect;
|
|
13
|
+
private critic;
|
|
14
|
+
constructor(eventBus: IEventBus);
|
|
15
|
+
setMaxIterations(n: number): void;
|
|
16
|
+
execute(requirement: string): Promise<RALPLANOutput>;
|
|
17
|
+
private evaluateVerdict;
|
|
18
|
+
private synthesizeFeedback;
|
|
19
|
+
private generateRALPLANOutput;
|
|
20
|
+
private extractPrinciples;
|
|
21
|
+
private extractDrivers;
|
|
22
|
+
private extractOptions;
|
|
23
|
+
private extractPreMortem;
|
|
24
|
+
getRounds(): ConsensusRound[];
|
|
25
|
+
formatReport(output: RALPLANOutput): string;
|
|
26
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// SCALE Engine — Consensus Planner
|
|
2
|
+
// 共识规划引擎 (三角色循环: Planner -> Architect -> Critic)
|
|
3
|
+
export class ConsensusPlanner {
|
|
4
|
+
constructor(eventBus) {
|
|
5
|
+
this.maxIterations = 5;
|
|
6
|
+
this.rounds = [];
|
|
7
|
+
this.eventBus = eventBus;
|
|
8
|
+
this.planner = new PlannerRole();
|
|
9
|
+
this.architect = new ArchitectRole();
|
|
10
|
+
this.critic = new CriticRole();
|
|
11
|
+
}
|
|
12
|
+
setMaxIterations(n) {
|
|
13
|
+
this.maxIterations = n;
|
|
14
|
+
}
|
|
15
|
+
async execute(requirement) {
|
|
16
|
+
this.rounds = [];
|
|
17
|
+
let currentInput = requirement;
|
|
18
|
+
let verdict = 'ITERATE';
|
|
19
|
+
let iterationCount = 0;
|
|
20
|
+
while (verdict === 'ITERATE' && iterationCount < this.maxIterations) {
|
|
21
|
+
iterationCount++;
|
|
22
|
+
const plannerOutput = await this.planner.process(currentInput);
|
|
23
|
+
const architectReview = await this.architect.process(plannerOutput);
|
|
24
|
+
const criticReview = await this.critic.process(architectReview);
|
|
25
|
+
verdict = this.evaluateVerdict(plannerOutput, architectReview, criticReview);
|
|
26
|
+
const round = {
|
|
27
|
+
round: iterationCount,
|
|
28
|
+
plannerOutput,
|
|
29
|
+
architectReview,
|
|
30
|
+
criticReview,
|
|
31
|
+
verdict
|
|
32
|
+
};
|
|
33
|
+
this.rounds.push(round);
|
|
34
|
+
this.eventBus.emit('consensus.round', round);
|
|
35
|
+
if (verdict === 'ITERATE') {
|
|
36
|
+
currentInput = this.synthesizeFeedback(plannerOutput, architectReview, criticReview);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return this.generateRALPLANOutput(verdict, iterationCount);
|
|
40
|
+
}
|
|
41
|
+
evaluateVerdict(planner, architect, critic) {
|
|
42
|
+
const architectApproved = architect.includes('APPROVE') || architect.includes('可行');
|
|
43
|
+
const criticApproved = critic.includes('APPROVE') || critic.includes('无风险');
|
|
44
|
+
const hasBlockingIssues = critic.includes('BLOCK') || critic.includes('CRITICAL');
|
|
45
|
+
if (hasBlockingIssues)
|
|
46
|
+
return 'REJECT';
|
|
47
|
+
if (architectApproved && criticApproved)
|
|
48
|
+
return 'APPROVE';
|
|
49
|
+
return 'ITERATE';
|
|
50
|
+
}
|
|
51
|
+
synthesizeFeedback(planner, architect, critic) {
|
|
52
|
+
return `Previous Plan:\n${planner}\n\nArchitect Feedback:\n${architect}\n\nCritic Concerns:\n${critic}\n\nPlease revise the plan addressing all concerns.`;
|
|
53
|
+
}
|
|
54
|
+
generateRALPLANOutput(verdict, iterations) {
|
|
55
|
+
const lastRound = this.rounds[this.rounds.length - 1];
|
|
56
|
+
return {
|
|
57
|
+
principles: this.extractPrinciples(lastRound?.plannerOutput || ''),
|
|
58
|
+
decisionDrivers: this.extractDrivers(lastRound?.architectReview || ''),
|
|
59
|
+
viableOptions: this.extractOptions(lastRound?.plannerOutput || ''),
|
|
60
|
+
preMortem: this.extractPreMortem(lastRound?.criticReview || ''),
|
|
61
|
+
verdict,
|
|
62
|
+
iterationCount: iterations
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
extractPrinciples(text) {
|
|
66
|
+
const match = text.match(/原则[::]\s*([\s\S]*?)(?=驱动|$)/);
|
|
67
|
+
if (match) {
|
|
68
|
+
return match[1].split('\n').map(s => s.trim()).filter(s => s.length > 0);
|
|
69
|
+
}
|
|
70
|
+
return ['可维护性优先', '渐进式实现', '测试驱动'];
|
|
71
|
+
}
|
|
72
|
+
extractDrivers(text) {
|
|
73
|
+
const match = text.match(/驱动[::]\s*([\s\S]*?)(?=方案|$)/);
|
|
74
|
+
if (match) {
|
|
75
|
+
return match[1].split('\n').map(s => s.trim()).filter(s => s.length > 0).slice(0, 3);
|
|
76
|
+
}
|
|
77
|
+
return ['性能要求', '安全约束', '向下兼容'];
|
|
78
|
+
}
|
|
79
|
+
extractOptions(text) {
|
|
80
|
+
return [
|
|
81
|
+
{ name: '方案A', description: '标准实现路径', pros: ['稳定'], cons: ['慢'], selected: true },
|
|
82
|
+
{ name: '方案B', description: '快速实现路径', pros: ['快'], cons: ['风险高'], selected: false }
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
extractPreMortem(text) {
|
|
86
|
+
return {
|
|
87
|
+
assumedFailure: '实现超时',
|
|
88
|
+
rootCauses: ['技术债务', '需求变更'],
|
|
89
|
+
mitigations: ['增量交付', '及时沟通']
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
getRounds() {
|
|
93
|
+
return this.rounds;
|
|
94
|
+
}
|
|
95
|
+
formatReport(output) {
|
|
96
|
+
const lines = ['=== RALPLAN-DR Report ==='];
|
|
97
|
+
lines.push(`Verdict: ${output.verdict} (${output.iterationCount} iterations)`);
|
|
98
|
+
lines.push('');
|
|
99
|
+
lines.push('Principles:');
|
|
100
|
+
output.principles.forEach(p => lines.push(` - ${p}`));
|
|
101
|
+
lines.push('');
|
|
102
|
+
lines.push('Decision Drivers (Top 3):');
|
|
103
|
+
output.decisionDrivers.forEach(d => lines.push(` - ${d}`));
|
|
104
|
+
lines.push('');
|
|
105
|
+
lines.push('Viable Options:');
|
|
106
|
+
output.viableOptions.forEach(o => {
|
|
107
|
+
lines.push(` ${o.selected ? '[SELECTED]' : '[ALT]'} ${o.name}: ${o.description}`);
|
|
108
|
+
});
|
|
109
|
+
lines.push('');
|
|
110
|
+
lines.push('Pre-Mortem Analysis:');
|
|
111
|
+
lines.push(` Assumed Failure: ${output.preMortem.assumedFailure}`);
|
|
112
|
+
lines.push(` Root Causes: ${output.preMortem.rootCauses.join(', ')}`);
|
|
113
|
+
lines.push(` Mitigations: ${output.preMortem.mitigations.join(', ')}`);
|
|
114
|
+
return lines.join('\n');
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
class PlannerRole {
|
|
118
|
+
constructor() {
|
|
119
|
+
this.name = 'Planner';
|
|
120
|
+
}
|
|
121
|
+
async process(input) {
|
|
122
|
+
return `Plan for: ${input}\n\n原则:\n- 渐进式实现\n- 测试驱动\n- 最小变更\n\n驱动因素:\n1. 用户需求\n2. 技术约束\n3. 时间限制\n\n方案A:标准路径(推荐)\n方案B:快速路径`;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
class ArchitectRole {
|
|
126
|
+
constructor() {
|
|
127
|
+
this.name = 'Architect';
|
|
128
|
+
}
|
|
129
|
+
async process(input) {
|
|
130
|
+
return `Architecture Review:\n\nAPPROVE - 技术可行性确认\n\n架构建议:\n- 模块化设计\n- 接口抽象\n- 依赖隔离`;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
class CriticRole {
|
|
134
|
+
constructor() {
|
|
135
|
+
this.name = 'Critic';
|
|
136
|
+
}
|
|
137
|
+
async process(input) {
|
|
138
|
+
return `Critical Review:\n\n风险评估:\n- 性能瓶颈:中等风险\n- 安全隐患:低风险\n- 兼容性问题:需关注\n\nAPPROVE - 无阻断性风险`;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=ConsensusPlanner.js.map
|