@winspan/claude-forge 2.4.1 → 2.6.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/dist/pipeline/analyzer.d.ts +6 -0
- package/dist/pipeline/analyzer.d.ts.map +1 -1
- package/dist/pipeline/analyzer.js +34 -2
- package/dist/pipeline/analyzer.js.map +1 -1
- package/dist/pipeline/completion-engine.d.ts.map +1 -1
- package/dist/pipeline/completion-engine.js +37 -24
- package/dist/pipeline/completion-engine.js.map +1 -1
- package/dist/pipeline/dynamic-node-executor.d.ts +7 -2
- package/dist/pipeline/dynamic-node-executor.d.ts.map +1 -1
- package/dist/pipeline/dynamic-node-executor.js +25 -136
- package/dist/pipeline/dynamic-node-executor.js.map +1 -1
- package/dist/pipeline/node-type-registry.d.ts.map +1 -1
- package/dist/pipeline/node-type-registry.js +0 -4
- package/dist/pipeline/node-type-registry.js.map +1 -1
- package/dist/pipeline/node-type-sync.js +2 -2
- package/dist/pipeline/node-type-sync.js.map +1 -1
- package/dist/pipeline/orchestration-enforcer.d.ts +44 -0
- package/dist/pipeline/orchestration-enforcer.d.ts.map +1 -0
- package/dist/pipeline/orchestration-enforcer.js +140 -0
- package/dist/pipeline/orchestration-enforcer.js.map +1 -0
- package/dist/pipeline/template-registry.d.ts.map +1 -1
- package/dist/pipeline/template-registry.js +30 -0
- package/dist/pipeline/template-registry.js.map +1 -1
- package/dist/prompts/pipeline-decompose.md +10 -0
- package/dist/web-static/assets/{index-NB0c9T4H.js → index-rNdquQVW.js} +1 -1
- package/dist/web-static/index.html +1 -1
- package/package.json +1 -1
|
@@ -5,6 +5,7 @@ export declare class PipelineAnalyzer {
|
|
|
5
5
|
private api;
|
|
6
6
|
private detector;
|
|
7
7
|
private conventionManager?;
|
|
8
|
+
private enforcer;
|
|
8
9
|
constructor(api: AIProvider, conventionManager?: ConventionManager);
|
|
9
10
|
/**
|
|
10
11
|
* 将一句话需求分解为任务树(AI 智能编排)
|
|
@@ -32,6 +33,11 @@ export declare class PipelineAnalyzer {
|
|
|
32
33
|
* 解析 AI 智能编排响应
|
|
33
34
|
*/
|
|
34
35
|
private parseIntelligentResponse;
|
|
36
|
+
/**
|
|
37
|
+
* 确保每个 plannedPhase 都有对应 task
|
|
38
|
+
* 当 enforcer 补全了新阶段时,创建最小占位任务
|
|
39
|
+
*/
|
|
40
|
+
private ensureTasksForPhases;
|
|
35
41
|
/**
|
|
36
42
|
* 降级方案:AI 失败时使用的默认编排
|
|
37
43
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/pipeline/analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAK1D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/pipeline/analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAK1D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAY7E,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,GAAG,CAAa;IACxB,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,iBAAiB,CAAC,CAAoB;IAC9C,OAAO,CAAC,QAAQ,CAA+B;gBAEnC,GAAG,EAAE,UAAU,EAAE,iBAAiB,CAAC,EAAE,iBAAiB;IAMlE;;OAEG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QACjE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;QACvC,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;QAC9C,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,GAAG,eAAe,GAAG,OAAO,CAAC;QACxF,aAAa,EAAE,aAAa,EAAE,CAAC;QAC/B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACzC,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IA6DF;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAY9B,+CAA+C;IAC/C,OAAO,CAAC,sBAAsB;IA4C9B,wCAAwC;IACxC,OAAO,CAAC,qBAAqB;IAY7B,mDAAmD;IACnD,OAAO,CAAC,cAAc;IAYtB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAyDhC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAmB5B;;OAEG;IACH,OAAO,CAAC,YAAY;CAgErB"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { TechStackDetector } from '../claudemd/detector.js';
|
|
2
2
|
import { logger } from '../utils/logger.js';
|
|
3
3
|
import { PromptRegistry } from '../prompts/registry.js';
|
|
4
|
+
import { OrchestrationEnforcer } from './orchestration-enforcer.js';
|
|
4
5
|
export class PipelineAnalyzer {
|
|
5
6
|
api;
|
|
6
7
|
detector;
|
|
7
8
|
conventionManager;
|
|
9
|
+
enforcer = new OrchestrationEnforcer();
|
|
8
10
|
constructor(api, conventionManager) {
|
|
9
11
|
this.api = api;
|
|
10
12
|
this.detector = new TechStackDetector();
|
|
@@ -43,8 +45,18 @@ export class PipelineAnalyzer {
|
|
|
43
45
|
logger.warn('[Pipeline] AI 输出解析失败,使用降级方案');
|
|
44
46
|
return this.fallbackPlan(requirement, techStack);
|
|
45
47
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
+
// 编排约束补全:应用 after-node 规则,确保关键阶段不缺失
|
|
49
|
+
const conventions = this.conventionManager?.getActiveConventions(projectPath) ?? [];
|
|
50
|
+
const enforcedPhases = this.enforcer.enforce(result.plannedPhases, result.complexity, result.taskType, conventions);
|
|
51
|
+
// 如果阶段被补全,同步补齐 tasks(最小化占位任务)
|
|
52
|
+
const enforcedTasks = this.ensureTasksForPhases(result.tasks, enforcedPhases);
|
|
53
|
+
logger.info(`[Pipeline] 智能分解完成:${result.complexity} | ${result.taskType} | ${enforcedPhases.length} 阶段`);
|
|
54
|
+
return {
|
|
55
|
+
...result,
|
|
56
|
+
techStack,
|
|
57
|
+
plannedPhases: enforcedPhases,
|
|
58
|
+
tasks: enforcedTasks,
|
|
59
|
+
};
|
|
48
60
|
}
|
|
49
61
|
catch (err) {
|
|
50
62
|
logger.error(`[Pipeline] 分解失败:${err}`);
|
|
@@ -177,6 +189,26 @@ export class PipelineAnalyzer {
|
|
|
177
189
|
return null;
|
|
178
190
|
}
|
|
179
191
|
}
|
|
192
|
+
/**
|
|
193
|
+
* 确保每个 plannedPhase 都有对应 task
|
|
194
|
+
* 当 enforcer 补全了新阶段时,创建最小占位任务
|
|
195
|
+
*/
|
|
196
|
+
ensureTasksForPhases(tasks, plannedPhases) {
|
|
197
|
+
const existingPhases = new Set(tasks.map(t => t.phase));
|
|
198
|
+
const result = [...tasks];
|
|
199
|
+
for (const phase of plannedPhases) {
|
|
200
|
+
if (phase === 'done' || existingPhases.has(phase))
|
|
201
|
+
continue;
|
|
202
|
+
result.push({
|
|
203
|
+
title: `执行 ${phase} 阶段任务`,
|
|
204
|
+
phase,
|
|
205
|
+
status: 'pending',
|
|
206
|
+
description: `由编排约束补全器自动补充的 ${phase} 阶段任务`,
|
|
207
|
+
dependencies: [],
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
return result;
|
|
211
|
+
}
|
|
180
212
|
/**
|
|
181
213
|
* 降级方案:AI 失败时使用的默认编排
|
|
182
214
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/pipeline/analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/pipeline/analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion-engine.d.ts","sourceRoot":"","sources":["../../src/pipeline/completion-engine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAK3E,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;CAC3C;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,iBAAiB,CAA2B;IAEpD;;;;;;;;;;;;OAYG;IACH,MAAM,CACJ,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,UAAU,EACjB,YAAY,EAAE,UAAU,EAAE,EAC1B,SAAS,EAAE,QAAQ,EAAE,EACrB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,UAAU,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,GAC7C,kBAAkB;
|
|
1
|
+
{"version":3,"file":"completion-engine.d.ts","sourceRoot":"","sources":["../../src/pipeline/completion-engine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAK3E,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;CAC3C;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,iBAAiB,CAA2B;IAEpD;;;;;;;;;;;;OAYG;IACH,MAAM,CACJ,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,UAAU,EACjB,YAAY,EAAE,UAAU,EAAE,EAC1B,SAAS,EAAE,QAAQ,EAAE,EACrB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,UAAU,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,GAC7C,kBAAkB;IAoHrB;;OAEG;IACH,OAAO,CAAC,cAAc;CASvB"}
|
|
@@ -25,13 +25,50 @@ export class CompletionEngine {
|
|
|
25
25
|
decide(node, nodeType, event, recentEvents, artifacts, eventCount, lastActivityAt, lastArtifactAt, complexity) {
|
|
26
26
|
const reasons = [];
|
|
27
27
|
let confidence = 0; // 0-100
|
|
28
|
+
// 产物完整性(先计算,用于后续门禁判断)
|
|
29
|
+
let hasRequiredArtifacts = false;
|
|
30
|
+
let artifactValidationPassed = false;
|
|
31
|
+
if (nodeType.expected_artifacts) {
|
|
32
|
+
const requiredArtifacts = nodeType.expected_artifacts.filter(a => a.required !== false);
|
|
33
|
+
hasRequiredArtifacts = requiredArtifacts.length > 0 && complexity !== 'simple';
|
|
34
|
+
const validation = this.artifactValidator.validate(artifacts, nodeType.expected_artifacts, complexity);
|
|
35
|
+
artifactValidationPassed = validation.passed;
|
|
36
|
+
if (validation.passed) {
|
|
37
|
+
reasons.push('产物完整');
|
|
38
|
+
confidence += 30;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
28
41
|
// 第一层:精准检测
|
|
42
|
+
let hasExplicitSignal = false;
|
|
29
43
|
if (nodeType.completion.explicit_signal) {
|
|
30
44
|
if (this.detector.detectExplicitSignal(event, nodeType.completion.explicit_signal)) {
|
|
45
|
+
hasExplicitSignal = true;
|
|
31
46
|
reasons.push('显式信号');
|
|
32
47
|
confidence += 40;
|
|
33
48
|
}
|
|
34
49
|
}
|
|
50
|
+
// 有必需产物的节点:必须同时满足显式信号 + 产物验证通过,关键词/推断不足以推进
|
|
51
|
+
if (hasRequiredArtifacts) {
|
|
52
|
+
if (!hasExplicitSignal || !artifactValidationPassed) {
|
|
53
|
+
const missing = !hasExplicitSignal ? '缺少显式完成信号' : '产物验证未通过';
|
|
54
|
+
logger.debug(`[CompletionEngine] 🔒 产物门禁:${missing},阻断推进`);
|
|
55
|
+
return {
|
|
56
|
+
shouldAdvance: false,
|
|
57
|
+
confidence: Math.min(confidence, 59),
|
|
58
|
+
reasons: [...reasons, `产物门禁(${missing})`],
|
|
59
|
+
method: 'precise',
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// 显式信号 + 产物验证均通过,直接推进
|
|
63
|
+
logger.info(`[CompletionEngine] ✅ 决策推进(显式信号 + 产物验证通过)`);
|
|
64
|
+
return {
|
|
65
|
+
shouldAdvance: true,
|
|
66
|
+
confidence: 100,
|
|
67
|
+
reasons: [...reasons],
|
|
68
|
+
method: 'precise',
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
// 无必需产物的节点:保留原有推断逻辑
|
|
35
72
|
if (nodeType.completion.heuristic?.keywords) {
|
|
36
73
|
if (this.detector.detectKeywords(event, nodeType.completion.heuristic.keywords)) {
|
|
37
74
|
reasons.push('关键词匹配');
|
|
@@ -44,19 +81,6 @@ export class CompletionEngine {
|
|
|
44
81
|
confidence += 25;
|
|
45
82
|
}
|
|
46
83
|
}
|
|
47
|
-
// 产物完整性
|
|
48
|
-
let hasRequiredArtifacts = false;
|
|
49
|
-
let artifactValidationPassed = false;
|
|
50
|
-
if (nodeType.expected_artifacts) {
|
|
51
|
-
const requiredArtifacts = nodeType.expected_artifacts.filter(a => a.required !== false);
|
|
52
|
-
hasRequiredArtifacts = requiredArtifacts.length > 0 && complexity !== 'simple';
|
|
53
|
-
const validation = this.artifactValidator.validate(artifacts, nodeType.expected_artifacts, complexity);
|
|
54
|
-
artifactValidationPassed = validation.passed;
|
|
55
|
-
if (validation.passed) {
|
|
56
|
-
reasons.push('产物完整');
|
|
57
|
-
confidence += 30;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
84
|
// 第二层:智能推断
|
|
61
85
|
if (this.detector.detectSemanticCompletion(event)) {
|
|
62
86
|
reasons.push('语义完成信号');
|
|
@@ -85,17 +109,6 @@ export class CompletionEngine {
|
|
|
85
109
|
reasons.push(`活动阈值(${eventCount}/${threshold})`);
|
|
86
110
|
confidence += 40;
|
|
87
111
|
}
|
|
88
|
-
// 产物门禁:有必需产物但验证失败时,硬阻断推进(无绕过后门)
|
|
89
|
-
// 移除显式信号和绝对超时的绕过逻辑,确保产物验证是硬约束
|
|
90
|
-
if (hasRequiredArtifacts && !artifactValidationPassed) {
|
|
91
|
-
logger.debug(`[CompletionEngine] 🔒 产物门禁:必需产物未生成,阻断推进(当前置信度 ${confidence}%)`);
|
|
92
|
-
return {
|
|
93
|
-
shouldAdvance: false,
|
|
94
|
-
confidence: Math.min(confidence, 59),
|
|
95
|
-
reasons: [...reasons, '产物门禁(必需产物未生成)'],
|
|
96
|
-
method: 'precise',
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
112
|
// 决策:confidence >= 60 即推进
|
|
100
113
|
const shouldAdvance = confidence >= 60;
|
|
101
114
|
if (shouldAdvance) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion-engine.js","sourceRoot":"","sources":["../../src/pipeline/completion-engine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAS5C,MAAM,OAAO,gBAAgB;IACnB,QAAQ,GAAG,IAAI,kBAAkB,EAAE,CAAC;IACpC,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAEpD;;;;;;;;;;;;OAYG;IACH,MAAM,CACJ,IAAiB,EACjB,QAA4B,EAC5B,KAAiB,EACjB,YAA0B,EAC1B,SAAqB,EACrB,UAAkB,EAClB,cAAkC,EAClC,cAAkC,EAClC,UAA8C;QAE9C,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,QAAQ;QAE5B,
|
|
1
|
+
{"version":3,"file":"completion-engine.js","sourceRoot":"","sources":["../../src/pipeline/completion-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,7 +28,9 @@ export declare class DynamicNodeExecutor implements INodeExecutor {
|
|
|
28
28
|
private lastArtifactAt;
|
|
29
29
|
/** 最近事件列表(key = pipelineId:nodeId,保留最近 10 条) */
|
|
30
30
|
private recentEvents;
|
|
31
|
-
/** 产物阶段状态(uninitialized/bootstrapped/enriching/ready)
|
|
31
|
+
/** 产物阶段状态(uninitialized/bootstrapped/enriching/ready)
|
|
32
|
+
* @deprecated 骨架自动创建已禁用,状态机不再维护
|
|
33
|
+
*/
|
|
32
34
|
private artifactStage;
|
|
33
35
|
/** 连续非 Write/Edit 工具调用次数(熔断器) */
|
|
34
36
|
private consecutiveNonWriteCount;
|
|
@@ -131,9 +133,12 @@ export declare class DynamicNodeExecutor implements INodeExecutor {
|
|
|
131
133
|
private ensureRequiredArtifactSkeletons;
|
|
132
134
|
/**
|
|
133
135
|
* 生成满足硬约束的富文本模板(> 300 字符、> 300 字节)
|
|
136
|
+
* @deprecated 骨架自动创建已禁用
|
|
134
137
|
*/
|
|
135
138
|
private generateRichTemplate;
|
|
136
|
-
/** 根据 path_pattern 推导骨架文件路径
|
|
139
|
+
/** 根据 path_pattern 推导骨架文件路径
|
|
140
|
+
* @deprecated 骨架自动创建已禁用
|
|
141
|
+
*/
|
|
137
142
|
private resolveSkeletonPath;
|
|
138
143
|
/**
|
|
139
144
|
* 将 path_pattern 转换为更明确的路径要求说明
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-node-executor.d.ts","sourceRoot":"","sources":["../../src/pipeline/dynamic-node-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,yBAAyB,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAM1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"dynamic-node-executor.d.ts","sourceRoot":"","sources":["../../src/pipeline/dynamic-node-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ import { SemanticValidator } from './semantic-validator.js';
|
|
|
15
15
|
import { StepOrchestrator } from './step-orchestrator.js';
|
|
16
16
|
import { StepPromptBuilder } from './step-prompt-builder.js';
|
|
17
17
|
import { StepValidator } from './step-validator.js';
|
|
18
|
+
import { StepGateKeeper as StepGateKeeperImpl } from './step-gate-keeper.js';
|
|
18
19
|
import { logger } from '../utils/logger.js';
|
|
19
20
|
import { memoryManager } from '../utils/memory-manager.js';
|
|
20
21
|
import { CACHE, TIME } from '../constants.js';
|
|
@@ -34,7 +35,9 @@ export class DynamicNodeExecutor {
|
|
|
34
35
|
lastArtifactAt = memoryManager.register('dynamicNode:lastArtifact', { max: CACHE.PHASE_MANAGER_MAX, ttl: TIME.DAY });
|
|
35
36
|
/** 最近事件列表(key = pipelineId:nodeId,保留最近 10 条) */
|
|
36
37
|
recentEvents = memoryManager.register('dynamicNode:recentEvents', { max: CACHE.PHASE_MANAGER_MAX, ttl: TIME.DAY });
|
|
37
|
-
/** 产物阶段状态(uninitialized/bootstrapped/enriching/ready)
|
|
38
|
+
/** 产物阶段状态(uninitialized/bootstrapped/enriching/ready)
|
|
39
|
+
* @deprecated 骨架自动创建已禁用,状态机不再维护
|
|
40
|
+
*/
|
|
38
41
|
artifactStage = memoryManager.register('dynamicNode:artifactStage', { max: CACHE.PHASE_MANAGER_MAX, ttl: TIME.DAY });
|
|
39
42
|
/** 连续非 Write/Edit 工具调用次数(熔断器) */
|
|
40
43
|
consecutiveNonWriteCount = memoryManager.register('dynamicNode:consecutiveNonWrite', { max: CACHE.PHASE_MANAGER_MAX, ttl: TIME.DAY });
|
|
@@ -60,8 +63,7 @@ export class DynamicNodeExecutor {
|
|
|
60
63
|
}
|
|
61
64
|
/** 初始化 StepGateKeeper(需要 HandlerContext) */
|
|
62
65
|
initStepGateKeeper(handlerContext) {
|
|
63
|
-
|
|
64
|
-
this.stepGateKeeper = new StepGateKeeper(handlerContext);
|
|
66
|
+
this.stepGateKeeper = new StepGateKeeperImpl(handlerContext);
|
|
65
67
|
}
|
|
66
68
|
/** 获取 StepOrchestrator(供 PipelineEngine 使用) */
|
|
67
69
|
getStepOrchestrator() {
|
|
@@ -92,9 +94,7 @@ export class DynamicNodeExecutor {
|
|
|
92
94
|
if (this.stepOrchestrator.isStepModeEnabled(currentNode)) {
|
|
93
95
|
return this.getStepInstruction(pipeline, currentNode, nodeType);
|
|
94
96
|
}
|
|
95
|
-
//
|
|
96
|
-
const key = `${pipeline.id}:${currentNode.id}`;
|
|
97
|
-
const bootstrapped = this.ensureRequiredArtifactSkeletons(key, pipeline, nodeType);
|
|
97
|
+
// 传统模式
|
|
98
98
|
let instruction = `当前节点:${nodeType.name}\n${nodeType.description}`;
|
|
99
99
|
// 添加产物要求说明
|
|
100
100
|
if (nodeType.expected_artifacts && nodeType.expected_artifacts.length > 0) {
|
|
@@ -108,9 +108,6 @@ export class DynamicNodeExecutor {
|
|
|
108
108
|
instruction += '\n\n请严格按路径要求使用 Write 工具生成这些文件(路径不匹配将被判定为未完成),完成后执行 echo "FORGE_NODE_DONE"。';
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
|
-
if (bootstrapped.length > 0) {
|
|
112
|
-
instruction += `\n\n[Forge 自动兜底] 已自动创建产物骨架:\n${bootstrapped.map(p => `- ${p}`).join('\n')}\n请立即使用 Edit 工具将你的分析内容写入以上文件。`;
|
|
113
|
-
}
|
|
114
111
|
if (nodeType.instruction_suffix) {
|
|
115
112
|
instruction += `\n\n${nodeType.instruction_suffix}`;
|
|
116
113
|
}
|
|
@@ -235,9 +232,8 @@ export class DynamicNodeExecutor {
|
|
|
235
232
|
async checkAndAdvanceTraditional(pipeline, currentNode, nodeType, event, qualityGate, key) {
|
|
236
233
|
// ── 无写入进展熔断器 ──────────────────────────────────────────────────────
|
|
237
234
|
const nonWriteCount = this.consecutiveNonWriteCount.get(key) || 0;
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
// 骨架已存在但 Claude 仍不写入 → 硬阻断
|
|
235
|
+
if (nonWriteCount >= DynamicNodeExecutor.CONSECUTIVE_NON_WRITE_BLOCK) {
|
|
236
|
+
// Claude 长时间不写入 → 硬阻断
|
|
241
237
|
logger.error(`[Pipeline:Dynamic:Node] ❌ 熔断:节点 ${currentNode.nodeTypeId} 连续 ${nonWriteCount} 次非写入工具调用`);
|
|
242
238
|
const requiredArtifacts = nodeType.expected_artifacts?.filter(c => c.required !== false) ?? [];
|
|
243
239
|
const artifactList = requiredArtifacts.map(c => {
|
|
@@ -252,10 +248,10 @@ export class DynamicNodeExecutor {
|
|
|
252
248
|
必需产物:
|
|
253
249
|
${artifactList}
|
|
254
250
|
|
|
255
|
-
|
|
251
|
+
请立即使用 Write 工具创建产物文件并写入实质内容,然后执行 echo "FORGE_NODE_DONE"。`,
|
|
256
252
|
};
|
|
257
253
|
}
|
|
258
|
-
if (nonWriteCount >= DynamicNodeExecutor.CONSECUTIVE_NON_WRITE_WARN
|
|
254
|
+
if (nonWriteCount >= DynamicNodeExecutor.CONSECUTIVE_NON_WRITE_WARN) {
|
|
259
255
|
// 警告:即将熔断,注入一次性提醒
|
|
260
256
|
logger.warn(`[Pipeline:Dynamic:Node] ⚠️ 熔断预警:节点 ${currentNode.nodeTypeId} 连续 ${nonWriteCount} 次非写入(阈值 ${DynamicNodeExecutor.CONSECUTIVE_NON_WRITE_BLOCK})`);
|
|
261
257
|
const requiredArtifacts = nodeType.expected_artifacts?.filter(c => c.required !== false) ?? [];
|
|
@@ -284,8 +280,7 @@ ${artifactList}
|
|
|
284
280
|
const validation = this.artifactValidator.validate(artifacts, nodeType.expected_artifacts, pipeline.complexity);
|
|
285
281
|
if (!decision.shouldAdvance) {
|
|
286
282
|
// 产物验证失败且达到最大重试次数 → 硬阻断
|
|
287
|
-
|
|
288
|
-
if (!validation.passed && pipeline.complexity !== 'simple' && (stage === 'enriching' || stage === 'ready')) {
|
|
283
|
+
if (!validation.passed && pipeline.complexity !== 'simple') {
|
|
289
284
|
const retryKey = `${pipeline.id}:${currentNode.id}`;
|
|
290
285
|
const retries = this.artifactRetryCount.get(retryKey) ?? 0;
|
|
291
286
|
if (retries >= DynamicNodeExecutor.MAX_ARTIFACT_RETRIES) {
|
|
@@ -345,8 +340,7 @@ ${artifactList || missing}
|
|
|
345
340
|
summary: `完成节点:${nodeType.name},产出 ${artifacts.length} 个产物(${decision.method},置信度 ${decision.confidence}%)`,
|
|
346
341
|
};
|
|
347
342
|
// 产物验证失败:simple 任务放行,moderate/complex 任务强制重新生成
|
|
348
|
-
|
|
349
|
-
if (!validation.passed && pipeline.complexity !== 'simple' && (stage === 'enriching' || stage === 'ready')) {
|
|
343
|
+
if (!validation.passed && pipeline.complexity !== 'simple') {
|
|
350
344
|
const retryKey = `${pipeline.id}:${currentNode.id}`;
|
|
351
345
|
const retries = this.artifactRetryCount.get(retryKey) ?? 0;
|
|
352
346
|
if (retries < DynamicNodeExecutor.MAX_ARTIFACT_RETRIES) {
|
|
@@ -611,11 +605,8 @@ ${missingList}
|
|
|
611
605
|
this.lastArtifactAt.set(key, Date.now());
|
|
612
606
|
// 重置连续非写入计数
|
|
613
607
|
this.consecutiveNonWriteCount.set(key, 0);
|
|
614
|
-
//
|
|
615
|
-
|
|
616
|
-
if (stage === 'uninitialized' || stage === 'bootstrapped') {
|
|
617
|
-
this.artifactStage.set(key, 'enriching');
|
|
618
|
-
}
|
|
608
|
+
// 兼容保留:设置为 enriching
|
|
609
|
+
this.artifactStage.set(key, 'enriching');
|
|
619
610
|
}
|
|
620
611
|
else {
|
|
621
612
|
// 非写入工具:递增熔断计数
|
|
@@ -674,124 +665,22 @@ ${missingList}
|
|
|
674
665
|
*
|
|
675
666
|
* 改进:骨架内容满足硬约束(min_length/min_size),避免首轮即失败
|
|
676
667
|
*/
|
|
677
|
-
ensureRequiredArtifactSkeletons(
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
const required = nodeType.expected_artifacts?.filter(c => c.required !== false) ?? [];
|
|
682
|
-
if (required.length === 0)
|
|
683
|
-
return [];
|
|
684
|
-
const created = [];
|
|
685
|
-
for (const constraint of required) {
|
|
686
|
-
const relPath = this.resolveSkeletonPath(constraint);
|
|
687
|
-
if (!relPath)
|
|
688
|
-
continue;
|
|
689
|
-
const absPath = path.isAbsolute(relPath) ? relPath : path.join(pipeline.projectPath, relPath);
|
|
690
|
-
try {
|
|
691
|
-
if (!fs.existsSync(absPath)) {
|
|
692
|
-
const dir = path.dirname(absPath);
|
|
693
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
694
|
-
// 生成满足硬约束的模板(> 300 字符、> 300 字节)
|
|
695
|
-
const template = this.generateRichTemplate(nodeType, pipeline.requirement);
|
|
696
|
-
fs.writeFileSync(absPath, template, 'utf-8');
|
|
697
|
-
created.push(relPath);
|
|
698
|
-
}
|
|
699
|
-
const fakeEvent = {
|
|
700
|
-
event_id: `bootstrap_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
|
|
701
|
-
session_id: pipeline.sessionId,
|
|
702
|
-
project_path: pipeline.projectPath,
|
|
703
|
-
timestamp: new Date().toISOString(),
|
|
704
|
-
hook_type: 'PostToolUse',
|
|
705
|
-
tool_name: 'Write',
|
|
706
|
-
tool_input: { file_path: absPath, content: '[Forge bootstrap skeleton]' },
|
|
707
|
-
tool_output: {},
|
|
708
|
-
distilled: false,
|
|
709
|
-
};
|
|
710
|
-
this.artifactCollector.track(key, fakeEvent);
|
|
711
|
-
}
|
|
712
|
-
catch (err) {
|
|
713
|
-
logger.warn(`[Pipeline:Dynamic:Node] 自动创建产物骨架失败:${absPath} | ${err}`);
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
if (created.length > 0) {
|
|
717
|
-
logger.info(`[Pipeline:Dynamic:Node] 🧩 自动创建产物骨架:${created.join(', ')}`);
|
|
718
|
-
this.lastArtifactAt.set(key, Date.now());
|
|
719
|
-
this.artifactStage.set(key, 'bootstrapped');
|
|
720
|
-
}
|
|
721
|
-
return created;
|
|
668
|
+
ensureRequiredArtifactSkeletons(_key, _pipeline, _nodeType) {
|
|
669
|
+
// 骨架自动创建已禁用:骨架文件会被误判为有效产物,导致节点提前完成
|
|
670
|
+
// Claude 必须自行创建产物文件并写入实质内容
|
|
671
|
+
return [];
|
|
722
672
|
}
|
|
723
673
|
/**
|
|
724
674
|
* 生成满足硬约束的富文本模板(> 300 字符、> 300 字节)
|
|
675
|
+
* @deprecated 骨架自动创建已禁用
|
|
725
676
|
*/
|
|
726
|
-
generateRichTemplate(
|
|
727
|
-
|
|
728
|
-
// 截取需求前 200 字符作为上下文
|
|
729
|
-
const reqPreview = requirement.length > 200 ? requirement.slice(0, 200) + '...' : requirement;
|
|
730
|
-
return `# ${nodeType.name}
|
|
731
|
-
|
|
732
|
-
## 背景与目标
|
|
733
|
-
|
|
734
|
-
**需求概述**:
|
|
735
|
-
${reqPreview}
|
|
736
|
-
|
|
737
|
-
**分析目标**:
|
|
738
|
-
- 理解当前系统架构和实现细节
|
|
739
|
-
- 识别潜在问题和优化空间
|
|
740
|
-
- 提出可行的改进方案
|
|
741
|
-
|
|
742
|
-
## 评审维度
|
|
743
|
-
|
|
744
|
-
### 1. 架构合理性
|
|
745
|
-
- 模块划分
|
|
746
|
-
- 分层设计
|
|
747
|
-
- 可扩展性
|
|
748
|
-
|
|
749
|
-
### 2. 代码质量
|
|
750
|
-
- 代码规范
|
|
751
|
-
- 命名规范
|
|
752
|
-
- 注释完整性
|
|
753
|
-
|
|
754
|
-
### 3. 系统质量
|
|
755
|
-
- 功能完整性
|
|
756
|
-
- 业务逻辑正确性
|
|
757
|
-
- 容错能力
|
|
758
|
-
|
|
759
|
-
## 证据记录
|
|
760
|
-
|
|
761
|
-
(待补充:调研过程中发现的关键代码、配置、数据流等)
|
|
762
|
-
|
|
763
|
-
## 风险与建议
|
|
764
|
-
|
|
765
|
-
(待补充:识别的风险点和优化建议)
|
|
766
|
-
|
|
767
|
-
---
|
|
768
|
-
生成时间:${now}
|
|
769
|
-
状态:待完善
|
|
770
|
-
`;
|
|
677
|
+
generateRichTemplate(_nodeType, _requirement) {
|
|
678
|
+
return '';
|
|
771
679
|
}
|
|
772
|
-
/** 根据 path_pattern 推导骨架文件路径
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
if (constraint.type === 'document')
|
|
777
|
-
return 'docs/analysis.md';
|
|
778
|
-
if (constraint.type === 'code')
|
|
779
|
-
return 'src/bootstrap.ts';
|
|
780
|
-
return null;
|
|
781
|
-
}
|
|
782
|
-
if (pattern === 'docs/**/*.md')
|
|
783
|
-
return 'docs/analysis.md';
|
|
784
|
-
const doubleStarIdx = pattern.indexOf('**');
|
|
785
|
-
if (doubleStarIdx !== -1) {
|
|
786
|
-
const dirPrefix = pattern.slice(0, doubleStarIdx).replace(/\/$/, '');
|
|
787
|
-
const suffix = pattern.slice(doubleStarIdx + 2).replace(/^\//, '');
|
|
788
|
-
const extMatch = suffix.match(/\*\.([a-zA-Z0-9]+)/);
|
|
789
|
-
const ext = extMatch ? extMatch[1] : (constraint.type === 'document' ? 'md' : 'txt');
|
|
790
|
-
return dirPrefix ? `${dirPrefix}/analysis.${ext}` : `analysis.${ext}`;
|
|
791
|
-
}
|
|
792
|
-
if (!pattern.includes('*') && !pattern.includes('{') && !pattern.includes('}')) {
|
|
793
|
-
return pattern;
|
|
794
|
-
}
|
|
680
|
+
/** 根据 path_pattern 推导骨架文件路径
|
|
681
|
+
* @deprecated 骨架自动创建已禁用
|
|
682
|
+
*/
|
|
683
|
+
resolveSkeletonPath(_constraint) {
|
|
795
684
|
return null;
|
|
796
685
|
}
|
|
797
686
|
/**
|