@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.
Files changed (103) hide show
  1. package/README.en.md +18 -1
  2. package/README.md +22 -2
  3. package/dist/agents/AgentSourceLoader.js +1 -1
  4. package/dist/agents/AgentSourceLoader.js.map +1 -1
  5. package/dist/agents/types.d.ts +1 -1
  6. package/dist/api/cli.js +222 -6
  7. package/dist/api/cli.js.map +1 -1
  8. package/dist/api/quickstart.d.ts +23 -0
  9. package/dist/api/quickstart.js +57 -0
  10. package/dist/api/quickstart.js.map +1 -0
  11. package/dist/artifact/types.d.ts +5 -1
  12. package/dist/artifact/types.js.map +1 -1
  13. package/dist/capabilities/BrowserCapability.d.ts +30 -0
  14. package/dist/capabilities/BrowserCapability.js +73 -0
  15. package/dist/capabilities/BrowserCapability.js.map +1 -0
  16. package/dist/capabilities/CapabilityRegistry.d.ts +17 -0
  17. package/dist/capabilities/CapabilityRegistry.js +65 -0
  18. package/dist/capabilities/CapabilityRegistry.js.map +1 -0
  19. package/dist/capabilities/ComputerCapability.d.ts +28 -0
  20. package/dist/capabilities/ComputerCapability.js +40 -0
  21. package/dist/capabilities/ComputerCapability.js.map +1 -0
  22. package/dist/capabilities/InstalledSkillsIntegration.d.ts +66 -0
  23. package/dist/capabilities/InstalledSkillsIntegration.js +188 -0
  24. package/dist/capabilities/InstalledSkillsIntegration.js.map +1 -0
  25. package/dist/capabilities/SearchCapability.d.ts +46 -0
  26. package/dist/capabilities/SearchCapability.js +88 -0
  27. package/dist/capabilities/SearchCapability.js.map +1 -0
  28. package/dist/capabilities/index.d.ts +6 -0
  29. package/dist/capabilities/index.js +9 -0
  30. package/dist/capabilities/index.js.map +1 -0
  31. package/dist/capabilities/types.d.ts +92 -0
  32. package/dist/capabilities/types.js +7 -0
  33. package/dist/capabilities/types.js.map +1 -0
  34. package/dist/cli/liteCommands.js +1 -1
  35. package/dist/cli/liteCommands.js.map +1 -1
  36. package/dist/cli/phaseCommands.d.ts +33 -3
  37. package/dist/cli/phaseCommands.js +398 -144
  38. package/dist/cli/phaseCommands.js.map +1 -1
  39. package/dist/core/logger.js +9 -2
  40. package/dist/core/logger.js.map +1 -1
  41. package/dist/hooks/HookGeneratorEnhanced.js +84 -5
  42. package/dist/hooks/HookGeneratorEnhanced.js.map +1 -1
  43. package/dist/hooks/WorkflowHooksManager.d.ts +30 -0
  44. package/dist/hooks/WorkflowHooksManager.js +117 -0
  45. package/dist/hooks/WorkflowHooksManager.js.map +1 -0
  46. package/dist/hooks/index.d.ts +2 -0
  47. package/dist/hooks/index.js +2 -1
  48. package/dist/hooks/index.js.map +1 -1
  49. package/dist/skills/SkillExecutor.d.ts +11 -1
  50. package/dist/skills/SkillExecutor.js +160 -5
  51. package/dist/skills/SkillExecutor.js.map +1 -1
  52. package/dist/workflow/EvidenceStore.d.ts +20 -0
  53. package/dist/workflow/EvidenceStore.js +48 -0
  54. package/dist/workflow/EvidenceStore.js.map +1 -0
  55. package/dist/workflow/ReviewAnalyzer.d.ts +28 -0
  56. package/dist/workflow/ReviewAnalyzer.js +80 -0
  57. package/dist/workflow/ReviewAnalyzer.js.map +1 -0
  58. package/dist/workflow/ReviewStore.d.ts +32 -0
  59. package/dist/workflow/ReviewStore.js +42 -0
  60. package/dist/workflow/ReviewStore.js.map +1 -0
  61. package/dist/workflow/VerificationCommands.d.ts +19 -0
  62. package/dist/workflow/VerificationCommands.js +123 -0
  63. package/dist/workflow/VerificationCommands.js.map +1 -0
  64. package/dist/workflow/WorkflowEngine.d.ts +62 -0
  65. package/dist/workflow/WorkflowEngine.js +151 -0
  66. package/dist/workflow/WorkflowEngine.js.map +1 -0
  67. package/dist/workflow/cognitive/AmbiguityScorer.d.ts +17 -0
  68. package/dist/workflow/cognitive/AmbiguityScorer.js +107 -0
  69. package/dist/workflow/cognitive/AmbiguityScorer.js.map +1 -0
  70. package/dist/workflow/cognitive/ConsensusPlanner.d.ts +26 -0
  71. package/dist/workflow/cognitive/ConsensusPlanner.js +141 -0
  72. package/dist/workflow/cognitive/ConsensusPlanner.js.map +1 -0
  73. package/dist/workflow/cognitive/SocraticQuestioner.d.ts +33 -0
  74. package/dist/workflow/cognitive/SocraticQuestioner.js +276 -0
  75. package/dist/workflow/cognitive/SocraticQuestioner.js.map +1 -0
  76. package/dist/workflow/execution/RalphEngine.d.ts +36 -0
  77. package/dist/workflow/execution/RalphEngine.js +123 -0
  78. package/dist/workflow/execution/RalphEngine.js.map +1 -0
  79. package/dist/workflow/execution/UltraworkEngine.d.ts +43 -0
  80. package/dist/workflow/execution/UltraworkEngine.js +135 -0
  81. package/dist/workflow/execution/UltraworkEngine.js.map +1 -0
  82. package/dist/workflow/gates/GateSystem.d.ts +104 -0
  83. package/dist/workflow/gates/GateSystem.js +579 -0
  84. package/dist/workflow/gates/GateSystem.js.map +1 -0
  85. package/dist/workflow/index.d.ts +12 -0
  86. package/dist/workflow/index.js +14 -0
  87. package/dist/workflow/index.js.map +1 -0
  88. package/dist/workflow/quality/HonestDelivery.d.ts +19 -0
  89. package/dist/workflow/quality/HonestDelivery.js +77 -0
  90. package/dist/workflow/quality/HonestDelivery.js.map +1 -0
  91. package/dist/workflow/quality/KarpathyEvaluator.d.ts +18 -0
  92. package/dist/workflow/quality/KarpathyEvaluator.js +76 -0
  93. package/dist/workflow/quality/KarpathyEvaluator.js.map +1 -0
  94. package/dist/workflow/types.d.ts +139 -0
  95. package/dist/workflow/types.js +4 -0
  96. package/dist/workflow/types.js.map +1 -0
  97. package/dist/workflows/DAGBuilder.js +1 -1
  98. package/dist/workflows/DAGBuilder.js.map +1 -1
  99. package/dist/workflows/WorkflowOrchestrator.js +1 -1
  100. package/dist/workflows/WorkflowOrchestrator.js.map +1 -1
  101. package/dist/workflows/index.js +1 -1
  102. package/dist/workflows/index.js.map +1 -1
  103. 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