@winspan/claude-forge 3.6.27 → 3.6.43

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 (239) hide show
  1. package/dist/autopilot/issue-tracker.js +1 -1
  2. package/dist/autopilot/issue-tracker.js.map +1 -1
  3. package/dist/autopilot/quality-gate.d.ts +20 -2
  4. package/dist/autopilot/quality-gate.d.ts.map +1 -1
  5. package/dist/autopilot/quality-gate.js +20 -2
  6. package/dist/autopilot/quality-gate.js.map +1 -1
  7. package/dist/cli/commands/logs.js +1 -1
  8. package/dist/cli/commands/logs.js.map +1 -1
  9. package/dist/config/defaults.d.ts.map +1 -1
  10. package/dist/config/defaults.js +5 -0
  11. package/dist/config/defaults.js.map +1 -1
  12. package/dist/config/schema.d.ts +9 -1
  13. package/dist/config/schema.d.ts.map +1 -1
  14. package/dist/config/schema.js +5 -0
  15. package/dist/config/schema.js.map +1 -1
  16. package/dist/convention/convention-loader.d.ts.map +1 -1
  17. package/dist/convention/convention-loader.js +3 -0
  18. package/dist/convention/convention-loader.js.map +1 -1
  19. package/dist/convention/types.d.ts +15 -5
  20. package/dist/convention/types.d.ts.map +1 -1
  21. package/dist/daemon/engine-registry.d.ts.map +1 -1
  22. package/dist/daemon/engine-registry.js +6 -0
  23. package/dist/daemon/engine-registry.js.map +1 -1
  24. package/dist/daemon/handler-context.d.ts +5 -1
  25. package/dist/daemon/handler-context.d.ts.map +1 -1
  26. package/dist/daemon/handlers/post-tool-use-handler.d.ts.map +1 -1
  27. package/dist/daemon/handlers/post-tool-use-handler.js +59 -2
  28. package/dist/daemon/handlers/post-tool-use-handler.js.map +1 -1
  29. package/dist/daemon/handlers/pre-tool-use-handler.d.ts.map +1 -1
  30. package/dist/daemon/handlers/pre-tool-use-handler.js +25 -2
  31. package/dist/daemon/handlers/pre-tool-use-handler.js.map +1 -1
  32. package/dist/daemon/handlers/session-cleanup.d.ts +2 -0
  33. package/dist/daemon/handlers/session-cleanup.d.ts.map +1 -1
  34. package/dist/daemon/handlers/session-cleanup.js +20 -0
  35. package/dist/daemon/handlers/session-cleanup.js.map +1 -1
  36. package/dist/daemon/handlers/stages/07-pipeline-reply.d.ts.map +1 -1
  37. package/dist/daemon/handlers/stages/07-pipeline-reply.js +3 -0
  38. package/dist/daemon/handlers/stages/07-pipeline-reply.js.map +1 -1
  39. package/dist/daemon/handlers/stages/18-complex-task.d.ts.map +1 -1
  40. package/dist/daemon/handlers/stages/18-complex-task.js +3 -0
  41. package/dist/daemon/handlers/stages/18-complex-task.js.map +1 -1
  42. package/dist/daemon/handlers/stages/19-moderate-task.d.ts.map +1 -1
  43. package/dist/daemon/handlers/stages/19-moderate-task.js +3 -0
  44. package/dist/daemon/handlers/stages/19-moderate-task.js.map +1 -1
  45. package/dist/daemon/handlers/stop-handler.d.ts.map +1 -1
  46. package/dist/daemon/handlers/stop-handler.js +1 -0
  47. package/dist/daemon/handlers/stop-handler.js.map +1 -1
  48. package/dist/daemon/index.d.ts.map +1 -1
  49. package/dist/daemon/index.js +80 -0
  50. package/dist/daemon/index.js.map +1 -1
  51. package/dist/pipeline/completion-gate.d.ts +1 -0
  52. package/dist/pipeline/completion-gate.d.ts.map +1 -1
  53. package/dist/pipeline/completion-gate.js +43 -3
  54. package/dist/pipeline/completion-gate.js.map +1 -1
  55. package/dist/pipeline/completion-verifier.d.ts +75 -0
  56. package/dist/pipeline/completion-verifier.d.ts.map +1 -0
  57. package/dist/pipeline/completion-verifier.js +217 -0
  58. package/dist/pipeline/completion-verifier.js.map +1 -0
  59. package/dist/pipeline/diagnosis-service.d.ts +43 -0
  60. package/dist/pipeline/diagnosis-service.d.ts.map +1 -0
  61. package/dist/pipeline/diagnosis-service.js +136 -0
  62. package/dist/pipeline/diagnosis-service.js.map +1 -0
  63. package/dist/pipeline/dynamic-node-types.d.ts +2 -0
  64. package/dist/pipeline/dynamic-node-types.d.ts.map +1 -1
  65. package/dist/pipeline/execution-engine.d.ts +79 -0
  66. package/dist/pipeline/execution-engine.d.ts.map +1 -0
  67. package/dist/pipeline/execution-engine.js +227 -0
  68. package/dist/pipeline/execution-engine.js.map +1 -0
  69. package/dist/pipeline/index.d.ts +27 -1
  70. package/dist/pipeline/index.d.ts.map +1 -1
  71. package/dist/pipeline/index.js +87 -72
  72. package/dist/pipeline/index.js.map +1 -1
  73. package/dist/pipeline/node-type-sync.d.ts.map +1 -1
  74. package/dist/pipeline/node-type-sync.js +25 -22
  75. package/dist/pipeline/node-type-sync.js.map +1 -1
  76. package/dist/pipeline/pipeline-state-machine.d.ts +19 -0
  77. package/dist/pipeline/pipeline-state-machine.d.ts.map +1 -0
  78. package/dist/pipeline/pipeline-state-machine.js +53 -0
  79. package/dist/pipeline/pipeline-state-machine.js.map +1 -0
  80. package/dist/pipeline/plan-service.d.ts +58 -0
  81. package/dist/pipeline/plan-service.d.ts.map +1 -0
  82. package/dist/pipeline/plan-service.js +382 -0
  83. package/dist/pipeline/plan-service.js.map +1 -0
  84. package/dist/pipeline/strategy-selector.d.ts +41 -0
  85. package/dist/pipeline/strategy-selector.d.ts.map +1 -0
  86. package/dist/pipeline/strategy-selector.js +112 -0
  87. package/dist/pipeline/strategy-selector.js.map +1 -0
  88. package/dist/pipeline/template-evolver.d.ts +45 -0
  89. package/dist/pipeline/template-evolver.d.ts.map +1 -0
  90. package/dist/pipeline/template-evolver.js +223 -0
  91. package/dist/pipeline/template-evolver.js.map +1 -0
  92. package/dist/pipeline/template-registry.d.ts.map +1 -1
  93. package/dist/pipeline/template-registry.js +4 -1
  94. package/dist/pipeline/template-registry.js.map +1 -1
  95. package/dist/storage/repositories/base-repository.d.ts +2 -0
  96. package/dist/storage/repositories/base-repository.d.ts.map +1 -1
  97. package/dist/storage/repositories/base-repository.js +12 -0
  98. package/dist/storage/repositories/base-repository.js.map +1 -1
  99. package/dist/storage/repositories/dynamic-pipeline-repository.d.ts +2 -2
  100. package/dist/storage/repositories/dynamic-pipeline-repository.d.ts.map +1 -1
  101. package/dist/storage/repositories/dynamic-pipeline-repository.js +28 -3
  102. package/dist/storage/repositories/dynamic-pipeline-repository.js.map +1 -1
  103. package/dist/storage/repositories/dynamic-pipeline-template-repository.d.ts +13 -0
  104. package/dist/storage/repositories/dynamic-pipeline-template-repository.d.ts.map +1 -0
  105. package/dist/storage/repositories/dynamic-pipeline-template-repository.js +117 -0
  106. package/dist/storage/repositories/dynamic-pipeline-template-repository.js.map +1 -0
  107. package/dist/storage/repositories/event-repository.d.ts.map +1 -1
  108. package/dist/storage/repositories/event-repository.js +1 -1
  109. package/dist/storage/repositories/event-repository.js.map +1 -1
  110. package/dist/storage/repositories/latency-repository.js +1 -1
  111. package/dist/storage/repositories/latency-repository.js.map +1 -1
  112. package/dist/storage/repositories/node-attempt-repository.d.ts +29 -0
  113. package/dist/storage/repositories/node-attempt-repository.d.ts.map +1 -0
  114. package/dist/storage/repositories/node-attempt-repository.js +57 -0
  115. package/dist/storage/repositories/node-attempt-repository.js.map +1 -0
  116. package/dist/storage/repositories/pipeline-plan-repository.d.ts +75 -0
  117. package/dist/storage/repositories/pipeline-plan-repository.d.ts.map +1 -0
  118. package/dist/storage/repositories/pipeline-plan-repository.js +123 -0
  119. package/dist/storage/repositories/pipeline-plan-repository.js.map +1 -0
  120. package/dist/storage/repositories/quality-repository.d.ts +16 -0
  121. package/dist/storage/repositories/quality-repository.d.ts.map +1 -0
  122. package/dist/storage/repositories/quality-repository.js +36 -0
  123. package/dist/storage/repositories/quality-repository.js.map +1 -0
  124. package/dist/storage/repositories/session-repository.d.ts +7 -0
  125. package/dist/storage/repositories/session-repository.d.ts.map +1 -1
  126. package/dist/storage/repositories/session-repository.js +33 -0
  127. package/dist/storage/repositories/session-repository.js.map +1 -1
  128. package/dist/storage/repositories/template-evolution-repository.d.ts +39 -0
  129. package/dist/storage/repositories/template-evolution-repository.d.ts.map +1 -0
  130. package/dist/storage/repositories/template-evolution-repository.js +83 -0
  131. package/dist/storage/repositories/template-evolution-repository.js.map +1 -0
  132. package/dist/storage/schema/migration-manager.d.ts +1 -1
  133. package/dist/storage/schema/migration-manager.d.ts.map +1 -1
  134. package/dist/storage/schema/migration-manager.js +27 -1
  135. package/dist/storage/schema/migration-manager.js.map +1 -1
  136. package/dist/storage/sqlite.d.ts +21 -0
  137. package/dist/storage/sqlite.d.ts.map +1 -1
  138. package/dist/storage/sqlite.js +105 -31
  139. package/dist/storage/sqlite.js.map +1 -1
  140. package/dist/types/session.d.ts +3 -0
  141. package/dist/types/session.d.ts.map +1 -1
  142. package/dist/utils/logger.d.ts +4 -4
  143. package/dist/utils/logger.d.ts.map +1 -1
  144. package/dist/utils/logger.js +24 -10
  145. package/dist/utils/logger.js.map +1 -1
  146. package/dist/web/routes/config.d.ts +2 -0
  147. package/dist/web/routes/config.d.ts.map +1 -1
  148. package/dist/web/routes/config.js +58 -3
  149. package/dist/web/routes/config.js.map +1 -1
  150. package/dist/web/routes/evolution.d.ts +4 -0
  151. package/dist/web/routes/evolution.d.ts.map +1 -0
  152. package/dist/web/routes/evolution.js +61 -0
  153. package/dist/web/routes/evolution.js.map +1 -0
  154. package/dist/web/routes/knowledge.d.ts.map +1 -1
  155. package/dist/web/routes/knowledge.js +44 -16
  156. package/dist/web/routes/knowledge.js.map +1 -1
  157. package/dist/web/routes/pipelines.d.ts.map +1 -1
  158. package/dist/web/routes/pipelines.js +72 -0
  159. package/dist/web/routes/pipelines.js.map +1 -1
  160. package/dist/web/routes/plans.d.ts +5 -0
  161. package/dist/web/routes/plans.d.ts.map +1 -0
  162. package/dist/web/routes/plans.js +163 -0
  163. package/dist/web/routes/plans.js.map +1 -0
  164. package/dist/web/routes/quality.d.ts.map +1 -1
  165. package/dist/web/routes/quality.js +6 -44
  166. package/dist/web/routes/quality.js.map +1 -1
  167. package/dist/web/routes/sessions.d.ts.map +1 -1
  168. package/dist/web/routes/sessions.js +27 -15
  169. package/dist/web/routes/sessions.js.map +1 -1
  170. package/dist/web/routes/skills.d.ts.map +1 -1
  171. package/dist/web/routes/skills.js +13 -6
  172. package/dist/web/routes/skills.js.map +1 -1
  173. package/dist/web/routes/stats.d.ts.map +1 -1
  174. package/dist/web/routes/stats.js +53 -2
  175. package/dist/web/routes/stats.js.map +1 -1
  176. package/dist/web/routes/templates.d.ts +4 -0
  177. package/dist/web/routes/templates.d.ts.map +1 -0
  178. package/dist/web/routes/templates.js +117 -0
  179. package/dist/web/routes/templates.js.map +1 -0
  180. package/dist/web/server.d.ts.map +1 -1
  181. package/dist/web/server.js +119 -26
  182. package/dist/web/server.js.map +1 -1
  183. package/dist/web/sse-broadcaster.d.ts +23 -0
  184. package/dist/web/sse-broadcaster.d.ts.map +1 -0
  185. package/dist/web/sse-broadcaster.js +73 -0
  186. package/dist/web/sse-broadcaster.js.map +1 -0
  187. package/dist/web/utils/error-response.d.ts +23 -0
  188. package/dist/web/utils/error-response.d.ts.map +1 -0
  189. package/dist/web/utils/error-response.js +26 -0
  190. package/dist/web/utils/error-response.js.map +1 -0
  191. package/dist/web/utils/validation.d.ts +10 -0
  192. package/dist/web/utils/validation.d.ts.map +1 -1
  193. package/dist/web/utils/validation.js +15 -0
  194. package/dist/web/utils/validation.js.map +1 -1
  195. package/dist/web-static/assets/Analytics-Bo74j97W.js +1 -0
  196. package/dist/web-static/assets/BatchProgress-BQ533tSf.js +1 -0
  197. package/dist/web-static/assets/Breadcrumb-DtfwnOx6.js +1 -0
  198. package/dist/web-static/assets/Config-DhfQsbT1.js +1 -0
  199. package/dist/web-static/assets/ConfirmDialog-CVzB7X5y.js +1 -0
  200. package/dist/web-static/assets/Conventions-BobuQiOk.js +1 -0
  201. package/dist/web-static/assets/Dashboard-Bj28rnDe.js +1 -0
  202. package/dist/web-static/assets/ErrorState-DXHA8lr8.js +1 -0
  203. package/dist/web-static/assets/Events-C0y7WcDP.js +1 -0
  204. package/dist/web-static/assets/Evolution-DimZAXFS.js +1 -0
  205. package/dist/web-static/assets/Knowledge-Y1lX6vor.js +2 -0
  206. package/dist/web-static/assets/NodeTypes-DyrDqhBp.js +1 -0
  207. package/dist/web-static/assets/Pagination-lp8b_3NR.js +1 -0
  208. package/dist/web-static/assets/PipelineDetail-DGKz18zu.js +4 -0
  209. package/dist/web-static/assets/PipelineTemplates-D4zvL6I1.js +1 -0
  210. package/dist/web-static/assets/Pipelines-CR9oD3Xy.js +2 -0
  211. package/dist/web-static/assets/ProjectDetail-RfdtEvTT.js +1 -0
  212. package/dist/web-static/assets/Projects-RGIPdiJn.js +1 -0
  213. package/dist/web-static/assets/Quality-BdvL1VQn.js +3 -0
  214. package/dist/web-static/assets/SessionDetail-BNDIfmmq.js +1 -0
  215. package/dist/web-static/assets/Sessions-CorfQV78.js +2 -0
  216. package/dist/web-static/assets/Skeleton-B7PVDJJ_.js +1 -0
  217. package/dist/web-static/assets/Skills-BJt0OrKj.js +1 -0
  218. package/dist/web-static/assets/TemplateDetail-DOfBYdQ3.js +1 -0
  219. package/dist/web-static/assets/Templates-Cp3yC5tv.js +1 -0
  220. package/dist/web-static/assets/client-BhcjNvkG.js +1 -0
  221. package/dist/web-static/assets/exportCsv-CSExJI8h.js +3 -0
  222. package/dist/web-static/assets/index-CqwJts5v.css +2 -0
  223. package/dist/web-static/assets/index-DdmJVOxm.js +2 -0
  224. package/dist/web-static/assets/rolldown-runtime-COnpUsM8.js +1 -0
  225. package/dist/web-static/assets/ui-CDL3BZ13.js +1 -0
  226. package/dist/web-static/assets/useDebounce-DNfPs3Tv.js +1 -0
  227. package/dist/web-static/assets/useSmartPolling-DYAVOihL.js +1 -0
  228. package/dist/web-static/assets/vendor-DRGPi8ui.js +9 -0
  229. package/dist/web-static/assets/vendor-charts-9eVsQvUV.js +36 -0
  230. package/dist/web-static/assets/vendor-editor-B1NX2ipj.js +11 -0
  231. package/dist/web-static/assets/vendor-flow-CHpVij2M.css +1 -0
  232. package/dist/web-static/assets/vendor-flow-srkes8If.js +7 -0
  233. package/dist/web-static/assets/vendor-motion-CQmdgnI8.js +9 -0
  234. package/dist/web-static/assets/vendor-query-DqPOMnuX.js +4 -0
  235. package/dist/web-static/assets/vendor-react-DJI9oneq.js +11 -0
  236. package/dist/web-static/index.html +13 -2
  237. package/package.json +2 -1
  238. package/dist/web-static/assets/index-BCgOtcuH.js +0 -91
  239. package/dist/web-static/assets/index-DwWCJY_u.css +0 -1
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Execution Engine - 执行引擎(状态机驱动)
3
+ *
4
+ * 核心职责:
5
+ * 1. 管理节点状态转换(pending → in_progress → retrying → blocked|done)
6
+ * 2. 集成 Verifier + Diagnosis + Strategy Selector
7
+ * 3. 下发节点指令包(via PreToolUse)
8
+ * 4. 校验完成条件并推进(via PostToolUse)
9
+ */
10
+ import { CompletionVerifier } from './completion-verifier.js';
11
+ import { DiagnosisService } from './diagnosis-service.js';
12
+ import { StrategySelector } from './strategy-selector.js';
13
+ import { logger } from '../utils/logger.js';
14
+ import { randomUUID } from 'crypto';
15
+ // ── Execution Engine 实现 ───────────────────────────────────────────────
16
+ export class ExecutionEngine {
17
+ storage;
18
+ aiProvider;
19
+ verifier = new CompletionVerifier();
20
+ diagnosisService;
21
+ strategySelector = new StrategySelector();
22
+ constructor(storage, aiProvider) {
23
+ this.storage = storage;
24
+ this.aiProvider = aiProvider;
25
+ this.diagnosisService = new DiagnosisService(aiProvider);
26
+ }
27
+ /**
28
+ * 获取当前活跃的执行计划
29
+ */
30
+ getActivePlan(projectPath) {
31
+ return this.storage.repositories.pipelinePlans.getByProjectPath(projectPath);
32
+ }
33
+ /**
34
+ * 获取当前执行中的节点
35
+ */
36
+ getCurrentNode(plan) {
37
+ const nodes = this.storage.repositories.planNodes.getByPlanId(plan.plan_id);
38
+ return nodes.find(n => n.status === 'in_progress') || null;
39
+ }
40
+ /**
41
+ * 获取下一个待执行的节点
42
+ */
43
+ getNextPendingNode(plan) {
44
+ const nodes = this.storage.repositories.planNodes.getByPlanId(plan.plan_id);
45
+ for (const node of nodes) {
46
+ if (node.status !== 'pending')
47
+ continue;
48
+ // 检查依赖是否满足
49
+ const dependenciesMet = (node.dependencies ?? []).every(depId => {
50
+ const depNode = nodes.find(n => n.node_id === depId);
51
+ return depNode?.status === 'done';
52
+ });
53
+ if (dependenciesMet) {
54
+ return node;
55
+ }
56
+ }
57
+ return null;
58
+ }
59
+ /**
60
+ * 生成节点指令包(PreToolUse 注入)
61
+ */
62
+ generateInstructionPackage(node) {
63
+ const completionSummary = node.completion_rules
64
+ .filter(r => r.required)
65
+ .map(r => `- ${r.description}`)
66
+ .join('\n');
67
+ let retryContext;
68
+ if (node.attempt_count > 0) {
69
+ retryContext = `这是第 ${node.attempt_count + 1} 次尝试。`;
70
+ }
71
+ return {
72
+ node_id: node.node_id,
73
+ title: node.title,
74
+ instruction: node.instruction,
75
+ completion_summary: completionSummary,
76
+ retry_context: retryContext,
77
+ };
78
+ }
79
+ /**
80
+ * 处理 PostToolUse 事件,推进状态机
81
+ */
82
+ async handlePostToolUse(plan, node, event) {
83
+ // 1. 校验完成条件
84
+ const verifyResult = await this.verifier.verify(node.completion_rules, plan.project_path);
85
+ logger.debug(`[ExecutionEngine] 节点 ${node.title} 验证结果: ${verifyResult.passed}, ` +
86
+ `缺失项: ${verifyResult.missing_items.length}`);
87
+ // 2. 记录本次尝试
88
+ await this.recordAttempt(node, verifyResult);
89
+ // 3. 验证通过 → 推进到下一个节点
90
+ if (verifyResult.passed) {
91
+ return await this.advanceToNextNode(plan, node);
92
+ }
93
+ // 4. 验证失败 → 诊断 + 选策略 + 重试
94
+ return await this.handleVerificationFailure(plan, node, event, verifyResult);
95
+ }
96
+ /**
97
+ * 记录节点执行尝试
98
+ */
99
+ async recordAttempt(node, verifyResult) {
100
+ const attemptId = randomUUID();
101
+ const now = new Date().toISOString();
102
+ this.storage.repositories.nodeAttempts.create({
103
+ attempt_id: attemptId,
104
+ node_id: node.node_id,
105
+ strategy_id: node.current_strategy_id || 'default',
106
+ attempt_number: node.attempt_count + 1,
107
+ started_at: now,
108
+ ended_at: now,
109
+ status: verifyResult.passed ? 'passed' : 'failed',
110
+ verification_result: {
111
+ passed: verifyResult.passed,
112
+ missing_items: verifyResult.missing_items,
113
+ diagnostics: verifyResult.diagnostics,
114
+ next_action: verifyResult.next_action,
115
+ },
116
+ });
117
+ }
118
+ /**
119
+ * 推进到下一个节点
120
+ */
121
+ async advanceToNextNode(plan, completedNode) {
122
+ // 更新当前节点状态为 done
123
+ this.storage.repositories.planNodes.updateStatus(completedNode.node_id, 'done');
124
+ // 更新策略池统计(成功)
125
+ if (completedNode.current_strategy_id) {
126
+ const updatedPool = this.strategySelector.updateStrategyStats(completedNode.strategy_pool, completedNode.current_strategy_id, true);
127
+ this.storage.repositories.planNodes.updateStrategyPool(completedNode.node_id, updatedPool);
128
+ }
129
+ // 查找下一个待执行节点
130
+ const nextNode = this.getNextPendingNode(plan);
131
+ if (!nextNode) {
132
+ // 所有节点完成
133
+ this.storage.repositories.pipelinePlans.updateStatus(plan.plan_id, 'completed');
134
+ logger.info(`[ExecutionEngine] Pipeline ${plan.plan_id} 已完成`);
135
+ return {
136
+ advanced: true,
137
+ system_message: `Pipeline 已完成!所有节点执行成功。`,
138
+ };
139
+ }
140
+ // 启动下一个节点
141
+ this.storage.repositories.planNodes.updateStatus(nextNode.node_id, 'in_progress');
142
+ logger.info(`[ExecutionEngine] 节点推进: ${completedNode.title} → ${nextNode.title}`);
143
+ return {
144
+ advanced: true,
145
+ next_node_id: nextNode.node_id,
146
+ system_message: `节点「${completedNode.title}」已完成,开始执行「${nextNode.title}」。`,
147
+ };
148
+ }
149
+ /**
150
+ * 处理验证失败
151
+ */
152
+ async handleVerificationFailure(plan, node, event, verifyResult) {
153
+ // 获取最近的工具调用记录
154
+ const recentEvents = this.getRecentToolCalls(plan.session_id, 20);
155
+ // 调用诊断服务
156
+ const diagnosis = await this.diagnosisService.diagnose({
157
+ node,
158
+ verification_result: verifyResult,
159
+ recent_tool_calls: recentEvents,
160
+ attempt_count: node.attempt_count,
161
+ });
162
+ logger.info(`[ExecutionEngine] 诊断结果: ${diagnosis.failure_category}, ` +
163
+ `证据: ${diagnosis.evidence.slice(0, 100)}`);
164
+ // 选择下一个策略
165
+ const attemptedStrategyIds = new Set(this.storage.repositories.nodeAttempts
166
+ .getByNodeId(node.node_id)
167
+ .map(a => a.strategy_id));
168
+ const nextStrategy = this.strategySelector.select(node.strategy_pool, diagnosis, attemptedStrategyIds);
169
+ if (!nextStrategy) {
170
+ // 策略池耗尽 → blocked
171
+ return await this.blockNode(plan, node, verifyResult, diagnosis);
172
+ }
173
+ // 更新节点状态为 retrying
174
+ this.storage.repositories.planNodes.updateStatus(node.node_id, 'retrying');
175
+ this.storage.repositories.planNodes.updateAttempt(node.node_id, nextStrategy.strategy_id, node.attempt_count + 1);
176
+ logger.info(`[ExecutionEngine] 节点「${node.title}」进入重试,策略: ${nextStrategy.name}`);
177
+ // 生成重试指令
178
+ const retryMessage = this.buildRetryMessage(node, verifyResult, nextStrategy);
179
+ return {
180
+ advanced: false,
181
+ system_message: retryMessage,
182
+ };
183
+ }
184
+ /**
185
+ * 阻塞节点
186
+ */
187
+ async blockNode(plan, node, verifyResult, diagnosis) {
188
+ this.storage.repositories.planNodes.updateStatus(node.node_id, 'blocked');
189
+ this.storage.repositories.pipelinePlans.updateStatus(plan.plan_id, 'failed');
190
+ logger.error(`[ExecutionEngine] 节点「${node.title}」已阻塞,策略池耗尽`);
191
+ const blockMessage = `[Pipeline 已阻断] 节点「${node.title}」执行失败,所有策略已尝试。\n\n` +
192
+ `诊断结果: ${diagnosis.failure_category}\n` +
193
+ `证据: ${diagnosis.evidence}\n\n` +
194
+ `缺失项:\n${verifyResult.missing_items.map((item) => `- ${item}`).join('\n')}`;
195
+ return {
196
+ advanced: false,
197
+ blocking: true,
198
+ system_message: blockMessage,
199
+ };
200
+ }
201
+ /**
202
+ * 构建重试指令
203
+ */
204
+ buildRetryMessage(node, verifyResult, strategy) {
205
+ let message = `[Forge:重试] 节点「${node.title}」验证未通过,正在使用策略「${strategy.name}」重试。\n\n`;
206
+ message += `缺失项:\n${verifyResult.missing_items.map((item) => `- ${item}`).join('\n')}\n\n`;
207
+ if (strategy.method.instruction_suffix) {
208
+ message += `策略提示:\n${strategy.method.instruction_suffix}\n\n`;
209
+ }
210
+ if (strategy.method.provide_template) {
211
+ message += `参考模板:\n${strategy.method.provide_template}\n\n`;
212
+ }
213
+ message += `请根据以上信息修复问题,完成后再次执行完成信号。`;
214
+ return message;
215
+ }
216
+ /**
217
+ * 获取最近的工具调用记录
218
+ */
219
+ getRecentToolCalls(sessionId, limit) {
220
+ const events = this.storage.queryEvents({
221
+ session_id: sessionId,
222
+ limit,
223
+ });
224
+ return events.reverse(); // 按时间正序
225
+ }
226
+ }
227
+ //# sourceMappingURL=execution-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-engine.js","sourceRoot":"","sources":["../../src/pipeline/execution-engine.ts"],"names":[],"mappings":"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"}
@@ -37,11 +37,18 @@ export declare class PipelineEngine {
37
37
  private blockedProjects;
38
38
  /**
39
39
  * PreToolUse 处理:如果有活跃 Pipeline,注入阶段指令
40
+ *
41
+ * @param event - Forge 事件对象,包含项目路径、会话 ID 等上下文
42
+ * @returns 需要注入的指令文本,无活跃 Pipeline 时返回 null
40
43
  */
41
44
  handlePreToolUse(event: ForgeEvent): Promise<string | null>;
42
45
  private _handlePreToolUse;
43
46
  /**
44
47
  * PostToolUse 处理:跟踪进度,检查阶段推进
48
+ *
49
+ * @param event - Forge 事件对象
50
+ * @param qualityGate - 可选的质量门禁引擎,用于代码审查
51
+ * @returns 包含进度消息、质量检查结果、系统消息等的对象
45
52
  */
46
53
  handlePostToolUse(event: ForgeEvent, qualityGate?: QualityGateEngine): Promise<{
47
54
  message: string | null;
@@ -60,6 +67,8 @@ export declare class PipelineEngine {
60
67
  * 路由到 DynamicNodeExecutor,处理节点推进和状态更新
61
68
  */
62
69
  private _handlePostToolUseDynamic;
70
+ /** 节点推进后的状态更新与消息构建 */
71
+ private handleDynamicAdvance;
63
72
  /**
64
73
  * 将当前 Pipeline 状态写入项目根目录 CLAUDE.md(上次工作续接章节)
65
74
  * 每次阶段推进时调用,确保跨会话后 Claude 能快速恢复上下文
@@ -67,14 +76,31 @@ export declare class PipelineEngine {
67
76
  private persistPipelineStateToClaude;
68
77
  /**
69
78
  * 启动新 Pipeline
79
+ *
80
+ * @param requirement - 用户需求描述
81
+ * @param projectPath - 项目根目录路径
82
+ * @param sessionId - 会话 ID
83
+ * @param analysis - 可选的意图分析结果,未提供时使用默认值
84
+ * @returns 创建的 Pipeline 对象
70
85
  */
71
86
  startPipeline(requirement: string, projectPath: string, sessionId: string, analysis?: IntentAnalysis): Promise<Pipeline>;
72
87
  /**
73
88
  * 生成统一执行计划(动态流水线唯一事实来源)
89
+ *
90
+ * @param requirement - 用户需求描述
91
+ * @param projectPath - 项目根目录路径
92
+ * @param sessionId - 会话 ID
93
+ * @param analysis - 意图分析结果
94
+ * @param template - 可选的流水线模板
95
+ * @param templateRoute - 可选的模板路由结果
96
+ * @returns 规范化的执行计划对象
74
97
  */
75
98
  buildExecutionPlan(requirement: string, projectPath: string, sessionId: string, analysis: IntentAnalysis, template?: PipelineTemplate, templateRoute?: import('./types.js').TemplateRouteResult | null): Promise<CanonicalExecutionPlan>;
76
99
  /**
77
- * 从统一执行计划启动动态 Pipeline
100
+ * 从统一执行计划启动动态 Pipeline
101
+ *
102
+ * @param plan - 规范化的执行计划对象
103
+ * @returns 创建的 Pipeline 对象
78
104
  */
79
105
  startPipelineFromPlan(plan: CanonicalExecutionPlan): Promise<Pipeline>;
80
106
  private materializeDynamicPipeline;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pipeline/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pipeline/index.ts"],"names":[],"mappings":"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"}
@@ -58,6 +58,9 @@ export class PipelineEngine {
58
58
  });
59
59
  /**
60
60
  * PreToolUse 处理:如果有活跃 Pipeline,注入阶段指令
61
+ *
62
+ * @param event - Forge 事件对象,包含项目路径、会话 ID 等上下文
63
+ * @returns 需要注入的指令文本,无活跃 Pipeline 时返回 null
61
64
  */
62
65
  async handlePreToolUse(event) {
63
66
  return this.pipelineLock.runExclusive(event.project_path, () => this._handlePreToolUse(event)) ?? null;
@@ -100,6 +103,10 @@ export class PipelineEngine {
100
103
  }
101
104
  /**
102
105
  * PostToolUse 处理:跟踪进度,检查阶段推进
106
+ *
107
+ * @param event - Forge 事件对象
108
+ * @param qualityGate - 可选的质量门禁引擎,用于代码审查
109
+ * @returns 包含进度消息、质量检查结果、系统消息等的对象
103
110
  */
104
111
  async handlePostToolUse(event, qualityGate) {
105
112
  const result = await this.pipelineLock.runExclusive(event.project_path, () => this._handlePostToolUse(event, qualityGate));
@@ -164,77 +171,7 @@ export class PipelineEngine {
164
171
  return { message: null, systemMessage: result.systemMessage, blocking: true };
165
172
  }
166
173
  if (result.advanced) {
167
- const completedNodeId = currentNodeId;
168
- // 更新已完成节点状态(包含产物输出)
169
- if (completedNodeId) {
170
- await this.storage.repositories.dynamicPipelines.updateNodeStatus(completedNodeId, 'completed', result.nodeOutput // 传入产物输出
171
- );
172
- }
173
- if (result.newPhase) {
174
- // 推进到下一节点
175
- await this.storage.repositories.dynamicPipelines.updateNodeStatus(result.newPhase, 'in_progress');
176
- await this.storage.repositories.dynamicPipelines.updateCurrentNode(pipeline.id, result.newPhase);
177
- // 更新 bridge pipeline 的 phase 和 tasks
178
- const nextNode = dynPipeline.nodes.find(n => n.id === result.newPhase);
179
- if (nextNode) {
180
- pipeline.phase = nextNode.nodeTypeId;
181
- }
182
- pipeline.tasks = pipeline.tasks.map(t => {
183
- if (t.id === completedNodeId)
184
- return { ...t, status: 'completed' };
185
- if (t.id === result.newPhase)
186
- return { ...t, status: 'in_progress' };
187
- return t;
188
- });
189
- this.activePipelines.set(event.project_path, pipeline);
190
- // 清除指纹缓存,确保新节点指令能正常注入
191
- this.lastInstructionKey.delete(event.project_path);
192
- this.emptyPhaseNotified.delete(`${event.project_path}:${pipeline.phase}`);
193
- // 更新 CLAUDE.md 续接状态
194
- this.persistPipelineStateToClaude(pipeline, event.project_path);
195
- // 获取下一节点的指令,通过 systemMessage 步进式告知 Claude Code
196
- const updatedDynPipeline = await this.storage.repositories.dynamicPipelines.getById(pipeline.id);
197
- const nextInstruction = updatedDynPipeline
198
- ? this.dynamicNodeExecutor.getInstruction(updatedDynPipeline)
199
- : null;
200
- const completedNodeType = dynPipeline.nodes.find(n => n.id === completedNodeId)?.nodeTypeId ?? completedNodeId;
201
- const advanceSystemMessage = nextInstruction
202
- ? `[Forge Pipeline] ✅ 节点「${completedNodeType}」已完成,产物验证通过。\n\n下一步任务:\n${nextInstruction}`
203
- : result.systemMessage;
204
- return {
205
- message: `[Forge Pipeline:Dynamic] 🔄 节点推进:${nextNode?.nodeTypeId ?? result.newPhase}`,
206
- gapMessage: result.gapMessage,
207
- qualityLevel: result.qualityLevel,
208
- advanceReason: result.advanceReason,
209
- systemMessage: advanceSystemMessage,
210
- };
211
- }
212
- else {
213
- // newPhase 为 undefined 表示所有节点已完成
214
- await this.storage.repositories.dynamicPipelines.close(pipeline.id, 'completed');
215
- this.activePipelines.delete(event.project_path);
216
- this.clearBlocked(event.project_path);
217
- this.dynamicNodeExecutor.cleanup(pipeline.id);
218
- const totalNodes = dynPipeline.nodes.length;
219
- const completedNodes = totalNodes; // 全部完成
220
- let reportMessage = `[Forge Pipeline:Dynamic] ✅ 动态流水线已完成所有节点!
221
- 📋 需求:${pipeline.requirement}
222
- 📊 统计:
223
- • 总节点数:${totalNodes}
224
- • 已完成:${completedNodes}`;
225
- if (qualityGate) {
226
- try {
227
- const reportGenerator = new PipelineReportGenerator(qualityGate.getIssueTracker(), this.dynamicNodeExecutor);
228
- const markdown = reportGenerator.generate(pipeline);
229
- reportGenerator.persist(pipeline.projectPath, markdown);
230
- reportMessage = `${reportMessage}\n\n${markdown}`;
231
- }
232
- catch (err) {
233
- logger.warn(`[Pipeline:Dynamic] ⚠️ 动态流水线完成报告生成失败:${err}`);
234
- }
235
- }
236
- return { message: reportMessage };
237
- }
174
+ return this.handleDynamicAdvance(pipeline, dynPipeline, event, qualityGate, result, currentNodeId);
238
175
  }
239
176
  // 非推进时定期更新 CLAUDE.md
240
177
  const eventCount = this.dynamicNodeExecutor.exportState(`${pipeline.id}:${currentNodeId ?? ''}`).eventCount;
@@ -244,6 +181,67 @@ export class PipelineEngine {
244
181
  // 透传 systemMessage(产物重试指令等)
245
182
  return { message: null, systemMessage: result.systemMessage, qualityLevel: result.qualityLevel };
246
183
  }
184
+ /** 节点推进后的状态更新与消息构建 */
185
+ async handleDynamicAdvance(pipeline, dynPipeline, event, qualityGate, result, completedNodeId) {
186
+ if (completedNodeId) {
187
+ await this.storage.repositories.dynamicPipelines.updateNodeStatus(completedNodeId, 'completed', result.nodeOutput);
188
+ }
189
+ if (result.newPhase) {
190
+ await this.storage.repositories.dynamicPipelines.updateNodeStatus(result.newPhase, 'in_progress');
191
+ await this.storage.repositories.dynamicPipelines.updateCurrentNode(pipeline.id, result.newPhase);
192
+ const nextNode = dynPipeline.nodes.find(n => n.id === result.newPhase);
193
+ if (nextNode) {
194
+ pipeline.phase = nextNode.nodeTypeId;
195
+ }
196
+ pipeline.tasks = pipeline.tasks.map(t => {
197
+ if (t.id === completedNodeId)
198
+ return { ...t, status: 'completed' };
199
+ if (t.id === result.newPhase)
200
+ return { ...t, status: 'in_progress' };
201
+ return t;
202
+ });
203
+ this.activePipelines.set(event.project_path, pipeline);
204
+ this.lastInstructionKey.delete(event.project_path);
205
+ this.emptyPhaseNotified.delete(`${event.project_path}:${pipeline.phase}`);
206
+ this.persistPipelineStateToClaude(pipeline, event.project_path);
207
+ const updatedDynPipeline = await this.storage.repositories.dynamicPipelines.getById(pipeline.id);
208
+ const nextInstruction = updatedDynPipeline ? this.dynamicNodeExecutor.getInstruction(updatedDynPipeline) : null;
209
+ const completedNodeType = dynPipeline.nodes.find(n => n.id === completedNodeId)?.nodeTypeId ?? completedNodeId;
210
+ const advanceSystemMessage = nextInstruction
211
+ ? `[Forge Pipeline] ✅ 节点「${completedNodeType}」已完成,产物验证通过。\n\n下一步任务:\n${nextInstruction}`
212
+ : result.systemMessage;
213
+ return {
214
+ message: `[Forge Pipeline:Dynamic] 🔄 节点推进:${nextNode?.nodeTypeId ?? result.newPhase}`,
215
+ gapMessage: result.gapMessage,
216
+ qualityLevel: result.qualityLevel,
217
+ advanceReason: result.advanceReason,
218
+ systemMessage: advanceSystemMessage,
219
+ };
220
+ }
221
+ // 所有节点已完成
222
+ await this.storage.repositories.dynamicPipelines.close(pipeline.id, 'completed');
223
+ this.activePipelines.delete(event.project_path);
224
+ this.clearBlocked(event.project_path);
225
+ this.dynamicNodeExecutor.cleanup(pipeline.id);
226
+ const totalNodes = dynPipeline.nodes.length;
227
+ let reportMessage = `[Forge Pipeline:Dynamic] ✅ 动态流水线已完成所有节点!
228
+ 📋 需求:${pipeline.requirement}
229
+ 📊 统计:
230
+ • 总节点数:${totalNodes}
231
+ • 已完成:${totalNodes}`;
232
+ if (qualityGate) {
233
+ try {
234
+ const reportGenerator = new PipelineReportGenerator(qualityGate.getIssueTracker(), this.dynamicNodeExecutor);
235
+ const markdown = reportGenerator.generate(pipeline);
236
+ reportGenerator.persist(pipeline.projectPath, markdown);
237
+ reportMessage = `${reportMessage}\n\n${markdown}`;
238
+ }
239
+ catch (err) {
240
+ logger.warn(`[Pipeline:Dynamic] ⚠️ 动态流水线完成报告生成失败:${err}`);
241
+ }
242
+ }
243
+ return { message: reportMessage };
244
+ }
247
245
  /**
248
246
  * 将当前 Pipeline 状态写入项目根目录 CLAUDE.md(上次工作续接章节)
249
247
  * 每次阶段推进时调用,确保跨会话后 Claude 能快速恢复上下文
@@ -299,6 +297,12 @@ ${taskSummary}
299
297
  }
300
298
  /**
301
299
  * 启动新 Pipeline
300
+ *
301
+ * @param requirement - 用户需求描述
302
+ * @param projectPath - 项目根目录路径
303
+ * @param sessionId - 会话 ID
304
+ * @param analysis - 可选的意图分析结果,未提供时使用默认值
305
+ * @returns 创建的 Pipeline 对象
302
306
  */
303
307
  async startPipeline(requirement, projectPath, sessionId, analysis) {
304
308
  logger.info(`[Pipeline] 启动中(模式:dynamic):"${requirement}"`);
@@ -316,6 +320,14 @@ ${taskSummary}
316
320
  }
317
321
  /**
318
322
  * 生成统一执行计划(动态流水线唯一事实来源)
323
+ *
324
+ * @param requirement - 用户需求描述
325
+ * @param projectPath - 项目根目录路径
326
+ * @param sessionId - 会话 ID
327
+ * @param analysis - 意图分析结果
328
+ * @param template - 可选的流水线模板
329
+ * @param templateRoute - 可选的模板路由结果
330
+ * @returns 规范化的执行计划对象
319
331
  */
320
332
  async buildExecutionPlan(requirement, projectPath, sessionId, analysis, template, templateRoute) {
321
333
  const goal = {
@@ -331,7 +343,10 @@ ${taskSummary}
331
343
  });
332
344
  }
333
345
  /**
334
- * 从统一执行计划启动动态 Pipeline
346
+ * 从统一执行计划启动动态 Pipeline
347
+ *
348
+ * @param plan - 规范化的执行计划对象
349
+ * @returns 创建的 Pipeline 对象
335
350
  */
336
351
  async startPipelineFromPlan(plan) {
337
352
  logger.info(`[Pipeline:Dynamic] 🚀 启动动态流水线:"${plan.requirement}" | 项目=${plan.projectPath} | source=${plan.source}`);