mcp-probe-kit 3.0.8 → 3.0.10

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 (52) hide show
  1. package/README.md +15 -4
  2. package/build/lib/__tests__/gitnexus-bridge.unit.test.d.ts +1 -0
  3. package/build/lib/__tests__/gitnexus-bridge.unit.test.js +86 -0
  4. package/build/lib/gitnexus-bridge.d.ts +23 -0
  5. package/build/lib/gitnexus-bridge.js +518 -22
  6. package/build/schemas/code-analysis-tools.d.ts +9 -1
  7. package/build/schemas/code-analysis-tools.js +9 -1
  8. package/build/schemas/git-tools.d.ts +1 -1
  9. package/build/schemas/git-tools.js +1 -1
  10. package/build/schemas/index.d.ts +23 -3
  11. package/build/schemas/orchestration-tools.d.ts +13 -1
  12. package/build/schemas/orchestration-tools.js +13 -1
  13. package/build/schemas/output/core-tools.d.ts +130 -1
  14. package/build/schemas/output/core-tools.js +71 -1
  15. package/build/schemas/output/index.d.ts +2 -2
  16. package/build/schemas/output/index.js +2 -2
  17. package/build/schemas/output/project-tools.d.ts +13 -0
  18. package/build/schemas/output/project-tools.js +9 -0
  19. package/build/schemas/structured-output.d.ts +358 -5
  20. package/build/schemas/structured-output.js +169 -5
  21. package/build/tools/__tests__/code_insight.unit.test.js +81 -1
  22. package/build/tools/__tests__/fix_bug.unit.test.d.ts +1 -0
  23. package/build/tools/__tests__/fix_bug.unit.test.js +31 -0
  24. package/build/tools/__tests__/gencommit.unit.test.d.ts +1 -0
  25. package/build/tools/__tests__/gencommit.unit.test.js +41 -0
  26. package/build/tools/__tests__/init_project_context.unit.test.d.ts +1 -0
  27. package/build/tools/__tests__/init_project_context.unit.test.js +63 -0
  28. package/build/tools/__tests__/start_bugfix.unit.test.js +10 -0
  29. package/build/tools/__tests__/start_feature.unit.test.js +10 -0
  30. package/build/tools/code_insight.d.ts +10 -0
  31. package/build/tools/code_insight.js +156 -3
  32. package/build/tools/fix_bug.d.ts +3 -3
  33. package/build/tools/fix_bug.js +297 -312
  34. package/build/tools/gencommit.js +144 -123
  35. package/build/tools/init_project_context.js +211 -53
  36. package/build/tools/start_bugfix.js +170 -70
  37. package/build/tools/start_feature.js +79 -25
  38. package/docs/data/tools.js +33 -31
  39. package/docs/i18n/all-tools/en.json +9 -9
  40. package/docs/i18n/all-tools/ja.json +9 -9
  41. package/docs/i18n/all-tools/ko.json +9 -9
  42. package/docs/i18n/all-tools/zh-CN.json +9 -9
  43. package/docs/i18n/en.json +535 -518
  44. package/docs/i18n/ja.json +533 -516
  45. package/docs/i18n/ko.json +535 -518
  46. package/docs/i18n/zh-CN.json +535 -518
  47. package/docs/index.html +5 -4
  48. package/docs/pages/all-tools.html +3 -2
  49. package/docs/pages/examples.html +58 -31
  50. package/docs/pages/getting-started.html +3 -3
  51. package/docs/pages/migration.html +19 -10
  52. package/package.json +1 -1
@@ -1,321 +1,232 @@
1
1
  /**
2
2
  * fix_bug 工具
3
3
  *
4
- * 功能:指导完整的 Bug 修复流程
5
- * 模式:指令生成器模式 - 返回详细的修复指南,由 AI 执行实际操作
4
+ * 功能:基于 TBP 8 步法输出真因分析与修复指南
5
+ * 模式:指令生成器模式 - 返回详细的 RCA 与修复指南,由 AI 执行实际操作
6
6
  *
7
- * 流程:问题定位原因分析修复方案验证测试
7
+ * 流程:定义现象复盘时间线排除错误方向找共同模式 → 定位边界 → 陈述真因 → 闭合证据链 → 设计修复方案
8
8
  */
9
- const PROMPT_TEMPLATE = `# Bug 修复指南
10
-
11
- ## 🐛 Bug 信息
12
-
13
- **错误信息**:
14
- \`\`\`
15
- {error_message}
16
- \`\`\`
17
-
18
- {stack_trace_section}
19
-
20
- {reproduce_section}
21
-
22
- {behavior_section}
23
-
24
- ---
25
-
26
- ## 📍 阶段 1: 问题定位
27
-
28
- ### 步骤 1.1: 分析错误信息
29
-
30
- 1. **识别错误类型**:
31
- - 语法错误(SyntaxError)
32
- - 运行时错误(TypeError, ReferenceError, RangeError)
33
- - 逻辑错误(结果不符合预期)
34
- - 异步错误(Promise rejection, 回调异常)
35
-
36
- 2. **提取关键信息**:
37
- - 错误名称: [从错误信息中提取]
38
- - 错误消息: [具体描述]
39
- - 发生位置: [文件:行号]
40
-
41
- ### 步骤 1.2: 分析堆栈跟踪
42
-
43
- **操作**:
44
- 1. 找到堆栈中第一个项目文件(排除 node_modules)
45
- 2. 追踪调用链,理解执行流程
46
- 3. 记录所有相关的项目文件
47
-
48
- **相关文件列表**:
49
- | 文件 | 行号 | 函数/方法 |
50
- |------|------|-----------|
51
- | [文件路径] | [行号] | [函数名] |
52
-
53
- ### 步骤 1.3: 读取相关代码
54
-
55
- **操作**: 读取以下文件并分析:
56
- - 错误发生的文件
57
- - 调用链上的文件
58
- - 相关的配置文件
59
- - 相关的测试文件(如有)
60
-
61
- ### 📋 定位结论
62
-
63
- | 项目 | 内容 |
64
- |------|------|
65
- | 问题文件 | [文件路径] |
66
- | 问题位置 | 第 X 行 |
67
- | 问题代码 | \`[代码片段]\` |
68
- | 触发条件 | [什么情况下触发] |
69
-
70
- ---
71
-
72
- ## 🔍 阶段 2: 原因分析
73
-
74
- ### 步骤 2.1: 5 Whys 分析
75
-
76
- 使用 5 Whys 方法深入分析根本原因:
77
-
78
- 1. **Why 1**: 为什么会出现这个错误?
79
- - [答案]
80
-
81
- 2. **Why 2**: 为什么会 [Why 1 的答案]?
82
- - [答案]
83
-
84
- 3. **Why 3**: 为什么会 [Why 2 的答案]?
85
- - [答案]
86
-
87
- 4. **Why 4**: 为什么会 [Why 3 的答案]?
88
- - [答案]
89
-
90
- 5. **Why 5**: 为什么会 [Why 4 的答案]?
91
- - [答案]
92
-
93
- ### 步骤 2.2: 代码逻辑分析
94
-
95
- 1. **数据流分析**: 追踪数据从输入到出错位置的流动
96
- 2. **状态分析**: 检查相关变量/状态在出错时的值
97
- 3. **边界条件**: 检查是否处理了所有边界情况
98
- 4. **异常处理**: 检查是否有适当的错误处理
99
-
100
- ### 📋 分析结论
101
-
102
- | 项目 | 内容 |
103
- |------|------|
104
- | 直接原因 | [直接导致错误的原因] |
105
- | 根本原因 | [深层次的原因] |
106
- | 触发条件 | [什么情况下会触发] |
107
- | 影响范围 | [受影响的功能/模块] |
108
-
109
- ---
110
-
111
- ## 🔧 阶段 3: 修复方案
112
-
113
- ### 步骤 3.1: 设计修复方案
114
-
115
- **方案 A**: [方案描述]
116
- - 修改内容: [具体修改]
117
- - 优点: [优点]
118
- - 缺点: [缺点]
119
- - 风险: [潜在风险]
120
-
121
- **方案 B**: [备选方案描述]
122
- - 修改内容: [具体修改]
123
- - 优点: [优点]
124
- - 缺点: [缺点]
125
- - 风险: [潜在风险]
126
-
127
- **选择方案**: [选择的方案]
128
- **选择理由**: [为什么选择这个方案]
129
-
130
- ### 步骤 3.2: 影响范围评估
131
-
132
- | 影响项 | 说明 |
133
- |--------|------|
134
- | 修改文件 | [文件列表] |
135
- | 影响功能 | [功能列表] |
136
- | 需要测试 | [测试范围] |
137
- | 是否需要回归 | [是/否] |
138
-
139
- ### 步骤 3.3: 实施修复
140
-
141
- **修改文件**: \`[文件路径]\`
142
-
143
- **修改前**:
144
- \`\`\`
145
- [原代码]
146
- \`\`\`
147
-
148
- **修改后**:
149
- \`\`\`
150
- [新代码]
151
- \`\`\`
152
-
153
- **修改说明**: [解释修改的原因和逻辑]
154
-
155
- ---
156
-
157
- ## ✅ 阶段 4: 验证测试
158
-
159
- ### 步骤 4.1: 单元测试
160
-
161
- 为修复编写针对性的单元测试:
162
-
163
- \`\`\`typescript
164
- describe('[功能描述]', () => {
165
- // 测试正常情况
166
- it('should [正常行为描述]', () => {
167
- // 测试代码
168
- });
169
-
170
- // 测试修复的 Bug 场景
171
- it('should handle [Bug 场景]', () => {
172
- // 测试代码 - 确保 Bug 已修复
173
- });
174
-
175
- // 测试边界情况
176
- it('should handle [边界情况]', () => {
177
- // 边界测试
178
- });
179
- });
180
- \`\`\`
181
-
182
- ### 步骤 4.2: 手动验证
183
-
184
- 1. [ ] 按原复现步骤验证问题已修复
185
- 2. [ ] 验证正常流程不受影响
186
- 3. [ ] 验证边界情况处理正确
187
- 4. [ ] 验证错误处理正确
188
-
189
- ### 步骤 4.3: 回归测试
190
-
191
- 1. [ ] 运行相关模块的测试
192
- 2. [ ] 运行全量测试(如有 CI)
193
- 3. [ ] 检查是否引入新问题
194
-
195
- ---
196
-
197
- ## 📋 修复检查清单
198
-
199
- ### 定位阶段
200
- - [ ] 错误类型已识别
201
- - [ ] 问题代码已定位
202
- - [ ] 相关文件已读取
203
-
204
- ### 分析阶段
205
- - [ ] 5 Whys 分析已完成
206
- - [ ] 根本原因已确定
207
- - [ ] 影响范围已评估
208
-
209
- ### 修复阶段
210
- - [ ] 修复方案已设计
211
- - [ ] 代码修改已完成
212
- - [ ] 修改已解释清楚
213
-
214
- ### 验证阶段
215
- - [ ] 单元测试已添加
216
- - [ ] 手动验证已通过
217
- - [ ] 回归测试已通过
218
-
219
- ### 提交阶段
220
- - [ ] 代码已提交
221
- - [ ] Commit message 清晰描述了修复内容
222
-
223
- ---
224
-
225
- ## 📝 修复总结
226
-
227
- 完成修复后,填写以下总结:
228
-
229
- | 项目 | 内容 |
230
- |------|------|
231
- | Bug 描述 | [简述] |
232
- | 根本原因 | [原因] |
233
- | 修复方案 | [方案] |
234
- | 修改文件 | [文件列表] |
235
- | 测试覆盖 | [测试情况] |
236
- | 修复时间 | [耗时] |
237
-
238
- ---
239
-
240
- ## 💡 经验教训
241
-
242
- 记录本次 Bug 的经验教训,避免类似问题:
243
-
244
- 1. **代码层面**: [如何避免写出类似 Bug]
245
- 2. **测试层面**: [应该增加什么测试]
246
- 3. **流程层面**: [流程上如何改进]
247
-
248
- ---
249
-
250
- ## 📤 输出格式要求
251
-
252
- 请严格按以下 JSON 格式输出修复指南:
253
-
254
- \`\`\`json
255
- {
256
- "bug_summary": "Bug 简述(一句话)",
257
- "analysis": {
258
- "error_type": "错误类型",
259
- "direct_cause": "直接原因",
260
- "root_cause": "根本原因",
261
- "affected_scope": "影响范围"
262
- },
263
- "location": {
264
- "file": "问题文件路径",
265
- "line": 42,
266
- "function": "问题函数名",
267
- "code_snippet": "问题代码片段"
268
- },
269
- "fix_plan": {
270
- "chosen_solution": "选择的修复方案",
271
- "reason": "选择理由",
272
- "steps": [
273
- { "step": 1, "action": "修复步骤", "file": "文件", "change": "变更内容" }
274
- ],
275
- "code_before": "修改前代码",
276
- "code_after": "修改后代码"
277
- },
278
- "verification": {
279
- "test_cases": ["测试用例1", "测试用例2"],
280
- "manual_checks": ["手动验证项1", "手动验证项2"]
281
- }
282
- }
283
- \`\`\`
284
-
285
- ## ⚠️ 边界约束
286
-
287
- - ❌ 仅提供修复指南,不保证自动修改代码
288
- - ❌ 不执行代码或命令
289
- - ✅ 输出结构化修复方案和验证步骤
290
- - 💡 如需自动修复,可配合 fix 工具应用 patch
291
-
292
- ---
293
-
294
- *指南版本: 1.0.0*
295
- *工具: MCP Probe Kit - fix_bug*
296
- `;
297
9
  import { parseArgs, getString } from "../utils/parseArgs.js";
298
- import { okText } from "../lib/response.js";
10
+ import { okStructured } from "../lib/response.js";
299
11
  import { renderGuidanceHeader } from "../lib/guidance.js";
300
12
  import { handleToolError } from "../utils/error-handler.js";
13
+ const PROMPT_TEMPLATE = `# TBP 8 步 Bug 真因分析与修复指南
14
+
15
+ ## 🐛 Bug 信息
16
+
17
+ **错误信息**:
18
+ \`\`\`
19
+ {error_message}
20
+ \`\`\`
21
+
22
+ {stack_trace_section}
23
+
24
+ {reproduce_section}
25
+
26
+ {behavior_section}
27
+
28
+ {code_context_section}
29
+
30
+ ---
31
+
32
+ ## TBP-1 现象
33
+
34
+ 先把用户可见的问题定义准确,避免“坏了/卡了/有问题”这类泛化描述。
35
+
36
+ 要求:
37
+ 1. 用 1-2 句定义现象
38
+ 2. 明确是“慢”“停滞”“失败”“回归”还是“未生效”
39
+ 3. 如果提供了期望/实际行为,必须纳入现象定义
40
+
41
+ ## TBP-2 时间线
42
+
43
+ 基于现有信息复盘事件顺序,至少回答:
44
+ 1. 什么时候开始
45
+ 2. 中间发生了什么
46
+ 3. 最后停在什么状态
47
+
48
+ 优先记录:
49
+ - 用户输入 / 复现步骤
50
+ - first progress / first error
51
+ - tool call / stack / stop / timeout
52
+ - 关键文件或模块
53
+
54
+ ## TBP-3 不是这个
55
+
56
+ 列出当前应优先排除的错误方向,并说明需要什么证据排除。
57
+
58
+ 常见排除项:
59
+ - 不是单纯网络慢
60
+ - 不是前端展示截断
61
+ - 不是消息没转发
62
+ - 不是纯粹的超时表象
63
+ - 不是用户输入丢失
64
+
65
+ ## TBP-4 共同模式
66
+
67
+ 对比成功/失败样本,找出从哪一步开始分叉。
68
+
69
+ 重点检查:
70
+ - 传输层
71
+ - 会话状态机
72
+ - 完成态判定
73
+ - 工具执行
74
+ - 文件写入
75
+ - 重试策略
76
+
77
+ ## TBP-5 边界
78
+
79
+ 明确指出问题失控落在哪一层:
80
+ - 上游模型 / SDK
81
+ - 网关状态机
82
+ - session 复用
83
+ - tool 执行层
84
+ - 文件系统
85
+ - 环境配置
86
+ - UI 展示层
87
+
88
+ ## TBP-6 真因
89
+
90
+ 真因必须写成因果句:
91
+ \`A + B 在条件 D 下导致了 C\`
92
+
93
+ 不允许只写:
94
+ - 超时了
95
+ - SDK 有 bug
96
+ - 返回慢
97
+
98
+ ## TBP-7 证据链
99
+
100
+ 说明:
101
+ 1. 哪些证据支持真因
102
+ 2. 哪些现象若出现会推翻它,但现场没有出现
103
+ 3. 为什么其他解释更弱
104
+
105
+ ## TBP-8 修复
106
+
107
+ 只有在证据链闭合后,才开始设计修复。
108
+
109
+ 每个修复方案都要说明:
110
+ - 改哪一层
111
+ - 为什么这是修真因,不是补症状
112
+ - 风险是什么
113
+ - 怎么验证
114
+
115
+ ---
116
+
117
+ ## 📤 输出格式要求
118
+
119
+ 请严格按以下 JSON 格式输出修复指南:
120
+
121
+ \`\`\`json
122
+ {
123
+ "bug_summary": "Bug 简述(一句话)",
124
+ "analysis_mode": "tbp8",
125
+ "analysis": {
126
+ "error_type": "错误类型",
127
+ "direct_cause": "直接原因",
128
+ "root_cause": "根本原因",
129
+ "affected_scope": "影响范围"
130
+ },
131
+ "tbp": {
132
+ "phenomenon": "TBP-1 现象",
133
+ "timeline": [],
134
+ "ruled_out": [],
135
+ "common_pattern": "TBP-4 共同模式",
136
+ "boundary": "TBP-5 边界",
137
+ "root_cause_statement": "A + B 在条件 D 下导致 C",
138
+ "evidence": [],
139
+ "repair": []
140
+ },
141
+ "location": {
142
+ "file": "问题文件路径",
143
+ "line": 42,
144
+ "function": "问题函数名",
145
+ "code_snippet": "问题代码片段"
146
+ },
147
+ "fix_plan": {
148
+ "chosen_solution": "选择的修复方案",
149
+ "reason": "选择理由",
150
+ "steps": [
151
+ { "step": 1, "action": "修复步骤", "file": "文件", "change": "变更内容" }
152
+ ],
153
+ "code_before": "修改前代码",
154
+ "code_after": "修改后代码"
155
+ },
156
+ "verification": {
157
+ "test_cases": ["测试用例1", "测试用例2"],
158
+ "manual_checks": ["手动验证项1", "手动验证项2"]
159
+ }
160
+ }
161
+ \`\`\`
162
+
163
+ ## ⚠️ 护栏
164
+
165
+ - 不要一看到新现象就补一个新分支,先判断是不是同一类根因在换表现
166
+ - 不要把“超时”直接当真因,要先分清是没进展、慢进展,还是结果已出现但判定过严
167
+ - 不要只看单一样本就下结论,有对比样本时必须做对比
168
+ - 如果证据不足,要明确说明还缺什么证据
169
+
170
+ ---
171
+
172
+ *指南版本: 2.0.0*
173
+ *工具: MCP Probe Kit - fix_bug*
174
+ `;
175
+ function inferBugType(text) {
176
+ if (/timeout|latency|slow|卡|慢|超时/i.test(text))
177
+ return "performance";
178
+ if (/auth|permission|unauthor|token|登录|权限/i.test(text))
179
+ return "security";
180
+ if (/ui|render|white screen|白屏|按钮|页面/i.test(text))
181
+ return "ui";
182
+ if (/sql|db|data|schema|缓存|数据/i.test(text))
183
+ return "data";
184
+ if (/api|request|network|gateway|integration|调用失败/i.test(text))
185
+ return "integration";
186
+ return "functional";
187
+ }
188
+ function inferSeverity(text) {
189
+ if (/crash|fatal|panic|生产故障|数据丢失|security|权限绕过/i.test(text))
190
+ return "critical";
191
+ if (/white screen|白屏|500|无法登录|阻塞|不可用|timeout|超时/i.test(text))
192
+ return "high";
193
+ if (/error|exception|失败|异常/i.test(text))
194
+ return "medium";
195
+ return "low";
196
+ }
197
+ function extractFilePaths(text) {
198
+ if (!text)
199
+ return [];
200
+ const matches = text.match(/[A-Za-z]:[\\/][^:\n\r\t]+|(?:src|app|lib|server|client|docs)[\\/][^:\n\r\t)]+/g) || [];
201
+ return Array.from(new Set(matches.map((item) => item.replace(/\\/g, "/")))).slice(0, 8);
202
+ }
203
+ function summarizePhenomenon(errorMessage, expectedBehavior, actualBehavior) {
204
+ if (expectedBehavior || actualBehavior) {
205
+ return `实际表现为“${actualBehavior || errorMessage}”,但期望是“${expectedBehavior || "保持正常行为"}”。`;
206
+ }
207
+ return `当前可见现象是“${errorMessage}”,需要先区分它属于失败、停滞、未生效还是性能退化。`;
208
+ }
301
209
  /**
302
210
  * fix_bug 工具实现
303
211
  */
304
212
  export async function fixBug(args) {
305
213
  try {
306
- // 智能参数解析,支持自然语言输入
307
214
  const parsedArgs = parseArgs(args, {
308
215
  defaultValues: {
309
216
  error_message: "",
310
217
  stack_trace: "",
218
+ code_context: "",
219
+ analysis_mode: "tbp8",
311
220
  steps_to_reproduce: "",
312
221
  expected_behavior: "",
313
222
  actual_behavior: "",
314
223
  },
315
- primaryField: "error_message", // 纯文本输入默认映射到 error_message 字段
224
+ primaryField: "error_message",
316
225
  fieldAliases: {
317
226
  error_message: ["error", "err", "message", "错误", "错误信息"],
318
227
  stack_trace: ["stack", "trace", "堆栈", "调用栈"],
228
+ code_context: ["code_context", "code", "context", "相关代码", "代码上下文"],
229
+ analysis_mode: ["analysis_mode", "methodology", "tbp", "rca", "分析方法"],
319
230
  steps_to_reproduce: ["steps", "reproduce", "步骤", "复现步骤"],
320
231
  expected_behavior: ["expected", "期望", "期望行为"],
321
232
  actual_behavior: ["actual", "实际", "实际行为"],
@@ -323,45 +234,119 @@ export async function fixBug(args) {
323
234
  });
324
235
  const errorMessage = getString(parsedArgs.error_message);
325
236
  const stackTrace = getString(parsedArgs.stack_trace);
237
+ const codeContext = getString(parsedArgs.code_context);
238
+ const analysisMode = (getString(parsedArgs.analysis_mode) || "tbp8").toLowerCase() === "tbp8"
239
+ ? "tbp8"
240
+ : "tbp8";
326
241
  const stepsToReproduce = getString(parsedArgs.steps_to_reproduce);
327
242
  const expectedBehavior = getString(parsedArgs.expected_behavior);
328
243
  const actualBehavior = getString(parsedArgs.actual_behavior);
329
244
  if (!errorMessage) {
330
245
  throw new Error("缺少必填参数: error_message(错误信息)");
331
246
  }
332
- // 构建可选部分
333
247
  const stackTraceSection = stackTrace
334
248
  ? `**堆栈跟踪**:\n\`\`\`\n${stackTrace}\n\`\`\``
335
249
  : "**堆栈跟踪**: 未提供(建议提供以便更准确定位)";
336
250
  const reproduceSection = stepsToReproduce
337
251
  ? `**复现步骤**:\n${stepsToReproduce}`
338
252
  : "";
339
- let behaviorSection = "";
340
- if (expectedBehavior || actualBehavior) {
341
- behaviorSection = [
342
- expectedBehavior ? `**期望行为**: ${expectedBehavior}` : "",
343
- actualBehavior ? `**实际行为**: ${actualBehavior}` : "",
344
- ]
345
- .filter(Boolean)
346
- .join("\n\n");
347
- }
253
+ const behaviorSection = [expectedBehavior ? `**期望行为**: ${expectedBehavior}` : "", actualBehavior ? `**实际行为**: ${actualBehavior}` : ""]
254
+ .filter(Boolean)
255
+ .join("\n\n");
256
+ const codeContextSection = codeContext
257
+ ? `**代码/图谱上下文**:\n\`\`\`\n${codeContext}\n\`\`\``
258
+ : "";
348
259
  const header = renderGuidanceHeader({
349
260
  tool: "fix_bug",
350
- goal: "分析 Bug 并提供修复指南。AI 应根据指南执行实际修复。",
351
- tasks: ["基于错误信息分析根因", "提供修复步骤", "建议验证方案"],
352
- outputs: ["修复指南(文本)"],
261
+ goal: "基于 TBP 8 步法分析 Bug 真因,并提供修复指南。AI 应根据指南执行实际修复。",
262
+ tasks: ["先定义现象并复盘时间线", "闭合证据链后形成真因", "输出修复步骤与验证方案"],
263
+ outputs: ["TBP 真因分析指南", "结构化 RCA 数据"],
353
264
  });
354
265
  const guide = `${header}${PROMPT_TEMPLATE
355
266
  .replace(/{error_message}/g, errorMessage)
356
267
  .replace(/{stack_trace_section}/g, stackTraceSection)
357
268
  .replace(/{reproduce_section}/g, reproduceSection)
358
- .replace(/{behavior_section}/g, behaviorSection)}`;
359
- return okText(guide, {
360
- schema: (await import('../schemas/output/core-tools.js')).BugAnalysisSchema,
361
- note: "本工具返回 Bug 修复指南,AI 应根据指南执行问题定位、原因分析、代码修复和验证测试",
269
+ .replace(/{behavior_section}/g, behaviorSection)
270
+ .replace(/{code_context_section}/g, codeContextSection)}`;
271
+ const evidence = [
272
+ { type: "symptom", detail: errorMessage, source: "error_message" },
273
+ ...(stepsToReproduce ? [{ type: "timeline", detail: stepsToReproduce, source: "steps_to_reproduce" }] : []),
274
+ ...(stackTrace ? [{ type: "stack", detail: stackTrace, source: "stack_trace" }] : []),
275
+ ...(codeContext ? [{ type: "code", detail: codeContext, source: "code_context" }] : []),
276
+ ...(expectedBehavior ? [{ type: "comparison", detail: `期望行为: ${expectedBehavior}`, source: "expected_behavior" }] : []),
277
+ ...(actualBehavior ? [{ type: "comparison", detail: `实际行为: ${actualBehavior}`, source: "actual_behavior" }] : []),
278
+ ];
279
+ const affectedFiles = [...extractFilePaths(stackTrace), ...extractFilePaths(codeContext)]
280
+ .filter((value, index, array) => array.indexOf(value) === index);
281
+ const structuredData = {
282
+ summary: `TBP 8 步真因分析:${errorMessage.substring(0, 60)}${errorMessage.length > 60 ? "..." : ""}`,
283
+ bugType: inferBugType([errorMessage, actualBehavior, codeContext].filter(Boolean).join("\n")),
284
+ severity: inferSeverity([errorMessage, actualBehavior].filter(Boolean).join("\n")),
285
+ analysisMode,
286
+ rootCause: "待通过 TBP-6 真因分析确认;在证据链闭合前不直接给出确定性修复结论。",
287
+ affectedComponents: affectedFiles.length > 0 ? affectedFiles.map((item) => item.split("/").slice(0, -1).join("/") || item) : [],
288
+ affectedFiles,
289
+ fixPlan: {
290
+ steps: [
291
+ "先完成 TBP-1:精确定义现象,避免泛化描述",
292
+ "完成 TBP-2 时间线,明确开始、经过、终止状态",
293
+ "完成 TBP-3 与 TBP-4,排除错误方向并对比成功/失败样本",
294
+ "在 TBP-5/6 确认问题边界与因果句真因后,再修改代码",
295
+ ],
296
+ estimatedTime: "30-90 分钟(取决于证据完整度)",
297
+ risks: [
298
+ "如果跳过 TBP 1-7,容易只修表象不修真因",
299
+ "如果没有成功样本对比,TBP-4 共同模式结论可能偏弱",
300
+ ],
301
+ },
302
+ testPlan: {
303
+ unitTests: ["覆盖触发 Bug 的最小输入场景", "覆盖修复后的边界条件"],
304
+ integrationTests: ["覆盖完整调用链或关键交互路径"],
305
+ manualTests: ["按原复现步骤再次验证", "验证成功样本与失败样本分叉点已消失"],
306
+ },
307
+ preventionMeasures: [
308
+ "补充针对该边界条件的自动化测试",
309
+ "把关键状态与错误上下文写入日志,便于 TBP-2 时间线复盘",
310
+ "对完成态判定、文件写入、重试等边界增加显式校验",
311
+ ],
312
+ tbp: {
313
+ phenomenon: summarizePhenomenon(errorMessage, expectedBehavior, actualBehavior),
314
+ timeline: [
315
+ { order: 1, event: "收到问题现象", evidence: errorMessage },
316
+ ...(stepsToReproduce ? [{ order: 2, event: "获得复现步骤", evidence: stepsToReproduce }] : []),
317
+ ...(stackTrace ? [{ order: 3, event: "获得堆栈或错误栈", evidence: stackTrace }] : []),
318
+ ...(codeContext ? [{ order: 4, event: "获得代码/图谱上下文", evidence: codeContext }] : []),
319
+ ],
320
+ ruledOut: [
321
+ "尚不能直接归因于“纯超时”或“SDK 有 bug”,需要先完成时间线与边界分析",
322
+ "尚不能直接归因于“网络慢”,除非有传输层证据支持",
323
+ ],
324
+ commonPattern: "优先比较成功与失败样本,从调用链、状态机、工具执行、文件写入等维度找分叉点。",
325
+ boundary: "待定位;默认优先排查工具执行层、状态机、文件写入层和环境配置层。",
326
+ rootCauseStatement: "待形成 “A + B 在条件 D 下导致 C” 的因果句;在证据闭环前不下最终结论。",
327
+ evidence,
328
+ repair: [
329
+ {
330
+ layer: "analysis",
331
+ action: "先补齐现象、时间线、对比样本和边界信息,再进入代码修复",
332
+ risk: "证据不足时过早修复,可能导致重复返工",
333
+ verification: "确认 TBP-7 证据链能解释全部关键现象",
334
+ },
335
+ {
336
+ layer: "implementation",
337
+ action: "只修改真因所在层,不以“兜底分支”替代根因修复",
338
+ risk: "补症状会掩盖真正失控边界",
339
+ verification: "验证原问题消失且未引入新的回归",
340
+ },
341
+ ],
342
+ },
343
+ };
344
+ return okStructured(guide, structuredData, {
345
+ schema: (await import("../schemas/output/core-tools.js")).BugAnalysisSchema,
346
+ note: "本工具默认采用 TBP 8 步法输出真因分析与修复指南,AI 应先完成证据闭环,再执行代码修复和验证测试",
362
347
  });
363
348
  }
364
349
  catch (error) {
365
- return handleToolError(error, 'fix_bug');
350
+ return handleToolError(error, "fix_bug");
366
351
  }
367
352
  }