@winspan/claude-forge 0.3.9 → 0.4.1

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 (72) hide show
  1. package/README.md +12 -7
  2. package/dist/autopilot/quality-gate.d.ts +11 -1
  3. package/dist/autopilot/quality-gate.d.ts.map +1 -1
  4. package/dist/autopilot/quality-gate.js +84 -27
  5. package/dist/autopilot/quality-gate.js.map +1 -1
  6. package/dist/daemon/engine-registry.d.ts.map +1 -1
  7. package/dist/daemon/engine-registry.js +3 -0
  8. package/dist/daemon/engine-registry.js.map +1 -1
  9. package/dist/daemon/handler-context.d.ts +4 -2
  10. package/dist/daemon/handler-context.d.ts.map +1 -1
  11. package/dist/daemon/handlers/session-cleanup.d.ts +6 -0
  12. package/dist/daemon/handlers/session-cleanup.d.ts.map +1 -1
  13. package/dist/daemon/handlers/session-cleanup.js +107 -0
  14. package/dist/daemon/handlers/session-cleanup.js.map +1 -1
  15. package/dist/daemon/handlers/stop-handler.d.ts.map +1 -1
  16. package/dist/daemon/handlers/stop-handler.js +15 -0
  17. package/dist/daemon/handlers/stop-handler.js.map +1 -1
  18. package/dist/daemon/handlers/user-prompt-handler.d.ts +5 -0
  19. package/dist/daemon/handlers/user-prompt-handler.d.ts.map +1 -1
  20. package/dist/daemon/handlers/user-prompt-handler.js +86 -0
  21. package/dist/daemon/handlers/user-prompt-handler.js.map +1 -1
  22. package/dist/pipeline/artifact-generator.d.ts +35 -0
  23. package/dist/pipeline/artifact-generator.d.ts.map +1 -0
  24. package/dist/pipeline/artifact-generator.js +287 -0
  25. package/dist/pipeline/artifact-generator.js.map +1 -0
  26. package/dist/pipeline/index.d.ts +57 -0
  27. package/dist/pipeline/index.d.ts.map +1 -1
  28. package/dist/pipeline/index.js +146 -0
  29. package/dist/pipeline/index.js.map +1 -1
  30. package/dist/pipeline/phase-manager.d.ts +14 -1
  31. package/dist/pipeline/phase-manager.d.ts.map +1 -1
  32. package/dist/pipeline/phase-manager.js +61 -10
  33. package/dist/pipeline/phase-manager.js.map +1 -1
  34. package/dist/pipeline/store.d.ts +5 -0
  35. package/dist/pipeline/store.d.ts.map +1 -1
  36. package/dist/pipeline/store.js +8 -0
  37. package/dist/pipeline/store.js.map +1 -1
  38. package/dist/retrospective/failure-detector.d.ts +17 -0
  39. package/dist/retrospective/failure-detector.d.ts.map +1 -0
  40. package/dist/retrospective/failure-detector.js +67 -0
  41. package/dist/retrospective/failure-detector.js.map +1 -0
  42. package/dist/retrospective/index.d.ts +69 -0
  43. package/dist/retrospective/index.d.ts.map +1 -0
  44. package/dist/retrospective/index.js +189 -0
  45. package/dist/retrospective/index.js.map +1 -0
  46. package/dist/retrospective/metrics-extractor.d.ts +27 -0
  47. package/dist/retrospective/metrics-extractor.d.ts.map +1 -0
  48. package/dist/retrospective/metrics-extractor.js +71 -0
  49. package/dist/retrospective/metrics-extractor.js.map +1 -0
  50. package/dist/retrospective/pattern-learner.d.ts +29 -0
  51. package/dist/retrospective/pattern-learner.d.ts.map +1 -0
  52. package/dist/retrospective/pattern-learner.js +159 -0
  53. package/dist/retrospective/pattern-learner.js.map +1 -0
  54. package/dist/retrospective/report-writer.d.ts +33 -0
  55. package/dist/retrospective/report-writer.d.ts.map +1 -0
  56. package/dist/retrospective/report-writer.js +173 -0
  57. package/dist/retrospective/report-writer.js.map +1 -0
  58. package/dist/retrospective/strategy-advisor.d.ts +21 -0
  59. package/dist/retrospective/strategy-advisor.d.ts.map +1 -0
  60. package/dist/retrospective/strategy-advisor.js +63 -0
  61. package/dist/retrospective/strategy-advisor.js.map +1 -0
  62. package/dist/retrospective/types.d.ts +107 -0
  63. package/dist/retrospective/types.d.ts.map +1 -0
  64. package/dist/retrospective/types.js +7 -0
  65. package/dist/retrospective/types.js.map +1 -0
  66. package/dist/storage/index.d.ts +12 -0
  67. package/dist/storage/index.d.ts.map +1 -1
  68. package/dist/storage/sqlite.d.ts +57 -0
  69. package/dist/storage/sqlite.d.ts.map +1 -1
  70. package/dist/storage/sqlite.js +126 -1
  71. package/dist/storage/sqlite.js.map +1 -1
  72. package/package.json +1 -1
@@ -0,0 +1,287 @@
1
+ import { PHASE_LABELS } from './types.js';
2
+ import { logger } from '../utils/logger.js';
3
+ import fs from 'fs';
4
+ import path from 'path';
5
+ /**
6
+ * 阶段产物生成器:为每个 Pipeline 阶段生成结构化文档
7
+ */
8
+ export class PhaseArtifactGenerator {
9
+ projectPath;
10
+ api;
11
+ storage;
12
+ constructor(projectPath, api, storage) {
13
+ this.projectPath = projectPath;
14
+ this.api = api;
15
+ this.storage = storage;
16
+ }
17
+ /**
18
+ * 为指定阶段生成产物,写入 .claude-forge/docs/YYYY-MM-DD_HH-MM/ 目录
19
+ * 幂等:若产物已存在则跳过
20
+ */
21
+ async generateForPhase(phase, pipeline, sessionId, outputDir) {
22
+ if (phase === 'done')
23
+ return;
24
+ const artifacts = this.getArtifactFiles(phase);
25
+ if (artifacts.length === 0)
26
+ return;
27
+ // 确保输出目录存在
28
+ if (!fs.existsSync(outputDir)) {
29
+ fs.mkdirSync(outputDir, { recursive: true });
30
+ }
31
+ // 检查幂等:所有产物文件都存在则跳过
32
+ const allExist = artifacts.every(filename => fs.existsSync(path.join(outputDir, filename)));
33
+ if (allExist) {
34
+ logger.debug(`[Forge:阶段产物] ${PHASE_LABELS[phase]} 产物已存在,跳过生成`);
35
+ return;
36
+ }
37
+ try {
38
+ logger.info(`[Forge:阶段产物] 开始生成 ${PHASE_LABELS[phase]} 阶段产物`);
39
+ // 查询本阶段相关事件
40
+ const events = this.storage.queryEvents({
41
+ session_id: sessionId,
42
+ project_path: this.projectPath,
43
+ limit: 200,
44
+ });
45
+ // 提取本阶段的任务和工具调用
46
+ const phaseTasks = pipeline.tasks.filter(t => t.phase === phase && t.status === 'completed');
47
+ const phaseEvents = this.extractPhaseEvents(events, phase);
48
+ // 为每个产物文件生成内容
49
+ for (const filename of artifacts) {
50
+ const filePath = path.join(outputDir, filename);
51
+ if (fs.existsSync(filePath)) {
52
+ logger.debug(`[Forge:阶段产物] ${filename} 已存在,跳过`);
53
+ continue;
54
+ }
55
+ const prompt = this.buildPrompt(phase, filename, phaseTasks, phaseEvents, pipeline);
56
+ // 最多重试 2 次,超时延长到 90s
57
+ let content = null;
58
+ for (let attempt = 1; attempt <= 2; attempt++) {
59
+ try {
60
+ content = await this.api.complete(prompt, '阶段产物生成', {
61
+ maxTokens: 2000,
62
+ timeoutMs: 90_000,
63
+ });
64
+ break;
65
+ }
66
+ catch (err) {
67
+ if (attempt < 2) {
68
+ logger.warn(`[Forge:阶段产物] ${filename} 生成失败(第 ${attempt} 次),重试中:${err}`);
69
+ await new Promise(r => setTimeout(r, 5000));
70
+ }
71
+ else {
72
+ throw err; // 两次均失败,向上抛出
73
+ }
74
+ }
75
+ }
76
+ if (content) {
77
+ fs.writeFileSync(filePath, content, 'utf-8');
78
+ logger.info(`[Forge:阶段产物] 已生成:${filename}`);
79
+ }
80
+ }
81
+ }
82
+ catch (err) {
83
+ logger.warn(`[Forge:阶段产物] ${PHASE_LABELS[phase]} 生成失败:${err}`);
84
+ throw err;
85
+ }
86
+ }
87
+ /**
88
+ * 获取或创建本次 session 的产物目录
89
+ * 格式:<project>/.claude-forge/docs/YYYY-MM-DD_HH-MM/
90
+ */
91
+ static resolveOutputDir(projectPath, sessionStartTime) {
92
+ const date = new Date(sessionStartTime);
93
+ const yyyy = date.getFullYear();
94
+ const mm = String(date.getMonth() + 1).padStart(2, '0');
95
+ const dd = String(date.getDate()).padStart(2, '0');
96
+ const hh = String(date.getHours()).padStart(2, '0');
97
+ const min = String(date.getMinutes()).padStart(2, '0');
98
+ const dirName = `${yyyy}-${mm}-${dd}_${hh}-${min}`;
99
+ return path.join(projectPath, '.claude-forge', 'docs', dirName);
100
+ }
101
+ /**
102
+ * 获取指定阶段的产物文件名列表
103
+ */
104
+ getArtifactFiles(phase) {
105
+ const mapping = {
106
+ analyze: ['requirements.md', 'prd.md'],
107
+ design: ['architecture.md', 'detailed-design.md'],
108
+ code: ['code-changes.md'],
109
+ test: ['test-report.md'],
110
+ review: ['review-report.md'],
111
+ done: [],
112
+ };
113
+ return mapping[phase];
114
+ }
115
+ /**
116
+ * 从事件流中提取本阶段相关的工具调用摘要
117
+ */
118
+ extractPhaseEvents(events, phase) {
119
+ const summaries = [];
120
+ for (const event of events) {
121
+ const { hook_type: hookType, tool_name: toolName, tool_input: toolInput } = event;
122
+ // UserPromptSubmit:用户输入
123
+ if (hookType === 'UserPromptSubmit' && toolInput) {
124
+ const userPrompt = String(toolInput['user_prompt'] ?? '').slice(0, 100);
125
+ if (userPrompt) {
126
+ summaries.push(`[用户] ${userPrompt}`);
127
+ }
128
+ }
129
+ // PostToolUse:工具调用
130
+ if (hookType === 'PostToolUse') {
131
+ if (toolName === 'Read' && toolInput) {
132
+ summaries.push(`[Read] ${String(toolInput['file_path'] ?? '')}`);
133
+ }
134
+ else if (toolName === 'Write' && toolInput) {
135
+ summaries.push(`[Write] ${String(toolInput['file_path'] ?? '')}`);
136
+ }
137
+ else if (toolName === 'Edit' && toolInput) {
138
+ summaries.push(`[Edit] ${String(toolInput['file_path'] ?? '')}`);
139
+ }
140
+ else if (toolName === 'Bash' && toolInput) {
141
+ const cmd = String(toolInput['command'] ?? '').slice(0, 50);
142
+ summaries.push(`[Bash] ${cmd}`);
143
+ }
144
+ else if (toolName === 'Grep' && toolInput) {
145
+ summaries.push(`[Grep] ${String(toolInput['pattern'] ?? '')}`);
146
+ }
147
+ else if (toolName === 'Glob' && toolInput) {
148
+ summaries.push(`[Glob] ${String(toolInput['pattern'] ?? '')}`);
149
+ }
150
+ }
151
+ }
152
+ void phase; // phase 参数保留供未来按阶段过滤使用
153
+ return summaries.slice(0, 50); // 限制数量,避免 prompt 过长
154
+ }
155
+ /**
156
+ * 构建 AI prompt
157
+ */
158
+ buildPrompt(phase, filename, tasks, events, pipeline) {
159
+ const phaseLabel = PHASE_LABELS[phase];
160
+ const requirement = pipeline.requirement;
161
+ const taskList = tasks.map(t => `- ${t.title}: ${t.description}${t.output ? ` (产出: ${t.output})` : ''}`).join('\n');
162
+ const eventList = events.join('\n');
163
+ const templates = {
164
+ 'requirements.md': `你是一位产品经理,正在为以下需求编写需求分析文档。
165
+
166
+ **需求**:${requirement}
167
+
168
+ **已完成的任务**:
169
+ ${taskList || '(无)'}
170
+
171
+ **工具调用记录**(Read/Grep/Glob 等探索操作):
172
+ ${eventList || '(无)'}
173
+
174
+ 请生成一份结构化的需求分析文档,包含:
175
+ 1. 需求背景
176
+ 2. 核心功能点
177
+ 3. 用户故事
178
+ 4. 验收标准
179
+
180
+ 使用 Markdown 格式,简洁专业。`,
181
+ 'prd.md': `你是一位产品经理,正在为以下需求编写产品需求文档(PRD)。
182
+
183
+ **需求**:${requirement}
184
+
185
+ **已完成的任务**:
186
+ ${taskList || '(无)'}
187
+
188
+ **工具调用记录**:
189
+ ${eventList || '(无)'}
190
+
191
+ 请生成一份 PRD 文档,包含:
192
+ 1. 产品目标
193
+ 2. 功能规格
194
+ 3. 交互流程
195
+ 4. 非功能性需求(性能、安全等)
196
+
197
+ 使用 Markdown 格式,简洁专业。`,
198
+ 'architecture.md': `你是一位架构师,正在为以下需求编写架构设计文档。
199
+
200
+ **需求**:${requirement}
201
+
202
+ **已完成的任务**:
203
+ ${taskList || '(无)'}
204
+
205
+ **工具调用记录**(Write/Edit README、设计文档等):
206
+ ${eventList || '(无)'}
207
+
208
+ 请生成一份架构设计文档,包含:
209
+ 1. 系统架构概览
210
+ 2. 模块划分
211
+ 3. 技术选型
212
+ 4. 关键设计决策
213
+
214
+ 使用 Markdown 格式,简洁专业。`,
215
+ 'detailed-design.md': `你是一位架构师,正在为以下需求编写详细设计文档。
216
+
217
+ **需求**:${requirement}
218
+
219
+ **已完成的任务**:
220
+ ${taskList || '(无)'}
221
+
222
+ **工具调用记录**:
223
+ ${eventList || '(无)'}
224
+
225
+ 请生成一份详细设计文档,包含:
226
+ 1. 数据模型
227
+ 2. 接口设计
228
+ 3. 核心算法
229
+ 4. 异常处理策略
230
+
231
+ 使用 Markdown 格式,简洁专业。`,
232
+ 'code-changes.md': `你是一位开发工程师,正在为以下需求编写代码改动说明。
233
+
234
+ **需求**:${requirement}
235
+
236
+ **已完成的任务**:
237
+ ${taskList || '(无)'}
238
+
239
+ **工具调用记录**(Write/Edit 源码文件):
240
+ ${eventList || '(无)'}
241
+
242
+ 请生成一份代码改动说明,包含:
243
+ 1. 变更文件列表
244
+ 2. 主要改动摘要
245
+ 3. 新增功能说明
246
+ 4. 重构说明(如有)
247
+
248
+ 使用 Markdown 格式,简洁专业。`,
249
+ 'test-report.md': `你是一位测试工程师,正在为以下需求编写测试报告。
250
+
251
+ **需求**:${requirement}
252
+
253
+ **已完成的任务**:
254
+ ${taskList || '(无)'}
255
+
256
+ **工具调用记录**(Bash 测试命令、Write 测试文件):
257
+ ${eventList || '(无)'}
258
+
259
+ 请生成一份测试报告,包含:
260
+ 1. 测试用例列表
261
+ 2. 测试结果(通过/失败)
262
+ 3. 覆盖率说明
263
+ 4. 遗留问题(如有)
264
+
265
+ 使用 Markdown 格式,简洁专业。`,
266
+ 'review-report.md': `你是一位技术负责人,正在为以下需求编写代码审查报告。
267
+
268
+ **需求**:${requirement}
269
+
270
+ **已完成的任务**:
271
+ ${taskList || '(无)'}
272
+
273
+ **工具调用记录**(Edit 操作、质量门禁结果):
274
+ ${eventList || '(无)'}
275
+
276
+ 请生成一份代码审查报告,包含:
277
+ 1. 审查要点
278
+ 2. 发现的问题
279
+ 3. 改进建议
280
+ 4. 审查结论
281
+
282
+ 使用 Markdown 格式,简洁专业。`,
283
+ };
284
+ return templates[filename] || `生成 ${phaseLabel} 阶段的 ${filename} 文档。`;
285
+ }
286
+ }
287
+ //# sourceMappingURL=artifact-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-generator.js","sourceRoot":"","sources":["../../src/pipeline/artifact-generator.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;GAEG;AACH,MAAM,OAAO,sBAAsB;IAEvB;IACA;IACA;IAHV,YACU,WAAmB,EACnB,GAAe,EACf,OAAsB;QAFtB,gBAAW,GAAX,WAAW,CAAQ;QACnB,QAAG,GAAH,GAAG,CAAY;QACf,YAAO,GAAP,OAAO,CAAe;IAC7B,CAAC;IAEJ;;;OAGG;IACH,KAAK,CAAC,gBAAgB,CACpB,KAAoB,EACpB,QAAkB,EAClB,SAAiB,EACjB,SAAiB;QAEjB,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO;QAE7B,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEnC,WAAW;QACX,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,oBAAoB;QACpB,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAC1C,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAC9C,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,gBAAgB,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,qBAAqB,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAE7D,YAAY;YACZ,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;gBACtC,UAAU,EAAE,SAAS;gBACrB,YAAY,EAAE,IAAI,CAAC,WAAW;gBAC9B,KAAK,EAAE,GAAG;aACX,CAAC,CAAC;YAEH,gBAAgB;YAChB,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;YAC7F,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC3D,cAAc;YACd,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAChD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,MAAM,CAAC,KAAK,CAAC,gBAAgB,QAAQ,SAAS,CAAC,CAAC;oBAChD,SAAS;gBACX,CAAC;gBAED,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;gBAEpF,qBAAqB;gBACrB,IAAI,OAAO,GAAkB,IAAI,CAAC;gBAClC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;oBAC9C,IAAI,CAAC;wBACH,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE;4BAClD,SAAS,EAAE,IAAI;4BACf,SAAS,EAAE,MAAM;yBAClB,CAAC,CAAC;wBACH,MAAM;oBACR,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;4BAChB,MAAM,CAAC,IAAI,CAAC,gBAAgB,QAAQ,WAAW,OAAO,WAAW,GAAG,EAAE,CAAC,CAAC;4BACxE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;wBAC9C,CAAC;6BAAM,CAAC;4BACN,MAAM,GAAG,CAAC,CAAC,aAAa;wBAC1B,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,IAAI,OAAO,EAAE,CAAC;oBACZ,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;oBAC7C,MAAM,CAAC,IAAI,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,gBAAgB,YAAY,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;YAC/D,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,gBAAgB,CAAC,WAAmB,EAAE,gBAAwB;QACnE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACxD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACnD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,KAAoB;QAC3C,MAAM,OAAO,GAAoC;YAC/C,OAAO,EAAE,CAAC,iBAAiB,EAAE,QAAQ,CAAC;YACtC,MAAM,EAAE,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;YACjD,IAAI,EAAE,CAAC,iBAAiB,CAAC;YACzB,IAAI,EAAE,CAAC,gBAAgB,CAAC;YACxB,MAAM,EAAE,CAAC,kBAAkB,CAAC;YAC5B,IAAI,EAAE,EAAE;SACT,CAAC;QACF,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,MAAoB,EAAE,KAAoB;QACnE,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;YAElF,wBAAwB;YACxB,IAAI,QAAQ,KAAK,kBAAkB,IAAI,SAAS,EAAE,CAAC;gBACjD,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACxE,IAAI,UAAU,EAAE,CAAC;oBACf,SAAS,CAAC,IAAI,CAAC,QAAQ,UAAU,EAAE,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;YAED,mBAAmB;YACnB,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;gBAC/B,IAAI,QAAQ,KAAK,MAAM,IAAI,SAAS,EAAE,CAAC;oBACrC,SAAS,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;gBACnE,CAAC;qBAAM,IAAI,QAAQ,KAAK,OAAO,IAAI,SAAS,EAAE,CAAC;oBAC7C,SAAS,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;gBACpE,CAAC;qBAAM,IAAI,QAAQ,KAAK,MAAM,IAAI,SAAS,EAAE,CAAC;oBAC5C,SAAS,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;gBACnE,CAAC;qBAAM,IAAI,QAAQ,KAAK,MAAM,IAAI,SAAS,EAAE,CAAC;oBAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC5D,SAAS,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;gBAClC,CAAC;qBAAM,IAAI,QAAQ,KAAK,MAAM,IAAI,SAAS,EAAE,CAAC;oBAC5C,SAAS,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;gBACjE,CAAC;qBAAM,IAAI,QAAQ,KAAK,MAAM,IAAI,SAAS,EAAE,CAAC;oBAC5C,SAAS,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC;QACH,CAAC;QAED,KAAK,KAAK,CAAC,CAAC,uBAAuB;QACnC,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB;IACrD,CAAC;IAED;;OAEG;IACK,WAAW,CACjB,KAAoB,EACpB,QAAgB,EAChB,KAAqE,EACrE,MAAgB,EAChB,QAAkB;QAElB,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;QAEzC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpH,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,SAAS,GAA2B;YACxC,iBAAiB,EAAE;;SAEhB,WAAW;;;EAGlB,QAAQ,IAAI,KAAK;;;EAGjB,SAAS,IAAI,KAAK;;;;;;;;qBAQC;YAEf,QAAQ,EAAE;;SAEP,WAAW;;;EAGlB,QAAQ,IAAI,KAAK;;;EAGjB,SAAS,IAAI,KAAK;;;;;;;;qBAQC;YAEf,iBAAiB,EAAE;;SAEhB,WAAW;;;EAGlB,QAAQ,IAAI,KAAK;;;EAGjB,SAAS,IAAI,KAAK;;;;;;;;qBAQC;YAEf,oBAAoB,EAAE;;SAEnB,WAAW;;;EAGlB,QAAQ,IAAI,KAAK;;;EAGjB,SAAS,IAAI,KAAK;;;;;;;;qBAQC;YAEf,iBAAiB,EAAE;;SAEhB,WAAW;;;EAGlB,QAAQ,IAAI,KAAK;;;EAGjB,SAAS,IAAI,KAAK;;;;;;;;qBAQC;YAEf,gBAAgB,EAAE;;SAEf,WAAW;;;EAGlB,QAAQ,IAAI,KAAK;;;EAGjB,SAAS,IAAI,KAAK;;;;;;;;qBAQC;YAEf,kBAAkB,EAAE;;SAEjB,WAAW;;;EAGlB,QAAQ,IAAI,KAAK;;;EAGjB,SAAS,IAAI,KAAK;;;;;;;;qBAQC;SAChB,CAAC;QAEF,OAAO,SAAS,CAAC,QAAQ,CAAC,IAAI,MAAM,UAAU,QAAQ,QAAQ,MAAM,CAAC;IACvE,CAAC;CACF"}
@@ -9,12 +9,16 @@ export declare class PipelineEngine {
9
9
  private store;
10
10
  private analyzer;
11
11
  private phaseManager;
12
+ private api;
13
+ private storage;
12
14
  /** 内存缓存:最多保留 50 个最近访问的项目 pipeline,防止无界增长 */
13
15
  private activePipelines;
14
16
  /** 上次注入的指令指纹(pipelineId:phase:completed/total),相同则跳过重复注入 */
15
17
  private lastInstructionKey;
16
18
  private static readonly MAX_CACHED_PROJECTS;
17
19
  constructor(storage: SQLiteStorage, api: AIProvider);
20
+ /** 检测到 ESC 中断、等待用户确认意图的项目路径集合 */
21
+ private interruptedProjects;
18
22
  /**
19
23
  * 向 activePipelines 写入时,如果超出上限则淘汰最旧的条目(LRU 策略)
20
24
  */
@@ -56,6 +60,47 @@ export declare class PipelineEngine {
56
60
  * 获取活跃 Pipeline 对象
57
61
  */
58
62
  getActivePipelineForProject(projectPath: string): Pipeline | null;
63
+ /**
64
+ * ESC 中断后从 DB 恢复时,重建 PhaseManager 的内存状态。
65
+ * - phaseToolsSeen:已完成任务的阶段标记为"已见过 write"(允许后续任务正常检测)
66
+ * - totalPhaseEventCounts:按已完成任务数估算(保守值,避免立刻触发兜底推进)
67
+ */
68
+ private restorePhaseState;
69
+ /**
70
+ * 检查指定项目是否处于 ESC 中断待确认状态
71
+ */
72
+ getInterruptedState(projectPath: string): {
73
+ pipelineId: string;
74
+ phase: string;
75
+ completedCount: number;
76
+ } | null;
77
+ /**
78
+ * 用户选择"继续":重置 in_progress → pending,恢复内存状态,清除中断标记
79
+ */
80
+ resumeAfterInterrupt(projectPath: string): void;
81
+ /**
82
+ * 用户选择"取消/重做":关闭当前 Pipeline,清除中断标记
83
+ */
84
+ cancelAfterInterrupt(projectPath: string): void;
85
+ /**
86
+ * ESC 中断后从 DB 恢复时,重建 PhaseManager 的内存状态。
87
+ const phase = pipeline.phase;
88
+ if (phase === 'done') return;
89
+
90
+ const key = `${pipeline.id}:${phase}`;
91
+ const completedCount = pipeline.tasks.filter(t => t.phase === phase && t.status === 'completed').length;
92
+
93
+ // 已有已完成任务 → 恢复 toolsSeen 为"已做过 explore + write",避免卡死
94
+ if (completedCount > 0) {
95
+ this.phaseManager.restoreToolsSeen(key, new Set(['explore', 'write', 'bash']));
96
+ }
97
+
98
+ // 恢复事件计数为已完成任务数 × 5(保守估算,不触发兜底推进)
99
+ this.phaseManager.restoreEventCount(key, completedCount * 5);
100
+
101
+ logger.debug(`[Pipeline] 恢复阶段状态:${phase} | 已完成=${completedCount}`);
102
+ }
103
+
59
104
  /**
60
105
  * 手动关闭指定项目(或指定 ID)的 Pipeline。
61
106
  * 供 CLI 和 daemon 启动时调用。
@@ -74,5 +119,17 @@ export declare class PipelineEngine {
74
119
  phase: string;
75
120
  updatedAt: string;
76
121
  }>;
122
+ /**
123
+ * 获取活跃 Pipeline 对象(session-cleanup 接口兼容)
124
+ */
125
+ getActivePipeline(projectPath: string): Pipeline | null;
126
+ /**
127
+ * 获取当前阶段名称(用于失败信号上下文)
128
+ */
129
+ getCurrentPhase(projectPath: string): string | undefined;
130
+ /**
131
+ * 获取 Pipeline 阶段快照(用于复盘分析)
132
+ */
133
+ getSessionSnapshot(pipelineId: string): import('../retrospective/types.js').PhaseSnapshot[];
77
134
  }
78
135
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pipeline/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEtE,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAElF,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,YAAY,CAAe;IACnC,4CAA4C;IAC5C,OAAO,CAAC,eAAe,CAA+B;IACtD,4DAA4D;IAC5D,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAM;gBAErC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,UAAU;IAMnD;;OAEG;IACH,OAAO,CAAC,SAAS;IAWjB;;OAEG;IACG,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA2BjE;;OAEG;IACG,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAoC5L;;OAEG;IACG,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAqBnG;;OAEG;IACH,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAM/C;;OAEG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAWpD;;OAEG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAUtD;;OAEG;IACH,eAAe,IAAI,YAAY;IAI/B;;OAEG;IACH,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAIjE;;;OAGG;IACH,aAAa,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,UAAQ,GAAG,IAAI;IAoB1D;;;OAGG;IACH,cAAc,CAAC,KAAK,SAAqB,GAAG,IAAI;IAUhD,oCAAoC;IACpC,UAAU,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAGhH"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pipeline/index.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,15 @@
1
1
  import { PipelineStore } from './store.js';
2
2
  import { PipelineAnalyzer } from './analyzer.js';
3
3
  import { PhaseManager } from './phase-manager.js';
4
+ import { PhaseArtifactGenerator } from './artifact-generator.js';
4
5
  import { PHASE_LABELS } from './types.js';
5
6
  import { logger } from '../utils/logger.js';
6
7
  export class PipelineEngine {
7
8
  store;
8
9
  analyzer;
9
10
  phaseManager;
11
+ api;
12
+ storage;
10
13
  /** 内存缓存:最多保留 50 个最近访问的项目 pipeline,防止无界增长 */
11
14
  activePipelines = new Map();
12
15
  /** 上次注入的指令指纹(pipelineId:phase:completed/total),相同则跳过重复注入 */
@@ -16,7 +19,11 @@ export class PipelineEngine {
16
19
  this.store = new PipelineStore(storage);
17
20
  this.analyzer = new PipelineAnalyzer(api);
18
21
  this.phaseManager = new PhaseManager(this.store);
22
+ this.api = api;
23
+ this.storage = storage;
19
24
  }
25
+ /** 检测到 ESC 中断、等待用户确认意图的项目路径集合 */
26
+ interruptedProjects = new Map();
20
27
  /**
21
28
  * 向 activePipelines 写入时,如果超出上限则淘汰最旧的条目(LRU 策略)
22
29
  */
@@ -41,6 +48,17 @@ export class PipelineEngine {
41
48
  if (!pipeline) {
42
49
  pipeline = this.store.getActivePipeline(projectPath) || undefined;
43
50
  if (pipeline) {
51
+ // 检测 ESC 中断:有 in_progress 任务说明上次被中断
52
+ const inProgressCount = pipeline.tasks.filter(t => t.status === 'in_progress').length;
53
+ if (inProgressCount > 0) {
54
+ const completedCount = pipeline.tasks.filter(t => t.phase === pipeline.phase && t.status === 'completed').length;
55
+ this.interruptedProjects.set(projectPath, {
56
+ pipelineId: pipeline.id,
57
+ phase: pipeline.phase,
58
+ completedCount,
59
+ });
60
+ logger.info(`[Pipeline] 检测到 ESC 中断(${inProgressCount} 个任务未完成),等待用户确认意图`);
61
+ }
44
62
  this.setCached(projectPath, pipeline);
45
63
  logger.info(`[Pipeline] 已续接:${pipeline.requirement} (${PHASE_LABELS[pipeline.phase]})`);
46
64
  }
@@ -66,6 +84,15 @@ export class PipelineEngine {
66
84
  if (!pipeline) {
67
85
  pipeline = this.store.getActivePipeline(event.project_path) || undefined;
68
86
  if (pipeline) {
87
+ const inProgressCount = pipeline.tasks.filter(t => t.status === 'in_progress').length;
88
+ if (inProgressCount > 0) {
89
+ const completedCount = pipeline.tasks.filter(t => t.phase === pipeline.phase && t.status === 'completed').length;
90
+ this.interruptedProjects.set(event.project_path, {
91
+ pipelineId: pipeline.id,
92
+ phase: pipeline.phase,
93
+ completedCount,
94
+ });
95
+ }
69
96
  this.setCached(event.project_path, pipeline);
70
97
  }
71
98
  }
@@ -78,6 +105,30 @@ export class PipelineEngine {
78
105
  return { message: null, qualityBlocked: true, qualityIssues: result.qualityIssues, systemMessage: result.systemMessage };
79
106
  }
80
107
  if (result.advanced && result.newPhase) {
108
+ const completedPhase = pipeline.phase; // 推进前的阶段
109
+ // 阶段产物生成:必须成功后才能推进(阻塞)
110
+ const outputDir = PhaseArtifactGenerator.resolveOutputDir(pipeline.projectPath, pipeline.createdAt);
111
+ const pipelineSnapshot = { ...pipeline };
112
+ try {
113
+ await new PhaseArtifactGenerator(pipeline.projectPath, this.api, this.storage)
114
+ .generateForPhase(completedPhase, pipelineSnapshot, event.session_id, outputDir);
115
+ }
116
+ catch (err) {
117
+ logger.warn(`[Forge:阶段产物] ${PHASE_LABELS[completedPhase]} 产物生成失败,阻断阶段推进:${err}`);
118
+ return {
119
+ message: null,
120
+ qualityBlocked: true,
121
+ qualityIssues: [`[阶段产物] ${PHASE_LABELS[completedPhase]} 产物生成失败:${err}`],
122
+ systemMessage: `[Forge 阶段产物] ❌ ${PHASE_LABELS[completedPhase]}阶段产物生成失败,无法推进到下一阶段。
123
+
124
+ 错误:${err}
125
+
126
+ 请检查 API 连接后重试,或手动在以下目录创建产物文件:
127
+ ${outputDir}
128
+
129
+ 产物生成成功后,继续正常工作流程,系统将自动重新检查。`,
130
+ };
131
+ }
81
132
  pipeline.phase = result.newPhase;
82
133
  // 阶段推进后清除指纹缓存,确保新阶段指令能正常注入
83
134
  this.lastInstructionKey.delete(event.project_path);
@@ -153,6 +204,80 @@ export class PipelineEngine {
153
204
  getActivePipelineForProject(projectPath) {
154
205
  return this.activePipelines.get(projectPath) || this.store.getActivePipeline(projectPath);
155
206
  }
207
+ /**
208
+ * ESC 中断后从 DB 恢复时,重建 PhaseManager 的内存状态。
209
+ * - phaseToolsSeen:已完成任务的阶段标记为"已见过 write"(允许后续任务正常检测)
210
+ * - totalPhaseEventCounts:按已完成任务数估算(保守值,避免立刻触发兜底推进)
211
+ */
212
+ restorePhaseState(pipeline) {
213
+ const phase = pipeline.phase;
214
+ if (phase === 'done')
215
+ return;
216
+ const key = `${pipeline.id}:${phase}`;
217
+ const completedCount = pipeline.tasks.filter(t => t.phase === phase && t.status === 'completed').length;
218
+ // 已有已完成任务 → 恢复 toolsSeen 为"已做过 explore + write",避免卡死
219
+ if (completedCount > 0) {
220
+ this.phaseManager.restoreToolsSeen(key, new Set(['explore', 'write', 'bash']));
221
+ }
222
+ // 恢复事件计数为已完成任务数 × 5(保守估算,不触发兜底推进)
223
+ this.phaseManager.restoreEventCount(key, completedCount * 5);
224
+ logger.debug(`[Pipeline] 恢复阶段状态:${phase} | 已完成=${completedCount}`);
225
+ }
226
+ /**
227
+ * 检查指定项目是否处于 ESC 中断待确认状态
228
+ */
229
+ getInterruptedState(projectPath) {
230
+ return this.interruptedProjects.get(projectPath) ?? null;
231
+ }
232
+ /**
233
+ * 用户选择"继续":重置 in_progress → pending,恢复内存状态,清除中断标记
234
+ */
235
+ resumeAfterInterrupt(projectPath) {
236
+ const pipeline = this.activePipelines.get(projectPath) || this.store.getActivePipeline(projectPath);
237
+ if (!pipeline)
238
+ return;
239
+ const reset = this.store.resetInProgressTasks(pipeline.id);
240
+ if (reset > 0) {
241
+ logger.info(`[Pipeline] 用户选择继续:重置 ${reset} 个 in_progress 任务为 pending`);
242
+ pipeline.tasks = this.store.getTasks(pipeline.id);
243
+ this.setCached(projectPath, pipeline);
244
+ }
245
+ this.restorePhaseState(pipeline);
246
+ this.interruptedProjects.delete(projectPath);
247
+ this.lastInstructionKey.delete(projectPath); // 强制重新注入阶段指令
248
+ }
249
+ /**
250
+ * 用户选择"取消/重做":关闭当前 Pipeline,清除中断标记
251
+ */
252
+ cancelAfterInterrupt(projectPath) {
253
+ const interrupted = this.interruptedProjects.get(projectPath);
254
+ if (interrupted) {
255
+ this.store.closeById(interrupted.pipelineId);
256
+ this.activePipelines.delete(projectPath);
257
+ this.lastInstructionKey.delete(projectPath);
258
+ this.interruptedProjects.delete(projectPath);
259
+ logger.info(`[Pipeline] 用户选择取消:Pipeline ${interrupted.pipelineId} 已关闭`);
260
+ }
261
+ }
262
+ /**
263
+ * ESC 中断后从 DB 恢复时,重建 PhaseManager 的内存状态。
264
+ const phase = pipeline.phase;
265
+ if (phase === 'done') return;
266
+
267
+ const key = `${pipeline.id}:${phase}`;
268
+ const completedCount = pipeline.tasks.filter(t => t.phase === phase && t.status === 'completed').length;
269
+
270
+ // 已有已完成任务 → 恢复 toolsSeen 为"已做过 explore + write",避免卡死
271
+ if (completedCount > 0) {
272
+ this.phaseManager.restoreToolsSeen(key, new Set(['explore', 'write', 'bash']));
273
+ }
274
+
275
+ // 恢复事件计数为已完成任务数 × 5(保守估算,不触发兜底推进)
276
+ this.phaseManager.restoreEventCount(key, completedCount * 5);
277
+
278
+ logger.debug(`[Pipeline] 恢复阶段状态:${phase} | 已完成=${completedCount}`);
279
+ }
280
+
156
281
  /**
157
282
  * 手动关闭指定项目(或指定 ID)的 Pipeline。
158
283
  * 供 CLI 和 daemon 启动时调用。
@@ -195,5 +320,26 @@ export class PipelineEngine {
195
320
  listActive() {
196
321
  return this.store.listActive();
197
322
  }
323
+ /**
324
+ * 获取活跃 Pipeline 对象(session-cleanup 接口兼容)
325
+ */
326
+ getActivePipeline(projectPath) {
327
+ return this.getActivePipelineForProject(projectPath);
328
+ }
329
+ /**
330
+ * 获取当前阶段名称(用于失败信号上下文)
331
+ */
332
+ getCurrentPhase(projectPath) {
333
+ const pipeline = this.getActivePipelineForProject(projectPath);
334
+ if (!pipeline || pipeline.phase === 'done')
335
+ return undefined;
336
+ return pipeline.phase;
337
+ }
338
+ /**
339
+ * 获取 Pipeline 阶段快照(用于复盘分析)
340
+ */
341
+ getSessionSnapshot(pipelineId) {
342
+ return this.phaseManager.getSessionSnapshot(pipelineId);
343
+ }
198
344
  }
199
345
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pipeline/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pipeline/index.ts"],"names":[],"mappings":"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"}