intention-coding 0.5.3 → 0.5.5

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 (53) hide show
  1. package/dist/index.cjs +1523 -541
  2. package/dist/services/change-summarizer/index.d.ts.map +1 -1
  3. package/dist/services/image-analysis/analyzer.d.ts +0 -18
  4. package/dist/services/image-analysis/analyzer.d.ts.map +1 -1
  5. package/dist/services/image-analysis/index.d.ts +2 -2
  6. package/dist/services/image-analysis/index.d.ts.map +1 -1
  7. package/dist/services/image-analysis/types.d.ts +1 -148
  8. package/dist/services/image-analysis/types.d.ts.map +1 -1
  9. package/dist/services/index.d.ts.map +1 -1
  10. package/dist/services/project-template/index.d.ts +2 -2
  11. package/dist/services/requirement/index.d.ts +75 -0
  12. package/dist/services/requirement/index.d.ts.map +1 -0
  13. package/dist/services/requirement-analyzer/index.d.ts +4 -4
  14. package/dist/services/requirement-analyzer/index.d.ts.map +1 -1
  15. package/package.json +1 -1
  16. package/dist/services/code-generator/index.d.ts +0 -50
  17. package/dist/services/code-generator/index.d.ts.map +0 -1
  18. package/dist/services/code-generator/stages/execution-stage.d.ts +0 -96
  19. package/dist/services/code-generator/stages/execution-stage.d.ts.map +0 -1
  20. package/dist/services/code-generator/stages/ideation-stage.d.ts +0 -34
  21. package/dist/services/code-generator/stages/ideation-stage.d.ts.map +0 -1
  22. package/dist/services/code-generator/stages/optimization-stage.d.ts +0 -47
  23. package/dist/services/code-generator/stages/optimization-stage.d.ts.map +0 -1
  24. package/dist/services/code-generator/stages/planning-stage.d.ts +0 -34
  25. package/dist/services/code-generator/stages/planning-stage.d.ts.map +0 -1
  26. package/dist/services/code-generator/stages/research-stage.d.ts +0 -36
  27. package/dist/services/code-generator/stages/research-stage.d.ts.map +0 -1
  28. package/dist/services/code-generator/stages/review-stage.d.ts +0 -34
  29. package/dist/services/code-generator/stages/review-stage.d.ts.map +0 -1
  30. package/dist/services/code-generator/types.d.ts +0 -233
  31. package/dist/services/code-generator/types.d.ts.map +0 -1
  32. package/dist/services/code-generator/utils/instruction-executor.d.ts +0 -70
  33. package/dist/services/code-generator/utils/instruction-executor.d.ts.map +0 -1
  34. package/dist/services/code-generator/workflow-manager.d.ts +0 -47
  35. package/dist/services/code-generator/workflow-manager.d.ts.map +0 -1
  36. package/dist/services/requirement-handler/core/agents/align-agent.d.ts +0 -31
  37. package/dist/services/requirement-handler/core/agents/align-agent.d.ts.map +0 -1
  38. package/dist/services/requirement-handler/core/agents/approve-agent.d.ts +0 -33
  39. package/dist/services/requirement-handler/core/agents/approve-agent.d.ts.map +0 -1
  40. package/dist/services/requirement-handler/core/agents/architect-agent.d.ts +0 -29
  41. package/dist/services/requirement-handler/core/agents/architect-agent.d.ts.map +0 -1
  42. package/dist/services/requirement-handler/core/agents/assess-agent.d.ts +0 -53
  43. package/dist/services/requirement-handler/core/agents/assess-agent.d.ts.map +0 -1
  44. package/dist/services/requirement-handler/core/agents/atomize-agent.d.ts +0 -33
  45. package/dist/services/requirement-handler/core/agents/atomize-agent.d.ts.map +0 -1
  46. package/dist/services/requirement-handler/core/agents/automate-agent.d.ts +0 -43
  47. package/dist/services/requirement-handler/core/agents/automate-agent.d.ts.map +0 -1
  48. package/dist/services/requirement-handler/core/requirement-handler-service.d.ts +0 -35
  49. package/dist/services/requirement-handler/core/requirement-handler-service.d.ts.map +0 -1
  50. package/dist/services/requirement-handler/core/types.d.ts +0 -143
  51. package/dist/services/requirement-handler/core/types.d.ts.map +0 -1
  52. package/dist/services/requirement-handler/index.d.ts +0 -87
  53. package/dist/services/requirement-handler/index.d.ts.map +0 -1
package/dist/index.cjs CHANGED
@@ -66,7 +66,7 @@ var __webpack_exports__ = {};
66
66
  try {
67
67
  if (process.env.LOG_DIR) logDir = process.env.LOG_DIR;
68
68
  else {
69
- const storageDir = getStorageDir();
69
+ const storageDir = config_getStorageDir();
70
70
  logDir = storageDir ? storageDir + '/logs' : './.aico/logs';
71
71
  }
72
72
  } catch (error) {
@@ -130,7 +130,7 @@ var __webpack_exports__ = {};
130
130
  format: fileFormat,
131
131
  level: 'info'
132
132
  }));
133
- const logger = external_winston_default().createLogger({
133
+ const logger_logger = external_winston_default().createLogger({
134
134
  level: 'debug',
135
135
  levels,
136
136
  format: external_winston_default().format.combine(external_winston_default().format.errors({
@@ -159,8 +159,8 @@ var __webpack_exports__ = {};
159
159
  ] : []
160
160
  });
161
161
  process.on('SIGINT', ()=>{
162
- logger.end(()=>{
163
- logger.info("\u65E5\u5FD7\u5DF2\u5173\u95ED");
162
+ logger_logger.end(()=>{
163
+ logger_logger.info("\u65E5\u5FD7\u5DF2\u5173\u95ED");
164
164
  process.exit(0);
165
165
  });
166
166
  });
@@ -243,7 +243,7 @@ var __webpack_exports__ = {};
243
243
  const contextManager = new ContextManager();
244
244
  const detectProjectRoot = (enableLogging = false)=>{
245
245
  if (process.env.MCP_STORAGE_DIR) {
246
- if (enableLogging) logger.info(`\u{4F7F}\u{7528}\u{73AF}\u{5883}\u{53D8}\u{91CF} MCP_STORAGE_DIR: ${process.env.MCP_STORAGE_DIR}`);
246
+ if (enableLogging) logger_logger.info(`\u{4F7F}\u{7528}\u{73AF}\u{5883}\u{53D8}\u{91CF} MCP_STORAGE_DIR: ${process.env.MCP_STORAGE_DIR}`);
247
247
  return process.env.MCP_STORAGE_DIR;
248
248
  }
249
249
  let currentDir = process.cwd();
@@ -254,12 +254,12 @@ var __webpack_exports__ = {};
254
254
  'pyproject.toml',
255
255
  'go.mod'
256
256
  ];
257
- if (enableLogging) logger.info(`\u{5F00}\u{59CB}\u{4ECE}\u{5F53}\u{524D}\u{76EE}\u{5F55}\u{68C0}\u{6D4B}\u{9879}\u{76EE}\u{6839}\u{76EE}\u{5F55}: ${currentDir}`);
257
+ if (enableLogging) logger_logger.info(`\u{5F00}\u{59CB}\u{4ECE}\u{5F53}\u{524D}\u{76EE}\u{5F55}\u{68C0}\u{6D4B}\u{9879}\u{76EE}\u{6839}\u{76EE}\u{5F55}: ${currentDir}`);
258
258
  while('/' !== currentDir){
259
259
  for (const marker of markers){
260
260
  const markerPath = (0, external_path_namespaceObject.resolve)(currentDir, marker);
261
261
  if (external_fs_namespaceObject.existsSync(markerPath)) {
262
- if (enableLogging) logger.info(`\u{627E}\u{5230}\u{9879}\u{76EE}\u{6807}\u{8BB0}\u{6587}\u{4EF6} ${marker} \u{5728}: ${currentDir}`);
262
+ if (enableLogging) logger_logger.info(`\u{627E}\u{5230}\u{9879}\u{76EE}\u{6807}\u{8BB0}\u{6587}\u{4EF6} ${marker} \u{5728}: ${currentDir}`);
263
263
  return currentDir;
264
264
  }
265
265
  }
@@ -267,7 +267,7 @@ var __webpack_exports__ = {};
267
267
  if (parentDir === currentDir) break;
268
268
  currentDir = parentDir;
269
269
  }
270
- if (enableLogging) logger.warn(`\u{672A}\u{627E}\u{5230}\u{9879}\u{76EE}\u{6807}\u{8BB0}\u{6587}\u{4EF6}\u{FF0C}\u{4F7F}\u{7528}\u{5F53}\u{524D}\u{5DE5}\u{4F5C}\u{76EE}\u{5F55}: ${process.cwd()}`);
270
+ if (enableLogging) logger_logger.warn(`\u{672A}\u{627E}\u{5230}\u{9879}\u{76EE}\u{6807}\u{8BB0}\u{6587}\u{4EF6}\u{FF0C}\u{4F7F}\u{7528}\u{5F53}\u{524D}\u{5DE5}\u{4F5C}\u{76EE}\u{5F55}: ${process.cwd()}`);
271
271
  return process.cwd();
272
272
  };
273
273
  let _PROJECT_ROOT = null;
@@ -289,9 +289,9 @@ var __webpack_exports__ = {};
289
289
  _PROJECT_ROOT = detectedRoot;
290
290
  if (!process.env.MCP_STORAGE_DIR) process.env.MCP_STORAGE_DIR = detectedRoot;
291
291
  contextManager.setCachedData("project_root", detectedRoot);
292
- logger.info(`\u{9879}\u{76EE}\u{6839}\u{76EE}\u{5F55}\u{5DF2}\u{8BBE}\u{7F6E}\u{4E3A}: ${detectedRoot}`);
292
+ logger_logger.info(`\u{9879}\u{76EE}\u{6839}\u{76EE}\u{5F55}\u{5DF2}\u{8BBE}\u{7F6E}\u{4E3A}: ${detectedRoot}`);
293
293
  };
294
- const getStorageDir = ()=>{
294
+ const config_getStorageDir = ()=>{
295
295
  try {
296
296
  const cachedRoot = contextManager.getCachedData("project_root");
297
297
  if (cachedRoot && 'string' == typeof cachedRoot) return cachedRoot + "/.aico";
@@ -317,7 +317,7 @@ var __webpack_exports__ = {};
317
317
  const external_html_to_md_namespaceObject = require("html-to-md");
318
318
  var external_html_to_md_default = /*#__PURE__*/ __webpack_require__.n(external_html_to_md_namespaceObject);
319
319
  const external_os_namespaceObject = require("os");
320
- const sanitizeFileName = (input)=>input.replace(/[\\/:*?"<>|\n\r#%&]/g, '').trim().replace(/\s+/g, '_').replace(/_+/g, '_').replace(/^_+|_+$/g, '');
320
+ const common_sanitizeFileName = (input)=>input.replace(/[\\/:*?"<>|\n\r#%&]/g, '').trim().replace(/\s+/g, '_').replace(/_+/g, '_').replace(/^_+|_+$/g, '');
321
321
  function normalizePath(filePath) {
322
322
  if (!filePath || 'string' != typeof filePath) throw new Error("\u6587\u4EF6\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A");
323
323
  filePath = filePath.trim().replace(/^["']|["']$/g, '');
@@ -329,14 +329,14 @@ var __webpack_exports__ = {};
329
329
  const resolved = external_path_default().resolve(normalized);
330
330
  return resolved;
331
331
  }
332
- async function validateAndResolvePath(filePath) {
332
+ async function common_validateAndResolvePath(filePath) {
333
333
  if (!filePath) throw new Error("\u6587\u4EF6\u8DEF\u5F84\u53C2\u6570\u7F3A\u5931\uFF0C\u8BF7\u63D0\u4F9B filePath \u53C2\u6570");
334
334
  const resolved = normalizePath(filePath);
335
335
  try {
336
336
  await external_fs_namespaceObject.promises.access(resolved, external_fs_namespaceObject.constants.R_OK);
337
337
  } catch (error) {
338
338
  const osInfo = `[${process.platform}]`;
339
- logger.warn(`\u{6587}\u{4EF6}\u{4E0D}\u{5B58}\u{5728}\u{6216}\u{4E0D}\u{53EF}\u{8BFB} ${osInfo}: ${resolved}`, error);
339
+ logger_logger.warn(`\u{6587}\u{4EF6}\u{4E0D}\u{5B58}\u{5728}\u{6216}\u{4E0D}\u{53EF}\u{8BFB} ${osInfo}: ${resolved}`, error);
340
340
  throw new Error(`\u{6587}\u{4EF6}\u{4E0D}\u{5B58}\u{5728}\u{6216}\u{4E0D}\u{53EF}\u{8BFB} ${osInfo}: ${resolved}`);
341
341
  }
342
342
  return resolved;
@@ -3968,9 +3968,9 @@ var __webpack_exports__ = {};
3968
3968
  const { filePath } = args;
3969
3969
  if (!filePath) throw new Error("\u6587\u4EF6\u8DEF\u5F84\u53C2\u6570\u7F3A\u5931\uFF0C\u8BF7\u63D0\u4F9B filePath \u53C2\u6570");
3970
3970
  try {
3971
- const resolvedPath = await validateAndResolvePath(filePath);
3971
+ const resolvedPath = await common_validateAndResolvePath(filePath);
3972
3972
  const buffer = await promises_namespaceObject.readFile(resolvedPath);
3973
- const mdDir = external_path_default().join(getStorageDir(), 'md');
3973
+ const mdDir = external_path_default().join(config_getStorageDir(), 'md');
3974
3974
  const baseName = external_path_default().basename(filePath, '.docx');
3975
3975
  const outputDir = external_path_default().join(mdDir, baseName);
3976
3976
  const imgsDir = external_path_default().join(outputDir, 'imgs');
@@ -3980,7 +3980,7 @@ var __webpack_exports__ = {};
3980
3980
  await promises_namespaceObject.mkdir(imgsDir, {
3981
3981
  recursive: true
3982
3982
  });
3983
- logger.info("\u5F00\u59CB\u8F6C\u6362Word\u6587\u6863", {
3983
+ logger_logger.info("\u5F00\u59CB\u8F6C\u6362Word\u6587\u6863", {
3984
3984
  file: filePath,
3985
3985
  outputDir,
3986
3986
  imgsDir
@@ -4006,7 +4006,7 @@ var __webpack_exports__ = {};
4006
4006
  await promises_namespaceObject.writeFile(imagePath, imageBuffer);
4007
4007
  htmlContent = htmlContent.replace(img.fullMatch, `<img src="./imgs/${imageFileName}" />`);
4008
4008
  } catch (err) {
4009
- logger.error("\u56FE\u7247\u5904\u7406\u5931\u8D25", {
4009
+ logger_logger.error("\u56FE\u7247\u5904\u7406\u5931\u8D25", {
4010
4010
  error: err instanceof Error ? err.message : String(err),
4011
4011
  imageNumber: i + 1
4012
4012
  });
@@ -4017,7 +4017,7 @@ var __webpack_exports__ = {};
4017
4017
  value: htmlContent,
4018
4018
  messages: basicResult.messages
4019
4019
  };
4020
- if (htmlResult.messages && htmlResult.messages.length > 0) logger.warn("Word\u8F6C\u6362\u8B66\u544A", {
4020
+ if (htmlResult.messages && htmlResult.messages.length > 0) logger_logger.warn("Word\u8F6C\u6362\u8B66\u544A", {
4021
4021
  file: filePath,
4022
4022
  warnings: htmlResult.messages
4023
4023
  });
@@ -4042,7 +4042,7 @@ var __webpack_exports__ = {};
4042
4042
  };
4043
4043
  } catch (error) {
4044
4044
  const errorMsg = error instanceof Error ? error.message : String(error);
4045
- logger.error(`Word\u{8F6C}\u{6362}\u{5931}\u{8D25}: ${errorMsg}`, {
4045
+ logger_logger.error(`Word\u{8F6C}\u{6362}\u{5931}\u{8D25}: ${errorMsg}`, {
4046
4046
  tool: "word2md",
4047
4047
  filePath
4048
4048
  });
@@ -4094,17 +4094,17 @@ var __webpack_exports__ = {};
4094
4094
  const { preserve_formatting = true, extract_metadata = true } = options;
4095
4095
  try {
4096
4096
  initializeProjectRoot();
4097
- const resolvedPath = await validateAndResolvePath(file_path);
4097
+ const resolvedPath = await common_validateAndResolvePath(file_path);
4098
4098
  if (!file_path.toLowerCase().endsWith('.pdf')) throw new Error("\u6587\u4EF6\u5FC5\u987B\u662FPDF\u683C\u5F0F\uFF08.pdf\u6269\u5C55\u540D\uFF09");
4099
- logger.info("\u5F00\u59CB\u8BFB\u53D6PDF\u6587\u4EF6", {
4099
+ logger_logger.info("\u5F00\u59CB\u8BFB\u53D6PDF\u6587\u4EF6", {
4100
4100
  file: file_path
4101
4101
  });
4102
4102
  const dataBuffer = await promises_namespaceObject.readFile(resolvedPath);
4103
- logger.info("\u5F00\u59CB\u89E3\u6790PDF\u5185\u5BB9");
4103
+ logger_logger.info("\u5F00\u59CB\u89E3\u6790PDF\u5185\u5BB9");
4104
4104
  const pdfParse = await Promise.resolve().then(__webpack_require__.bind(__webpack_require__, "pdf-parse/lib/pdf-parse.js"));
4105
4105
  const pdfData = await pdfParse.default(dataBuffer);
4106
- const mdDir = external_path_default().join(getStorageDir(), 'md');
4107
- const baseName = sanitizeFileName(external_path_default().basename(file_path, '.pdf'));
4106
+ const mdDir = external_path_default().join(config_getStorageDir(), 'md');
4107
+ const baseName = common_sanitizeFileName(external_path_default().basename(file_path, '.pdf'));
4108
4108
  const outputDir = external_path_default().join(mdDir, baseName);
4109
4109
  await promises_namespaceObject.mkdir(outputDir, {
4110
4110
  recursive: true
@@ -4133,7 +4133,7 @@ var __webpack_exports__ = {};
4133
4133
  markdownLength: markdownContent.length,
4134
4134
  outputFile: external_path_default().resolve(fullMdPath)
4135
4135
  };
4136
- logger.info("PDF\u8F6C\u6362\u5B8C\u6210", stats);
4136
+ logger_logger.info("PDF\u8F6C\u6362\u5B8C\u6210", stats);
4137
4137
  return {
4138
4138
  content: [
4139
4139
  {
@@ -4160,7 +4160,7 @@ var __webpack_exports__ = {};
4160
4160
  };
4161
4161
  } catch (error) {
4162
4162
  const errorMsg = error instanceof Error ? error.message : String(error);
4163
- logger.error(`PDF\u{8F6C}\u{6362}\u{5931}\u{8D25}: ${errorMsg}`, {
4163
+ logger_logger.error(`PDF\u{8F6C}\u{6362}\u{5931}\u{8D25}: ${errorMsg}`, {
4164
4164
  tool: "pdf2md",
4165
4165
  file_path,
4166
4166
  error: errorMsg
@@ -4181,188 +4181,7 @@ var __webpack_exports__ = {};
4181
4181
  }
4182
4182
  }
4183
4183
  };
4184
- const changeAnalysisPrompt = `\u{8BF7}\u{5206}\u{6790}\u{5F53}\u{524D}\u{4EE3}\u{7801}\u{5E93}\u{FF0C}\u{5E76}\u{4E0E}\u{9700}\u{6C42}\u{8FDB}\u{884C}\u{5BF9}\u{6BD4}\u{FF0C}\u{786E}\u{4FDD}\u{5B9E}\u{73B0}\u{7684}\u{5B8C}\u{6574}\u{6027}\u{3002}
4185
-
4186
- \u{8BF7}\u{6309}\u{4EE5}\u{4E0B}\u{6B65}\u{9AA4}\u{8FDB}\u{884C}\u{5206}\u{6790}\u{FF1A}
4187
-
4188
- ## 1. \u{4EE3}\u{7801}\u{5E93}\u{5206}\u{6790}
4189
- \u{5206}\u{6790}\u{5F53}\u{524D}\u{4EE3}\u{7801}\u{5E93}\u{FF0C}\u{603B}\u{7ED3}\u{FF1A}
4190
- - \u{4E3B}\u{8981}\u{529F}\u{80FD}\u{6A21}\u{5757}\u{53CA}\u{5176}\u{5B9E}\u{73B0}
4191
- - \u{5173}\u{952E}\u{4E1A}\u{52A1}\u{903B}\u{8F91}\u{6D41}\u{7A0B}
4192
- - \u{91CD}\u{8981}\u{6570}\u{636E}\u{7ED3}\u{6784}
4193
- - \u{6838}\u{5FC3}\u{7B97}\u{6CD5}\u{5B9E}\u{73B0}
4194
-
4195
- ## 2. \u{63A5}\u{53E3}\u{4E0E}\u{9700}\u{6C42}\u{5BF9}\u{5E94}\u{5173}\u{7CFB}\u{8868}
4196
- \u{6839}\u{636E}\u{4EE3}\u{7801}\u{53D8}\u{66F4}\u{FF0C}\u{751F}\u{6210}\u{63A5}\u{53E3}\u{4E0E}\u{9700}\u{6C42}\u{5BF9}\u{5E94}\u{5173}\u{7CFB}\u{8868}\u{FF1A}
4197
-
4198
- | \u{9700}\u{6C42}\u{529F}\u{80FD} | \u{5B9E}\u{73B0}\u{63A5}\u{53E3} | \u{8BF7}\u{6C42}\u{65B9}\u{5F0F} | URL | \u{53D8}\u{66F4}\u{72B6}\u{6001} |
4199
- |---------|---------|---------|-----|----------|
4200
- | [\u{9700}\u{6C42}\u{529F}\u{80FD}\u{63CF}\u{8FF0}] | [Controller.method] | [GET/POST/PUT/DELETE] | [/api/path] | [\u{65B0}\u{589E}/\u{4FEE}\u{6539}/\u{5220}\u{9664}] |
4201
-
4202
- ## 3. \u{6838}\u{5FC3}\u{903B}\u{8F91}\u{65B9}\u{6CD5}\u{8868}
4203
- \u{5206}\u{6790}\u{6838}\u{5FC3}\u{4E1A}\u{52A1}\u{903B}\u{8F91}\u{65B9}\u{6CD5}\u{FF1A}
4204
-
4205
- | \u{65B9}\u{6CD5}\u{540D}\u{79F0} | \u{6240}\u{5C5E}\u{7C7B} | \u{529F}\u{80FD}\u{8BF4}\u{660E} | \u{53D8}\u{66F4}\u{72B6}\u{6001} |
4206
- |---------|-------|---------|----------|
4207
- | [methodName] | [ClassName] | [\u{529F}\u{80FD}\u{63CF}\u{8FF0}] | [\u{65B0}\u{589E}/\u{4FEE}\u{6539}/\u{5220}\u{9664}] |
4208
-
4209
- ## 4. \u{524D}\u{7AEF}\u{9875}\u{9762}\u{4E0E}\u{63A5}\u{53E3}\u{5BF9}\u{5E94}\u{5173}\u{7CFB}\u{8868}
4210
- \u{5206}\u{6790}\u{524D}\u{7AEF}\u{9875}\u{9762}\u{53D8}\u{66F4}\u{FF1A}
4211
-
4212
- | \u{9875}\u{9762}\u{540D}\u{79F0} | \u{8C03}\u{7528}\u{63A5}\u{53E3} | \u{7EC4}\u{4EF6}\u{540D}\u{79F0} | \u{8DEF}\u{7531}\u{8DEF}\u{5F84} | \u{53D8}\u{66F4}\u{72B6}\u{6001} |
4213
- |---------|---------|---------|---------|----------|
4214
- | [\u{9875}\u{9762}\u{540D}\u{79F0}] | [Controller.method] | [ComponentName] | [/path] | [\u{65B0}\u{589E}/\u{4FEE}\u{6539}/\u{5220}\u{9664}] |
4215
-
4216
- ## 5. \u{524D}\u{7AEF}\u{6838}\u{5FC3}\u{7EC4}\u{4EF6}\u{8868}
4217
- \u{5206}\u{6790}\u{524D}\u{7AEF}\u{7EC4}\u{4EF6}\u{53D8}\u{66F4}\u{FF1A}
4218
-
4219
- | \u{7EC4}\u{4EF6}\u{540D}\u{79F0} | \u{6240}\u{5C5E}\u{9875}\u{9762} | \u{529F}\u{80FD}\u{8BF4}\u{660E} | \u{53D8}\u{66F4}\u{72B6}\u{6001} |
4220
- |---------|---------|---------|----------|
4221
- | [ComponentName] | [PageName] | [\u{529F}\u{80FD}\u{63CF}\u{8FF0}] | [\u{65B0}\u{589E}/\u{4FEE}\u{6539}/\u{5220}\u{9664}] |
4222
-
4223
- ## 6. \u{9700}\u{6C42}\u{5B8C}\u{6574}\u{6027}\u{68C0}\u{67E5}
4224
- \u{5BF9}\u{6BD4}\u{539F}\u{59CB}\u{9700}\u{6C42}\u{FF0C}\u{68C0}\u{67E5}\u{FF1A}
4225
- - \u{2705} \u{5DF2}\u{5B8C}\u{6210}\u{7684}\u{529F}\u{80FD}
4226
- - \u{26A0}\u{FE0F} \u{90E8}\u{5206}\u{5B8C}\u{6210}\u{7684}\u{529F}\u{80FD}
4227
- - \u{274C} \u{672A}\u{5B9E}\u{73B0}\u{7684}\u{529F}\u{80FD}
4228
- - \u{1F504} \u{9700}\u{8981}\u{8FDB}\u{4E00}\u{6B65}\u{5B8C}\u{5584}\u{7684}\u{529F}\u{80FD}
4229
-
4230
- ## 7. \u{5EFA}\u{8BAE}\u{4E0E}\u{603B}\u{7ED3}
4231
- - \u{5B9E}\u{73B0}\u{8D28}\u{91CF}\u{8BC4}\u{4F30}
4232
- - \u{6F5C}\u{5728}\u{95EE}\u{9898}\u{8BC6}\u{522B}
4233
- - \u{540E}\u{7EED}\u{5F00}\u{53D1}\u{5EFA}\u{8BAE}
4234
- - \u{6D4B}\u{8BD5}\u{5EFA}\u{8BAE}
4235
-
4236
- \u{8BF7}\u{786E}\u{4FDD}\u{6240}\u{6709}\u{8868}\u{683C}\u{4E0A}\u{4E0B}\u{5BF9}\u{9F50}\u{FF0C}\u{5185}\u{5BB9}\u{8BE6}\u{5B9E}\u{51C6}\u{786E}\u{3002}`;
4237
- objectType({
4238
- baseBranch: stringType().default('main').describe("\u57FA\u51C6\u5206\u652F\u540D\u79F0\uFF0C\u7528\u4E8E\u5BF9\u6BD4\u53D8\u66F4"),
4239
- requirementFile: stringType().optional().describe("\u9700\u6C42\u6587\u6863\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09"),
4240
- includeUncommitted: booleanType().default(true).describe("\u662F\u5426\u5305\u542B\u672A\u63D0\u4EA4\u7684\u53D8\u66F4"),
4241
- outputFormat: enumType([
4242
- 'markdown',
4243
- 'json'
4244
- ]).default('markdown').describe("\u8F93\u51FA\u683C\u5F0F")
4245
- });
4246
- const changeSummarizer = {
4247
- name: "\u4EE3\u7801\u53D8\u66F4\u5206\u6790\u667A\u80FD\u4F53",
4248
- description: "\u5206\u6790\u4EE3\u7801\u5E76\u4E0E\u9700\u6C42\u8FDB\u884C\u5BF9\u6BD4\uFF0C\u786E\u4FDD\u5B9E\u73B0\u5B8C\u6574\u6027",
4249
- inputSchema: {
4250
- baseBranch: stringType().default('main').describe("\u57FA\u51C6\u5206\u652F\u540D\u79F0\uFF0C\u7528\u4E8E\u5BF9\u6BD4\u53D8\u66F4"),
4251
- requirementFile: stringType().optional().describe("\u9700\u6C42\u6587\u6863\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09"),
4252
- includeUncommitted: booleanType().default(true).describe("\u662F\u5426\u5305\u542B\u672A\u63D0\u4EA4\u7684\u53D8\u66F4"),
4253
- outputFormat: enumType([
4254
- 'markdown',
4255
- 'json'
4256
- ]).default('markdown').describe("\u8F93\u51FA\u683C\u5F0F")
4257
- },
4258
- handler: async (args)=>{
4259
- try {
4260
- initializeProjectRoot();
4261
- console.log('[CHANGE-SUMMARIZER DEBUG] args:', JSON.stringify(args, null, 2));
4262
- console.log('[CHANGE-SUMMARIZER DEBUG] args.baseBranch:', args.baseBranch);
4263
- console.log('[CHANGE-SUMMARIZER DEBUG] args.outputFormat:', args.outputFormat);
4264
- logger.info({
4265
- module: 'change-summarizer',
4266
- message: 'Starting code analysis',
4267
- args
4268
- });
4269
- let requirementContent = '';
4270
- if (args.requirementFile && external_fs_default().existsSync(args.requirementFile)) requirementContent = external_fs_default().readFileSync(args.requirementFile, 'utf-8');
4271
- const analysisPrompt = buildAnalysisPrompt(requirementContent);
4272
- const outputPath = await saveAnalysisResult(analysisPrompt, args.outputFormat);
4273
- logger.info({
4274
- module: 'change-summarizer',
4275
- message: 'Code analysis completed',
4276
- outputPath
4277
- });
4278
- return {
4279
- content: [
4280
- {
4281
- type: "text",
4282
- text: JSON.stringify({
4283
- success: true,
4284
- message: "\u4EE3\u7801\u53D8\u66F4\u5206\u6790\u667A\u80FD\u4F53\u6D4B\u8BD5\u6210\u529F",
4285
- data: {
4286
- baseBranch: args.baseBranch || 'main',
4287
- outputFormat: args.outputFormat || 'markdown'
4288
- }
4289
- })
4290
- }
4291
- ]
4292
- };
4293
- } catch (error) {
4294
- logger.error({
4295
- module: 'change-summarizer',
4296
- message: 'Code analysis failed',
4297
- error: error instanceof Error ? error.message : String(error)
4298
- });
4299
- return {
4300
- content: [
4301
- {
4302
- type: "text",
4303
- text: JSON.stringify({
4304
- success: false,
4305
- message: `\u{4EE3}\u{7801}\u{53D8}\u{66F4}\u{5206}\u{6790}\u{667A}\u{80FD}\u{4F53}\u{6267}\u{884C}\u{5931}\u{8D25}: ${error instanceof Error ? error.message : String(error)}`,
4306
- data: null
4307
- })
4308
- }
4309
- ],
4310
- isError: true
4311
- };
4312
- }
4313
- }
4314
- };
4315
- changeSummarizer.handler = changeSummarizer.handler;
4316
- function buildAnalysisPrompt(requirementContent) {
4317
- const changesSection = `
4318
- ## \u{4EE3}\u{7801}\u{4E0A}\u{4E0B}\u{6587}\u{5206}\u{6790}
4319
-
4320
- \u{8BF7}\u{57FA}\u{4E8E}\u{4EE5}\u{4E0B}\u{5185}\u{5BB9}\u{8FDB}\u{884C}\u{5206}\u{6790}\u{FF1A}
4321
- - \u{5F53}\u{524D}\u{4EE3}\u{7801}\u{5E93}\u{7684}\u{6574}\u{4F53}\u{7ED3}\u{6784}
4322
- - \u{4E3B}\u{8981}\u{529F}\u{80FD}\u{6A21}\u{5757}\u{7684}\u{5B9E}\u{73B0}
4323
- - \u{5173}\u{952E}\u{4E1A}\u{52A1}\u{903B}\u{8F91}
4324
- - \u{63A5}\u{53E3}\u{5B9A}\u{4E49}\u{4E0E}\u{5B9E}\u{73B0}
4325
- - \u{524D}\u{7AEF}\u{7EC4}\u{4EF6}\u{4E0E}\u{9875}\u{9762}
4326
- `;
4327
- const requirementSection = requirementContent ? `
4328
- ## \u{9700}\u{6C42}\u{6587}\u{6863}\u{5185}\u{5BB9}
4329
- ${requirementContent}
4330
- ` : `
4331
- ## \u{9700}\u{6C42}\u{6587}\u{6863}
4332
- \u{672A}\u{63D0}\u{4F9B}\u{9700}\u{6C42}\u{6587}\u{6863}\u{FF0C}\u{8BF7}\u{57FA}\u{4E8E}\u{4EE3}\u{7801}\u{53D8}\u{66F4}\u{8FDB}\u{884C}\u{5206}\u{6790}\u{3002}
4333
- `;
4334
- return `
4335
- ${changeAnalysisPrompt}
4336
-
4337
- ${changesSection}
4338
-
4339
- ${requirementSection}
4340
-
4341
- \u{8BF7}\u{57FA}\u{4E8E}\u{4EE5}\u{4E0A}\u{4FE1}\u{606F}\u{8FDB}\u{884C}\u{8BE6}\u{7EC6}\u{5206}\u{6790}\u{3002}
4342
- `;
4343
- }
4344
- async function saveAnalysisResult(prompt, format) {
4345
- const storageDir = getStorageDir();
4346
- if (!storageDir || 'string' != typeof storageDir) throw new Error("\u5B58\u50A8\u76EE\u5F55\u914D\u7F6E\u9519\u8BEF\uFF0C\u65E0\u6CD5\u4FDD\u5B58\u5206\u6790\u7ED3\u679C");
4347
- const outputDir = external_path_default().join(storageDir, 'change-analysis');
4348
- if (!external_fs_default().existsSync(outputDir)) external_fs_default().mkdirSync(outputDir, {
4349
- recursive: true
4350
- });
4351
- const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
4352
- const filename = `change-analysis-${timestamp}.${'json' === format ? 'json' : 'md'}`;
4353
- const outputPath = external_path_default().join(outputDir, filename);
4354
- if ('json' === format) {
4355
- const jsonData = {
4356
- timestamp: new Date().toISOString(),
4357
- prompt,
4358
- type: 'change-analysis'
4359
- };
4360
- external_fs_default().writeFileSync(outputPath, JSON.stringify(jsonData, null, 2), 'utf-8');
4361
- } else external_fs_default().writeFileSync(outputPath, prompt, 'utf-8');
4362
- return outputPath;
4363
- }
4364
- const external_sharp_namespaceObject = require("sharp");
4365
- var external_sharp_default = /*#__PURE__*/ __webpack_require__.n(external_sharp_namespaceObject);
4184
+ require("aico-pack");
4366
4185
  class OpenAIService {
4367
4186
  qwenConfig = {
4368
4187
  apiKey: 'sk-95b0bc60b7464bbbafd64edc2f5bab14',
@@ -4683,7 +4502,623 @@ ${requirementSection}
4683
4502
  }
4684
4503
  }
4685
4504
  }
4686
- const openAIService = new OpenAIService();
4505
+ const openai_openAIService = new OpenAIService();
4506
+ objectType({
4507
+ input_type: enumType([
4508
+ "text",
4509
+ "md_file"
4510
+ ]).describe("\u8F93\u5165\u7C7B\u578B\uFF1A\u76F4\u63A5\u6587\u672C\u8F93\u5165\u6216\u5F15\u7528\u5DF2\u751F\u6210\u7684MD\u6587\u4EF6"),
4511
+ content: stringType().optional().describe("\u5F53input_type\u4E3Atext\u65F6\uFF0C\u76F4\u63A5\u8F93\u5165\u7684\u9700\u6C42\u5185\u5BB9"),
4512
+ md_file_path: stringType().optional().describe("\u5F53input_type\u4E3Amd_file\u65F6\uFF0C\u8981\u5206\u6790\u7684MD\u6587\u4EF6\u8DEF\u5F84"),
4513
+ feature_name: stringType().describe("\u529F\u80FD\u540D\u79F0\uFF0C\u7528\u4E8E\u751F\u6210\u8F93\u51FA\u6587\u4EF6\u540D"),
4514
+ custom_prompt: stringType().optional().describe("\u81EA\u5B9A\u4E49\u63D0\u793A\u8BCD\uFF0C\u7528\u4E8E\u6307\u5BFCAI\u751F\u6210\u7279\u5B9A\u98CE\u683C\u7684\u9700\u6C42\u6587\u6863"),
4515
+ analysis_depth: enumType([
4516
+ "basic",
4517
+ "detailed",
4518
+ "comprehensive"
4519
+ ]).default("detailed").describe("\u5206\u6790\u6DF1\u5EA6\uFF1A\u57FA\u7840\u3001\u8BE6\u7EC6\u3001\u7EFC\u5408"),
4520
+ use_streaming: booleanType().default(false).describe("\u662F\u5426\u4F7F\u7528\u6D41\u5F0F\u5904\u7406\uFF08\u9002\u7528\u4E8E\u5927\u6587\u4EF6\uFF09"),
4521
+ chunk_size: numberType().min(10).max(1000).default(100).describe("\u5206\u5757\u5927\u5C0F\uFF08\u4EC5\u5728use_streaming\u4E3Atrue\u65F6\u6709\u6548\uFF09")
4522
+ }).refine((data)=>{
4523
+ if ("text" === data.input_type) return data.content && data.content.trim().length > 0;
4524
+ if ("md_file" === data.input_type) return data.md_file_path && data.md_file_path.trim().length > 0;
4525
+ return false;
4526
+ }, {
4527
+ message: "\u5F53input_type\u4E3Atext\u65F6content\u5FC5\u586B\uFF0C\u5F53input_type\u4E3Amd_file\u65F6md_file_path\u5FC5\u586B"
4528
+ });
4529
+ const requirementAnalyzerTool = {
4530
+ name: "\u9700\u6C42\u62A5\u544A\u751F\u6210\u667A\u80FD\u4F53",
4531
+ description: "\u667A\u80FD\u5206\u6790\u9700\u6C42\u5E76\u751F\u6210\u7EDF\u4E00\u7684\u6280\u672F\u6587\u6863\uFF0C\u652F\u6301\u9879\u76EE\u60C5\u51B5\u611F\u77E5\u548C\u7CBE\u786E\u6A21\u677F\u5339\u914D",
4532
+ inputSchema: {
4533
+ input_type: enumType([
4534
+ "text",
4535
+ "md_file"
4536
+ ]).describe("\u8F93\u5165\u7C7B\u578B\uFF1A\u76F4\u63A5\u6587\u672C\u8F93\u5165\u6216\u5F15\u7528\u5DF2\u751F\u6210\u7684MD\u6587\u4EF6"),
4537
+ content: stringType().optional().describe("\u5F53input_type\u4E3Atext\u65F6\uFF0C\u76F4\u63A5\u8F93\u5165\u7684\u9700\u6C42\u5185\u5BB9"),
4538
+ md_file_path: stringType().optional().describe("\u5F53input_type\u4E3Amd_file\u65F6\uFF0C\u8981\u5206\u6790\u7684MD\u6587\u4EF6\u8DEF\u5F84"),
4539
+ feature_name: stringType().describe("\u529F\u80FD\u540D\u79F0\uFF0C\u7528\u4E8E\u751F\u6210\u8F93\u51FA\u6587\u4EF6\u540D"),
4540
+ custom_prompt: stringType().optional().describe("\u81EA\u5B9A\u4E49\u63D0\u793A\u8BCD\uFF0C\u7528\u4E8E\u6307\u5BFCAI\u751F\u6210\u7279\u5B9A\u98CE\u683C\u7684\u9700\u6C42\u6587\u6863"),
4541
+ analysis_depth: enumType([
4542
+ "basic",
4543
+ "detailed",
4544
+ "comprehensive"
4545
+ ]).default("detailed").describe("\u5206\u6790\u6DF1\u5EA6\uFF1A\u57FA\u7840\u3001\u8BE6\u7EC6\u3001\u7EFC\u5408"),
4546
+ use_streaming: booleanType().default(false).describe("\u662F\u5426\u4F7F\u7528\u6D41\u5F0F\u5904\u7406\uFF08\u9002\u7528\u4E8E\u5927\u6587\u4EF6\uFF09"),
4547
+ chunk_size: numberType().min(10).max(1000).default(100).describe("\u5206\u5757\u5927\u5C0F\uFF08\u4EC5\u5728use_streaming\u4E3Atrue\u65F6\u6709\u6548\uFF09")
4548
+ },
4549
+ handler: async (args)=>{
4550
+ try {
4551
+ const { input_type, content, md_file_path, feature_name, custom_prompt, analysis_depth, use_streaming, chunk_size } = args;
4552
+ const systemGuidance = `
4553
+ # \u{7CFB}\u{7EDF}\u{5316}\u{9700}\u{6C42}\u{5206}\u{6790}\u{667A}\u{80FD}\u{4F53}\u{6267}\u{884C}\u{6D41}\u{7A0B}
4554
+
4555
+ ## \u{8F93}\u{5165}\u{53C2}\u{6570}
4556
+ - \u{8F93}\u{5165}\u{7C7B}\u{578B}: ${input_type}
4557
+ - \u{529F}\u{80FD}\u{540D}\u{79F0}: ${feature_name}
4558
+ - \u{5206}\u{6790}\u{6DF1}\u{5EA6}: ${analysis_depth}
4559
+ - \u{6D41}\u{5F0F}\u{5904}\u{7406}: ${use_streaming}
4560
+
4561
+ ## TODO\u{6E05}\u{5355}\u{6807}\u{51C6}\u{6D41}\u{7A0B}
4562
+
4563
+ ### 1. \u{9700}\u{6C42}\u{5206}\u{6790}
4564
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
4565
+ - \u{5145}\u{5206}\u{641C}\u{7D22}\u{4E0E}\u{7528}\u{6237}\u{8F93}\u{5165}\u{5185}\u{5BB9}\u{76F8}\u{5173}\u{7684}\u{8D44}\u{6E90}
4566
+ - \u{660E}\u{786E}\u{7528}\u{6237}\u{7684}\u{6838}\u{5FC3}\u{95EE}\u{9898}\u{3001}\u{9690}\u{542B}\u{9700}\u{6C42}\u{548C}\u{6700}\u{7EC8}\u{76EE}\u{6807}
4567
+ - \u{56F4}\u{7ED5}\u{95EE}\u{9898}\u{FF0C}\u{5FEB}\u{901F}\u{6784}\u{5EFA}\u{4E00}\u{4E2A}\u{77E5}\u{8BC6}\u{6846}\u{67B6}\u{3002}\u{786E}\u{5B9A}\u{56DE}\u{7B54}\u{5E94}\u{5305}\u{542B}\u{7684}\u{5173}\u{952E}\u{6982}\u{5FF5}\u{3001}\u{4E0A}\u{4E0B}\u{6587}\u{3001}\u{6B63}\u{53CD}\u{8BBA}\u{70B9}\u{548C}\u{6F5C}\u{5728}\u{7684}\u{5EF6}\u{4F38}\u{9886}\u{57DF}
4568
+ - \u{6839}\u{636E}\u{5145}\u{5206}\u{4E86}\u{89E3}\u{5230}\u{7684}\u{4FE1}\u{606F}\u{FF0C}\u{6E05}\u{6670}\u{5B8C}\u{6574}\u{7684}\u{590D}\u{8FF0}\u{7528}\u{6237}\u{9700}\u{6C42}\u{FF0C}\u{5E76}\u{7ED9}\u{51FA}\u{4E00}\u{4E2A}\u{9AD8}\u{5EA6}\u{6D53}\u{7F29}\u{7684}\u{3001}\u{7ED3}\u{8BBA}\u{6027}\u{7684}\u{6838}\u{5FC3}\u{89C2}\u{70B9}
4569
+
4570
+ **\u{8F93}\u{5165}\u{5185}\u{5BB9}\u{5904}\u{7406}\u{FF1A}**
4571
+ ${'text' === input_type ? `
4572
+ **\u{76F4}\u{63A5}\u{6587}\u{672C}\u{8F93}\u{5165}\u{FF1A}**
4573
+ \`\`\`
4574
+ ${content}
4575
+ \`\`\`
4576
+ ` : `
4577
+ **MD\u{6587}\u{4EF6}\u{8DEF}\u{5F84}\u{FF1A}** ${md_file_path}
4578
+ **\u{4F7F}\u{7528}\u{5DE5}\u{5177}\u{FF1A}** readFile \u{8BFB}\u{53D6}\u{6587}\u{4EF6}\u{5185}\u{5BB9}
4579
+ `}
4580
+
4581
+ **\u{4F7F}\u{7528}\u{5DE5}\u{5177}\u{FF1A}**
4582
+ ${'md_file' === input_type ? `
4583
+ 1. readFile("${md_file_path}") \u{8BFB}\u{53D6}MD\u{6587}\u{4EF6}\u{5185}\u{5BB9}
4584
+ 2. \u{5206}\u{6790}\u{6587}\u{4EF6}\u{7ED3}\u{6784}\u{548C}\u{5185}\u{5BB9}\u{8981}\u{70B9}
4585
+ ` : `
4586
+ 1. \u{76F4}\u{63A5}\u{5206}\u{6790}\u{8F93}\u{5165}\u{7684}\u{6587}\u{672C}\u{5185}\u{5BB9}
4587
+ 2. \u{8BC6}\u{522B}\u{5173}\u{952E}\u{9700}\u{6C42}\u{70B9}\u{548C}\u{6280}\u{672F}\u{8981}\u{6C42}
4588
+ `}
4589
+
4590
+ ### 2. \u{573A}\u{666F}\u{8BC6}\u{522B}
4591
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
4592
+ - \u{57FA}\u{4E8E}\u{9700}\u{6C42}\u{5206}\u{6790}\u{7684}\u{5185}\u{5BB9}\u{FF0C}\u{627E}\u{51FA}\u{4E3B}\u{8981}\u{77DB}\u{76FE}\u{70B9}\u{FF0C}\u{5B9A}\u{4F4D}\u{6838}\u{5FC3}\u{95EE}\u{9898}\u{8282}\u{70B9}
4593
+ - \u{4ECE}\u{7CFB}\u{7EDF}\u{5C42}\u{9762}\u{62C6}\u{89E3}\u{4E3A}\u{53EF}\u{6267}\u{884C}\u{5B50}\u{4EFB}\u{52A1}\u{FF0C}\u{786E}\u{4FDD}\u{903B}\u{8F91}\u{94FE}\u{6761}\u{6E05}\u{6670}\u{FF0C}\u{4E0A}\u{4E0B}\u{6587}\u{4FE1}\u{606F}\u{5145}\u{8DB3}
4594
+
4595
+ **\u{5206}\u{6790}\u{7EF4}\u{5EA6}\u{FF1A}**
4596
+ 1. **\u{529F}\u{80FD}\u{573A}\u{666F}\u{8BC6}\u{522B}**
4597
+ - \u{6838}\u{5FC3}\u{529F}\u{80FD}\u{6A21}\u{5757}
4598
+ - \u{7528}\u{6237}\u{4EA4}\u{4E92}\u{573A}\u{666F}
4599
+ - \u{6570}\u{636E}\u{6D41}\u{8F6C}\u{573A}\u{666F}
4600
+
4601
+ 2. **\u{6280}\u{672F}\u{573A}\u{666F}\u{8BC6}\u{522B}**
4602
+ - \u{6280}\u{672F}\u{6808}\u{8981}\u{6C42}
4603
+ - \u{67B6}\u{6784}\u{7EA6}\u{675F}
4604
+ - \u{6027}\u{80FD}\u{8981}\u{6C42}
4605
+
4606
+ 3. **\u{4E1A}\u{52A1}\u{573A}\u{666F}\u{8BC6}\u{522B}**
4607
+ - \u{4E1A}\u{52A1}\u{6D41}\u{7A0B}
4608
+ - \u{7528}\u{6237}\u{89D2}\u{8272}
4609
+ - \u{4F7F}\u{7528}\u{573A}\u{666F}
4610
+
4611
+ ### 3. \u{65B9}\u{6848}\u{8BBE}\u{8BA1}
4612
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
4613
+ - \u{65B9}\u{6848}\u{8BBE}\u{8BA1}\u{4F18}\u{5148}\u{590D}\u{7528}\u{73B0}\u{6709}\u{65B9}\u{6848}\u{FF0C}\u{7EC4}\u{4EF6}\u{FF0C}\u{5DE5}\u{5177}\u{65B9}\u{6CD5}\u{7B49}\u{FF0C}\u{80FD}\u{590D}\u{7528}\u{7684}\u{5C3D}\u{53EF}\u{80FD}\u{590D}\u{7528}
4614
+ - \u{626B}\u{63CF}\u{9879}\u{76EE}\u{4E2D}\u{4F7F}\u{7528}\u{7684}\u{6D4B}\u{8BD5}\u{6846}\u{67B6}\u{548C}\u{811A}\u{672C}\u{FF0C}\u{751F}\u{6210}\u{672C}\u{6B21}\u{9700}\u{6C42}\u{7684}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{FF0C}\u{5982}\u{679C}\u{4E0D}\u{5B58}\u{5728}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{FF0C}\u{5219}\u{7F16}\u{5199}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{5230}.aico/tests\u{4E0B}\u{9762}
4615
+
4616
+ **\u{8BBE}\u{8BA1}\u{5185}\u{5BB9}\u{FF1A}**
4617
+ 1. **\u{6280}\u{672F}\u{65B9}\u{6848}\u{8BBE}\u{8BA1}**
4618
+ - \u{67B6}\u{6784}\u{6A21}\u{5F0F}\u{9009}\u{62E9}
4619
+ - \u{6280}\u{672F}\u{6808}\u{786E}\u{5B9A}
4620
+ - \u{6838}\u{5FC3}\u{7EC4}\u{4EF6}\u{8BBE}\u{8BA1}
4621
+
4622
+ 2. **\u{5B9E}\u{73B0}\u{65B9}\u{6848}\u{8BBE}\u{8BA1}**
4623
+ - \u{6587}\u{4EF6}\u{7ED3}\u{6784}\u{89C4}\u{5212}
4624
+ - \u{6A21}\u{5757}\u{5212}\u{5206}\u{7B56}\u{7565}
4625
+ - \u{63A5}\u{53E3}\u{8BBE}\u{8BA1}\u{65B9}\u{6848}
4626
+
4627
+ 3. **\u{6D4B}\u{8BD5}\u{65B9}\u{6848}\u{8BBE}\u{8BA1}**
4628
+ - \u{6D4B}\u{8BD5}\u{7B56}\u{7565}\u{5236}\u{5B9A}
4629
+ - \u{6D4B}\u{8BD5}\u{7528}\u{4F8B}\u{8BBE}\u{8BA1}
4630
+ - \u{6D4B}\u{8BD5}\u{73AF}\u{5883}\u{51C6}\u{5907}
4631
+
4632
+ ### 4. \u{6267}\u{884C}\u{9A8C}\u{8BC1}
4633
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
4634
+ - \u{6309}\u{65B9}\u{6848}\u{8BBE}\u{8BA1}\u{7684}\u{7ED3}\u{679C}\u{8F93}\u{51FA}\u{4EE3}\u{7801}
4635
+ - \u{5982}\u{679C}\u{6709}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{FF0C}\u{8FD0}\u{884C}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{5E76}\u{4FEE}\u{6B63}\u{76F4}\u{5230}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{5168}\u{90E8}\u{901A}\u{8FC7}
4636
+
4637
+ **\u{9A8C}\u{8BC1}\u{5185}\u{5BB9}\u{FF1A}**
4638
+ 1. **\u{9700}\u{6C42}\u{6587}\u{6863}\u{751F}\u{6210}**
4639
+ - \u{57FA}\u{4E8E}\u{5206}\u{6790}\u{7ED3}\u{679C}\u{751F}\u{6210}\u{7ED3}\u{6784}\u{5316}\u{6587}\u{6863}
4640
+ - \u{786E}\u{4FDD}\u{6587}\u{6863}\u{5B8C}\u{6574}\u{6027}\u{548C}\u{51C6}\u{786E}\u{6027}
4641
+ - \u{8F93}\u{51FA}\u{6807}\u{51C6}\u{683C}\u{5F0F}\u{9700}\u{6C42}\u{62A5}\u{544A}
4642
+
4643
+ 2. **\u{8D28}\u{91CF}\u{9A8C}\u{8BC1}**
4644
+ - \u{6587}\u{6863}\u{7ED3}\u{6784}\u{68C0}\u{67E5}
4645
+ - \u{5185}\u{5BB9}\u{5B8C}\u{6574}\u{6027}\u{9A8C}\u{8BC1}
4646
+ - \u{6280}\u{672F}\u{53EF}\u{884C}\u{6027}\u{8BC4}\u{4F30}
4647
+
4648
+ ### 5. \u{603B}\u{7ED3}\u{53CD}\u{9988}
4649
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
4650
+ - \u{8F93}\u{51FA}\u{6700}\u{7EC8}\u{6267}\u{884C}\u{7684}\u{65B9}\u{6848}
4651
+ - \u{66F4}\u{65B0}TODO\u{6E05}\u{5355}
4652
+ - \u{6839}\u{636E}\u{60C5}\u{51B5}\u{63D0}\u{4F9B}\u{4E00}\u{4E9B}\u{524D}\u{77BB}\u{6027}\u{7684}\u{601D}\u{8003}\u{6216}\u{5EFA}\u{8BAE}
4653
+
4654
+ **\u{8F93}\u{51FA}\u{5185}\u{5BB9}\u{FF1A}**
4655
+ 1. **\u{9700}\u{6C42}\u{5206}\u{6790}\u{62A5}\u{544A}**
4656
+ - \u{9700}\u{6C42}\u{6982}\u{8FF0}
4657
+ - \u{529F}\u{80FD}\u{6A21}\u{5757}\u{5206}\u{6790}
4658
+ - \u{6280}\u{672F}\u{65B9}\u{6848}\u{5EFA}\u{8BAE}
4659
+ - \u{5B9E}\u{65BD}\u{8DEF}\u{5F84}\u{89C4}\u{5212}
4660
+
4661
+ 2. **\u{9879}\u{76EE}\u{5EFA}\u{8BAE}**
4662
+ - \u{98CE}\u{9669}\u{8BC4}\u{4F30}
4663
+ - \u{8D44}\u{6E90}\u{9700}\u{6C42}
4664
+ - \u{65F6}\u{95F4}\u{89C4}\u{5212}
4665
+ - \u{8D28}\u{91CF}\u{4FDD}\u{8BC1}\u{63AA}\u{65BD}
4666
+
4667
+ ## \u{81EA}\u{5B9A}\u{4E49}\u{63D0}\u{793A}\u{8BCD}\u{5904}\u{7406}
4668
+ ${custom_prompt ? `
4669
+ **\u{7528}\u{6237}\u{81EA}\u{5B9A}\u{4E49}\u{63D0}\u{793A}\u{8BCD}\u{FF1A}**
4670
+ \`\`\`
4671
+ ${custom_prompt}
4672
+ \`\`\`
4673
+
4674
+ **\u{5904}\u{7406}\u{65B9}\u{5F0F}\u{FF1A}**
4675
+ - \u{5C06}\u{81EA}\u{5B9A}\u{4E49}\u{63D0}\u{793A}\u{8BCD}\u{878D}\u{5165}\u{5230}\u{6807}\u{51C6}\u{5206}\u{6790}\u{6D41}\u{7A0B}\u{4E2D}
4676
+ - \u{786E}\u{4FDD}\u{81EA}\u{5B9A}\u{4E49}\u{8981}\u{6C42}\u{4E0E}\u{7CFB}\u{7EDF}\u{5316}\u{6D41}\u{7A0B}\u{76F8}\u{7ED3}\u{5408}
4677
+ - \u{5728}\u{751F}\u{6210}\u{6587}\u{6863}\u{65F6}\u{4F53}\u{73B0}\u{7528}\u{6237}\u{7684}\u{7279}\u{5B9A}\u{9700}\u{6C42}
4678
+ ` : `
4679
+ **\u{4F7F}\u{7528}\u{9ED8}\u{8BA4}\u{5206}\u{6790}\u{6A21}\u{677F}**
4680
+ - \u{6309}\u{7167}\u{6807}\u{51C6}\u{9700}\u{6C42}\u{5206}\u{6790}\u{6D41}\u{7A0B}\u{6267}\u{884C}
4681
+ - \u{751F}\u{6210}\u{901A}\u{7528}\u{683C}\u{5F0F}\u{7684}\u{9700}\u{6C42}\u{6587}\u{6863}
4682
+ - \u{786E}\u{4FDD}\u{5206}\u{6790}\u{7684}\u{5168}\u{9762}\u{6027}\u{548C}\u{7CFB}\u{7EDF}\u{6027}
4683
+ `}
4684
+
4685
+ ## \u{5206}\u{6790}\u{6DF1}\u{5EA6}\u{63A7}\u{5236}
4686
+ **\u{5F53}\u{524D}\u{8BBE}\u{7F6E}\u{FF1A}** ${analysis_depth}
4687
+ - **basic**: \u{57FA}\u{7840}\u{5206}\u{6790}\u{FF0C}\u{91CD}\u{70B9}\u{5173}\u{6CE8}\u{6838}\u{5FC3}\u{529F}\u{80FD}
4688
+ - **detailed**: \u{8BE6}\u{7EC6}\u{5206}\u{6790}\u{FF0C}\u{5305}\u{542B}\u{6280}\u{672F}\u{7EC6}\u{8282}\u{548C}\u{5B9E}\u{73B0}\u{65B9}\u{6848}
4689
+ - **comprehensive**: \u{7EFC}\u{5408}\u{5206}\u{6790}\u{FF0C}\u{5168}\u{9762}\u{8986}\u{76D6}\u{6240}\u{6709}\u{65B9}\u{9762}
4690
+
4691
+ ## \u{6D41}\u{5F0F}\u{5904}\u{7406}\u{914D}\u{7F6E}
4692
+ ${use_streaming ? `
4693
+ **\u{542F}\u{7528}\u{6D41}\u{5F0F}\u{5904}\u{7406}**
4694
+ - \u{5206}\u{5757}\u{5927}\u{5C0F}: ${chunk_size}
4695
+ - \u{9002}\u{7528}\u{4E8E}\u{5927}\u{6587}\u{4EF6}\u{5904}\u{7406}
4696
+ - \u{652F}\u{6301}\u{589E}\u{91CF}\u{5206}\u{6790}\u{548C}\u{8F93}\u{51FA}
4697
+ ` : `
4698
+ **\u{6807}\u{51C6}\u{5904}\u{7406}\u{6A21}\u{5F0F}**
4699
+ - \u{4E00}\u{6B21}\u{6027}\u{5B8C}\u{6574}\u{5206}\u{6790}
4700
+ - \u{9002}\u{7528}\u{4E8E}\u{4E2D}\u{5C0F}\u{578B}\u{9700}\u{6C42}
4701
+ - \u{8F93}\u{51FA}\u{5B8C}\u{6574}\u{5206}\u{6790}\u{7ED3}\u{679C}
4702
+ `}
4703
+
4704
+ ---
4705
+
4706
+ **\u{6267}\u{884C}\u{539F}\u{5219}\u{FF1A}**
4707
+ - \u{521B}\u{5EFA}\u{5E76}\u{6301}\u{7EED}\u{66F4}\u{65B0}TODO\u{6E05}\u{5355}
4708
+ - \u{6301}\u{7EED}\u{5DE5}\u{4F5C}\u{81F3}\u{5B8C}\u{6210}
4709
+ - \u{786E}\u{4FDD}\u{5206}\u{6790}\u{7684}\u{7CFB}\u{7EDF}\u{6027}\u{548C}\u{5B8C}\u{6574}\u{6027}
4710
+ - \u{4F18}\u{5148}\u{8003}\u{8651}\u{7528}\u{6237}\u{81EA}\u{5B9A}\u{4E49}\u{9700}\u{6C42}
4711
+ - \u{4FDD}\u{8BC1}\u{8F93}\u{51FA}\u{6587}\u{6863}\u{7684}\u{8D28}\u{91CF}\u{548C}\u{53EF}\u{7528}\u{6027}
4712
+ `;
4713
+ return {
4714
+ content: [
4715
+ {
4716
+ type: "text",
4717
+ text: JSON.stringify({
4718
+ success: true,
4719
+ message: "\u7CFB\u7EDF\u5316\u9700\u6C42\u5206\u6790\u667A\u80FD\u4F53\u6267\u884C\u6307\u5BFC\u5DF2\u751F\u6210",
4720
+ data: {
4721
+ input_type,
4722
+ feature_name,
4723
+ analysis_depth,
4724
+ use_streaming,
4725
+ guidance: systemGuidance,
4726
+ execution_phases: [
4727
+ "\u9700\u6C42\u5206\u6790 - \u6DF1\u5EA6\u7406\u89E3\u7528\u6237\u9700\u6C42",
4728
+ "\u573A\u666F\u8BC6\u522B - \u62C6\u89E3\u6838\u5FC3\u95EE\u9898\u8282\u70B9",
4729
+ "\u65B9\u6848\u8BBE\u8BA1 - \u5236\u5B9A\u6280\u672F\u5B9E\u73B0\u65B9\u6848",
4730
+ "\u6267\u884C\u9A8C\u8BC1 - \u751F\u6210\u9700\u6C42\u6587\u6863",
4731
+ "\u603B\u7ED3\u53CD\u9988 - \u63D0\u4F9B\u9879\u76EE\u5EFA\u8BAE"
4732
+ ],
4733
+ next_steps: [
4734
+ "\u6839\u636E\u8F93\u5165\u7C7B\u578B\u5904\u7406\u5185\u5BB9",
4735
+ "\u6267\u884C\u7CFB\u7EDF\u5316\u5206\u6790\u6D41\u7A0B",
4736
+ "\u751F\u6210\u7ED3\u6784\u5316\u9700\u6C42\u6587\u6863",
4737
+ "\u63D0\u4F9B\u5B9E\u65BD\u5EFA\u8BAE"
4738
+ ]
4739
+ }
4740
+ })
4741
+ }
4742
+ ]
4743
+ };
4744
+ } catch (error) {
4745
+ return {
4746
+ content: [
4747
+ {
4748
+ type: "text",
4749
+ text: JSON.stringify({
4750
+ success: false,
4751
+ message: `\u{9700}\u{6C42}\u{5206}\u{6790}\u{667A}\u{80FD}\u{4F53}\u{6267}\u{884C}\u{5931}\u{8D25}: ${error.message}`,
4752
+ data: null
4753
+ })
4754
+ }
4755
+ ],
4756
+ isError: true
4757
+ };
4758
+ }
4759
+ }
4760
+ };
4761
+ const changeAnalysisPrompt = `\u{8BF7}\u{5206}\u{6790}\u{5F53}\u{524D}\u{4EE3}\u{7801}\u{5E93}\u{FF0C}\u{5E76}\u{4E0E}\u{9700}\u{6C42}\u{8FDB}\u{884C}\u{5BF9}\u{6BD4}\u{FF0C}\u{786E}\u{4FDD}\u{5B9E}\u{73B0}\u{7684}\u{5B8C}\u{6574}\u{6027}\u{3002}
4762
+
4763
+ \u{8BF7}\u{6309}\u{4EE5}\u{4E0B}\u{6B65}\u{9AA4}\u{8FDB}\u{884C}\u{5206}\u{6790}\u{FF1A}
4764
+
4765
+ ## 1. \u{4EE3}\u{7801}\u{5E93}\u{5206}\u{6790}
4766
+ \u{5206}\u{6790}\u{5F53}\u{524D}\u{4EE3}\u{7801}\u{5E93}\u{FF0C}\u{603B}\u{7ED3}\u{FF1A}
4767
+ - \u{4E3B}\u{8981}\u{529F}\u{80FD}\u{6A21}\u{5757}\u{53CA}\u{5176}\u{5B9E}\u{73B0}
4768
+ - \u{5173}\u{952E}\u{4E1A}\u{52A1}\u{903B}\u{8F91}\u{6D41}\u{7A0B}
4769
+ - \u{91CD}\u{8981}\u{6570}\u{636E}\u{7ED3}\u{6784}
4770
+ - \u{6838}\u{5FC3}\u{7B97}\u{6CD5}\u{5B9E}\u{73B0}
4771
+
4772
+ ## 2. \u{63A5}\u{53E3}\u{4E0E}\u{9700}\u{6C42}\u{5BF9}\u{5E94}\u{5173}\u{7CFB}\u{8868}
4773
+ \u{6839}\u{636E}\u{4EE3}\u{7801}\u{53D8}\u{66F4}\u{FF0C}\u{751F}\u{6210}\u{63A5}\u{53E3}\u{4E0E}\u{9700}\u{6C42}\u{5BF9}\u{5E94}\u{5173}\u{7CFB}\u{8868}\u{FF1A}
4774
+
4775
+ | \u{9700}\u{6C42}\u{529F}\u{80FD} | \u{5B9E}\u{73B0}\u{63A5}\u{53E3} | \u{8BF7}\u{6C42}\u{65B9}\u{5F0F} | URL | \u{53D8}\u{66F4}\u{72B6}\u{6001} |
4776
+ |---------|---------|---------|-----|----------|
4777
+ | [\u{9700}\u{6C42}\u{529F}\u{80FD}\u{63CF}\u{8FF0}] | [Controller.method] | [GET/POST/PUT/DELETE] | [/api/path] | [\u{65B0}\u{589E}/\u{4FEE}\u{6539}/\u{5220}\u{9664}] |
4778
+
4779
+ ## 3. \u{6838}\u{5FC3}\u{903B}\u{8F91}\u{65B9}\u{6CD5}\u{8868}
4780
+ \u{5206}\u{6790}\u{6838}\u{5FC3}\u{4E1A}\u{52A1}\u{903B}\u{8F91}\u{65B9}\u{6CD5}\u{FF1A}
4781
+
4782
+ | \u{65B9}\u{6CD5}\u{540D}\u{79F0} | \u{6240}\u{5C5E}\u{7C7B} | \u{529F}\u{80FD}\u{8BF4}\u{660E} | \u{53D8}\u{66F4}\u{72B6}\u{6001} |
4783
+ |---------|-------|---------|----------|
4784
+ | [methodName] | [ClassName] | [\u{529F}\u{80FD}\u{63CF}\u{8FF0}] | [\u{65B0}\u{589E}/\u{4FEE}\u{6539}/\u{5220}\u{9664}] |
4785
+
4786
+ ## 4. \u{524D}\u{7AEF}\u{9875}\u{9762}\u{4E0E}\u{63A5}\u{53E3}\u{5BF9}\u{5E94}\u{5173}\u{7CFB}\u{8868}
4787
+ \u{5206}\u{6790}\u{524D}\u{7AEF}\u{9875}\u{9762}\u{53D8}\u{66F4}\u{FF1A}
4788
+
4789
+ | \u{9875}\u{9762}\u{540D}\u{79F0} | \u{8C03}\u{7528}\u{63A5}\u{53E3} | \u{7EC4}\u{4EF6}\u{540D}\u{79F0} | \u{8DEF}\u{7531}\u{8DEF}\u{5F84} | \u{53D8}\u{66F4}\u{72B6}\u{6001} |
4790
+ |---------|---------|---------|---------|----------|
4791
+ | [\u{9875}\u{9762}\u{540D}\u{79F0}] | [Controller.method] | [ComponentName] | [/path] | [\u{65B0}\u{589E}/\u{4FEE}\u{6539}/\u{5220}\u{9664}] |
4792
+
4793
+ ## 5. \u{524D}\u{7AEF}\u{6838}\u{5FC3}\u{7EC4}\u{4EF6}\u{8868}
4794
+ \u{5206}\u{6790}\u{524D}\u{7AEF}\u{7EC4}\u{4EF6}\u{53D8}\u{66F4}\u{FF1A}
4795
+
4796
+ | \u{7EC4}\u{4EF6}\u{540D}\u{79F0} | \u{6240}\u{5C5E}\u{9875}\u{9762} | \u{529F}\u{80FD}\u{8BF4}\u{660E} | \u{53D8}\u{66F4}\u{72B6}\u{6001} |
4797
+ |---------|---------|---------|----------|
4798
+ | [ComponentName] | [PageName] | [\u{529F}\u{80FD}\u{63CF}\u{8FF0}] | [\u{65B0}\u{589E}/\u{4FEE}\u{6539}/\u{5220}\u{9664}] |
4799
+
4800
+ ## 6. \u{9700}\u{6C42}\u{5B8C}\u{6574}\u{6027}\u{68C0}\u{67E5}
4801
+ \u{5BF9}\u{6BD4}\u{539F}\u{59CB}\u{9700}\u{6C42}\u{FF0C}\u{68C0}\u{67E5}\u{FF1A}
4802
+ - \u{2705} \u{5DF2}\u{5B8C}\u{6210}\u{7684}\u{529F}\u{80FD}
4803
+ - \u{26A0}\u{FE0F} \u{90E8}\u{5206}\u{5B8C}\u{6210}\u{7684}\u{529F}\u{80FD}
4804
+ - \u{274C} \u{672A}\u{5B9E}\u{73B0}\u{7684}\u{529F}\u{80FD}
4805
+ - \u{1F504} \u{9700}\u{8981}\u{8FDB}\u{4E00}\u{6B65}\u{5B8C}\u{5584}\u{7684}\u{529F}\u{80FD}
4806
+
4807
+ ## 7. \u{5EFA}\u{8BAE}\u{4E0E}\u{603B}\u{7ED3}
4808
+ - \u{5B9E}\u{73B0}\u{8D28}\u{91CF}\u{8BC4}\u{4F30}
4809
+ - \u{6F5C}\u{5728}\u{95EE}\u{9898}\u{8BC6}\u{522B}
4810
+ - \u{540E}\u{7EED}\u{5F00}\u{53D1}\u{5EFA}\u{8BAE}
4811
+ - \u{6D4B}\u{8BD5}\u{5EFA}\u{8BAE}
4812
+
4813
+ \u{8BF7}\u{786E}\u{4FDD}\u{6240}\u{6709}\u{8868}\u{683C}\u{4E0A}\u{4E0B}\u{5BF9}\u{9F50}\u{FF0C}\u{5185}\u{5BB9}\u{8BE6}\u{5B9E}\u{51C6}\u{786E}\u{3002}`;
4814
+ objectType({
4815
+ baseBranch: stringType().default('main').describe("\u57FA\u51C6\u5206\u652F\u540D\u79F0\uFF0C\u7528\u4E8E\u5BF9\u6BD4\u53D8\u66F4"),
4816
+ requirementFile: stringType().optional().describe("\u9700\u6C42\u6587\u6863\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09"),
4817
+ includeUncommitted: booleanType().default(true).describe("\u662F\u5426\u5305\u542B\u672A\u63D0\u4EA4\u7684\u53D8\u66F4"),
4818
+ outputFormat: enumType([
4819
+ 'markdown',
4820
+ 'json'
4821
+ ]).default('markdown').describe("\u8F93\u51FA\u683C\u5F0F")
4822
+ });
4823
+ const changeSummarizer = {
4824
+ name: "\u4EE3\u7801\u53D8\u66F4\u5206\u6790\u667A\u80FD\u4F53",
4825
+ description: "\u5206\u6790\u4EE3\u7801\u5E76\u4E0E\u9700\u6C42\u8FDB\u884C\u5BF9\u6BD4\uFF0C\u786E\u4FDD\u5B9E\u73B0\u5B8C\u6574\u6027",
4826
+ inputSchema: {
4827
+ baseBranch: stringType().default('main').describe("\u57FA\u51C6\u5206\u652F\u540D\u79F0\uFF0C\u7528\u4E8E\u5BF9\u6BD4\u53D8\u66F4"),
4828
+ requirementFile: stringType().optional().describe("\u9700\u6C42\u6587\u6863\u6587\u4EF6\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09"),
4829
+ includeUncommitted: booleanType().default(true).describe("\u662F\u5426\u5305\u542B\u672A\u63D0\u4EA4\u7684\u53D8\u66F4"),
4830
+ outputFormat: enumType([
4831
+ 'markdown',
4832
+ 'json'
4833
+ ]).default('markdown').describe("\u8F93\u51FA\u683C\u5F0F")
4834
+ },
4835
+ handler: async (args)=>{
4836
+ try {
4837
+ initializeProjectRoot();
4838
+ console.log('[CHANGE-SUMMARIZER DEBUG] args:', JSON.stringify(args, null, 2));
4839
+ console.log('[CHANGE-SUMMARIZER DEBUG] args.baseBranch:', args.baseBranch);
4840
+ console.log('[CHANGE-SUMMARIZER DEBUG] args.outputFormat:', args.outputFormat);
4841
+ logger_logger.info({
4842
+ module: 'change-summarizer',
4843
+ message: 'Starting code analysis',
4844
+ args
4845
+ });
4846
+ let requirementContent = '';
4847
+ if (args.requirementFile && external_fs_default().existsSync(args.requirementFile)) requirementContent = external_fs_default().readFileSync(args.requirementFile, 'utf-8');
4848
+ const analysisPrompt = buildAnalysisPrompt(requirementContent);
4849
+ const outputPath = await saveAnalysisResult(analysisPrompt, args.outputFormat);
4850
+ logger_logger.info({
4851
+ module: 'change-summarizer',
4852
+ message: 'Code analysis completed',
4853
+ outputPath
4854
+ });
4855
+ const systemGuidance = `
4856
+ # \u{7CFB}\u{7EDF}\u{5316}\u{4EE3}\u{7801}\u{53D8}\u{66F4}\u{5206}\u{6790}\u{667A}\u{80FD}\u{4F53}\u{6267}\u{884C}\u{6D41}\u{7A0B}
4857
+
4858
+ ## \u{5206}\u{6790}\u{53C2}\u{6570}
4859
+ - \u{57FA}\u{51C6}\u{5206}\u{652F}: ${args.baseBranch || 'main'}
4860
+ - \u{8F93}\u{51FA}\u{683C}\u{5F0F}: ${args.outputFormat || 'markdown'}
4861
+ - \u{5305}\u{542B}\u{672A}\u{63D0}\u{4EA4}\u{53D8}\u{66F4}: ${false !== args.includeUncommitted ? "\u662F" : "\u5426"}
4862
+ ${args.requirementFile ? `- \u{9700}\u{6C42}\u{6587}\u{6863}: ${args.requirementFile}` : ''}
4863
+
4864
+ ## TODO\u{6E05}\u{5355}\u{6807}\u{51C6}\u{6D41}\u{7A0B}
4865
+
4866
+ ### 1. \u{9700}\u{6C42}\u{5206}\u{6790}
4867
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
4868
+ - \u{5145}\u{5206}\u{641C}\u{7D22}\u{4E0E}\u{7528}\u{6237}\u{8F93}\u{5165}\u{5185}\u{5BB9}\u{76F8}\u{5173}\u{7684}\u{8D44}\u{6E90}
4869
+ - \u{660E}\u{786E}\u{7528}\u{6237}\u{7684}\u{6838}\u{5FC3}\u{95EE}\u{9898}\u{3001}\u{9690}\u{542B}\u{9700}\u{6C42}\u{548C}\u{6700}\u{7EC8}\u{76EE}\u{6807}
4870
+ - \u{56F4}\u{7ED5}\u{95EE}\u{9898}\u{FF0C}\u{5FEB}\u{901F}\u{6784}\u{5EFA}\u{4E00}\u{4E2A}\u{77E5}\u{8BC6}\u{6846}\u{67B6}\u{3002}\u{786E}\u{5B9A}\u{56DE}\u{7B54}\u{5E94}\u{5305}\u{542B}\u{7684}\u{5173}\u{952E}\u{6982}\u{5FF5}\u{3001}\u{4E0A}\u{4E0B}\u{6587}\u{3001}\u{6B63}\u{53CD}\u{8BBA}\u{70B9}\u{548C}\u{6F5C}\u{5728}\u{7684}\u{5EF6}\u{4F38}\u{9886}\u{57DF}
4871
+ - \u{6839}\u{636E}\u{5145}\u{5206}\u{4E86}\u{89E3}\u{5230}\u{7684}\u{4FE1}\u{606F}\u{FF0C}\u{6E05}\u{6670}\u{5B8C}\u{6574}\u{7684}\u{590D}\u{8FF0}\u{7528}\u{6237}\u{9700}\u{6C42}\u{FF0C}\u{5E76}\u{7ED9}\u{51FA}\u{4E00}\u{4E2A}\u{9AD8}\u{5EA6}\u{6D53}\u{7F29}\u{7684}\u{3001}\u{7ED3}\u{8BBA}\u{6027}\u{7684}\u{6838}\u{5FC3}\u{89C2}\u{70B9}
4872
+
4873
+ **\u{9700}\u{6C42}\u{6587}\u{6863}\u{5206}\u{6790}\u{FF1A}**
4874
+ ${args.requirementFile ? `
4875
+ **\u{5DF2}\u{63D0}\u{4F9B}\u{9700}\u{6C42}\u{6587}\u{6863}\u{FF1A}** ${args.requirementFile}
4876
+ **\u{9700}\u{6C42}\u{5185}\u{5BB9}\u{FF1A}**
4877
+ \`\`\`
4878
+ ${requirementContent}
4879
+ \`\`\`
4880
+ ` : `
4881
+ **\u{672A}\u{63D0}\u{4F9B}\u{9700}\u{6C42}\u{6587}\u{6863}**
4882
+ - \u{5C06}\u{57FA}\u{4E8E}\u{4EE3}\u{7801}\u{53D8}\u{66F4}\u{672C}\u{8EAB}\u{8FDB}\u{884C}\u{5206}\u{6790}
4883
+ - \u{91CD}\u{70B9}\u{5173}\u{6CE8}\u{4EE3}\u{7801}\u{8D28}\u{91CF}\u{548C}\u{529F}\u{80FD}\u{5B8C}\u{6574}\u{6027}
4884
+ - \u{8BC6}\u{522B}\u{6F5C}\u{5728}\u{7684}\u{95EE}\u{9898}\u{548C}\u{6539}\u{8FDB}\u{70B9}
4885
+ `}
4886
+
4887
+ **\u{4F7F}\u{7528}\u{5DE5}\u{5177}\u{FF1A}**
4888
+ 1. **\u{4EE3}\u{7801}\u{53D8}\u{66F4}\u{83B7}\u{53D6}**
4889
+ - \u{4F7F}\u{7528} git \u{547D}\u{4EE4}\u{83B7}\u{53D6}\u{53D8}\u{66F4}\u{5185}\u{5BB9}
4890
+ - \u{5206}\u{6790}\u{6587}\u{4EF6}\u{53D8}\u{66F4}\u{5217}\u{8868}
4891
+ - \u{63D0}\u{53D6}\u{4EE3}\u{7801}\u{5DEE}\u{5F02}
4892
+
4893
+ 2. **\u{9879}\u{76EE}\u{7ED3}\u{6784}\u{5206}\u{6790}**
4894
+ - listDirectory() \u{67E5}\u{770B}\u{9879}\u{76EE}\u{7ED3}\u{6784}
4895
+ - readFile() \u{8BFB}\u{53D6}\u{5173}\u{952E}\u{914D}\u{7F6E}\u{6587}\u{4EF6}
4896
+ - \u{4E86}\u{89E3}\u{9879}\u{76EE}\u{67B6}\u{6784}\u{548C}\u{6280}\u{672F}\u{6808}
4897
+
4898
+ ### 2. \u{573A}\u{666F}\u{8BC6}\u{522B}
4899
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
4900
+ - \u{57FA}\u{4E8E}\u{9700}\u{6C42}\u{5206}\u{6790}\u{7684}\u{5185}\u{5BB9}\u{FF0C}\u{627E}\u{51FA}\u{4E3B}\u{8981}\u{77DB}\u{76FE}\u{70B9}\u{FF0C}\u{5B9A}\u{4F4D}\u{6838}\u{5FC3}\u{95EE}\u{9898}\u{8282}\u{70B9}
4901
+ - \u{4ECE}\u{7CFB}\u{7EDF}\u{5C42}\u{9762}\u{62C6}\u{89E3}\u{4E3A}\u{53EF}\u{6267}\u{884C}\u{5B50}\u{4EFB}\u{52A1}\u{FF0C}\u{786E}\u{4FDD}\u{903B}\u{8F91}\u{94FE}\u{6761}\u{6E05}\u{6670}\u{FF0C}\u{4E0A}\u{4E0B}\u{6587}\u{4FE1}\u{606F}\u{5145}\u{8DB3}
4902
+
4903
+ **\u{5206}\u{6790}\u{7EF4}\u{5EA6}\u{FF1A}**
4904
+ 1. **\u{53D8}\u{66F4}\u{573A}\u{666F}\u{8BC6}\u{522B}**
4905
+ - \u{65B0}\u{589E}\u{529F}\u{80FD}\u{573A}\u{666F}
4906
+ - \u{4FEE}\u{6539}\u{529F}\u{80FD}\u{573A}\u{666F}
4907
+ - \u{5220}\u{9664}\u{529F}\u{80FD}\u{573A}\u{666F}
4908
+ - \u{91CD}\u{6784}\u{573A}\u{666F}
4909
+
4910
+ 2. **\u{5F71}\u{54CD}\u{8303}\u{56F4}\u{5206}\u{6790}**
4911
+ - \u{76F4}\u{63A5}\u{5F71}\u{54CD}\u{7684}\u{6A21}\u{5757}
4912
+ - \u{95F4}\u{63A5}\u{5F71}\u{54CD}\u{7684}\u{6A21}\u{5757}
4913
+ - \u{4F9D}\u{8D56}\u{5173}\u{7CFB}\u{53D8}\u{5316}
4914
+ - \u{63A5}\u{53E3}\u{517C}\u{5BB9}\u{6027}
4915
+
4916
+ 3. **\u{98CE}\u{9669}\u{8BC4}\u{4F30}**
4917
+ - \u{7834}\u{574F}\u{6027}\u{53D8}\u{66F4}
4918
+ - \u{6027}\u{80FD}\u{5F71}\u{54CD}
4919
+ - \u{5B89}\u{5168}\u{98CE}\u{9669}
4920
+ - \u{517C}\u{5BB9}\u{6027}\u{95EE}\u{9898}
4921
+
4922
+ ### 3. \u{65B9}\u{6848}\u{8BBE}\u{8BA1}
4923
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
4924
+ - \u{65B9}\u{6848}\u{8BBE}\u{8BA1}\u{4F18}\u{5148}\u{590D}\u{7528}\u{73B0}\u{6709}\u{65B9}\u{6848}\u{FF0C}\u{7EC4}\u{4EF6}\u{FF0C}\u{5DE5}\u{5177}\u{65B9}\u{6CD5}\u{7B49}\u{FF0C}\u{80FD}\u{590D}\u{7528}\u{7684}\u{5C3D}\u{53EF}\u{80FD}\u{590D}\u{7528}
4925
+ - \u{626B}\u{63CF}\u{9879}\u{76EE}\u{4E2D}\u{4F7F}\u{7528}\u{7684}\u{6D4B}\u{8BD5}\u{6846}\u{67B6}\u{548C}\u{811A}\u{672C}\u{FF0C}\u{751F}\u{6210}\u{672C}\u{6B21}\u{9700}\u{6C42}\u{7684}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{FF0C}\u{5982}\u{679C}\u{4E0D}\u{5B58}\u{5728}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{FF0C}\u{5219}\u{7F16}\u{5199}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{5230}.aico/tests\u{4E0B}\u{9762}
4926
+
4927
+ **\u{8BBE}\u{8BA1}\u{5185}\u{5BB9}\u{FF1A}**
4928
+ 1. **\u{5206}\u{6790}\u{65B9}\u{6848}\u{8BBE}\u{8BA1}**
4929
+ - \u{4EE3}\u{7801}\u{5BA1}\u{67E5}\u{7B56}\u{7565}
4930
+ - \u{8D28}\u{91CF}\u{8BC4}\u{4F30}\u{6807}\u{51C6}
4931
+ - \u{6D4B}\u{8BD5}\u{9A8C}\u{8BC1}\u{65B9}\u{6848}
4932
+
4933
+ 2. **\u{62A5}\u{544A}\u{65B9}\u{6848}\u{8BBE}\u{8BA1}**
4934
+ - \u{62A5}\u{544A}\u{7ED3}\u{6784}\u{89C4}\u{5212}
4935
+ - \u{5173}\u{952E}\u{6307}\u{6807}\u{5B9A}\u{4E49}
4936
+ - \u{8F93}\u{51FA}\u{683C}\u{5F0F}\u{89C4}\u{8303}
4937
+
4938
+ 3. **\u{6D4B}\u{8BD5}\u{65B9}\u{6848}\u{8BBE}\u{8BA1}**
4939
+ - \u{56DE}\u{5F52}\u{6D4B}\u{8BD5}\u{8BA1}\u{5212}
4940
+ - \u{65B0}\u{529F}\u{80FD}\u{6D4B}\u{8BD5}
4941
+ - \u{6027}\u{80FD}\u{6D4B}\u{8BD5}\u{65B9}\u{6848}
4942
+
4943
+ ### 4. \u{6267}\u{884C}\u{9A8C}\u{8BC1}
4944
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
4945
+ - \u{6309}\u{65B9}\u{6848}\u{8BBE}\u{8BA1}\u{7684}\u{7ED3}\u{679C}\u{8F93}\u{51FA}\u{4EE3}\u{7801}
4946
+ - \u{5982}\u{679C}\u{6709}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{FF0C}\u{8FD0}\u{884C}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{5E76}\u{4FEE}\u{6B63}\u{76F4}\u{5230}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{5168}\u{90E8}\u{901A}\u{8FC7}
4947
+
4948
+ **\u{9A8C}\u{8BC1}\u{5185}\u{5BB9}\u{FF1A}**
4949
+ 1. **\u{4EE3}\u{7801}\u{8D28}\u{91CF}\u{9A8C}\u{8BC1}**
4950
+ - \u{4EE3}\u{7801}\u{89C4}\u{8303}\u{68C0}\u{67E5}
4951
+ - \u{7C7B}\u{578B}\u{5B89}\u{5168}\u{9A8C}\u{8BC1}
4952
+ - \u{6027}\u{80FD}\u{5F71}\u{54CD}\u{8BC4}\u{4F30}
4953
+ - \u{5B89}\u{5168}\u{6027}\u{68C0}\u{67E5}
4954
+
4955
+ 2. **\u{529F}\u{80FD}\u{5B8C}\u{6574}\u{6027}\u{9A8C}\u{8BC1}**
4956
+ - \u{9700}\u{6C42}\u{8986}\u{76D6}\u{5EA6}\u{5206}\u{6790}
4957
+ - \u{529F}\u{80FD}\u{5B9E}\u{73B0}\u{5B8C}\u{6574}\u{6027}
4958
+ - \u{8FB9}\u{754C}\u{6761}\u{4EF6}\u{5904}\u{7406}
4959
+ - \u{9519}\u{8BEF}\u{5904}\u{7406}\u{673A}\u{5236}
4960
+
4961
+ 3. **\u{6D4B}\u{8BD5}\u{6267}\u{884C}**
4962
+ - \u{8FD0}\u{884C}\u{73B0}\u{6709}\u{6D4B}\u{8BD5}\u{5957}\u{4EF6}
4963
+ - \u{6267}\u{884C}\u{65B0}\u{589E}\u{6D4B}\u{8BD5}\u{7528}\u{4F8B}
4964
+ - \u{9A8C}\u{8BC1}\u{6D4B}\u{8BD5}\u{8986}\u{76D6}\u{7387}
4965
+ - \u{786E}\u{4FDD}\u{6240}\u{6709}\u{6D4B}\u{8BD5}\u{901A}\u{8FC7}
4966
+
4967
+ ### 5. \u{603B}\u{7ED3}\u{53CD}\u{9988}
4968
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
4969
+ - \u{8F93}\u{51FA}\u{6700}\u{7EC8}\u{6267}\u{884C}\u{7684}\u{65B9}\u{6848}
4970
+ - \u{66F4}\u{65B0}TODO\u{6E05}\u{5355}
4971
+ - \u{6839}\u{636E}\u{60C5}\u{51B5}\u{63D0}\u{4F9B}\u{4E00}\u{4E9B}\u{524D}\u{77BB}\u{6027}\u{7684}\u{601D}\u{8003}\u{6216}\u{5EFA}\u{8BAE}
4972
+
4973
+ **\u{8F93}\u{51FA}\u{5185}\u{5BB9}\u{FF1A}**
4974
+ 1. **\u{53D8}\u{66F4}\u{5206}\u{6790}\u{62A5}\u{544A}**
4975
+ - \u{53D8}\u{66F4}\u{6982}\u{8FF0}
4976
+ - \u{5F71}\u{54CD}\u{8303}\u{56F4}\u{5206}\u{6790}
4977
+ - \u{8D28}\u{91CF}\u{8BC4}\u{4F30}\u{7ED3}\u{679C}
4978
+ - \u{98CE}\u{9669}\u{8BC4}\u{4F30}\u{62A5}\u{544A}
4979
+
4980
+ 2. **\u{5B9E}\u{65BD}\u{5EFA}\u{8BAE}**
4981
+ - \u{4EE3}\u{7801}\u{6539}\u{8FDB}\u{5EFA}\u{8BAE}
4982
+ - \u{6D4B}\u{8BD5}\u{5B8C}\u{5584}\u{5EFA}\u{8BAE}
4983
+ - \u{90E8}\u{7F72}\u{6CE8}\u{610F}\u{4E8B}\u{9879}
4984
+ - \u{540E}\u{7EED}\u{7EF4}\u{62A4}\u{5EFA}\u{8BAE}
4985
+
4986
+ ## \u{5206}\u{6790}\u{6DF1}\u{5EA6}\u{63A7}\u{5236}
4987
+ **\u{57FA}\u{51C6}\u{5206}\u{652F}\u{FF1A}** ${args.baseBranch || 'main'}
4988
+ - \u{5BF9}\u{6BD4}\u{57FA}\u{51C6}\u{5206}\u{652F}\u{7684}\u{4EE3}\u{7801}\u{5DEE}\u{5F02}
4989
+ - \u{8BC6}\u{522B}\u{65B0}\u{589E}\u{3001}\u{4FEE}\u{6539}\u{3001}\u{5220}\u{9664}\u{7684}\u{6587}\u{4EF6}
4990
+ - \u{5206}\u{6790}\u{53D8}\u{66F4}\u{7684}\u{5F71}\u{54CD}\u{8303}\u{56F4}
4991
+
4992
+ **\u{8F93}\u{51FA}\u{683C}\u{5F0F}\u{FF1A}** ${args.outputFormat || 'markdown'}
4993
+ - **markdown**: \u{751F}\u{6210}\u{6613}\u{8BFB}\u{7684}Markdown\u{683C}\u{5F0F}\u{62A5}\u{544A}
4994
+ - **json**: \u{751F}\u{6210}\u{7ED3}\u{6784}\u{5316}\u{7684}JSON\u{683C}\u{5F0F}\u{6570}\u{636E}
4995
+
4996
+ ## \u{53D8}\u{66F4}\u{8303}\u{56F4}\u{63A7}\u{5236}
4997
+ **\u{5305}\u{542B}\u{672A}\u{63D0}\u{4EA4}\u{53D8}\u{66F4}\u{FF1A}** ${false !== args.includeUncommitted ? "\u662F" : "\u5426"}
4998
+ - \u{5305}\u{542B}\u{5DE5}\u{4F5C}\u{533A}\u{548C}\u{6682}\u{5B58}\u{533A}\u{7684}\u{53D8}\u{66F4}
4999
+ - \u{63D0}\u{4F9B}\u{66F4}\u{5168}\u{9762}\u{7684}\u{5206}\u{6790}\u{89C6}\u{89D2}
5000
+ - \u{8BC6}\u{522B}\u{6F5C}\u{5728}\u{7684}\u{672A}\u{5B8C}\u{6210}\u{529F}\u{80FD}
5001
+
5002
+ ---
5003
+
5004
+ **\u{6267}\u{884C}\u{539F}\u{5219}\u{FF1A}**
5005
+ - \u{521B}\u{5EFA}\u{5E76}\u{6301}\u{7EED}\u{66F4}\u{65B0}TODO\u{6E05}\u{5355}
5006
+ - \u{6301}\u{7EED}\u{5DE5}\u{4F5C}\u{81F3}\u{5B8C}\u{6210}
5007
+ - \u{786E}\u{4FDD}\u{5206}\u{6790}\u{7684}\u{5168}\u{9762}\u{6027}\u{548C}\u{51C6}\u{786E}\u{6027}
5008
+ - \u{91CD}\u{70B9}\u{5173}\u{6CE8}\u{4EE3}\u{7801}\u{8D28}\u{91CF}\u{548C}\u{529F}\u{80FD}\u{5B8C}\u{6574}\u{6027}
5009
+ - \u{63D0}\u{4F9B}\u{53EF}\u{64CD}\u{4F5C}\u{7684}\u{6539}\u{8FDB}\u{5EFA}\u{8BAE}
5010
+ `;
5011
+ return {
5012
+ content: [
5013
+ {
5014
+ type: "text",
5015
+ text: JSON.stringify({
5016
+ success: true,
5017
+ message: "\u7CFB\u7EDF\u5316\u4EE3\u7801\u53D8\u66F4\u5206\u6790\u667A\u80FD\u4F53\u6267\u884C\u6307\u5BFC\u5DF2\u751F\u6210",
5018
+ data: {
5019
+ baseBranch: args.baseBranch || 'main',
5020
+ outputFormat: args.outputFormat || 'markdown',
5021
+ includeUncommitted: false !== args.includeUncommitted,
5022
+ requirementFile: args.requirementFile || null,
5023
+ guidance: systemGuidance,
5024
+ execution_phases: [
5025
+ "\u9700\u6C42\u5206\u6790 - \u7406\u89E3\u53D8\u66F4\u80CC\u666F\u548C\u76EE\u6807",
5026
+ "\u573A\u666F\u8BC6\u522B - \u5206\u6790\u53D8\u66F4\u5F71\u54CD\u8303\u56F4",
5027
+ "\u65B9\u6848\u8BBE\u8BA1 - \u5236\u5B9A\u5206\u6790\u9A8C\u8BC1\u65B9\u6848",
5028
+ "\u6267\u884C\u9A8C\u8BC1 - \u6267\u884C\u4EE3\u7801\u8D28\u91CF\u68C0\u67E5",
5029
+ "\u603B\u7ED3\u53CD\u9988 - \u751F\u6210\u5206\u6790\u62A5\u544A\u548C\u5EFA\u8BAE"
5030
+ ],
5031
+ analysis_dimensions: [
5032
+ "\u4EE3\u7801\u53D8\u66F4\u5206\u6790",
5033
+ "\u529F\u80FD\u5B8C\u6574\u6027\u9A8C\u8BC1",
5034
+ "\u8D28\u91CF\u8BC4\u4F30",
5035
+ "\u98CE\u9669\u8BC4\u4F30",
5036
+ "\u6D4B\u8BD5\u8986\u76D6\u5EA6\u5206\u6790"
5037
+ ],
5038
+ next_steps: [
5039
+ "\u83B7\u53D6\u4EE3\u7801\u53D8\u66F4\u5185\u5BB9",
5040
+ "\u6267\u884C\u7CFB\u7EDF\u5316\u5206\u6790\u6D41\u7A0B",
5041
+ "\u751F\u6210\u53D8\u66F4\u5206\u6790\u62A5\u544A",
5042
+ "\u63D0\u4F9B\u6539\u8FDB\u5EFA\u8BAE"
5043
+ ]
5044
+ }
5045
+ })
5046
+ }
5047
+ ]
5048
+ };
5049
+ } catch (error) {
5050
+ logger_logger.error({
5051
+ module: 'change-summarizer',
5052
+ message: 'Code analysis failed',
5053
+ error: error instanceof Error ? error.message : String(error)
5054
+ });
5055
+ return {
5056
+ content: [
5057
+ {
5058
+ type: "text",
5059
+ text: JSON.stringify({
5060
+ success: false,
5061
+ message: `\u{4EE3}\u{7801}\u{53D8}\u{66F4}\u{5206}\u{6790}\u{667A}\u{80FD}\u{4F53}\u{6267}\u{884C}\u{5931}\u{8D25}: ${error instanceof Error ? error.message : String(error)}`,
5062
+ data: null
5063
+ })
5064
+ }
5065
+ ],
5066
+ isError: true
5067
+ };
5068
+ }
5069
+ }
5070
+ };
5071
+ changeSummarizer.handler = changeSummarizer.handler;
5072
+ function buildAnalysisPrompt(requirementContent) {
5073
+ const changesSection = `
5074
+ ## \u{4EE3}\u{7801}\u{4E0A}\u{4E0B}\u{6587}\u{5206}\u{6790}
5075
+
5076
+ \u{8BF7}\u{57FA}\u{4E8E}\u{4EE5}\u{4E0B}\u{5185}\u{5BB9}\u{8FDB}\u{884C}\u{5206}\u{6790}\u{FF1A}
5077
+ - \u{5F53}\u{524D}\u{4EE3}\u{7801}\u{5E93}\u{7684}\u{6574}\u{4F53}\u{7ED3}\u{6784}
5078
+ - \u{4E3B}\u{8981}\u{529F}\u{80FD}\u{6A21}\u{5757}\u{7684}\u{5B9E}\u{73B0}
5079
+ - \u{5173}\u{952E}\u{4E1A}\u{52A1}\u{903B}\u{8F91}
5080
+ - \u{63A5}\u{53E3}\u{5B9A}\u{4E49}\u{4E0E}\u{5B9E}\u{73B0}
5081
+ - \u{524D}\u{7AEF}\u{7EC4}\u{4EF6}\u{4E0E}\u{9875}\u{9762}
5082
+ `;
5083
+ const requirementSection = requirementContent ? `
5084
+ ## \u{9700}\u{6C42}\u{6587}\u{6863}\u{5185}\u{5BB9}
5085
+ ${requirementContent}
5086
+ ` : `
5087
+ ## \u{9700}\u{6C42}\u{6587}\u{6863}
5088
+ \u{672A}\u{63D0}\u{4F9B}\u{9700}\u{6C42}\u{6587}\u{6863}\u{FF0C}\u{8BF7}\u{57FA}\u{4E8E}\u{4EE3}\u{7801}\u{53D8}\u{66F4}\u{8FDB}\u{884C}\u{5206}\u{6790}\u{3002}
5089
+ `;
5090
+ return `
5091
+ ${changeAnalysisPrompt}
5092
+
5093
+ ${changesSection}
5094
+
5095
+ ${requirementSection}
5096
+
5097
+ \u{8BF7}\u{57FA}\u{4E8E}\u{4EE5}\u{4E0A}\u{4FE1}\u{606F}\u{8FDB}\u{884C}\u{8BE6}\u{7EC6}\u{5206}\u{6790}\u{3002}
5098
+ `;
5099
+ }
5100
+ async function saveAnalysisResult(prompt, format) {
5101
+ const storageDir = config_getStorageDir();
5102
+ if (!storageDir || 'string' != typeof storageDir) throw new Error("\u5B58\u50A8\u76EE\u5F55\u914D\u7F6E\u9519\u8BEF\uFF0C\u65E0\u6CD5\u4FDD\u5B58\u5206\u6790\u7ED3\u679C");
5103
+ const outputDir = external_path_default().join(storageDir, 'change-analysis');
5104
+ if (!external_fs_default().existsSync(outputDir)) external_fs_default().mkdirSync(outputDir, {
5105
+ recursive: true
5106
+ });
5107
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
5108
+ const filename = `change-analysis-${timestamp}.${'json' === format ? 'json' : 'md'}`;
5109
+ const outputPath = external_path_default().join(outputDir, filename);
5110
+ if ('json' === format) {
5111
+ const jsonData = {
5112
+ timestamp: new Date().toISOString(),
5113
+ prompt,
5114
+ type: 'change-analysis'
5115
+ };
5116
+ external_fs_default().writeFileSync(outputPath, JSON.stringify(jsonData, null, 2), 'utf-8');
5117
+ } else external_fs_default().writeFileSync(outputPath, prompt, 'utf-8');
5118
+ return outputPath;
5119
+ }
5120
+ const external_sharp_namespaceObject = require("sharp");
5121
+ var external_sharp_default = /*#__PURE__*/ __webpack_require__.n(external_sharp_namespaceObject);
4687
5122
  async function invokeFlow(params, streamCb) {
4688
5123
  const { appid = 'app-ESTcrkOPOmkxdrO0120mE4s1', data, timeout = 1800000 } = params;
4689
5124
  const controller = new AbortController();
@@ -4880,24 +5315,6 @@ ${requirementSection}
4880
5315
  throw new Error("\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25: \u672A\u77E5\u9519\u8BEF");
4881
5316
  }
4882
5317
  }
4883
- var types_AnalysisType = /*#__PURE__*/ function(AnalysisType) {
4884
- AnalysisType["GENERAL"] = "general";
4885
- AnalysisType["OBJECTS"] = "objects";
4886
- AnalysisType["TEXT"] = "text";
4887
- AnalysisType["SCENE"] = "scene";
4888
- AnalysisType["PEOPLE"] = "people";
4889
- AnalysisType["TECHNICAL"] = "technical";
4890
- AnalysisType["UI_DESIGN"] = "ui_design";
4891
- AnalysisType["REQUIREMENT"] = "requirement";
4892
- AnalysisType["CUSTOM"] = "custom";
4893
- return AnalysisType;
4894
- }({});
4895
- var types_DetailLevel = /*#__PURE__*/ function(DetailLevel) {
4896
- DetailLevel["BRIEF"] = "brief";
4897
- DetailLevel["DETAILED"] = "detailed";
4898
- DetailLevel["COMPREHENSIVE"] = "comprehensive";
4899
- return DetailLevel;
4900
- }({});
4901
5318
  class ImageAnalysisError extends Error {
4902
5319
  code;
4903
5320
  context;
@@ -4913,7 +5330,6 @@ ${requirementSection}
4913
5330
  AnalysisErrorCodes["IMAGE_CORRUPTED"] = "IMAGE_CORRUPTED";
4914
5331
  AnalysisErrorCodes["ANALYSIS_FAILED"] = "ANALYSIS_FAILED";
4915
5332
  AnalysisErrorCodes["AI_SERVICE_ERROR"] = "AI_SERVICE_ERROR";
4916
- AnalysisErrorCodes["INVALID_ANALYSIS_TYPE"] = "INVALID_ANALYSIS_TYPE";
4917
5333
  return AnalysisErrorCodes;
4918
5334
  }({});
4919
5335
  const SUPPORTED_IMAGE_FORMATS = [
@@ -4930,7 +5346,7 @@ ${requirementSection}
4930
5346
  async analyzeImage(imagePath, context) {
4931
5347
  const startTime = Date.now();
4932
5348
  try {
4933
- logger.info("\u5F00\u59CB\u56FE\u7247\u5185\u5BB9\u5206\u6790", {
5349
+ logger_logger.info("\u5F00\u59CB\u56FE\u7247\u5185\u5BB9\u5206\u6790", {
4934
5350
  imagePath: imagePath
4935
5351
  });
4936
5352
  await this.validateParams(imagePath);
@@ -4944,20 +5360,16 @@ ${requirementSection}
4944
5360
  });
4945
5361
  const result = {
4946
5362
  basic_info: basicInfo,
4947
- analysis_type: types_AnalysisType.GENERAL,
4948
- detail_level: types_DetailLevel.DETAILED,
4949
5363
  content: analysisContent,
4950
- processing_time_ms: processingTime,
4951
- confidence_score: this.calculateConfidenceScore(analysisContent)
5364
+ processing_time_ms: processingTime
4952
5365
  };
4953
- logger.info("\u56FE\u7247\u5185\u5BB9\u5206\u6790\u5B8C\u6210", {
5366
+ logger_logger.info("\u56FE\u7247\u5185\u5BB9\u5206\u6790\u5B8C\u6210", {
4954
5367
  imagePath: imagePath,
4955
- processingTimeMs: processingTime,
4956
- confidenceScore: result.confidence_score
5368
+ processingTimeMs: processingTime
4957
5369
  });
4958
5370
  return result;
4959
5371
  } catch (error) {
4960
- logger.error("\u56FE\u7247\u5185\u5BB9\u5206\u6790\u5931\u8D25", {
5372
+ logger_logger.error("\u56FE\u7247\u5185\u5BB9\u5206\u6790\u5931\u8D25", {
4961
5373
  error,
4962
5374
  params: {
4963
5375
  image_path: imagePath
@@ -4970,7 +5382,7 @@ ${requirementSection}
4970
5382
  try {
4971
5383
  const imageBase64 = await this.imageToBase64(imagePath);
4972
5384
  const prompt = this.buildAnalysisPrompt(imagePath, basicInfo, context);
4973
- const aiResponse = await openAIService.analyzeImage({
5385
+ const aiResponse = await openai_openAIService.analyzeImage({
4974
5386
  image_base64: imageBase64,
4975
5387
  prompt: prompt,
4976
5388
  system_prompt: "\u4F60\u662F\u4E00\u4E2A\u4E13\u4E1A\u7684\u56FE\u7247\u5206\u6790\u4E13\u5BB6\uFF0C\u8BF7\u4E25\u683C\u57FA\u4E8E\u4EFB\u52A1\u6307\u4EE4\u5206\u6790\u56FE\u7247\u5185\u5BB9\uFF0C\u4E0D\u504F\u79BB\u4EFB\u52A1\u8303\u56F4\uFF0C\u4E0D\u6DFB\u52A0\u65E0\u5173\u4FE1\u606F\u3002"
@@ -4978,13 +5390,26 @@ ${requirementSection}
4978
5390
  const analysisContent = this.parseAIResponse(aiResponse);
4979
5391
  return analysisContent;
4980
5392
  } catch (error) {
4981
- logger.warn("\u4E3BAI\u5206\u6790\u5931\u8D25\uFF0C\u5C1D\u8BD5Dify\u515C\u5E95\u5206\u6790", {
5393
+ logger_logger.warn("\u4E3BAI\u5206\u6790\u5931\u8D25\uFF0C\u5C1D\u8BD5Dify\u515C\u5E95\u5206\u6790", {
4982
5394
  error,
4983
5395
  params: {
4984
5396
  image_path: imagePath
4985
5397
  }
4986
5398
  });
4987
- return await this.fallbackToDifyAnalysis(imagePath, context);
5399
+ try {
5400
+ return await this.fallbackToDifyAnalysis(imagePath, context);
5401
+ } catch (fallbackError) {
5402
+ logger_logger.error("Dify\u515C\u5E95\u5206\u6790\u4E5F\u5931\u8D25", {
5403
+ error: fallbackError,
5404
+ params: {
5405
+ image_path: imagePath
5406
+ }
5407
+ });
5408
+ throw new ImageAnalysisError("\u8BC6\u522B\u56FE\u7247\u5931\u8D25", types_AnalysisErrorCodes.ANALYSIS_FAILED, {
5409
+ originalError: error,
5410
+ fallbackError
5411
+ });
5412
+ }
4988
5413
  }
4989
5414
  }
4990
5415
  buildAnalysisPrompt(imagePath, basicInfo, context) {
@@ -4998,48 +5423,18 @@ ${requirementSection}
4998
5423
  const contextPrompt = context ? `
4999
5424
 
5000
5425
  ## \u{5206}\u{6790}\u{6307}\u{4EE4}
5001
- ${context}
5002
-
5003
- \u{8BF7}\u{4E25}\u{683C}\u{6839}\u{636E}\u{4EE5}\u{4E0A}\u{6307}\u{4EE4}\u{8FDB}\u{884C}\u{56FE}\u{7247}\u{5206}\u{6790}\u{FF0C}\u{4E0D}\u{504F}\u{79BB}\u{4EFB}\u{52A1}\u{8303}\u{56F4}\u{FF0C}\u{4E0D}\u{6DFB}\u{52A0}\u{65E0}\u{5173}\u{4FE1}\u{606F}\u{3002}` : '';
5004
- const strictPrompt = `
5005
-
5006
- ## \u{5206}\u{6790}\u{8981}\u{6C42}
5007
- \u{4F60}\u{5FC5}\u{987B}\u{4E25}\u{683C}\u{6839}\u{636E}\u{4EFB}\u{52A1}\u{6307}\u{4EE4}\u{5206}\u{6790}\u{56FE}\u{7247}\u{5185}\u{5BB9}\u{FF0C}\u{4E0D}\u{504F}\u{79BB}\u{7528}\u{6237}\u{8981}\u{6C42}\u{7684}\u{8303}\u{56F4}\u{FF0C}\u{4E0D}\u{6DFB}\u{52A0}\u{65E0}\u{5173}\u{4FE1}\u{606F}\u{3002}\u{786E}\u{4FDD}\u{5206}\u{6790}\u{7ED3}\u{679C}\u{6E05}\u{6670}\u{51C6}\u{786E}\u{FF0C}\u{53EA}\u{5305}\u{542B}\u{4E0E}\u{4EFB}\u{52A1}\u{76F8}\u{5173}\u{7684}\u{4FE1}\u{606F}\u{3002}`;
5008
- return `${basePrompt}${contextPrompt}${strictPrompt}`.trim();
5426
+ ${context}` : '';
5427
+ return `${basePrompt}${contextPrompt}`.trim();
5009
5428
  }
5010
5429
  parseAIResponse(aiResponse) {
5011
5430
  if (!aiResponse || 'string' != typeof aiResponse) throw new ImageAnalysisError("AI\u670D\u52A1\u8FD4\u56DE\u65E0\u6548\u54CD\u5E94", types_AnalysisErrorCodes.AI_SERVICE_ERROR, {
5012
5431
  aiResponse
5013
5432
  });
5014
- logger.debug("AI\u54CD\u5E94\u5185\u5BB9", {
5015
- responseLength: aiResponse.length,
5016
- responsePreview: aiResponse.substring(0, 200) + (aiResponse.length > 200 ? '...' : '')
5017
- });
5018
- const cleanedResponse = this.cleanAIResponse(aiResponse);
5019
- const content = {
5020
- summary: cleanedResponse,
5021
- details: {
5022
- raw_response: aiResponse
5023
- },
5433
+ return {
5434
+ summary: aiResponse.trim(),
5435
+ details: {},
5024
5436
  tags: []
5025
5437
  };
5026
- logger.debug("\u5185\u5BB9\u89E3\u6790\u7ED3\u679C", {
5027
- summaryLength: content.summary.length
5028
- });
5029
- return content;
5030
- }
5031
- cleanAIResponse(response) {
5032
- let cleaned = response.trim();
5033
- const patternsToRemove = [
5034
- /^(?:好的|明白了|根据您的要求|根据分析|根据图片内容)[,,::]\s*/i,
5035
- /(?:以下是|下面是对|分析结果如下|内容如下)[::]\s*/i,
5036
- /\n(?:总结|结论|综上所述)[::]\s*/i
5037
- ];
5038
- patternsToRemove.forEach((pattern)=>{
5039
- cleaned = cleaned.replace(pattern, '');
5040
- });
5041
- cleaned = cleaned.replace(/\n{3,}/g, '\n\n').trim();
5042
- return cleaned;
5043
5438
  }
5044
5439
  async getImageBasicInfo(imagePath) {
5045
5440
  try {
@@ -5052,9 +5447,7 @@ ${context}
5052
5447
  width: metadata.width || 0,
5053
5448
  height: metadata.height || 0
5054
5449
  },
5055
- file_size: stats.size,
5056
- color_space: metadata.space,
5057
- has_alpha: metadata.hasAlpha
5450
+ file_size: stats.size
5058
5451
  };
5059
5452
  } catch (error) {
5060
5453
  throw new ImageAnalysisError(`\u{65E0}\u{6CD5}\u{8BFB}\u{53D6}\u{56FE}\u{7247}\u{4FE1}\u{606F}: ${imagePath}`, types_AnalysisErrorCodes.IMAGE_CORRUPTED, {
@@ -5108,135 +5501,6 @@ ${context}
5108
5501
  supportedFormats: SUPPORTED_IMAGE_FORMATS
5109
5502
  });
5110
5503
  }
5111
- calculateConfidenceScore(content) {
5112
- let score = 0.5;
5113
- if (content.summary.length > 100) score += 0.2;
5114
- if (content.tags && content.tags.length > 0) score += 0.1;
5115
- if (content.objects && content.objects.length > 0) score += 0.1;
5116
- if (content.text_content && content.text_content.length > 0) score += 0.1;
5117
- return Math.min(score, 1.0);
5118
- }
5119
- extractValue(text, pattern) {
5120
- const match = text.match(pattern);
5121
- return match ? match[1].trim() : null;
5122
- }
5123
- extractBoolean(text, pattern) {
5124
- return pattern.test(text);
5125
- }
5126
- extractList(text, pattern) {
5127
- const match = text.match(pattern);
5128
- if (match) return match[1].split(/[,,、]/).map((item)=>item.trim()).filter(Boolean);
5129
- return [];
5130
- }
5131
- extractUIComponents(text) {
5132
- const components = [];
5133
- const componentPatterns = [
5134
- /按钮|button/gi,
5135
- /输入框|input|文本框/gi,
5136
- /导航|navigation|nav/gi,
5137
- /卡片|card/gi,
5138
- /列表|list/gi,
5139
- /表格|table/gi
5140
- ];
5141
- componentPatterns.forEach((pattern, index)=>{
5142
- const matches = text.match(pattern);
5143
- if (matches) components.push({
5144
- type: [
5145
- 'button',
5146
- 'input',
5147
- 'navigation',
5148
- 'card',
5149
- 'list',
5150
- 'table'
5151
- ][index],
5152
- name: matches[0],
5153
- position: {
5154
- x: 0,
5155
- y: 0,
5156
- width: 0,
5157
- height: 0
5158
- },
5159
- properties: {}
5160
- });
5161
- });
5162
- return components;
5163
- }
5164
- extractColorScheme(text) {
5165
- return {
5166
- primary_colors: this.extractList(text, /主色调[::]\s*([^\n]+)/i),
5167
- secondary_colors: this.extractList(text, /辅助色[::]\s*([^\n]+)/i),
5168
- background_colors: this.extractList(text, /背景色[::]\s*([^\n]+)/i)
5169
- };
5170
- }
5171
- extractTypography(text) {
5172
- return {
5173
- fonts: this.extractList(text, /字体[::]\s*([^\n]+)/i),
5174
- text_hierarchy: this.extractList(text, /文字层次[::]\s*([^\n]+)/i)
5175
- };
5176
- }
5177
- extractNavigation(text) {
5178
- return {
5179
- type: this.extractValue(text, /导航类型[::]\s*([^\n]+)/i) || "\u672A\u8BC6\u522B",
5180
- elements: this.extractList(text, /导航元素[::]\s*([^\n]+)/i)
5181
- };
5182
- }
5183
- extractFunctionalRequirements(text) {
5184
- const requirements = [];
5185
- const funcReqPattern = /功能需求[::][\s\S]*?(?=非功能需求|用户故事|$)/i;
5186
- const match = text.match(funcReqPattern);
5187
- if (match) {
5188
- const reqText = match[0];
5189
- const reqItems = reqText.split(/\d+\./).filter((item)=>item.trim());
5190
- reqItems.forEach((item, index)=>{
5191
- if (item.trim()) requirements.push({
5192
- id: `FR-${index + 1}`,
5193
- title: item.split('\n')[0].trim(),
5194
- description: item.trim(),
5195
- priority: 'medium',
5196
- category: "\u529F\u80FD\u9700\u6C42",
5197
- acceptance_criteria: []
5198
- });
5199
- });
5200
- }
5201
- return requirements;
5202
- }
5203
- extractNonFunctionalRequirements(text) {
5204
- const requirements = [];
5205
- const nfrTypes = [
5206
- "\u6027\u80FD",
5207
- "\u5B89\u5168",
5208
- "\u53EF\u7528\u6027",
5209
- "\u53EF\u7EF4\u62A4\u6027",
5210
- "\u53EF\u6269\u5C55\u6027"
5211
- ];
5212
- nfrTypes.forEach((type)=>{
5213
- const pattern = new RegExp(`${type}[\u{FF1A}:]\\s*([^\\n]+)`, 'i');
5214
- const match = text.match(pattern);
5215
- if (match) requirements.push({
5216
- type: type,
5217
- description: match[1].trim(),
5218
- metric: '',
5219
- target_value: ''
5220
- });
5221
- });
5222
- return requirements;
5223
- }
5224
- extractUserStories(text) {
5225
- const stories = [];
5226
- const storyPattern = /作为.*?我希望.*?以便.*?/g;
5227
- const matches = text.match(storyPattern);
5228
- if (matches) matches.forEach((story, index)=>{
5229
- const parts = story.split(/我希望|以便/);
5230
- if (parts.length >= 3) stories.push({
5231
- as_a: parts[0].replace("\u4F5C\u4E3A", '').trim(),
5232
- i_want: parts[1].trim(),
5233
- so_that: parts[2].trim(),
5234
- acceptance_criteria: [],
5235
- priority: 'medium'
5236
- });
5237
- });
5238
- return stories;
5239
- }
5240
5504
  formatFileSize(bytes) {
5241
5505
  if (0 === bytes) return '0 B';
5242
5506
  const k = 1024;
@@ -5250,7 +5514,7 @@ ${context}
5250
5514
  return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;
5251
5515
  }
5252
5516
  async fallbackToDifyAnalysis(imagePath, context) {
5253
- logger.info("\u5F00\u59CBDify\u515C\u5E95\u56FE\u7247\u5206\u6790", {
5517
+ logger_logger.info("\u5F00\u59CBDify\u515C\u5E95\u56FE\u7247\u5206\u6790", {
5254
5518
  imagePath: imagePath,
5255
5519
  context: context
5256
5520
  });
@@ -5260,7 +5524,7 @@ ${context}
5260
5524
  filePath: imagePath,
5261
5525
  user: 'aico-mcp'
5262
5526
  });
5263
- logger.info("\u6587\u4EF6\u4E0A\u4F20\u6210\u529F\uFF0C\u6587\u4EF6ID:", uploadResult.id);
5527
+ logger_logger.info("\u6587\u4EF6\u4E0A\u4F20\u6210\u529F\uFF0C\u6587\u4EF6ID:", uploadResult.id);
5264
5528
  const workflowData = {
5265
5529
  imagePath: {
5266
5530
  type: 'image',
@@ -5273,16 +5537,15 @@ ${context}
5273
5537
  appid: 'app-AvlLh0nfN4l9oz1MSW4sEAQ6',
5274
5538
  data: workflowData
5275
5539
  });
5276
- logger.info("Dify\u5DE5\u4F5C\u6D41\u8C03\u7528\u6210\u529F", {
5540
+ logger_logger.info("Dify\u5DE5\u4F5C\u6D41\u8C03\u7528\u6210\u529F", {
5277
5541
  response: workflowResponse
5278
5542
  });
5279
- if (workflowResponse?.status === 'failed') throw new Error(`Dify\u{5DE5}\u{4F5C}\u{6D41}\u{6267}\u{884C}\u{5931}\u{8D25}: ${workflowResponse.error || "\u672A\u77E5\u9519\u8BEF"}`);
5280
- if (workflowResponse?.status !== 'succeeded') throw new Error(`Dify\u{5DE5}\u{4F5C}\u{6D41}\u{72B6}\u{6001}\u{5F02}\u{5E38}: ${workflowResponse?.status}`);
5281
5543
  let summary = "\u5206\u6790\u5B8C\u6210";
5282
5544
  if ('string' == typeof workflowResponse) summary = workflowResponse;
5283
5545
  else if (workflowResponse?.data?.text) summary = workflowResponse.data.text;
5284
5546
  else if (workflowResponse?.answer) summary = workflowResponse.answer;
5285
5547
  else if (workflowResponse?.outputs?.text) summary = workflowResponse.outputs.text;
5548
+ else if (workflowResponse?.status === 'failed') throw new Error(`Dify\u{5DE5}\u{4F5C}\u{6D41}\u{6267}\u{884C}\u{5931}\u{8D25}: ${workflowResponse.error || "\u672A\u77E5\u9519\u8BEF"}`);
5286
5549
  return {
5287
5550
  summary: summary,
5288
5551
  details: {
@@ -5294,7 +5557,7 @@ ${context}
5294
5557
  ]
5295
5558
  };
5296
5559
  } catch (error) {
5297
- logger.error("Dify\u670D\u52A1\u8C03\u7528\u5931\u8D25", {
5560
+ logger_logger.error("Dify\u670D\u52A1\u8C03\u7528\u5931\u8D25", {
5298
5561
  error: error instanceof Error ? error.message : String(error),
5299
5562
  imagePath: imagePath,
5300
5563
  context: context
@@ -5317,11 +5580,166 @@ ${context}
5317
5580
  handler: async (args)=>{
5318
5581
  const analyzer = new ImageAnalyzer();
5319
5582
  try {
5320
- logger.info("\u56FE\u7247\u5185\u5BB9\u7406\u89E3\u667A\u80FD\u4F53\u5F00\u59CB\u6267\u884C", {
5583
+ logger_logger.info("\u56FE\u7247\u5185\u5BB9\u7406\u89E3\u667A\u80FD\u4F53\u5F00\u59CB\u6267\u884C", {
5321
5584
  imagePath: args.image_path
5322
5585
  });
5323
5586
  const validatedArgs = ImageAnalysisParamsSchema.parse(args);
5324
5587
  const result = await analyzer.analyzeImage(validatedArgs.image_path, validatedArgs.context);
5588
+ const systemGuidance = `
5589
+ # \u{7CFB}\u{7EDF}\u{5316}\u{56FE}\u{7247}\u{5185}\u{5BB9}\u{5206}\u{6790}\u{667A}\u{80FD}\u{4F53}\u{6267}\u{884C}\u{6D41}\u{7A0B}
5590
+
5591
+ ## \u{5206}\u{6790}\u{53C2}\u{6570}
5592
+ - \u{56FE}\u{7247}\u{8DEF}\u{5F84}: ${validatedArgs.image_path}
5593
+ - \u{4E0A}\u{4E0B}\u{6587}\u{6307}\u{5BFC}: ${validatedArgs.context || "\u65E0"}
5594
+ - \u{56FE}\u{7247}\u{6587}\u{4EF6}: ${external_path_namespaceObject.basename(validatedArgs.image_path)}
5595
+ - \u{56FE}\u{7247}\u{5C3A}\u{5BF8}: ${result.basic_info.dimensions.width} \xd7 ${result.basic_info.dimensions.height} \u{50CF}\u{7D20}
5596
+ - \u{6587}\u{4EF6}\u{5927}\u{5C0F}: ${formatFileSize(result.basic_info.file_size)}
5597
+ - \u{5904}\u{7406}\u{65F6}\u{95F4}: ${result.processing_time_ms}ms
5598
+
5599
+ ## TODO\u{6E05}\u{5355}\u{6807}\u{51C6}\u{6D41}\u{7A0B}
5600
+
5601
+ ### 1. \u{9700}\u{6C42}\u{5206}\u{6790}
5602
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
5603
+ - \u{5145}\u{5206}\u{641C}\u{7D22}\u{4E0E}\u{7528}\u{6237}\u{8F93}\u{5165}\u{5185}\u{5BB9}\u{76F8}\u{5173}\u{7684}\u{8D44}\u{6E90}
5604
+ - \u{660E}\u{786E}\u{7528}\u{6237}\u{7684}\u{6838}\u{5FC3}\u{95EE}\u{9898}\u{3001}\u{9690}\u{542B}\u{9700}\u{6C42}\u{548C}\u{6700}\u{7EC8}\u{76EE}\u{6807}
5605
+ - \u{56F4}\u{7ED5}\u{95EE}\u{9898}\u{FF0C}\u{5FEB}\u{901F}\u{6784}\u{5EFA}\u{4E00}\u{4E2A}\u{77E5}\u{8BC6}\u{6846}\u{67B6}\u{3002}\u{786E}\u{5B9A}\u{56DE}\u{7B54}\u{5E94}\u{5305}\u{542B}\u{7684}\u{5173}\u{952E}\u{6982}\u{5FF5}\u{3001}\u{4E0A}\u{4E0B}\u{6587}\u{3001}\u{6B63}\u{53CD}\u{8BBA}\u{70B9}\u{548C}\u{6F5C}\u{5728}\u{7684}\u{5EF6}\u{4F38}\u{9886}\u{57DF}
5606
+ - \u{6839}\u{636E}\u{5145}\u{5206}\u{4E86}\u{89E3}\u{5230}\u{7684}\u{4FE1}\u{606F}\u{FF0C}\u{6E05}\u{6670}\u{5B8C}\u{6574}\u{7684}\u{590D}\u{8FF0}\u{7528}\u{6237}\u{9700}\u{6C42}\u{FF0C}\u{5E76}\u{7ED9}\u{51FA}\u{4E00}\u{4E2A}\u{9AD8}\u{5EA6}\u{6D53}\u{7F29}\u{7684}\u{3001}\u{7ED3}\u{8BBA}\u{6027}\u{7684}\u{6838}\u{5FC3}\u{89C2}\u{70B9}
5607
+
5608
+ **\u{4E0A}\u{4E0B}\u{6587}\u{5206}\u{6790}\u{FF1A}**
5609
+ ${validatedArgs.context ? `
5610
+ **\u{7528}\u{6237}\u{63D0}\u{4F9B}\u{7684}\u{4E0A}\u{4E0B}\u{6587}\u{FF1A}**
5611
+ \`\`\`
5612
+ ${validatedArgs.context}
5613
+ \`\`\`
5614
+
5615
+ **\u{5206}\u{6790}\u{91CD}\u{70B9}\u{FF1A}**
5616
+ - \u{6839}\u{636E}\u{4E0A}\u{4E0B}\u{6587}\u{786E}\u{5B9A}\u{5206}\u{6790}\u{65B9}\u{5411}
5617
+ - \u{91CD}\u{70B9}\u{5173}\u{6CE8}\u{4E0A}\u{4E0B}\u{6587}\u{4E2D}\u{63D0}\u{5230}\u{7684}\u{5173}\u{952E}\u{8981}\u{7D20}
5618
+ - \u{786E}\u{4FDD}\u{5206}\u{6790}\u{7ED3}\u{679C}\u{7B26}\u{5408}\u{7528}\u{6237}\u{9884}\u{671F}
5619
+ ` : `
5620
+ **\u{65E0}\u{7279}\u{5B9A}\u{4E0A}\u{4E0B}\u{6587}\u{6307}\u{5BFC}**
5621
+ - \u{8FDB}\u{884C}\u{901A}\u{7528}\u{56FE}\u{7247}\u{5185}\u{5BB9}\u{5206}\u{6790}
5622
+ - \u{8BC6}\u{522B}\u{56FE}\u{7247}\u{4E2D}\u{7684}\u{4E3B}\u{8981}\u{5143}\u{7D20}\u{548C}\u{7279}\u{5F81}
5623
+ - \u{63D0}\u{4F9B}\u{5168}\u{9762}\u{7684}\u{56FE}\u{7247}\u{63CF}\u{8FF0}
5624
+ `}
5625
+
5626
+ **\u{56FE}\u{7247}\u{57FA}\u{672C}\u{4FE1}\u{606F}\u{FF1A}**
5627
+ - \u{6587}\u{4EF6}\u{8DEF}\u{5F84}: ${validatedArgs.image_path}
5628
+ - \u{56FE}\u{7247}\u{683C}\u{5F0F}: ${external_path_namespaceObject.extname(validatedArgs.image_path)}
5629
+ - \u{5206}\u{8FA8}\u{7387}: ${result.basic_info.dimensions.width} \xd7 ${result.basic_info.dimensions.height}
5630
+ - \u{6587}\u{4EF6}\u{5927}\u{5C0F}: ${formatFileSize(result.basic_info.file_size)}
5631
+
5632
+ ### 2. \u{573A}\u{666F}\u{8BC6}\u{522B}
5633
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
5634
+ - \u{57FA}\u{4E8E}\u{9700}\u{6C42}\u{5206}\u{6790}\u{7684}\u{5185}\u{5BB9}\u{FF0C}\u{627E}\u{51FA}\u{4E3B}\u{8981}\u{77DB}\u{76FE}\u{70B9}\u{FF0C}\u{5B9A}\u{4F4D}\u{6838}\u{5FC3}\u{95EE}\u{9898}\u{8282}\u{70B9}
5635
+ - \u{4ECE}\u{7CFB}\u{7EDF}\u{5C42}\u{9762}\u{62C6}\u{89E3}\u{4E3A}\u{53EF}\u{6267}\u{884C}\u{5B50}\u{4EFB}\u{52A1}\u{FF0C}\u{786E}\u{4FDD}\u{903B}\u{8F91}\u{94FE}\u{6761}\u{6E05}\u{6670}\u{FF0C}\u{4E0A}\u{4E0B}\u{6587}\u{4FE1}\u{606F}\u{5145}\u{8DB3}
5636
+
5637
+ **\u{5206}\u{6790}\u{7EF4}\u{5EA6}\u{FF1A}**
5638
+ 1. **\u{5185}\u{5BB9}\u{573A}\u{666F}\u{8BC6}\u{522B}**
5639
+ - \u{56FE}\u{7247}\u{7C7B}\u{578B}\u{8BC6}\u{522B}\u{FF08}\u{81EA}\u{7136}\u{666F}\u{89C2}\u{3001}\u{4EBA}\u{7269}\u{3001}\u{6587}\u{6863}\u{3001}\u{56FE}\u{8868}\u{7B49}\u{FF09}
5640
+ - \u{4E3B}\u{8981}\u{5BF9}\u{8C61}\u{8BC6}\u{522B}
5641
+ - \u{573A}\u{666F}\u{73AF}\u{5883}\u{5206}\u{6790}
5642
+ - \u{60C5}\u{611F}\u{8272}\u{5F69}\u{5224}\u{65AD}
5643
+
5644
+ 2. **\u{6280}\u{672F}\u{573A}\u{666F}\u{8BC6}\u{522B}**
5645
+ - \u{56FE}\u{7247}\u{8D28}\u{91CF}\u{8BC4}\u{4F30}
5646
+ - \u{5206}\u{8FA8}\u{7387}\u{9002}\u{7528}\u{6027}
5647
+ - \u{683C}\u{5F0F}\u{517C}\u{5BB9}\u{6027}
5648
+ - \u{538B}\u{7F29}\u{8D28}\u{91CF}\u{5206}\u{6790}
5649
+
5650
+ 3. **\u{5E94}\u{7528}\u{573A}\u{666F}\u{8BC6}\u{522B}**
5651
+ - \u{4F7F}\u{7528}\u{573A}\u{666F}\u{5206}\u{6790}
5652
+ - \u{76EE}\u{6807}\u{53D7}\u{4F17}\u{8BC6}\u{522B}
5653
+ - \u{5546}\u{4E1A}\u{4EF7}\u{503C}\u{8BC4}\u{4F30}
5654
+ - \u{7248}\u{6743}\u{98CE}\u{9669}\u{5206}\u{6790}
5655
+
5656
+ ### 3. \u{65B9}\u{6848}\u{8BBE}\u{8BA1}
5657
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
5658
+ - \u{65B9}\u{6848}\u{8BBE}\u{8BA1}\u{4F18}\u{5148}\u{590D}\u{7528}\u{73B0}\u{6709}\u{65B9}\u{6848}\u{FF0C}\u{7EC4}\u{4EF6}\u{FF0C}\u{5DE5}\u{5177}\u{65B9}\u{6CD5}\u{7B49}\u{FF0C}\u{80FD}\u{590D}\u{7528}\u{7684}\u{5C3D}\u{53EF}\u{80FD}\u{590D}\u{7528}
5659
+ - \u{626B}\u{63CF}\u{9879}\u{76EE}\u{4E2D}\u{4F7F}\u{7528}\u{7684}\u{6D4B}\u{8BD5}\u{6846}\u{67B6}\u{548C}\u{811A}\u{672C}\u{FF0C}\u{751F}\u{6210}\u{672C}\u{6B21}\u{9700}\u{6C42}\u{7684}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{FF0C}\u{5982}\u{679C}\u{4E0D}\u{5B58}\u{5728}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{FF0C}\u{5219}\u{7F16}\u{5199}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{5230}.aico/tests\u{4E0B}\u{9762}
5660
+
5661
+ **\u{8BBE}\u{8BA1}\u{5185}\u{5BB9}\u{FF1A}**
5662
+ 1. **\u{5206}\u{6790}\u{65B9}\u{6848}\u{8BBE}\u{8BA1}**
5663
+ - \u{56FE}\u{7247}\u{5185}\u{5BB9}\u{8BC6}\u{522B}\u{7B56}\u{7565}
5664
+ - \u{7279}\u{5F81}\u{63D0}\u{53D6}\u{65B9}\u{6CD5}
5665
+ - \u{5206}\u{7C7B}\u{6807}\u{6CE8}\u{65B9}\u{6848}
5666
+ - \u{8D28}\u{91CF}\u{8BC4}\u{4F30}\u{6807}\u{51C6}
5667
+
5668
+ 2. **\u{8F93}\u{51FA}\u{65B9}\u{6848}\u{8BBE}\u{8BA1}**
5669
+ - \u{5206}\u{6790}\u{62A5}\u{544A}\u{7ED3}\u{6784}
5670
+ - \u{5173}\u{952E}\u{4FE1}\u{606F}\u{63D0}\u{53D6}
5671
+ - \u{683C}\u{5F0F}\u{5316}\u{8F93}\u{51FA}\u{89C4}\u{8303}
5672
+ - \u{591A}\u{8BED}\u{8A00}\u{652F}\u{6301}\u{65B9}\u{6848}
5673
+
5674
+ 3. **\u{6D4B}\u{8BD5}\u{65B9}\u{6848}\u{8BBE}\u{8BA1}**
5675
+ - \u{56FE}\u{7247}\u{6837}\u{672C}\u{6D4B}\u{8BD5}
5676
+ - \u{51C6}\u{786E}\u{6027}\u{9A8C}\u{8BC1}
5677
+ - \u{8FB9}\u{754C}\u{6848}\u{4F8B}\u{6D4B}\u{8BD5}
5678
+ - \u{6027}\u{80FD}\u{57FA}\u{51C6}\u{6D4B}\u{8BD5}
5679
+
5680
+ ### 4. \u{6267}\u{884C}\u{9A8C}\u{8BC1}
5681
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
5682
+ - \u{6309}\u{65B9}\u{6848}\u{8BBE}\u{8BA1}\u{7684}\u{7ED3}\u{679C}\u{8F93}\u{51FA}\u{4EE3}\u{7801}
5683
+ - \u{5982}\u{679C}\u{6709}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{FF0C}\u{8FD0}\u{884C}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{5E76}\u{4FEE}\u{6B63}\u{76F4}\u{5230}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{5168}\u{90E8}\u{901A}\u{8FC7}
5684
+
5685
+ **\u{9A8C}\u{8BC1}\u{5185}\u{5BB9}\u{FF1A}**
5686
+ 1. **\u{56FE}\u{7247}\u{5185}\u{5BB9}\u{9A8C}\u{8BC1}**
5687
+ - \u{4E3B}\u{8981}\u{5BF9}\u{8C61}\u{8BC6}\u{522B}\u{51C6}\u{786E}\u{6027}
5688
+ - \u{573A}\u{666F}\u{63CF}\u{8FF0}\u{5B8C}\u{6574}\u{6027}
5689
+ - \u{7EC6}\u{8282}\u{7279}\u{5F81}\u{6355}\u{6349}
5690
+ - \u{4E0A}\u{4E0B}\u{6587}\u{76F8}\u{5173}\u{6027}
5691
+
5692
+ 2. **\u{5206}\u{6790}\u{8D28}\u{91CF}\u{9A8C}\u{8BC1}**
5693
+ - \u{63CF}\u{8FF0}\u{51C6}\u{786E}\u{6027}\u{68C0}\u{67E5}
5694
+ - \u{5173}\u{952E}\u{4FE1}\u{606F}\u{5B8C}\u{6574}\u{6027}
5695
+ - \u{903B}\u{8F91}\u{4E00}\u{81F4}\u{6027}\u{9A8C}\u{8BC1}
5696
+ - \u{8BED}\u{8A00}\u{8868}\u{8FBE}\u{6E05}\u{6670}\u{5EA6}
5697
+
5698
+ 3. **\u{6280}\u{672F}\u{6307}\u{6807}\u{9A8C}\u{8BC1}**
5699
+ - \u{5904}\u{7406}\u{65F6}\u{95F4}\u{6548}\u{7387}
5700
+ - \u{5185}\u{5B58}\u{4F7F}\u{7528}\u{4F18}\u{5316}
5701
+ - \u{9519}\u{8BEF}\u{5904}\u{7406}\u{673A}\u{5236}
5702
+ - \u{683C}\u{5F0F}\u{517C}\u{5BB9}\u{6027}
5703
+
5704
+ ### 5. \u{603B}\u{7ED3}\u{53CD}\u{9988}
5705
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
5706
+ - \u{8F93}\u{51FA}\u{6700}\u{7EC8}\u{6267}\u{884C}\u{7684}\u{65B9}\u{6848}
5707
+ - \u{66F4}\u{65B0}TODO\u{6E05}\u{5355}
5708
+ - \u{6839}\u{636E}\u{60C5}\u{51B5}\u{63D0}\u{4F9B}\u{4E00}\u{4E9B}\u{524D}\u{77BB}\u{6027}\u{7684}\u{601D}\u{8003}\u{6216}\u{5EFA}\u{8BAE}
5709
+
5710
+ **\u{8F93}\u{51FA}\u{5185}\u{5BB9}\u{FF1A}**
5711
+ 1. **\u{56FE}\u{7247}\u{5206}\u{6790}\u{62A5}\u{544A}**
5712
+ - \u{57FA}\u{672C}\u{4FE1}\u{606F}\u{6C47}\u{603B}
5713
+ - \u{5185}\u{5BB9}\u{8BE6}\u{7EC6}\u{63CF}\u{8FF0}
5714
+ - \u{7279}\u{5F81}\u{63D0}\u{53D6}\u{7ED3}\u{679C}
5715
+ - \u{8D28}\u{91CF}\u{8BC4}\u{4F30}\u{62A5}\u{544A}
5716
+
5717
+ 2. **\u{5E94}\u{7528}\u{5EFA}\u{8BAE}**
5718
+ - \u{4F7F}\u{7528}\u{573A}\u{666F}\u{5EFA}\u{8BAE}
5719
+ - \u{4F18}\u{5316}\u{6539}\u{8FDB}\u{5EFA}\u{8BAE}
5720
+ - \u{6280}\u{672F}\u{5904}\u{7406}\u{5EFA}\u{8BAE}
5721
+ - \u{5546}\u{4E1A}\u{5E94}\u{7528}\u{5EFA}\u{8BAE}
5722
+
5723
+ ## \u{5F53}\u{524D}\u{5206}\u{6790}\u{7ED3}\u{679C}
5724
+
5725
+ **\u{56FE}\u{7247}\u{63CF}\u{8FF0}\u{FF1A}**
5726
+ ${result.content.summary}
5727
+
5728
+ **\u{8BE6}\u{7EC6}\u{5206}\u{6790}\u{7ED3}\u{679C}\u{FF1A}**
5729
+ - \u{57FA}\u{672C}\u{4FE1}\u{606F}\u{5DF2}\u{83B7}\u{53D6}
5730
+ - \u{5185}\u{5BB9}\u{5206}\u{6790}\u{5DF2}\u{5B8C}\u{6210}
5731
+ - \u{5904}\u{7406}\u{65F6}\u{95F4}: ${result.processing_time_ms}ms
5732
+ - \u{5206}\u{6790}\u{72B6}\u{6001}: \u{6210}\u{529F}
5733
+
5734
+ ---
5735
+
5736
+ **\u{6267}\u{884C}\u{539F}\u{5219}\u{FF1A}**
5737
+ - \u{521B}\u{5EFA}\u{5E76}\u{6301}\u{7EED}\u{66F4}\u{65B0}TODO\u{6E05}\u{5355}
5738
+ - \u{6301}\u{7EED}\u{5DE5}\u{4F5C}\u{81F3}\u{5B8C}\u{6210}
5739
+ - \u{786E}\u{4FDD}\u{5206}\u{6790}\u{7684}\u{51C6}\u{786E}\u{6027}\u{548C}\u{5168}\u{9762}\u{6027}
5740
+ - \u{4E25}\u{683C}\u{57FA}\u{4E8E}\u{4EFB}\u{52A1}\u{6307}\u{4EE4}\u{8FDB}\u{884C}\u{5206}\u{6790}
5741
+ - \u{4E0D}\u{504F}\u{79BB}\u{4EFB}\u{52A1}\u{8303}\u{56F4}\u{FF0C}\u{8F93}\u{51FA}\u{6E05}\u{6670}\u{51C6}\u{786E}\u{7684}\u{7ED3}\u{679C}
5742
+ `;
5325
5743
  return {
5326
5744
  content: [
5327
5745
  {
@@ -5337,12 +5755,14 @@ ${context}
5337
5755
  \u{56FE}\u{7247}\u{63CF}\u{8FF0}\u{FF1A}
5338
5756
  ${result.content.summary}
5339
5757
 
5340
- ${result.content.tags && result.content.tags.length > 0 ? `\u{5173}\u{952E}\u{6807}\u{7B7E}\u{FF1A}${result.content.tags.map((tag)=>`\`${tag}\``).join(' ')}` : ''}`
5758
+ ---
5759
+
5760
+ ${systemGuidance}`
5341
5761
  }
5342
5762
  ]
5343
5763
  };
5344
5764
  } catch (error) {
5345
- logger.error("\u56FE\u7247\u5185\u5BB9\u7406\u89E3\u667A\u80FD\u4F53\u6267\u884C\u5931\u8D25", {
5765
+ logger_logger.error("\u56FE\u7247\u5185\u5BB9\u7406\u89E3\u667A\u80FD\u4F53\u6267\u884C\u5931\u8D25", {
5346
5766
  error,
5347
5767
  args
5348
5768
  });
@@ -5373,51 +5793,16 @@ ${result.content.tags && result.content.tags.length > 0 ? `\u{5173}\u{952E}\u{68
5373
5793
  [types_AnalysisErrorCodes.UNSUPPORTED_FORMAT]: "\u4E0D\u652F\u6301\u7684\u56FE\u7247\u683C\u5F0F",
5374
5794
  [types_AnalysisErrorCodes.FILE_NOT_FOUND]: "\u56FE\u7247\u6587\u4EF6\u672A\u627E\u5230",
5375
5795
  [types_AnalysisErrorCodes.IMAGE_CORRUPTED]: "\u56FE\u7247\u6587\u4EF6\u635F\u574F",
5376
- [types_AnalysisErrorCodes.ANALYSIS_FAILED]: "\u5206\u6790\u5931\u8D25",
5377
- [types_AnalysisErrorCodes.AI_SERVICE_ERROR]: "AI\u670D\u52A1\u9519\u8BEF",
5378
- [types_AnalysisErrorCodes.INVALID_ANALYSIS_TYPE]: "\u65E0\u6548\u7684\u5206\u6790\u7C7B\u578B"
5796
+ [types_AnalysisErrorCodes.ANALYSIS_FAILED]: "\u56FE\u7247\u8BC6\u522B\u5931\u8D25",
5797
+ [types_AnalysisErrorCodes.AI_SERVICE_ERROR]: "AI\u670D\u52A1\u9519\u8BEF"
5379
5798
  };
5380
5799
  const errorTitle = errorMessages[error.code] || "\u5206\u6790\u9519\u8BEF";
5381
- return `
5382
- # \u{274C} ${errorTitle}
5383
-
5384
- ## \u{9519}\u{8BEF}\u{4FE1}\u{606F}
5385
- ${error.message}
5386
-
5387
- ## \u{9519}\u{8BEF}\u{4EE3}\u{7801}
5388
- ${error.code}
5389
-
5390
- ## \u{89E3}\u{51B3}\u{5EFA}\u{8BAE}
5391
- ${getErrorSuggestion(error.code)}
5392
-
5393
- ## \u{652F}\u{6301}\u{7684}\u{529F}\u{80FD}
5394
- - **\u{56FE}\u{7247}\u{683C}\u{5F0F}**: ${SUPPORTED_IMAGE_FORMATS.join(", ")}
5395
- - **\u{5206}\u{6790}\u{7C7B}\u{578B}**: \u{901A}\u{7528}\u{3001}\u{7269}\u{4F53}\u{8BC6}\u{522B}\u{3001}\u{6587}\u{5B57}\u{8BC6}\u{522B}\u{3001}\u{573A}\u{666F}\u{5206}\u{6790}\u{3001}\u{4EBA}\u{7269}\u{5206}\u{6790}\u{3001}\u{6280}\u{672F}\u{5206}\u{6790}\u{3001}UI\u{8BBE}\u{8BA1}\u{7A3F}\u{3001}\u{9700}\u{6C42}\u{8BC6}\u{522B}\u{3001}\u{81EA}\u{5B9A}\u{4E49}
5396
- - **\u{8BE6}\u{7EC6}\u{7A0B}\u{5EA6}**: \u{7B80}\u{8981}\u{3001}\u{8BE6}\u{7EC6}\u{3001}\u{5168}\u{9762}
5397
-
5398
- ## \u{9519}\u{8BEF}\u{8BE6}\u{60C5}
5399
- - **\u{65F6}\u{95F4}**: ${new Date().toISOString()}
5400
- - **\u{4E0A}\u{4E0B}\u{6587}**: ${error.context ? JSON.stringify(error.context, null, 2) : "\u65E0"}
5401
-
5402
- \u{8BF7}\u{6839}\u{636E}\u{4E0A}\u{8FF0}\u{4FE1}\u{606F}\u{8C03}\u{6574}\u{53C2}\u{6570}\u{540E}\u{91CD}\u{8BD5}\u{3002}
5403
- `.trim();
5800
+ return `\u{274C} ${errorTitle}\n\n${error.message}`;
5404
5801
  }
5405
5802
  function formatUnknownErrorResponse(error) {
5406
- return `
5407
- # \u{274C} \u{7CFB}\u{7EDF}\u{9519}\u{8BEF}
5408
-
5409
- \u{56FE}\u{7247}\u{5185}\u{5BB9}\u{5206}\u{6790}\u{8FC7}\u{7A0B}\u{4E2D}\u{53D1}\u{751F}\u{672A}\u{77E5}\u{9519}\u{8BEF}\u{FF0C}\u{8BF7}\u{7A0D}\u{540E}\u{91CD}\u{8BD5}\u{6216}\u{8054}\u{7CFB}\u{6280}\u{672F}\u{652F}\u{6301}\u{3002}
5803
+ return `\u{274C} \u{7CFB}\u{7EDF}\u{9519}\u{8BEF}
5410
5804
 
5411
- **\u{9519}\u{8BEF}\u{4FE1}\u{606F}**: ${error?.message || "\u672A\u77E5\u9519\u8BEF"}
5412
- **\u{65F6}\u{95F4}**: ${new Date().toISOString()}
5413
-
5414
- ## \u{5EFA}\u{8BAE}
5415
- 1. \u{68C0}\u{67E5}\u{56FE}\u{7247}\u{6587}\u{4EF6}\u{662F}\u{5426}\u{5B58}\u{5728}\u{4E14}\u{53EF}\u{8BFB}
5416
- 2. \u{786E}\u{8BA4}\u{56FE}\u{7247}\u{683C}\u{5F0F}\u{662F}\u{5426}\u{652F}\u{6301}
5417
- 3. \u{9A8C}\u{8BC1}\u{56FE}\u{7247}\u{6587}\u{4EF6}\u{662F}\u{5426}\u{635F}\u{574F}
5418
- 4. \u{68C0}\u{67E5}\u{7F51}\u{7EDC}\u{8FDE}\u{63A5}\u{662F}\u{5426}\u{6B63}\u{5E38}
5419
- 5. \u{5982}\u{95EE}\u{9898}\u{6301}\u{7EED}\u{FF0C}\u{8BF7}\u{8054}\u{7CFB}\u{6280}\u{672F}\u{652F}\u{6301}
5420
- `.trim();
5805
+ ${error?.message || "\u672A\u77E5\u9519\u8BEF"}`;
5421
5806
  }
5422
5807
  function formatFileSize(bytes) {
5423
5808
  if (0 === bytes) return "0 B";
@@ -5431,18 +5816,6 @@ ${getErrorSuggestion(error.code)}
5431
5816
  const i = Math.floor(Math.log(bytes) / Math.log(k));
5432
5817
  return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;
5433
5818
  }
5434
- function getErrorSuggestion(errorCode) {
5435
- const suggestions = {
5436
- [types_AnalysisErrorCodes.INVALID_IMAGE_PATH]: "\u8BF7\u68C0\u67E5\u56FE\u7247\u8DEF\u5F84\u662F\u5426\u6B63\u786E",
5437
- [types_AnalysisErrorCodes.UNSUPPORTED_FORMAT]: "\u8BF7\u4F7F\u7528\u652F\u6301\u7684\u56FE\u7247\u683C\u5F0F\uFF08jpg, png, gif\u7B49\uFF09",
5438
- [types_AnalysisErrorCodes.FILE_NOT_FOUND]: "\u8BF7\u786E\u8BA4\u56FE\u7247\u6587\u4EF6\u5B58\u5728\u4E14\u8DEF\u5F84\u6B63\u786E",
5439
- [types_AnalysisErrorCodes.IMAGE_CORRUPTED]: "\u8BF7\u68C0\u67E5\u56FE\u7247\u6587\u4EF6\u662F\u5426\u5B8C\u6574\u4E14\u672A\u635F\u574F",
5440
- [types_AnalysisErrorCodes.ANALYSIS_FAILED]: "\u8BF7\u91CD\u8BD5\u6216\u4F7F\u7528\u4E0D\u540C\u7684\u5206\u6790\u7C7B\u578B",
5441
- [types_AnalysisErrorCodes.AI_SERVICE_ERROR]: "\u8BF7\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u6216\u7A0D\u540E\u91CD\u8BD5",
5442
- [types_AnalysisErrorCodes.INVALID_ANALYSIS_TYPE]: "\u8BF7\u4F7F\u7528\u6709\u6548\u7684\u5206\u6790\u7C7B\u578B"
5443
- };
5444
- return suggestions[errorCode] || "\u8BF7\u68C0\u67E5\u8F93\u5165\u53C2\u6570\u5E76\u91CD\u8BD5";
5445
- }
5446
5819
  class ImageConversionError extends Error {
5447
5820
  code;
5448
5821
  context;
@@ -5491,7 +5864,7 @@ ${getErrorSuggestion(error.code)}
5491
5864
  const inputPaths = Array.isArray(params.input_paths) ? params.input_paths : [
5492
5865
  params.input_paths
5493
5866
  ];
5494
- logger.info("\u5F00\u59CB\u56FE\u7247\u8F6C\u6362", {
5867
+ logger_logger.info("\u5F00\u59CB\u56FE\u7247\u8F6C\u6362", {
5495
5868
  inputCount: inputPaths.length,
5496
5869
  outputFormat: params.output_format,
5497
5870
  isBatch: inputPaths.length > 1
@@ -5509,7 +5882,7 @@ ${getErrorSuggestion(error.code)}
5509
5882
  processing_time_ms: processingTime
5510
5883
  }
5511
5884
  };
5512
- logger.info("\u56FE\u7247\u8F6C\u6362\u5B8C\u6210", {
5885
+ logger_logger.info("\u56FE\u7247\u8F6C\u6362\u5B8C\u6210", {
5513
5886
  total: results.length,
5514
5887
  successful,
5515
5888
  failed,
@@ -5517,7 +5890,7 @@ ${getErrorSuggestion(error.code)}
5517
5890
  });
5518
5891
  return batchResult;
5519
5892
  } catch (error) {
5520
- logger.error("\u56FE\u7247\u8F6C\u6362\u5931\u8D25", {
5893
+ logger_logger.error("\u56FE\u7247\u8F6C\u6362\u5931\u8D25", {
5521
5894
  error,
5522
5895
  params
5523
5896
  });
@@ -5531,14 +5904,14 @@ ${getErrorSuggestion(error.code)}
5531
5904
  await this.ensureOutputDirectory(outputPath);
5532
5905
  const metadata = await this.getImageMetadata(inputPath);
5533
5906
  const result = await this.performConversion(inputPath, outputPath, params, metadata);
5534
- logger.info("\u5355\u5F20\u56FE\u7247\u8F6C\u6362\u6210\u529F", {
5907
+ logger_logger.info("\u5355\u5F20\u56FE\u7247\u8F6C\u6362\u6210\u529F", {
5535
5908
  inputPath,
5536
5909
  outputPath,
5537
5910
  format: params.output_format
5538
5911
  });
5539
5912
  return result;
5540
5913
  } catch (error) {
5541
- logger.error("\u5355\u5F20\u56FE\u7247\u8F6C\u6362\u5931\u8D25", {
5914
+ logger_logger.error("\u5355\u5F20\u56FE\u7247\u8F6C\u6362\u5931\u8D25", {
5542
5915
  error,
5543
5916
  inputPath
5544
5917
  });
@@ -5735,7 +6108,7 @@ ${getErrorSuggestion(error.code)}
5735
6108
  initializeProjectRoot();
5736
6109
  const converter = new ImageConverter();
5737
6110
  try {
5738
- logger.info("\u56FE\u7247\u683C\u5F0F\u8F6C\u6362\u667A\u80FD\u4F53\u5F00\u59CB\u6267\u884C", {
6111
+ logger_logger.info("\u56FE\u7247\u683C\u5F0F\u8F6C\u6362\u667A\u80FD\u4F53\u5F00\u59CB\u6267\u884C", {
5739
6112
  inputPaths: args.input_paths,
5740
6113
  outputFormat: args.output_format,
5741
6114
  isBatch: Array.isArray(args.input_paths)
@@ -5760,7 +6133,7 @@ ${getErrorSuggestion(error.code)}
5760
6133
  ]
5761
6134
  };
5762
6135
  } catch (error) {
5763
- logger.error("\u56FE\u7247\u683C\u5F0F\u8F6C\u6362\u667A\u80FD\u4F53\u6267\u884C\u5931\u8D25", {
6136
+ logger_logger.error("\u56FE\u7247\u683C\u5F0F\u8F6C\u6362\u667A\u80FD\u4F53\u6267\u884C\u5931\u8D25", {
5764
6137
  error,
5765
6138
  args
5766
6139
  });
@@ -5871,7 +6244,7 @@ ${error.message}
5871
6244
  ${error.code}
5872
6245
 
5873
6246
  ## \u{89E3}\u{51B3}\u{5EFA}\u{8BAE}
5874
- ${image_converter_getErrorSuggestion(error.code)}
6247
+ ${getErrorSuggestion(error.code)}
5875
6248
 
5876
6249
  ## \u{652F}\u{6301}\u{7684}\u{683C}\u{5F0F}
5877
6250
  - **\u{8F93}\u{5165}\u{683C}\u{5F0F}**: ${SUPPORTED_INPUT_FORMATS.join(", ")}
@@ -5915,7 +6288,7 @@ ${image_converter_getErrorSuggestion(error.code)}
5915
6288
  const i = Math.floor(Math.log(bytes) / Math.log(k));
5916
6289
  return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;
5917
6290
  }
5918
- function image_converter_getErrorSuggestion(errorCode) {
6291
+ function getErrorSuggestion(errorCode) {
5919
6292
  const suggestions = {
5920
6293
  [types_ConversionErrorCodes.INVALID_INPUT_PATH]: "\u8BF7\u68C0\u67E5\u8F93\u5165\u8DEF\u5F84\u662F\u5426\u6B63\u786E",
5921
6294
  [types_ConversionErrorCodes.UNSUPPORTED_FORMAT]: "\u8BF7\u4F7F\u7528\u652F\u6301\u7684\u56FE\u7247\u683C\u5F0F",
@@ -6010,7 +6383,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6010
6383
  });
6011
6384
  class ImagePreprocessor {
6012
6385
  async validateImage(imagePath) {
6013
- logger.info("ImagePreprocessor: \u5F00\u59CB\u9A8C\u8BC1\u56FE\u7247", imagePath);
6386
+ logger_logger.info("ImagePreprocessor: \u5F00\u59CB\u9A8C\u8BC1\u56FE\u7247", imagePath);
6014
6387
  const result = {
6015
6388
  isValid: false,
6016
6389
  fileExists: false,
@@ -6022,7 +6395,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6022
6395
  result.formatSupported = types_SUPPORTED_IMAGE_FORMATS.includes(fileExtension);
6023
6396
  if (!result.formatSupported) {
6024
6397
  result.errorMessage = `\u{4E0D}\u{652F}\u{6301}\u{7684}\u{56FE}\u{7247}\u{683C}\u{5F0F}: ${fileExtension}`;
6025
- logger.warn("\u4E0D\u652F\u6301\u7684\u56FE\u7247\u683C\u5F0F", {
6398
+ logger_logger.warn("\u4E0D\u652F\u6301\u7684\u56FE\u7247\u683C\u5F0F", {
6026
6399
  imagePath,
6027
6400
  format: fileExtension
6028
6401
  });
@@ -6031,12 +6404,12 @@ ${image_converter_getErrorSuggestion(error.code)}
6031
6404
  try {
6032
6405
  await external_node_fs_promises_namespaceObject.access(imagePath, external_node_fs_namespaceObject.constants.R_OK);
6033
6406
  result.readable = true;
6034
- logger.debug("\u56FE\u7247\u6587\u4EF6\u53EF\u8BFB", {
6407
+ logger_logger.debug("\u56FE\u7247\u6587\u4EF6\u53EF\u8BFB", {
6035
6408
  imagePath
6036
6409
  });
6037
6410
  } catch (error) {
6038
6411
  result.errorMessage = "\u56FE\u7247\u6587\u4EF6\u65E0\u6CD5\u8BFB\u53D6\uFF0C\u8BF7\u68C0\u67E5\u6587\u4EF6\u6743\u9650";
6039
- logger.warn("\u56FE\u7247\u6587\u4EF6\u65E0\u6CD5\u8BFB\u53D6", {
6412
+ logger_logger.warn("\u56FE\u7247\u6587\u4EF6\u65E0\u6CD5\u8BFB\u53D6", {
6040
6413
  imagePath
6041
6414
  });
6042
6415
  return result;
@@ -6045,32 +6418,32 @@ ${image_converter_getErrorSuggestion(error.code)}
6045
6418
  const metadata = await external_sharp_default()(imagePath).metadata();
6046
6419
  if (!metadata.width || !metadata.height) {
6047
6420
  result.errorMessage = "\u65E0\u6CD5\u83B7\u53D6\u56FE\u7247\u5C3A\u5BF8\u4FE1\u606F\uFF0C\u53EF\u80FD\u6587\u4EF6\u5DF2\u635F\u574F";
6048
- logger.warn("\u65E0\u6CD5\u83B7\u53D6\u56FE\u7247\u5C3A\u5BF8", {
6421
+ logger_logger.warn("\u65E0\u6CD5\u83B7\u53D6\u56FE\u7247\u5C3A\u5BF8", {
6049
6422
  imagePath
6050
6423
  });
6051
6424
  return result;
6052
6425
  }
6053
- logger.debug("\u56FE\u7247\u5143\u6570\u636E\u83B7\u53D6\u6210\u529F", {
6426
+ logger_logger.debug("\u56FE\u7247\u5143\u6570\u636E\u83B7\u53D6\u6210\u529F", {
6054
6427
  imagePath,
6055
6428
  width: metadata.width,
6056
6429
  height: metadata.height
6057
6430
  });
6058
6431
  } catch (error) {
6059
6432
  result.errorMessage = "\u56FE\u7247\u6587\u4EF6\u683C\u5F0F\u9519\u8BEF\u6216\u5DF2\u635F\u574F";
6060
- logger.warn("\u56FE\u7247\u6587\u4EF6\u635F\u574F", {
6433
+ logger_logger.warn("\u56FE\u7247\u6587\u4EF6\u635F\u574F", {
6061
6434
  imagePath,
6062
6435
  error: error instanceof Error ? error.message : error
6063
6436
  });
6064
6437
  return result;
6065
6438
  }
6066
6439
  result.isValid = true;
6067
- logger.info("\u56FE\u7247\u9A8C\u8BC1\u6210\u529F", {
6440
+ logger_logger.info("\u56FE\u7247\u9A8C\u8BC1\u6210\u529F", {
6068
6441
  imagePath
6069
6442
  });
6070
6443
  return result;
6071
6444
  } catch (error) {
6072
6445
  result.errorMessage = `\u{56FE}\u{7247}\u{9A8C}\u{8BC1}\u{8FC7}\u{7A0B}\u{4E2D}\u{53D1}\u{751F}\u{9519}\u{8BEF}: ${error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF"}`;
6073
- logger.error("\u56FE\u7247\u9A8C\u8BC1\u5931\u8D25", {
6446
+ logger_logger.error("\u56FE\u7247\u9A8C\u8BC1\u5931\u8D25", {
6074
6447
  imagePath,
6075
6448
  error
6076
6449
  });
@@ -6078,7 +6451,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6078
6451
  }
6079
6452
  }
6080
6453
  async getImageInfo(imagePath) {
6081
- logger.info("ImagePreprocessor: \u5F00\u59CB\u83B7\u53D6\u56FE\u7247\u4FE1\u606F", imagePath);
6454
+ logger_logger.info("ImagePreprocessor: \u5F00\u59CB\u83B7\u53D6\u56FE\u7247\u4FE1\u606F", imagePath);
6082
6455
  try {
6083
6456
  const stats = await external_node_fs_promises_namespaceObject.stat(imagePath);
6084
6457
  const fileName = external_node_path_namespaceObject.basename(imagePath);
@@ -6114,7 +6487,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6114
6487
  fileName,
6115
6488
  createdAt: stats.birthtime
6116
6489
  };
6117
- logger.info("\u56FE\u7247\u4FE1\u606F\u83B7\u53D6\u6210\u529F", {
6490
+ logger_logger.info("\u56FE\u7247\u4FE1\u606F\u83B7\u53D6\u6210\u529F", {
6118
6491
  imagePath,
6119
6492
  width,
6120
6493
  height,
@@ -6125,7 +6498,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6125
6498
  return imageInfo;
6126
6499
  } catch (error) {
6127
6500
  if (error instanceof ImageRecognitionError) throw error;
6128
- logger.error("\u83B7\u53D6\u56FE\u7247\u4FE1\u606F\u5931\u8D25", {
6501
+ logger_logger.error("\u83B7\u53D6\u56FE\u7247\u4FE1\u606F\u5931\u8D25", {
6129
6502
  imagePath,
6130
6503
  error
6131
6504
  });
@@ -6140,7 +6513,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6140
6513
  const heightCondition = height >= LONG_IMAGE_THRESHOLDS.MIN_HEIGHT;
6141
6514
  const aspectRatioCondition = aspectRatio <= 1 / LONG_IMAGE_THRESHOLDS.MIN_ASPECT_RATIO;
6142
6515
  const isLong = heightCondition && aspectRatioCondition;
6143
- logger.debug("\u957F\u56FE\u68C0\u6D4B\u7ED3\u679C", {
6516
+ logger_logger.debug("\u957F\u56FE\u68C0\u6D4B\u7ED3\u679C", {
6144
6517
  width,
6145
6518
  height,
6146
6519
  aspectRatio: aspectRatio.toFixed(2),
@@ -6151,7 +6524,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6151
6524
  return isLong;
6152
6525
  }
6153
6526
  async assessImageQuality(imagePath) {
6154
- logger.info("ImagePreprocessor: \u5F00\u59CB\u8BC4\u4F30\u56FE\u7247\u8D28\u91CF", {
6527
+ logger_logger.info("ImagePreprocessor: \u5F00\u59CB\u8BC4\u4F30\u56FE\u7247\u8D28\u91CF", {
6155
6528
  imagePath
6156
6529
  });
6157
6530
  try {
@@ -6193,7 +6566,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6193
6566
  clarity: clarityScore,
6194
6567
  recommendation
6195
6568
  };
6196
- logger.info("\u56FE\u7247\u8D28\u91CF\u8BC4\u4F30\u5B8C\u6210", {
6569
+ logger_logger.info("\u56FE\u7247\u8D28\u91CF\u8BC4\u4F30\u5B8C\u6210", {
6197
6570
  imagePath,
6198
6571
  totalScore: totalScore.toFixed(3),
6199
6572
  resolutionScore: resolutionScore.toFixed(3),
@@ -6204,7 +6577,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6204
6577
  return assessment;
6205
6578
  } catch (error) {
6206
6579
  if (error instanceof ImageRecognitionError) throw error;
6207
- logger.error("\u56FE\u7247\u8D28\u91CF\u8BC4\u4F30\u5931\u8D25", {
6580
+ logger_logger.error("\u56FE\u7247\u8D28\u91CF\u8BC4\u4F30\u5931\u8D25", {
6208
6581
  imagePath,
6209
6582
  error
6210
6583
  });
@@ -6220,7 +6593,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6220
6593
  }
6221
6594
  class ConfigCalculator {
6222
6595
  async calculateSegmentConfig(imageInfo, qualityAssessment, maxSegments = LONG_IMAGE_THRESHOLDS.MAX_SEGMENTS) {
6223
- logger.info("ConfigCalculator: \u5F00\u59CB\u8BA1\u7B97\u5206\u6BB5\u914D\u7F6E", {
6596
+ logger_logger.info("ConfigCalculator: \u5F00\u59CB\u8BA1\u7B97\u5206\u6BB5\u914D\u7F6E", {
6224
6597
  width: imageInfo.width,
6225
6598
  height: imageInfo.height,
6226
6599
  isLongImage: imageInfo.isLongImage
@@ -6236,7 +6609,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6236
6609
  ],
6237
6610
  estimatedTime: this.estimateSegmentProcessingTime(1, imageInfo.size)
6238
6611
  };
6239
- logger.info("\u975E\u957F\u56FE\uFF0C\u4F7F\u7528\u5355\u6BB5\u914D\u7F6E", config);
6612
+ logger_logger.info("\u975E\u957F\u56FE\uFF0C\u4F7F\u7528\u5355\u6BB5\u914D\u7F6E", config);
6240
6613
  return config;
6241
6614
  }
6242
6615
  const segmentHeight = this.calculateOptimalSegmentHeight(imageInfo, qualityAssessment);
@@ -6255,13 +6628,13 @@ ${image_converter_getErrorSuggestion(error.code)}
6255
6628
  processingOrder,
6256
6629
  estimatedTime
6257
6630
  };
6258
- logger.info("\u5206\u6BB5\u914D\u7F6E\u8BA1\u7B97\u5B8C\u6210", {
6631
+ logger_logger.info("\u5206\u6BB5\u914D\u7F6E\u8BA1\u7B97\u5B8C\u6210", {
6259
6632
  ...config,
6260
6633
  estimatedTimeMinutes: (estimatedTime / 60000).toFixed(1)
6261
6634
  });
6262
6635
  return config;
6263
6636
  } catch (error) {
6264
- logger.error("\u5206\u6BB5\u914D\u7F6E\u8BA1\u7B97\u5931\u8D25", {
6637
+ logger_logger.error("\u5206\u6BB5\u914D\u7F6E\u8BA1\u7B97\u5931\u8D25", {
6265
6638
  error,
6266
6639
  imageInfo
6267
6640
  });
@@ -6291,7 +6664,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6291
6664
  return Math.max(overlapHeight, LONG_IMAGE_THRESHOLDS.MIN_OVERLAP);
6292
6665
  }
6293
6666
  calculateConcurrencyConfig(imageSize, segmentCount = 1) {
6294
- logger.info("ConfigCalculator: \u5F00\u59CB\u8BA1\u7B97\u5E76\u53D1\u914D\u7F6E", {
6667
+ logger_logger.info("ConfigCalculator: \u5F00\u59CB\u8BA1\u7B97\u5E76\u53D1\u914D\u7F6E", {
6295
6668
  imageSize: `${(imageSize / 1024 / 1024).toFixed(2)}MB`,
6296
6669
  segmentCount
6297
6670
  });
@@ -6313,7 +6686,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6313
6686
  delayBetweenBatches,
6314
6687
  memoryLimit: PERFORMANCE_LIMITS.MAX_MEMORY_MB
6315
6688
  };
6316
- logger.info("\u5E76\u53D1\u914D\u7F6E\u8BA1\u7B97\u5B8C\u6210", {
6689
+ logger_logger.info("\u5E76\u53D1\u914D\u7F6E\u8BA1\u7B97\u5B8C\u6210", {
6317
6690
  ...config,
6318
6691
  systemInfo: {
6319
6692
  totalMemoryGB: (totalMemoryMB / 1024).toFixed(1),
@@ -6325,7 +6698,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6325
6698
  });
6326
6699
  return config;
6327
6700
  } catch (error) {
6328
- logger.error("\u5E76\u53D1\u914D\u7F6E\u8BA1\u7B97\u5931\u8D25", {
6701
+ logger_logger.error("\u5E76\u53D1\u914D\u7F6E\u8BA1\u7B97\u5931\u8D25", {
6329
6702
  error,
6330
6703
  imageSize,
6331
6704
  segmentCount
@@ -6342,7 +6715,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6342
6715
  return this.estimateSegmentProcessingTime(segmentCount, imageSize);
6343
6716
  }
6344
6717
  estimateSegmentProcessingTime(segmentCount, imageSize) {
6345
- logger.info("ConfigCalculator: \u5F00\u59CB\u9884\u4F30\u5904\u7406\u65F6\u95F4", {
6718
+ logger_logger.info("ConfigCalculator: \u5F00\u59CB\u9884\u4F30\u5904\u7406\u65F6\u95F4", {
6346
6719
  segmentCount,
6347
6720
  imageSize
6348
6721
  });
@@ -6360,7 +6733,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6360
6733
  const startupOverhead = 2000;
6361
6734
  const finalizationOverhead = 1000;
6362
6735
  const estimatedTime = totalTime + startupOverhead + finalizationOverhead;
6363
- logger.info("\u5904\u7406\u65F6\u95F4\u9884\u4F30\u5B8C\u6210", {
6736
+ logger_logger.info("\u5904\u7406\u65F6\u95F4\u9884\u4F30\u5B8C\u6210", {
6364
6737
  segmentCount,
6365
6738
  baseTimePerSegment,
6366
6739
  concurrencyEfficiency,
@@ -6369,7 +6742,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6369
6742
  });
6370
6743
  return estimatedTime;
6371
6744
  } catch (error) {
6372
- logger.error("\u5904\u7406\u65F6\u95F4\u9884\u4F30\u5931\u8D25", {
6745
+ logger_logger.error("\u5904\u7406\u65F6\u95F4\u9884\u4F30\u5931\u8D25", {
6373
6746
  error,
6374
6747
  segmentCount,
6375
6748
  imageSize
@@ -6380,7 +6753,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6380
6753
  }
6381
6754
  class analyzer_ImageAnalyzer {
6382
6755
  async analyzeLongImage(imagePath, imageInfo, segmentConfig, concurrencyConfig, apiPreference = 'auto') {
6383
- logger.info("ImageAnalyzer: \u5F00\u59CB\u5206\u6790\u957F\u56FE", {
6756
+ logger_logger.info("ImageAnalyzer: \u5F00\u59CB\u5206\u6790\u957F\u56FE", {
6384
6757
  imagePath,
6385
6758
  totalSegments: segmentConfig.totalSegments,
6386
6759
  maxConcurrency: concurrencyConfig.maxConcurrency
@@ -6414,7 +6787,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6414
6787
  outputPath: '',
6415
6788
  success: 0 === summary.failedSegments
6416
6789
  };
6417
- logger.info("\u957F\u56FE\u5206\u6790\u5B8C\u6210", {
6790
+ logger_logger.info("\u957F\u56FE\u5206\u6790\u5B8C\u6210", {
6418
6791
  imagePath,
6419
6792
  totalSegments: summary.totalSegments,
6420
6793
  successfulSegments: summary.successfulSegments,
@@ -6423,7 +6796,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6423
6796
  });
6424
6797
  return result;
6425
6798
  } catch (error) {
6426
- logger.error("\u957F\u56FE\u5206\u6790\u5931\u8D25", {
6799
+ logger_logger.error("\u957F\u56FE\u5206\u6790\u5931\u8D25", {
6427
6800
  imagePath,
6428
6801
  error
6429
6802
  });
@@ -6439,7 +6812,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6439
6812
  const segments = await this.generateSegments(imagePath, imageInfo, segmentConfig);
6440
6813
  for(let i = 0; i < segments.length; i += batchSize){
6441
6814
  const batch = segments.slice(i, i + batchSize);
6442
- logger.info(`\u{5904}\u{7406}\u{6279}\u{6B21} ${Math.floor(i / batchSize) + 1}/${Math.ceil(segments.length / batchSize)}`, {
6815
+ logger_logger.info(`\u{5904}\u{7406}\u{6279}\u{6B21} ${Math.floor(i / batchSize) + 1}/${Math.ceil(segments.length / batchSize)}`, {
6443
6816
  batchSize: batch.length,
6444
6817
  startIndex: i
6445
6818
  });
@@ -6447,7 +6820,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6447
6820
  try {
6448
6821
  return await this.analyzeSegment(buffer, info, apiPreference);
6449
6822
  } catch (error) {
6450
- logger.error(`\u{6BB5}\u{843D} ${info.index} \u{5206}\u{6790}\u{5931}\u{8D25}`, {
6823
+ logger_logger.error(`\u{6BB5}\u{843D} ${info.index} \u{5206}\u{6790}\u{5931}\u{8D25}`, {
6451
6824
  error
6452
6825
  });
6453
6826
  return {
@@ -6469,7 +6842,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6469
6842
  }
6470
6843
  async analyzeSegment(imageBuffer, segmentInfo, apiPreference = 'auto') {
6471
6844
  const startTime = Date.now();
6472
- logger.info("ImageAnalyzer: \u5F00\u59CB\u5206\u6790\u56FE\u7247\u6BB5\u843D", {
6845
+ logger_logger.info("ImageAnalyzer: \u5F00\u59CB\u5206\u6790\u56FE\u7247\u6BB5\u843D", {
6473
6846
  segmentIndex: segmentInfo.index,
6474
6847
  totalSegments: segmentInfo.totalSegments,
6475
6848
  isFirstSegment: segmentInfo.isFirstSegment,
@@ -6484,7 +6857,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6484
6857
  try {
6485
6858
  if ('glm-4v' === apiPreference || 'auto' === apiPreference) {
6486
6859
  apiUsed = 'glm-4v-flash';
6487
- aiResponse = await openAIService.analyzeImage({
6860
+ aiResponse = await openai_openAIService.analyzeImage({
6488
6861
  image_base64: base64Image,
6489
6862
  prompt,
6490
6863
  system_prompt: systemPrompt,
@@ -6494,7 +6867,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6494
6867
  });
6495
6868
  } else if ('moonshot' === apiPreference) {
6496
6869
  apiUsed = 'kimi-latest';
6497
- aiResponse = await openAIService.analyzeImage({
6870
+ aiResponse = await openai_openAIService.analyzeImage({
6498
6871
  image_base64: base64Image,
6499
6872
  prompt,
6500
6873
  system_prompt: systemPrompt,
@@ -6504,13 +6877,13 @@ ${image_converter_getErrorSuggestion(error.code)}
6504
6877
  });
6505
6878
  }
6506
6879
  } catch (primaryError) {
6507
- logger.warn(`\u{4E3B}\u{8981}API ${apiUsed} \u{8C03}\u{7528}\u{5931}\u{8D25}\u{FF0C}\u{5C1D}\u{8BD5}\u{5907}\u{7528}API`, {
6880
+ logger_logger.warn(`\u{4E3B}\u{8981}API ${apiUsed} \u{8C03}\u{7528}\u{5931}\u{8D25}\u{FF0C}\u{5C1D}\u{8BD5}\u{5907}\u{7528}API`, {
6508
6881
  error: primaryError instanceof Error ? primaryError.message : primaryError
6509
6882
  });
6510
6883
  try {
6511
6884
  if ('kimi-latest' !== apiUsed) {
6512
6885
  apiUsed = 'kimi-latest';
6513
- aiResponse = await openAIService.analyzeImage({
6886
+ aiResponse = await openai_openAIService.analyzeImage({
6514
6887
  image_base64: base64Image,
6515
6888
  prompt,
6516
6889
  system_prompt: systemPrompt,
@@ -6520,7 +6893,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6520
6893
  });
6521
6894
  } else {
6522
6895
  apiUsed = 'glm-4v-flash';
6523
- aiResponse = await openAIService.analyzeImage({
6896
+ aiResponse = await openai_openAIService.analyzeImage({
6524
6897
  image_base64: base64Image,
6525
6898
  prompt,
6526
6899
  system_prompt: systemPrompt,
@@ -6551,7 +6924,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6551
6924
  totalTokens: Math.ceil((prompt.length + aiResponse.length) / 4)
6552
6925
  }
6553
6926
  };
6554
- logger.info("\u6BB5\u843D\u5206\u6790\u5B8C\u6210", {
6927
+ logger_logger.info("\u6BB5\u843D\u5206\u6790\u5B8C\u6210", {
6555
6928
  segmentIndex: segmentInfo.index,
6556
6929
  textLength: textContent.length,
6557
6930
  descriptionLength: imageDescription.length,
@@ -6562,7 +6935,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6562
6935
  return result;
6563
6936
  } catch (error) {
6564
6937
  const processingTime = Date.now() - startTime;
6565
- logger.error("\u6BB5\u843D\u5206\u6790\u5931\u8D25", {
6938
+ logger_logger.error("\u6BB5\u843D\u5206\u6790\u5931\u8D25", {
6566
6939
  segmentIndex: segmentInfo.index,
6567
6940
  error,
6568
6941
  processingTimeMs: processingTime
@@ -6646,7 +7019,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6646
7019
  let textContent = '';
6647
7020
  let imageDescription = '';
6648
7021
  let confidence = 0.9;
6649
- logger.debug("AI\u54CD\u5E94\u539F\u59CB\u5185\u5BB9", {
7022
+ logger_logger.debug("AI\u54CD\u5E94\u539F\u59CB\u5185\u5BB9", {
6650
7023
  responseLength: response.length,
6651
7024
  responsePreview: response.substring(0, 200) + (response.length > 200 ? '...' : '')
6652
7025
  });
@@ -6656,7 +7029,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6656
7029
  textContent = '';
6657
7030
  imageDescription = '';
6658
7031
  confidence = 0.9;
6659
- logger.debug("\u68C0\u6D4B\u5230\u65E0\u6587\u5B57\u5185\u5BB9\u6807\u8BC6");
7032
+ logger_logger.debug("\u68C0\u6D4B\u5230\u65E0\u6587\u5B57\u5185\u5BB9\u6807\u8BC6");
6660
7033
  return {
6661
7034
  textContent,
6662
7035
  imageDescription,
@@ -6671,14 +7044,14 @@ ${image_converter_getErrorSuggestion(error.code)}
6671
7044
  const chineseRatio = chineseCharCount / totalCharCount;
6672
7045
  confidence = Math.min(0.9, 0.6 + 0.3 * chineseRatio);
6673
7046
  } else confidence = totalCharCount > 10 ? 0.8 : 0.6;
6674
- logger.debug("AI\u54CD\u5E94\u89E3\u6790\u7ED3\u679C", {
7047
+ logger_logger.debug("AI\u54CD\u5E94\u89E3\u6790\u7ED3\u679C", {
6675
7048
  textContentLength: textContent.length,
6676
7049
  chineseCharCount,
6677
7050
  totalCharCount,
6678
7051
  confidence
6679
7052
  });
6680
7053
  } catch (error) {
6681
- logger.warn("AI\u54CD\u5E94\u89E3\u6790\u5931\u8D25\uFF0C\u4F7F\u7528\u539F\u59CB\u54CD\u5E94", {
7054
+ logger_logger.warn("AI\u54CD\u5E94\u89E3\u6790\u5931\u8D25\uFF0C\u4F7F\u7528\u539F\u59CB\u54CD\u5E94", {
6682
7055
  error
6683
7056
  });
6684
7057
  textContent = response.trim();
@@ -6738,7 +7111,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6738
7111
  }
6739
7112
  async processImage(imagePath) {
6740
7113
  const startTime = Date.now();
6741
- logger.info("ImageRecognitionProcessor: \u5F00\u59CB\u5904\u7406\u56FE\u7247", {
7114
+ logger_logger.info("ImageRecognitionProcessor: \u5F00\u59CB\u5904\u7406\u56FE\u7247", {
6742
7115
  imagePath
6743
7116
  });
6744
7117
  try {
@@ -6749,7 +7122,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6749
7122
  });
6750
7123
  const imageInfo = await this.preprocessor.getImageInfo(imagePath);
6751
7124
  const qualityAssessment = await this.preprocessor.assessImageQuality(imagePath);
6752
- logger.info("\u56FE\u7247\u4FE1\u606F\u83B7\u53D6\u5B8C\u6210", {
7125
+ logger_logger.info("\u56FE\u7247\u4FE1\u606F\u83B7\u53D6\u5B8C\u6210", {
6753
7126
  width: imageInfo.width,
6754
7127
  height: imageInfo.height,
6755
7128
  isLongImage: imageInfo.isLongImage,
@@ -6757,7 +7130,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6757
7130
  });
6758
7131
  const segmentConfig = await this.configCalculator.calculateSegmentConfig(imageInfo, qualityAssessment, 20);
6759
7132
  const concurrencyConfig = this.configCalculator.calculateConcurrencyConfig(imageInfo.size, segmentConfig.totalSegments);
6760
- logger.info("\u5206\u6BB5\u914D\u7F6E\u8BA1\u7B97\u5B8C\u6210", {
7133
+ logger_logger.info("\u5206\u6BB5\u914D\u7F6E\u8BA1\u7B97\u5B8C\u6210", {
6761
7134
  totalSegments: segmentConfig.totalSegments,
6762
7135
  segmentHeight: segmentConfig.segmentHeight,
6763
7136
  maxConcurrency: concurrencyConfig.maxConcurrency
@@ -6765,7 +7138,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6765
7138
  const analysisResult = await this.analyzer.analyzeLongImage(imagePath, imageInfo, segmentConfig, concurrencyConfig, 'auto');
6766
7139
  const outputPath = await this.generateSingleOutputFile(imageInfo, analysisResult.segmentResults, analysisResult.summary);
6767
7140
  const totalTime = Date.now() - startTime;
6768
- logger.info("\u56FE\u7247\u5904\u7406\u5B8C\u6210", {
7141
+ logger_logger.info("\u56FE\u7247\u5904\u7406\u5B8C\u6210", {
6769
7142
  outputPath,
6770
7143
  totalSegments: analysisResult.summary.totalSegments,
6771
7144
  successfulSegments: analysisResult.summary.successfulSegments,
@@ -6784,7 +7157,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6784
7157
  }
6785
7158
  };
6786
7159
  } catch (error) {
6787
- logger.error("\u56FE\u7247\u5904\u7406\u5931\u8D25", {
7160
+ logger_logger.error("\u56FE\u7247\u5904\u7406\u5931\u8D25", {
6788
7161
  imagePath,
6789
7162
  error
6790
7163
  });
@@ -6808,7 +7181,7 @@ ${image_converter_getErrorSuggestion(error.code)}
6808
7181
  }
6809
7182
  }
6810
7183
  async generateSingleOutputFile(imageInfo, segmentResults, summary) {
6811
- const baseDir = getStorageDir();
7184
+ const baseDir = config_getStorageDir();
6812
7185
  const dateDir = new Date().toISOString().split('T')[0];
6813
7186
  const outputDirectory = external_path_namespaceObject.join(baseDir, 'image-recognition', dateDir);
6814
7187
  await external_fs_namespaceObject.promises.mkdir(outputDirectory, {
@@ -6839,7 +7212,7 @@ ${allTextContent || "\u672A\u8BC6\u522B\u5230\u6587\u5B57\u5185\u5BB9"}
6839
7212
  **\u{8BC6}\u{522B}\u{5B8C}\u{6210}\u{65F6}\u{95F4}**: ${new Date().toLocaleString('zh-CN')}
6840
7213
  `;
6841
7214
  await external_fs_namespaceObject.promises.writeFile(outputPath, content, 'utf8');
6842
- logger.info("\u8F93\u51FA\u6587\u4EF6\u751F\u6210\u5B8C\u6210", {
7215
+ logger_logger.info("\u8F93\u51FA\u6587\u4EF6\u751F\u6210\u5B8C\u6210", {
6843
7216
  outputPath,
6844
7217
  fileName,
6845
7218
  contentLength: content.length
@@ -6855,14 +7228,14 @@ ${allTextContent || "\u672A\u8BC6\u522B\u5230\u6587\u5B57\u5185\u5BB9"}
6855
7228
  },
6856
7229
  handler: async (args)=>{
6857
7230
  initializeProjectRoot();
6858
- logger.info("\u56FE\u7247\u5185\u5BB9\u8BC6\u522B\u667A\u80FD\u4F53: \u5F00\u59CB\u5904\u7406", {
7231
+ logger_logger.info("\u56FE\u7247\u5185\u5BB9\u8BC6\u522B\u667A\u80FD\u4F53: \u5F00\u59CB\u5904\u7406", {
6859
7232
  args
6860
7233
  });
6861
7234
  try {
6862
7235
  const { imagePath } = ImageRecognitionParamsSchema.parse(args);
6863
7236
  const processor = new ImageRecognitionProcessor();
6864
7237
  const result = await processor.processImage(imagePath);
6865
- logger.info("\u56FE\u7247\u5185\u5BB9\u8BC6\u522B\u667A\u80FD\u4F53: \u5904\u7406\u5B8C\u6210", {
7238
+ logger_logger.info("\u56FE\u7247\u5185\u5BB9\u8BC6\u522B\u667A\u80FD\u4F53: \u5904\u7406\u5B8C\u6210", {
6866
7239
  outputPath: result.outputPath,
6867
7240
  summary: result.summary
6868
7241
  });
@@ -6888,7 +7261,7 @@ ${allTextContent || "\u672A\u8BC6\u522B\u5230\u6587\u5B57\u5185\u5BB9"}
6888
7261
  ]
6889
7262
  };
6890
7263
  } catch (error) {
6891
- logger.error("\u56FE\u7247\u5185\u5BB9\u8BC6\u522B\u667A\u80FD\u4F53: \u5904\u7406\u5931\u8D25", {
7264
+ logger_logger.error("\u56FE\u7247\u5185\u5BB9\u8BC6\u522B\u667A\u80FD\u4F53: \u5904\u7406\u5931\u8D25", {
6892
7265
  error
6893
7266
  });
6894
7267
  return {
@@ -6929,8 +7302,8 @@ ${allTextContent || "\u672A\u8BC6\u522B\u5230\u6587\u5B57\u5185\u5BB9"}
6929
7302
  if (!filePath) throw new Error("\u6587\u4EF6\u8DEF\u5F84\u53C2\u6570\u7F3A\u5931\uFF0C\u8BF7\u63D0\u4F9B filePath \u53C2\u6570");
6930
7303
  try {
6931
7304
  if (!isValidExcelPath(filePath)) throw new Error(`\u{6587}\u{4EF6}\u{683C}\u{5F0F}\u{4E0D}\u{652F}\u{6301}\u{FF0C}\u{8BF7}\u{63D0}\u{4F9B}\u{6709}\u{6548}\u{7684}Excel\u{6587}\u{4EF6}\u{8DEF}\u{5F84}(.xlsx, .xls, .xlsm): ${filePath}`);
6932
- const resolvedPath = await validateAndResolvePath(filePath);
6933
- logger.info("\u5F00\u59CB\u8BFB\u53D6Excel\u6587\u4EF6", {
7305
+ const resolvedPath = await common_validateAndResolvePath(filePath);
7306
+ logger_logger.info("\u5F00\u59CB\u8BFB\u53D6Excel\u6587\u4EF6", {
6934
7307
  tool: 'read_excel',
6935
7308
  originalPath: filePath,
6936
7309
  resolvedPath: resolvedPath,
@@ -6969,7 +7342,7 @@ ${allTextContent || "\u672A\u8BC6\u522B\u5230\u6587\u5B57\u5185\u5BB9"}
6969
7342
  columnCount: filteredData.length > 0 ? Object.keys(filteredData[0]).length : 0,
6970
7343
  range: range
6971
7344
  };
6972
- const jsonDir = external_path_default().join(getStorageDir(), 'excel');
7345
+ const jsonDir = external_path_default().join(config_getStorageDir(), 'excel');
6973
7346
  const baseName = external_path_default().basename(filePath, external_path_default().extname(filePath));
6974
7347
  const outputDir = external_path_default().join(jsonDir, baseName);
6975
7348
  await promises_namespaceObject.mkdir(outputDir, {
@@ -6977,7 +7350,7 @@ ${allTextContent || "\u672A\u8BC6\u522B\u5230\u6587\u5B57\u5185\u5BB9"}
6977
7350
  });
6978
7351
  const jsonFilePath = external_path_default().join(outputDir, `${baseName}_${sheetName}.json`);
6979
7352
  await promises_namespaceObject.writeFile(jsonFilePath, JSON.stringify(filteredData, null, 2), 'utf8');
6980
- logger.info("Excel\u8BFB\u53D6\u5B8C\u6210", {
7353
+ logger_logger.info("Excel\u8BFB\u53D6\u5B8C\u6210", {
6981
7354
  file: filePath,
6982
7355
  sheet: sheetName,
6983
7356
  rows: filteredData.length,
@@ -7009,7 +7382,7 @@ ${JSON.stringify(filteredData.slice(0, 3), null, 2)}
7009
7382
  } catch (error) {
7010
7383
  const errorMsg = error instanceof Error ? error.message : String(error);
7011
7384
  const osInfo = `[${process.platform}]`;
7012
- logger.error(`Excel\u{8BFB}\u{53D6}\u{5931}\u{8D25} ${osInfo}: ${errorMsg}`, {
7385
+ logger_logger.error(`Excel\u{8BFB}\u{53D6}\u{5931}\u{8D25} ${osInfo}: ${errorMsg}`, {
7013
7386
  tool: "read_excel",
7014
7387
  filePath,
7015
7388
  resolvedPath: error.resolvedPath || filePath,
@@ -7072,7 +7445,7 @@ ${JSON.stringify(filteredData.slice(0, 3), null, 2)}
7072
7445
  try {
7073
7446
  let jsonData = [];
7074
7447
  if ('string' == typeof data) try {
7075
- const resolvedPath = await validateAndResolvePath(data);
7448
+ const resolvedPath = await common_validateAndResolvePath(data);
7076
7449
  const fileContent = await promises_namespaceObject.readFile(resolvedPath, 'utf8');
7077
7450
  jsonData = JSON.parse(fileContent);
7078
7451
  } catch {
@@ -7139,7 +7512,7 @@ ${JSON.stringify(filteredData.slice(0, 3), null, 2)}
7139
7512
  let finalOutputPath;
7140
7513
  if (outputPath) finalOutputPath = normalizePath(outputPath);
7141
7514
  else {
7142
- const excelDir = external_path_default().join(getStorageDir(), 'excel');
7515
+ const excelDir = external_path_default().join(config_getStorageDir(), 'excel');
7143
7516
  await promises_namespaceObject.mkdir(excelDir, {
7144
7517
  recursive: true
7145
7518
  });
@@ -7155,7 +7528,7 @@ ${JSON.stringify(filteredData.slice(0, 3), null, 2)}
7155
7528
  bookType: options.format || 'xlsx'
7156
7529
  });
7157
7530
  await promises_namespaceObject.writeFile(finalOutputPath, buffer);
7158
- logger.info("Excel\u5BFC\u51FA\u5B8C\u6210", {
7531
+ logger_logger.info("Excel\u5BFC\u51FA\u5B8C\u6210", {
7159
7532
  outputPath: finalOutputPath,
7160
7533
  rows: jsonData.length,
7161
7534
  columns: headers.length,
@@ -7186,7 +7559,7 @@ ${JSON.stringify(filteredData.slice(0, 3), null, 2)}
7186
7559
  };
7187
7560
  } catch (error) {
7188
7561
  const errorMsg = error instanceof Error ? error.message : String(error);
7189
- logger.error(`Excel\u{5BFC}\u{51FA}\u{5931}\u{8D25}: ${errorMsg}`, {
7562
+ logger_logger.error(`Excel\u{5BFC}\u{51FA}\u{5931}\u{8D25}: ${errorMsg}`, {
7190
7563
  tool: "export_excel",
7191
7564
  data: 'string' == typeof data ? data.substring(0, 100) + '...' : 'complex data',
7192
7565
  options
@@ -7207,6 +7580,611 @@ ${JSON.stringify(filteredData.slice(0, 3), null, 2)}
7207
7580
  }
7208
7581
  }
7209
7582
  };
7583
+ const requirementIdentifierTool = {
7584
+ name: "requirement-identifier",
7585
+ description: "\u6839\u636E\u7528\u6237\u8F93\u5165\u5185\u5BB9\uFF0C\u6307\u5BFCAI\u8FDB\u884C\u6DF1\u5EA6\u9700\u6C42\u5206\u6790\uFF0C\u751F\u6210\u7ED3\u6784\u5316\u7684\u9700\u6C42\u63CF\u8FF0",
7586
+ inputSchema: {
7587
+ user_input: stringType().describe("\u7528\u6237\u8F93\u5165\u7684\u539F\u59CB\u9700\u6C42\u5185\u5BB9"),
7588
+ project_context: stringType().optional().describe("\u9879\u76EE\u4E0A\u4E0B\u6587\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09\uFF0C\u7528\u4E8E\u5206\u6790\u73B0\u6709\u4EE3\u7801\u7ED3\u6784")
7589
+ },
7590
+ handler: async (args)=>{
7591
+ try {
7592
+ const { user_input, project_context } = args;
7593
+ const guidancePrompt = `
7594
+ # \u{7CFB}\u{7EDF}\u{5316}\u{9700}\u{6C42}\u{5206}\u{6790}\u{6D41}\u{7A0B}
7595
+
7596
+ ## \u{7528}\u{6237}\u{9700}\u{6C42}
7597
+ ${user_input}
7598
+
7599
+ ## TODO\u{6E05}\u{5355}\u{6807}\u{51C6}\u{6D41}\u{7A0B}
7600
+
7601
+ ### 1. \u{9700}\u{6C42}\u{5206}\u{6790}
7602
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
7603
+ - \u{5145}\u{5206}\u{641C}\u{7D22}\u{4E0E}\u{7528}\u{6237}\u{8F93}\u{5165}\u{5185}\u{5BB9}\u{76F8}\u{5173}\u{7684}\u{8D44}\u{6E90}
7604
+ - \u{660E}\u{786E}\u{7528}\u{6237}\u{7684}\u{6838}\u{5FC3}\u{95EE}\u{9898}\u{3001}\u{9690}\u{542B}\u{9700}\u{6C42}\u{548C}\u{6700}\u{7EC8}\u{76EE}\u{6807}
7605
+ - \u{56F4}\u{7ED5}\u{95EE}\u{9898}\u{FF0C}\u{5FEB}\u{901F}\u{6784}\u{5EFA}\u{4E00}\u{4E2A}\u{77E5}\u{8BC6}\u{6846}\u{67B6}\u{3002}\u{786E}\u{5B9A}\u{56DE}\u{7B54}\u{5E94}\u{5305}\u{542B}\u{7684}\u{5173}\u{952E}\u{6982}\u{5FF5}\u{3001}\u{4E0A}\u{4E0B}\u{6587}\u{3001}\u{6B63}\u{53CD}\u{8BBA}\u{70B9}\u{548C}\u{6F5C}\u{5728}\u{7684}\u{5EF6}\u{4F38}\u{9886}\u{57DF}
7606
+ - \u{6839}\u{636E}\u{5145}\u{5206}\u{4E86}\u{89E3}\u{5230}\u{7684}\u{4FE1}\u{606F}\u{FF0C}\u{6E05}\u{6670}\u{5B8C}\u{6574}\u{7684}\u{590D}\u{8FF0}\u{7528}\u{6237}\u{9700}\u{6C42}\u{FF0C}\u{5E76}\u{7ED9}\u{51FA}\u{4E00}\u{4E2A}\u{9AD8}\u{5EA6}\u{6D53}\u{7F29}\u{7684}\u{3001}\u{7ED3}\u{8BBA}\u{6027}\u{7684}\u{6838}\u{5FC3}\u{89C2}\u{70B9}
7607
+
7608
+ **\u{4F7F}\u{7528}\u{5DE5}\u{5177}\u{FF1A}**
7609
+ ${project_context ? `
7610
+ 1. \u{4F7F}\u{7528} listDirectory \u{67E5}\u{770B}\u{9879}\u{76EE}\u{7ED3}\u{6784}\u{FF1A}\`${project_context}\`
7611
+ 2. \u{4F7F}\u{7528} grepSearch \u{641C}\u{7D22}\u{76F8}\u{5173}\u{529F}\u{80FD}\u{6A21}\u{5757}\u{FF0C}\u{4E86}\u{89E3}\u{73B0}\u{6709}\u{5B9E}\u{73B0}\u{6A21}\u{5F0F}
7612
+ 3. \u{4F7F}\u{7528} readFile \u{8BFB}\u{53D6}\u{5173}\u{952E}\u{914D}\u{7F6E}\u{6587}\u{4EF6}\u{FF08}package.json, tsconfig.json\u{7B49}\u{FF09}
7613
+ 4. \u{5206}\u{6790}\u{6280}\u{672F}\u{6808}\u{3001}\u{4EE3}\u{7801}\u{89C4}\u{8303}\u{3001}\u{67B6}\u{6784}\u{6A21}\u{5F0F}
7614
+ ` : `
7615
+ 1. \u{57FA}\u{4E8E}\u{901A}\u{7528}\u{6700}\u{4F73}\u{5B9E}\u{8DF5}\u{8FDB}\u{884C}\u{9700}\u{6C42}\u{5206}\u{6790}
7616
+ 2. \u{641C}\u{7D22}\u{76F8}\u{5173}\u{6280}\u{672F}\u{6587}\u{6863}\u{548C}\u{6700}\u{4F73}\u{5B9E}\u{8DF5}
7617
+ `}
7618
+
7619
+ ### 2. \u{573A}\u{666F}\u{8BC6}\u{522B}
7620
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
7621
+ - \u{57FA}\u{4E8E}\u{9700}\u{6C42}\u{5206}\u{6790}\u{7684}\u{5185}\u{5BB9}\u{FF0C}\u{627E}\u{51FA}\u{4E3B}\u{8981}\u{77DB}\u{76FE}\u{70B9}\u{FF0C}\u{5B9A}\u{4F4D}\u{6838}\u{5FC3}\u{95EE}\u{9898}\u{8282}\u{70B9}
7622
+ - \u{4ECE}\u{7CFB}\u{7EDF}\u{5C42}\u{9762}\u{62C6}\u{89E3}\u{4E3A}\u{53EF}\u{6267}\u{884C}\u{5B50}\u{4EFB}\u{52A1}\u{FF0C}\u{786E}\u{4FDD}\u{903B}\u{8F91}\u{94FE}\u{6761}\u{6E05}\u{6670}\u{FF0C}\u{4E0A}\u{4E0B}\u{6587}\u{4FE1}\u{606F}\u{5145}\u{8DB3}
7623
+
7624
+ **\u{8F93}\u{51FA}\u{FF1A}** \u{573A}\u{666F}\u{5206}\u{6790}\u{62A5}\u{544A}\u{548C}\u{4EFB}\u{52A1}\u{5206}\u{89E3}\u{6E05}\u{5355}
7625
+
7626
+ ### 3. \u{65B9}\u{6848}\u{8BBE}\u{8BA1}
7627
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
7628
+ - \u{65B9}\u{6848}\u{8BBE}\u{8BA1}\u{4F18}\u{5148}\u{590D}\u{7528}\u{73B0}\u{6709}\u{65B9}\u{6848}\u{FF0C}\u{7EC4}\u{4EF6}\u{FF0C}\u{5DE5}\u{5177}\u{65B9}\u{6CD5}\u{7B49}\u{FF0C}\u{80FD}\u{590D}\u{7528}\u{7684}\u{5C3D}\u{53EF}\u{80FD}\u{590D}\u{7528}
7629
+ - \u{626B}\u{63CF}\u{9879}\u{76EE}\u{4E2D}\u{4F7F}\u{7528}\u{7684}\u{6D4B}\u{8BD5}\u{6846}\u{67B6}\u{548C}\u{811A}\u{672C}\u{FF0C}\u{751F}\u{6210}\u{672C}\u{6B21}\u{9700}\u{6C42}\u{7684}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{FF0C}\u{5982}\u{679C}\u{4E0D}\u{5B58}\u{5728}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{FF0C}\u{5219}\u{7F16}\u{5199}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{5230}.aico/tests\u{4E0B}\u{9762}
7630
+
7631
+ **\u{4F7F}\u{7528}\u{5DE5}\u{5177}\u{FF1A}** grepSearch, readFile \u{67E5}\u{627E}\u{73B0}\u{6709}\u{7EC4}\u{4EF6}\u{548C}\u{5DE5}\u{5177}
7632
+
7633
+ ### 4. \u{6267}\u{884C}\u{9A8C}\u{8BC1}
7634
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
7635
+ - \u{6309}\u{65B9}\u{6848}\u{8BBE}\u{8BA1}\u{7684}\u{7ED3}\u{679C}\u{8F93}\u{51FA}\u{4EE3}\u{7801}
7636
+ - \u{5982}\u{679C}\u{6709}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{FF0C}\u{8FD0}\u{884C}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{5E76}\u{4FEE}\u{6B63}\u{76F4}\u{5230}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{5168}\u{90E8}\u{901A}\u{8FC7}
7637
+
7638
+ ### 5. \u{603B}\u{7ED3}\u{53CD}\u{9988}
7639
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
7640
+ - \u{8F93}\u{51FA}\u{6700}\u{7EC8}\u{6267}\u{884C}\u{7684}\u{65B9}\u{6848}
7641
+ - \u{66F4}\u{65B0}TODO\u{6E05}\u{5355}
7642
+ - \u{6839}\u{636E}\u{60C5}\u{51B5}\u{63D0}\u{4F9B}\u{4E00}\u{4E9B}\u{524D}\u{77BB}\u{6027}\u{7684}\u{601D}\u{8003}\u{6216}\u{5EFA}\u{8BAE}
7643
+
7644
+ ## \u{9700}\u{6C42}\u{6DF1}\u{5EA6}\u{89E3}\u{6790}\u{7EF4}\u{5EA6}
7645
+ 1. **\u{6838}\u{5FC3}\u{529F}\u{80FD}\u{8BC6}\u{522B}**
7646
+ - \u{4E3B}\u{8981}\u{529F}\u{80FD}\u{6A21}\u{5757}\u{6709}\u{54EA}\u{4E9B}\u{FF1F}
7647
+ - \u{6BCF}\u{4E2A}\u{6A21}\u{5757}\u{7684}\u{6838}\u{5FC3}\u{804C}\u{8D23}\u{662F}\u{4EC0}\u{4E48}\u{FF1F}
7648
+ - \u{6A21}\u{5757}\u{95F4}\u{5982}\u{4F55}\u{534F}\u{4F5C}\u{FF1F}
7649
+
7650
+ 2. **\u{6280}\u{672F}\u{65B9}\u{6848}\u{8BC4}\u{4F30}**
7651
+ - \u{9700}\u{8981}\u{54EA}\u{4E9B}\u{6280}\u{672F}\u{6808}\u{FF1F}
7652
+ - \u{662F}\u{5426}\u{9700}\u{8981}\u{5F15}\u{5165}\u{65B0}\u{7684}\u{4F9D}\u{8D56}\u{FF1F}
7653
+ - \u{5982}\u{4F55}\u{4E0E}\u{73B0}\u{6709}\u{7CFB}\u{7EDF}\u{96C6}\u{6210}\u{FF1F}
7654
+
7655
+ 3. **\u{6570}\u{636E}\u{6D41}\u{8BBE}\u{8BA1}**
7656
+ - \u{8F93}\u{5165}\u{6570}\u{636E}\u{683C}\u{5F0F}\u{548C}\u{6765}\u{6E90}
7657
+ - \u{6570}\u{636E}\u{5904}\u{7406}\u{6D41}\u{7A0B}
7658
+ - \u{8F93}\u{51FA}\u{6570}\u{636E}\u{683C}\u{5F0F}\u{548C}\u{53BB}\u{5411}
7659
+
7660
+ 4. **\u{8FB9}\u{754C}\u{6761}\u{4EF6}\u{4E0E}\u{7EA6}\u{675F}**
7661
+ - \u{6027}\u{80FD}\u{8981}\u{6C42}\u{FF08}\u{54CD}\u{5E94}\u{65F6}\u{95F4}\u{3001}\u{5E76}\u{53D1}\u{91CF}\u{FF09}
7662
+ - \u{5B89}\u{5168}\u{8981}\u{6C42}\u{FF08}\u{6743}\u{9650}\u{63A7}\u{5236}\u{3001}\u{6570}\u{636E}\u{52A0}\u{5BC6}\u{FF09}
7663
+ - \u{517C}\u{5BB9}\u{6027}\u{8981}\u{6C42}\u{FF08}\u{6D4F}\u{89C8}\u{5668}\u{3001}Node\u{7248}\u{672C}\u{FF09}
7664
+ - \u{9519}\u{8BEF}\u{5904}\u{7406}\u{7B56}\u{7565}
7665
+
7666
+ ## \u{751F}\u{6210}\u{7ED3}\u{6784}\u{5316}\u{9700}\u{6C42}\u{6587}\u{6863}
7667
+ **\u{8F93}\u{51FA}\u{683C}\u{5F0F}\u{FF1A}**
7668
+ \`\`\`
7669
+ ## \u{9700}\u{6C42}\u{6982}\u{8FF0}
7670
+ [\u{4E00}\u{53E5}\u{8BDD}\u{63CF}\u{8FF0}\u{6838}\u{5FC3}\u{9700}\u{6C42}]
7671
+
7672
+ ## \u{529F}\u{80FD}\u{6A21}\u{5757}
7673
+ ### \u{6A21}\u{5757}1\u{FF1A}[\u{540D}\u{79F0}]
7674
+ - \u{529F}\u{80FD}\u{63CF}\u{8FF0}\u{FF1A}
7675
+ - \u{8F93}\u{5165}\u{FF1A}
7676
+ - \u{8F93}\u{51FA}\u{FF1A}
7677
+ - \u{4F9D}\u{8D56}\u{FF1A}
7678
+
7679
+ ### \u{6A21}\u{5757}2\u{FF1A}[\u{540D}\u{79F0}]
7680
+ ...
7681
+
7682
+ ## \u{6280}\u{672F}\u{65B9}\u{6848}
7683
+ - \u{6280}\u{672F}\u{6808}\u{FF1A}
7684
+ - \u{6838}\u{5FC3}\u{4F9D}\u{8D56}\u{FF1A}
7685
+ - \u{67B6}\u{6784}\u{6A21}\u{5F0F}\u{FF1A}
7686
+
7687
+ ## \u{5B9E}\u{73B0}\u{8DEF}\u{5F84}
7688
+ 1. [\u{6B65}\u{9AA4}1]
7689
+ 2. [\u{6B65}\u{9AA4}2]
7690
+ ...
7691
+
7692
+ ## \u{9A8C}\u{6536}\u{6807}\u{51C6}
7693
+ - [ ] \u{529F}\u{80FD}\u{5B8C}\u{6574}\u{6027}
7694
+ - [ ] \u{6027}\u{80FD}\u{8FBE}\u{6807}
7695
+ - [ ] \u{9519}\u{8BEF}\u{5904}\u{7406}\u{5B8C}\u{5584}
7696
+ - [ ] \u{4EE3}\u{7801}\u{8D28}\u{91CF}\u{7B26}\u{5408}\u{89C4}\u{8303}
7697
+ \`\`\`
7698
+
7699
+ ## \u{4E0B}\u{4E00}\u{6B65}\u{64CD}\u{4F5C}
7700
+ \u{5B8C}\u{6210}\u{9700}\u{6C42}\u{5206}\u{6790}\u{540E}\u{FF0C}\u{8C03}\u{7528} **requirement-aligner** \u{5DE5}\u{5177}\u{FF0C}\u{4F20}\u{5165}\u{FF1A}
7701
+ - requirement_description: \u{4E0A}\u{8FF0}\u{751F}\u{6210}\u{7684}\u{7ED3}\u{6784}\u{5316}\u{9700}\u{6C42}\u{6587}\u{6863}
7702
+ - user_input: \u{539F}\u{59CB}\u{7528}\u{6237}\u{9700}\u{6C42}
7703
+
7704
+ ---
7705
+
7706
+ **\u{6267}\u{884C}\u{539F}\u{5219}\u{FF1A}**
7707
+ - \u{521B}\u{5EFA}\u{5E76}\u{6301}\u{7EED}\u{66F4}\u{65B0}TODO\u{6E05}\u{5355}
7708
+ - \u{6301}\u{7EED}\u{5DE5}\u{4F5C}\u{81F3}\u{5B8C}\u{6210}
7709
+ - \u{4F18}\u{5148}\u{4F7F}\u{7528} grepSearch \u{548C} readFile \u{4E86}\u{89E3}\u{73B0}\u{6709}\u{4EE3}\u{7801}
7710
+ - \u{5206}\u{6790}\u{8981}\u{5177}\u{4F53}\u{3001}\u{53EF}\u{6267}\u{884C}\u{FF0C}\u{907F}\u{514D}\u{7A7A}\u{6CDB}\u{63CF}\u{8FF0}
7711
+ - \u{6280}\u{672F}\u{65B9}\u{6848}\u{8981}\u{8003}\u{8651}\u{9879}\u{76EE}\u{5B9E}\u{9645}\u{60C5}\u{51B5}
7712
+ `;
7713
+ return {
7714
+ content: [
7715
+ {
7716
+ type: "text",
7717
+ text: JSON.stringify({
7718
+ success: true,
7719
+ message: "\u9700\u6C42\u5206\u6790\u6307\u5BFC\u5DF2\u751F\u6210\uFF0C\u8BF7AI\u6309\u7167\u6307\u5F15\u6267\u884C\u5206\u6790",
7720
+ data: {
7721
+ guidance: guidancePrompt,
7722
+ user_input,
7723
+ project_context: project_context || "\u672A\u6307\u5B9A",
7724
+ recommended_tools: [
7725
+ "listDirectory - \u67E5\u770B\u9879\u76EE\u7ED3\u6784",
7726
+ "grepSearch - \u641C\u7D22\u76F8\u5173\u4EE3\u7801",
7727
+ "readFile - \u8BFB\u53D6\u5173\u952E\u6587\u4EF6",
7728
+ "fileSearch - \u67E5\u627E\u7279\u5B9A\u6587\u4EF6"
7729
+ ],
7730
+ next_tool: "requirement-aligner"
7731
+ }
7732
+ }, null, 2)
7733
+ }
7734
+ ]
7735
+ };
7736
+ } catch (error) {
7737
+ return {
7738
+ content: [
7739
+ {
7740
+ type: "text",
7741
+ text: JSON.stringify({
7742
+ success: false,
7743
+ message: `\u{9700}\u{6C42}\u{8BC6}\u{522B}\u{5931}\u{8D25}: ${error.message}`,
7744
+ data: null
7745
+ })
7746
+ }
7747
+ ],
7748
+ isError: true
7749
+ };
7750
+ }
7751
+ }
7752
+ };
7753
+ const requirementAlignerTool = {
7754
+ name: "requirement-aligner",
7755
+ description: "\u57FA\u4E8E\u9700\u6C42\u5206\u6790\u7ED3\u679C\uFF0C\u6307\u5BFCAI\u751F\u6210\u8BE6\u7EC6\u7684\u5B9E\u65BD\u8BA1\u5212\uFF0C\u5305\u62EC\u6587\u4EF6\u521B\u5EFA\u3001\u4EE3\u7801\u7F16\u5199\u3001\u6D4B\u8BD5\u9A8C\u8BC1\u7B49\u5177\u4F53\u64CD\u4F5C\u6B65\u9AA4",
7756
+ inputSchema: {
7757
+ requirement_description: stringType().describe("\u7B2C\u4E00\u6B65\u751F\u6210\u7684\u7ED3\u6784\u5316\u9700\u6C42\u63CF\u8FF0"),
7758
+ user_input: stringType().describe("\u7528\u6237\u539F\u59CB\u9700\u6C42")
7759
+ },
7760
+ handler: async (args)=>{
7761
+ try {
7762
+ const { requirement_description, user_input } = args;
7763
+ const implementationGuidance = `
7764
+ # \u{7CFB}\u{7EDF}\u{5316}\u{5B9E}\u{65BD}\u{8BA1}\u{5212}\u{6307}\u{5BFC}
7765
+
7766
+ ## \u{9700}\u{6C42}\u{56DE}\u{987E}
7767
+ ${requirement_description}
7768
+
7769
+ ## TODO\u{6E05}\u{5355}\u{6807}\u{51C6}\u{6D41}\u{7A0B}
7770
+
7771
+ ### 1. \u{9700}\u{6C42}\u{5206}\u{6790}\u{FF08}\u{5DF2}\u{5B8C}\u{6210}\u{FF09}
7772
+ - \u{2705} \u{5DF2}\u{751F}\u{6210}\u{7ED3}\u{6784}\u{5316}\u{9700}\u{6C42}\u{6587}\u{6863}
7773
+ - \u{2705} \u{5DF2}\u{660E}\u{786E}\u{6838}\u{5FC3}\u{529F}\u{80FD}\u{548C}\u{6280}\u{672F}\u{65B9}\u{6848}
7774
+
7775
+ ### 2. \u{573A}\u{666F}\u{8BC6}\u{522B}
7776
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
7777
+ - \u{57FA}\u{4E8E}\u{9700}\u{6C42}\u{5206}\u{6790}\u{7684}\u{5185}\u{5BB9}\u{FF0C}\u{627E}\u{51FA}\u{4E3B}\u{8981}\u{77DB}\u{76FE}\u{70B9}\u{FF0C}\u{5B9A}\u{4F4D}\u{6838}\u{5FC3}\u{95EE}\u{9898}\u{8282}\u{70B9}
7778
+ - \u{4ECE}\u{7CFB}\u{7EDF}\u{5C42}\u{9762}\u{62C6}\u{89E3}\u{4E3A}\u{53EF}\u{6267}\u{884C}\u{5B50}\u{4EFB}\u{52A1}\u{FF0C}\u{786E}\u{4FDD}\u{903B}\u{8F91}\u{94FE}\u{6761}\u{6E05}\u{6670}\u{FF0C}\u{4E0A}\u{4E0B}\u{6587}\u{4FE1}\u{606F}\u{5145}\u{8DB3}
7779
+
7780
+ **\u{4F7F}\u{7528}\u{5DE5}\u{5177}\u{FF1A}** listDirectory, readFile, grepSearch
7781
+
7782
+ **\u{64CD}\u{4F5C}\u{6307}\u{5F15}\u{FF1A}**
7783
+ 1. \u{4F7F}\u{7528} listDirectory \u{5206}\u{6790}\u{73B0}\u{6709}\u{670D}\u{52A1}\u{76EE}\u{5F55}\u{7ED3}\u{6784}\u{FF08}\u{5982} src/services/\u{FF09}
7784
+ 2. \u{4F7F}\u{7528} readFile \u{67E5}\u{770B}\u{7C7B}\u{4F3C}\u{670D}\u{52A1}\u{7684}\u{5B9E}\u{73B0}\u{6A21}\u{5F0F}\u{FF08}\u{53C2}\u{8003}\u{73B0}\u{6709}\u{670D}\u{52A1}\u{FF09}
7785
+ 3. \u{4F7F}\u{7528} grepSearch \u{641C}\u{7D22}\u{76F8}\u{5173}\u{7C7B}\u{578B}\u{5B9A}\u{4E49}\u{3001}\u{5DE5}\u{5177}\u{51FD}\u{6570}
7786
+ 4. \u{786E}\u{5B9A}\u{65B0}\u{529F}\u{80FD}\u{7684}\u{6587}\u{4EF6}\u{7EC4}\u{7EC7}\u{65B9}\u{5F0F}\u{FF0C}\u{4FDD}\u{6301}\u{4E0E}\u{73B0}\u{6709}\u{67B6}\u{6784}\u{4E00}\u{81F4}
7787
+
7788
+ **\u{8F93}\u{51FA}\u{FF1A}** \u{573A}\u{666F}\u{5206}\u{6790}\u{62A5}\u{544A}\u{548C}\u{4EFB}\u{52A1}\u{5206}\u{89E3}\u{6E05}\u{5355}
7789
+
7790
+ ### 3. \u{65B9}\u{6848}\u{8BBE}\u{8BA1}
7791
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
7792
+ - \u{65B9}\u{6848}\u{8BBE}\u{8BA1}\u{4F18}\u{5148}\u{590D}\u{7528}\u{73B0}\u{6709}\u{65B9}\u{6848}\u{FF0C}\u{7EC4}\u{4EF6}\u{FF0C}\u{5DE5}\u{5177}\u{65B9}\u{6CD5}\u{7B49}\u{FF0C}\u{80FD}\u{590D}\u{7528}\u{7684}\u{5C3D}\u{53EF}\u{80FD}\u{590D}\u{7528}
7793
+ - \u{626B}\u{63CF}\u{9879}\u{76EE}\u{4E2D}\u{4F7F}\u{7528}\u{7684}\u{6D4B}\u{8BD5}\u{6846}\u{67B6}\u{548C}\u{811A}\u{672C}\u{FF0C}\u{751F}\u{6210}\u{672C}\u{6B21}\u{9700}\u{6C42}\u{7684}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{FF0C}\u{5982}\u{679C}\u{4E0D}\u{5B58}\u{5728}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{FF0C}\u{5219}\u{7F16}\u{5199}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{5230}.aico/tests\u{4E0B}\u{9762}
7794
+
7795
+ **\u{4F7F}\u{7528}\u{5DE5}\u{5177}\u{FF1A}** readFile, grepSearch
7796
+
7797
+ **\u{64CD}\u{4F5C}\u{6307}\u{5F15}\u{FF1A}**
7798
+ 1. \u{4F7F}\u{7528} readFile \u{8BFB}\u{53D6} package.json\u{FF0C}\u{786E}\u{8BA4}\u{53EF}\u{7528}\u{4F9D}\u{8D56}
7799
+ 2. \u{4F7F}\u{7528} grepSearch \u{641C}\u{7D22}\u{73B0}\u{6709}\u{7C7B}\u{578B}\u{5B9A}\u{4E49}\u{FF0C}\u{590D}\u{7528}\u{5DF2}\u{6709}\u{7C7B}\u{578B}
7800
+ 3. \u{786E}\u{5B9A}\u{9700}\u{8981}\u{65B0}\u{589E}\u{7684}\u{7C7B}\u{578B}\u{5B9A}\u{4E49}
7801
+ 4. \u{68C0}\u{67E5}\u{662F}\u{5426}\u{9700}\u{8981}\u{5B89}\u{88C5}\u{65B0}\u{4F9D}\u{8D56}
7802
+ 5. \u{67E5}\u{627E}\u{73B0}\u{6709}\u{6D4B}\u{8BD5}\u{6846}\u{67B6}\u{548C}\u{811A}\u{672C}\u{6A21}\u{5F0F}
7803
+
7804
+ **\u{8F93}\u{51FA}\u{FF1A}**
7805
+ - \u{6587}\u{4EF6}\u{7ED3}\u{6784}\u{6E05}\u{5355}
7806
+ - \u{4F9D}\u{8D56}\u{6E05}\u{5355}\u{548C}\u{7C7B}\u{578B}\u{5B9A}\u{4E49}\u{65B9}\u{6848}
7807
+ - \u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{65B9}\u{6848}
7808
+
7809
+ **\u{6587}\u{4EF6}\u{7ED3}\u{6784}\u{6A21}\u{677F}\u{FF1A}**
7810
+ \`\`\`
7811
+ src/services/[\u{529F}\u{80FD}\u{540D}]/
7812
+ \u{251C}\u{2500}\u{2500} index.ts # \u{4E3B}\u{5165}\u{53E3}\u{548C}\u{5DE5}\u{5177}\u{5B9A}\u{4E49}
7813
+ \u{251C}\u{2500}\u{2500} core/ # \u{6838}\u{5FC3}\u{4E1A}\u{52A1}\u{903B}\u{8F91}
7814
+ \u{251C}\u{2500}\u{2500} types/ # \u{7C7B}\u{578B}\u{5B9A}\u{4E49}
7815
+ \u{2514}\u{2500}\u{2500} utils/ # \u{5DE5}\u{5177}\u{51FD}\u{6570}
7816
+
7817
+ .aico/tests/
7818
+ \u{2514}\u{2500}\u{2500} [\u{529F}\u{80FD}\u{540D}].test.ts # \u{6D4B}\u{8BD5}\u{811A}\u{672C}
7819
+ \`\`\`
7820
+
7821
+ ### 4. \u{6267}\u{884C}\u{9A8C}\u{8BC1}
7822
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
7823
+ - \u{6309}\u{65B9}\u{6848}\u{8BBE}\u{8BA1}\u{7684}\u{7ED3}\u{679C}\u{8F93}\u{51FA}\u{4EE3}\u{7801}
7824
+ - \u{5982}\u{679C}\u{6709}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{FF0C}\u{8FD0}\u{884C}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{5E76}\u{4FEE}\u{6B63}\u{76F4}\u{5230}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{5168}\u{90E8}\u{901A}\u{8FC7}
7825
+
7826
+ ### 5. \u{603B}\u{7ED3}\u{53CD}\u{9988}
7827
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
7828
+ - \u{8F93}\u{51FA}\u{6700}\u{7EC8}\u{6267}\u{884C}\u{7684}\u{65B9}\u{6848}
7829
+ - \u{66F4}\u{65B0}TODO\u{6E05}\u{5355}
7830
+ - \u{6839}\u{636E}\u{60C5}\u{51B5}\u{63D0}\u{4F9B}\u{4E00}\u{4E9B}\u{524D}\u{77BB}\u{6027}\u{7684}\u{601D}\u{8003}\u{6216}\u{5EFA}\u{8BAE}
7831
+
7832
+ ## \u{4E0B}\u{4E00}\u{6B65}\u{64CD}\u{4F5C}
7833
+ \u{5B8C}\u{6210}\u{5B9E}\u{65BD}\u{8BA1}\u{5212}\u{540E}\u{FF0C}\u{8C03}\u{7528} **task-executor** \u{5DE5}\u{5177}\u{FF0C}\u{4F20}\u{5165}\u{FF1A}
7834
+ - implementation_plan: \u{4E0A}\u{8FF0}\u{751F}\u{6210}\u{7684}\u{8BE6}\u{7EC6}\u{5B9E}\u{65BD}TODO\u{6E05}\u{5355}
7835
+ - requirement_description: \u{7ED3}\u{6784}\u{5316}\u{9700}\u{6C42}\u{6587}\u{6863}
7836
+ - user_confirmed: true\u{FF08}\u{786E}\u{8BA4}\u{6267}\u{884C}\u{8BA1}\u{5212}\u{FF09}
7837
+
7838
+ ---
7839
+
7840
+ **\u{6267}\u{884C}\u{539F}\u{5219}\u{FF1A}**
7841
+ - \u{521B}\u{5EFA}\u{5E76}\u{6301}\u{7EED}\u{66F4}\u{65B0}TODO\u{6E05}\u{5355}
7842
+ - \u{6301}\u{7EED}\u{5DE5}\u{4F5C}\u{81F3}\u{5B8C}\u{6210}
7843
+ - \u{4F18}\u{5148}\u{590D}\u{7528}\u{73B0}\u{6709}\u{7EC4}\u{4EF6}\u{548C}\u{5DE5}\u{5177}
7844
+ - \u{786E}\u{4FDD}\u{6D4B}\u{8BD5}\u{8986}\u{76D6}\u{7387}\u{548C}\u{8D28}\u{91CF}
7845
+
7846
+ ### \u{7B2C}\u{4E09}\u{6B65}\u{FF1A}\u{751F}\u{6210}\u{5B9E}\u{65BD}TODO\u{6E05}\u{5355}
7847
+ \u{57FA}\u{4E8E}\u{4E0A}\u{8FF0}\u{5206}\u{6790}\u{FF0C}\u{751F}\u{6210}\u{5177}\u{4F53}\u{7684}\u{5B9E}\u{65BD}\u{6B65}\u{9AA4}\u{FF1A}
7848
+
7849
+ \`\`\`markdown
7850
+ ## \u{5B9E}\u{65BD}TODO\u{6E05}\u{5355}
7851
+
7852
+ ### \u{51C6}\u{5907}\u{9636}\u{6BB5}
7853
+ - [ ] \u{521B}\u{5EFA}\u{670D}\u{52A1}\u{76EE}\u{5F55}\u{7ED3}\u{6784}
7854
+ - [ ] \u{5B9A}\u{4E49}\u{6838}\u{5FC3}\u{7C7B}\u{578B}\u{FF08}\u{4F7F}\u{7528} fsWrite \u{521B}\u{5EFA} types.ts\u{FF09}
7855
+ - [ ] \u{51C6}\u{5907}\u{5DE5}\u{5177}\u{51FD}\u{6570}\u{FF08}\u{4F7F}\u{7528} fsWrite \u{521B}\u{5EFA} utils.ts\u{FF09}
7856
+
7857
+ ### \u{5B9E}\u{73B0}\u{9636}\u{6BB5}
7858
+ - [ ] \u{5B9E}\u{73B0}\u{6838}\u{5FC3}\u{4E1A}\u{52A1}\u{903B}\u{8F91}\u{FF08}\u{4F7F}\u{7528} fsWrite \u{521B}\u{5EFA}\u{6838}\u{5FC3}\u{6587}\u{4EF6}\u{FF09}
7859
+ - [ ] \u{5B9A}\u{4E49}MCP\u{5DE5}\u{5177}\u{63A5}\u{53E3}\u{FF08}\u{4F7F}\u{7528} strReplace \u{66F4}\u{65B0} index.ts\u{FF09}
7860
+ - [ ] \u{96C6}\u{6210}\u{5230}\u{4E3B}\u{670D}\u{52A1}\u{FF08}\u{4F7F}\u{7528} strReplace \u{66F4}\u{65B0} src/services/index.ts\u{FF09}
7861
+ - [ ] \u{6DFB}\u{52A0}\u{9519}\u{8BEF}\u{5904}\u{7406}\u{548C}\u{53C2}\u{6570}\u{9A8C}\u{8BC1}
7862
+
7863
+ ### \u{9A8C}\u{8BC1}\u{9636}\u{6BB5}
7864
+ - [ ] \u{4F7F}\u{7528} getDiagnostics \u{68C0}\u{67E5}\u{7C7B}\u{578B}\u{9519}\u{8BEF}
7865
+ - [ ] \u{4F7F}\u{7528} executeBash \u{8FD0}\u{884C}\u{6784}\u{5EFA}\u{547D}\u{4EE4}
7866
+ - [ ] \u{521B}\u{5EFA}\u{6D4B}\u{8BD5}\u{6587}\u{4EF6}\u{FF08}\u{4F7F}\u{7528} fsWrite\u{FF09}
7867
+ - [ ] \u{6267}\u{884C}\u{6D4B}\u{8BD5}\u{9A8C}\u{8BC1}\u{529F}\u{80FD}
7868
+
7869
+ ### \u{4F18}\u{5316}\u{9636}\u{6BB5}
7870
+ - [ ] \u{4EE3}\u{7801}\u{5BA1}\u{67E5}\u{548C}\u{91CD}\u{6784}
7871
+ - [ ] \u{6DFB}\u{52A0}\u{6CE8}\u{91CA}\u{6587}\u{6863}
7872
+ - [ ] \u{6027}\u{80FD}\u{4F18}\u{5316}
7873
+ \`\`\`
7874
+
7875
+ ### \u{7B2C}\u{56DB}\u{6B65}\u{FF1A}\u{5411}\u{7528}\u{6237}\u{5C55}\u{793A}\u{8BA1}\u{5212}\u{5E76}\u{8BF7}\u{6C42}\u{786E}\u{8BA4}
7876
+ **\u{5C55}\u{793A}\u{5185}\u{5BB9}\u{FF1A}**
7877
+ 1. \u{6587}\u{4EF6}\u{7ED3}\u{6784}\u{8BBE}\u{8BA1}
7878
+ 2. \u{6838}\u{5FC3}\u{529F}\u{80FD}\u{6A21}\u{5757}\u{8BF4}\u{660E}
7879
+ 3. \u{6280}\u{672F}\u{5B9E}\u{73B0}\u{8981}\u{70B9}
7880
+ 4. \u{9884}\u{8BA1}\u{5DE5}\u{4F5C}\u{91CF}
7881
+
7882
+ **\u{786E}\u{8BA4}\u{95EE}\u{9898}\u{FF1A}**
7883
+ - \u{6587}\u{4EF6}\u{7EC4}\u{7EC7}\u{7ED3}\u{6784}\u{662F}\u{5426}\u{5408}\u{7406}\u{FF1F}
7884
+ - \u{6280}\u{672F}\u{65B9}\u{6848}\u{662F}\u{5426}\u{53EF}\u{884C}\u{FF1F}
7885
+ - \u{662F}\u{5426}\u{6709}\u{9057}\u{6F0F}\u{7684}\u{529F}\u{80FD}\u{70B9}\u{FF1F}
7886
+ - \u{662F}\u{5426}\u{9700}\u{8981}\u{8C03}\u{6574}\u{4F18}\u{5148}\u{7EA7}\u{FF1F}
7887
+
7888
+ ### \u{7B2C}\u{4E94}\u{6B65}\u{FF1A}\u{7528}\u{6237}\u{786E}\u{8BA4}\u{540E}\u{8C03}\u{7528}\u{4E0B}\u{4E00}\u{4E2A}\u{5DE5}\u{5177}
7889
+ \u{7528}\u{6237}\u{786E}\u{8BA4}\u{540E}\u{FF0C}\u{8C03}\u{7528} **task-executor** \u{5DE5}\u{5177}\u{FF0C}\u{4F20}\u{5165}\u{FF1A}
7890
+ - implementation_plan: \u{4E0A}\u{8FF0}\u{751F}\u{6210}\u{7684}\u{5B9E}\u{65BD}TODO\u{6E05}\u{5355}
7891
+ - requirement_description: \u{9700}\u{6C42}\u{63CF}\u{8FF0}
7892
+ - user_confirmed: true
7893
+
7894
+ ---
7895
+
7896
+ **\u{91CD}\u{8981}\u{63D0}\u{793A}\u{FF1A}**
7897
+ - \u{8BA1}\u{5212}\u{8981}\u{5177}\u{4F53}\u{5230}\u{6BCF}\u{4E2A}\u{6587}\u{4EF6}\u{3001}\u{6BCF}\u{4E2A}\u{51FD}\u{6570}
7898
+ - \u{660E}\u{786E}\u{4F7F}\u{7528}\u{54EA}\u{4E9B}Kiro\u{5DE5}\u{5177}\u{5B8C}\u{6210}\u{54EA}\u{4E9B}\u{64CD}\u{4F5C}
7899
+ - \u{8003}\u{8651}\u{73B0}\u{6709}\u{4EE3}\u{7801}\u{89C4}\u{8303}\u{548C}\u{67B6}\u{6784}\u{6A21}\u{5F0F}
7900
+ - \u{5FC5}\u{987B}\u{7B49}\u{5F85}\u{7528}\u{6237}\u{786E}\u{8BA4}\u{540E}\u{624D}\u{80FD}\u{6267}\u{884C}
7901
+ `;
7902
+ return {
7903
+ content: [
7904
+ {
7905
+ type: "text",
7906
+ text: JSON.stringify({
7907
+ success: true,
7908
+ message: "\u5B9E\u65BD\u8BA1\u5212\u6307\u5BFC\u5DF2\u751F\u6210\uFF0C\u8BF7AI\u6309\u7167\u6307\u5F15\u751F\u6210\u8BE6\u7EC6\u8BA1\u5212\u5E76\u8BF7\u6C42\u7528\u6237\u786E\u8BA4",
7909
+ data: {
7910
+ guidance: implementationGuidance,
7911
+ requirement_description,
7912
+ user_input,
7913
+ recommended_tools: [
7914
+ "listDirectory - \u5206\u6790\u76EE\u5F55\u7ED3\u6784",
7915
+ "readFile - \u8BFB\u53D6\u53C2\u8003\u6587\u4EF6",
7916
+ "grepSearch - \u641C\u7D22\u76F8\u5173\u4EE3\u7801",
7917
+ "fsWrite - \u521B\u5EFA\u65B0\u6587\u4EF6",
7918
+ "strReplace - \u4FEE\u6539\u73B0\u6709\u6587\u4EF6"
7919
+ ],
7920
+ require_user_confirmation: true,
7921
+ next_tool: "task-executor"
7922
+ }
7923
+ }, null, 2)
7924
+ }
7925
+ ]
7926
+ };
7927
+ } catch (error) {
7928
+ return {
7929
+ content: [
7930
+ {
7931
+ type: "text",
7932
+ text: JSON.stringify({
7933
+ success: false,
7934
+ message: `\u{8BA1}\u{5212}\u{751F}\u{6210}\u{5931}\u{8D25}: ${error.message}`,
7935
+ data: null
7936
+ })
7937
+ }
7938
+ ],
7939
+ isError: true
7940
+ };
7941
+ }
7942
+ }
7943
+ };
7944
+ const taskExecutorTool = {
7945
+ name: "task-executor",
7946
+ description: "\u6307\u5BFCAI\u9010\u6B65\u6267\u884C\u5B9E\u65BD\u8BA1\u5212\uFF0C\u5305\u62EC\u6587\u4EF6\u521B\u5EFA\u3001\u4EE3\u7801\u7F16\u5199\u3001\u6D4B\u8BD5\u9A8C\u8BC1\uFF0C\u5E76\u751F\u6210\u6267\u884C\u603B\u7ED3",
7947
+ inputSchema: {
7948
+ implementation_plan: stringType().describe("\u7B2C\u4E8C\u6B65\u751F\u6210\u7684\u5B9E\u65BDTODO\u6E05\u5355"),
7949
+ requirement_description: stringType().describe("\u9700\u6C42\u63CF\u8FF0"),
7950
+ user_confirmed: booleanType().describe("\u7528\u6237\u662F\u5426\u786E\u8BA4\u6267\u884C\u8BA1\u5212")
7951
+ },
7952
+ handler: async (args)=>{
7953
+ try {
7954
+ const { implementation_plan, requirement_description, user_confirmed } = args;
7955
+ if (!user_confirmed) return {
7956
+ content: [
7957
+ {
7958
+ type: "text",
7959
+ text: JSON.stringify({
7960
+ success: false,
7961
+ message: "\u7528\u6237\u672A\u786E\u8BA4\u6267\u884C\u8BA1\u5212\uFF0C\u4EFB\u52A1\u7EC8\u6B62",
7962
+ data: {
7963
+ tip: "\u8BF7\u7528\u6237\u786E\u8BA4\u8BA1\u5212\u540E\u91CD\u65B0\u8C03\u7528\u6B64\u5DE5\u5177"
7964
+ }
7965
+ })
7966
+ }
7967
+ ]
7968
+ };
7969
+ const executionGuidance = `
7970
+ # \u{7CFB}\u{7EDF}\u{5316}\u{4EFB}\u{52A1}\u{6267}\u{884C}\u{6307}\u{5BFC}
7971
+
7972
+ ## \u{5B9E}\u{65BD}\u{8BA1}\u{5212}
7973
+ ${implementation_plan}
7974
+
7975
+ ## \u{9700}\u{6C42}\u{63CF}\u{8FF0}
7976
+ ${requirement_description}
7977
+
7978
+ ## TODO\u{6E05}\u{5355}\u{6807}\u{51C6}\u{6D41}\u{7A0B}
7979
+
7980
+ ### 1. \u{9700}\u{6C42}\u{5206}\u{6790}\u{FF08}\u{5DF2}\u{5B8C}\u{6210}\u{FF09}
7981
+ - \u{2705} \u{5DF2}\u{751F}\u{6210}\u{7ED3}\u{6784}\u{5316}\u{9700}\u{6C42}\u{6587}\u{6863}
7982
+ - \u{2705} \u{5DF2}\u{660E}\u{786E}\u{6838}\u{5FC3}\u{529F}\u{80FD}\u{548C}\u{6280}\u{672F}\u{65B9}\u{6848}
7983
+ - \u{2705} \u{7528}\u{6237}\u{5DF2}\u{786E}\u{8BA4}\u{6267}\u{884C}\u{8BA1}\u{5212}
7984
+
7985
+ ### 2. \u{573A}\u{666F}\u{8BC6}\u{522B}
7986
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
7987
+ - \u{57FA}\u{4E8E}\u{9700}\u{6C42}\u{5206}\u{6790}\u{7684}\u{5185}\u{5BB9}\u{FF0C}\u{627E}\u{51FA}\u{4E3B}\u{8981}\u{77DB}\u{76FE}\u{70B9}\u{FF0C}\u{5B9A}\u{4F4D}\u{6838}\u{5FC3}\u{95EE}\u{9898}\u{8282}\u{70B9}
7988
+ - \u{4ECE}\u{7CFB}\u{7EDF}\u{5C42}\u{9762}\u{62C6}\u{89E3}\u{4E3A}\u{53EF}\u{6267}\u{884C}\u{5B50}\u{4EFB}\u{52A1}\u{FF0C}\u{786E}\u{4FDD}\u{903B}\u{8F91}\u{94FE}\u{6761}\u{6E05}\u{6670}\u{FF0C}\u{4E0A}\u{4E0B}\u{6587}\u{4FE1}\u{606F}\u{5145}\u{8DB3}
7989
+
7990
+ **\u{4F7F}\u{7528}\u{5DE5}\u{5177}\u{FF1A}** listDirectory, readFile, grepSearch
7991
+
7992
+ **\u{64CD}\u{4F5C}\u{6307}\u{5F15}\u{FF1A}**
7993
+ \`\`\`
7994
+ 1. listDirectory("src/services") \u{67E5}\u{770B}\u{670D}\u{52A1}\u{76EE}\u{5F55}\u{7ED3}\u{6784}
7995
+ 2. readFile("src/services/[\u{53C2}\u{8003}\u{670D}\u{52A1}]/index.ts") \u{5B66}\u{4E60}\u{5B9E}\u{73B0}\u{6A21}\u{5F0F}
7996
+ 3. readFile("src/services/index.ts") \u{4E86}\u{89E3}\u{670D}\u{52A1}\u{6CE8}\u{518C}\u{65B9}\u{5F0F}
7997
+ 4. grepSearch("\u{76F8}\u{5173}\u{5173}\u{952E}\u{8BCD}", includePattern: "*.ts") \u{641C}\u{7D22}\u{76F8}\u{5173}\u{5B9E}\u{73B0}
7998
+ 5. readFile("package.json") \u{786E}\u{8BA4}\u{53EF}\u{7528}\u{4F9D}\u{8D56}
7999
+ 6. readFile("tsconfig.json") \u{4E86}\u{89E3}TypeScript\u{914D}\u{7F6E}
8000
+ \`\`\`
8001
+
8002
+ **\u{8F93}\u{51FA}\u{FF1A}** \u{573A}\u{666F}\u{5206}\u{6790}\u{62A5}\u{544A}\u{548C}\u{4EFB}\u{52A1}\u{5206}\u{89E3}\u{6E05}\u{5355}
8003
+
8004
+ ### 3. \u{65B9}\u{6848}\u{8BBE}\u{8BA1}
8005
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
8006
+ - \u{65B9}\u{6848}\u{8BBE}\u{8BA1}\u{4F18}\u{5148}\u{590D}\u{7528}\u{73B0}\u{6709}\u{65B9}\u{6848}\u{FF0C}\u{7EC4}\u{4EF6}\u{FF0C}\u{5DE5}\u{5177}\u{65B9}\u{6CD5}\u{7B49}\u{FF0C}\u{80FD}\u{590D}\u{7528}\u{7684}\u{5C3D}\u{53EF}\u{80FD}\u{590D}\u{7528}
8007
+ - \u{626B}\u{63CF}\u{9879}\u{76EE}\u{4E2D}\u{4F7F}\u{7528}\u{7684}\u{6D4B}\u{8BD5}\u{6846}\u{67B6}\u{548C}\u{811A}\u{672C}\u{FF0C}\u{751F}\u{6210}\u{672C}\u{6B21}\u{9700}\u{6C42}\u{7684}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{FF0C}\u{5982}\u{679C}\u{4E0D}\u{5B58}\u{5728}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{FF0C}\u{5219}\u{7F16}\u{5199}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{5230}.aico/tests\u{4E0B}\u{9762}
8008
+
8009
+ **\u{4F7F}\u{7528}\u{5DE5}\u{5177}\u{FF1A}** grepSearch, readFile
8010
+
8011
+ **\u{64CD}\u{4F5C}\u{6307}\u{5F15}\u{FF1A}**
8012
+ \`\`\`
8013
+ 1. \u{641C}\u{7D22}\u{73B0}\u{6709}\u{7C7B}\u{578B}\u{5B9A}\u{4E49}\u{FF0C}\u{590D}\u{7528}\u{5DF2}\u{6709}\u{7C7B}\u{578B}
8014
+ 2. \u{786E}\u{5B9A}\u{9700}\u{8981}\u{65B0}\u{589E}\u{7684}\u{7C7B}\u{578B}\u{5B9A}\u{4E49}
8015
+ 3. \u{68C0}\u{67E5}\u{662F}\u{5426}\u{9700}\u{8981}\u{5B89}\u{88C5}\u{65B0}\u{4F9D}\u{8D56}
8016
+ 4. \u{67E5}\u{627E}\u{73B0}\u{6709}\u{6D4B}\u{8BD5}\u{6846}\u{67B6}\u{548C}\u{811A}\u{672C}\u{6A21}\u{5F0F}
8017
+ 5. \u{8BBE}\u{8BA1}\u{6587}\u{4EF6}\u{7ED3}\u{6784}\u{FF0C}\u{4FDD}\u{6301}\u{4E0E}\u{73B0}\u{6709}\u{67B6}\u{6784}\u{4E00}\u{81F4}
8018
+ \`\`\`
8019
+
8020
+ **\u{8F93}\u{51FA}\u{FF1A}**
8021
+ - \u{6587}\u{4EF6}\u{7ED3}\u{6784}\u{6E05}\u{5355}
8022
+ - \u{4F9D}\u{8D56}\u{6E05}\u{5355}\u{548C}\u{7C7B}\u{578B}\u{5B9A}\u{4E49}\u{65B9}\u{6848}
8023
+ - \u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{65B9}\u{6848}
8024
+
8025
+ ### 4. \u{6267}\u{884C}\u{9A8C}\u{8BC1}
8026
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
8027
+ - \u{6309}\u{65B9}\u{6848}\u{8BBE}\u{8BA1}\u{7684}\u{7ED3}\u{679C}\u{8F93}\u{51FA}\u{4EE3}\u{7801}
8028
+ - \u{5982}\u{679C}\u{6709}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{FF0C}\u{8FD0}\u{884C}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{5E76}\u{4FEE}\u{6B63}\u{76F4}\u{5230}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{5168}\u{90E8}\u{901A}\u{8FC7}
8029
+
8030
+ **4.1 \u{4EE3}\u{7801}\u{5B9E}\u{73B0}\u{9636}\u{6BB5}**
8031
+ **\u{5DE5}\u{5177}\u{FF1A}** fsWrite, strReplace, fsAppend
8032
+
8033
+ **\u{64CD}\u{4F5C}\u{987A}\u{5E8F}\u{FF1A}**
8034
+ \`\`\`
8035
+ 1. fsWrite("src/services/[\u{529F}\u{80FD}\u{540D}]/types.ts", "\u{7C7B}\u{578B}\u{5B9A}\u{4E49}\u{5185}\u{5BB9}")
8036
+ 2. fsWrite("src/services/[\u{529F}\u{80FD}\u{540D}]/utils.ts", "\u{5DE5}\u{5177}\u{51FD}\u{6570}\u{5185}\u{5BB9}")
8037
+ 3. fsWrite("src/services/[\u{529F}\u{80FD}\u{540D}]/core/[\u{6838}\u{5FC3}\u{6A21}\u{5757}].ts", "\u{6838}\u{5FC3}\u{903B}\u{8F91}")
8038
+ 4. fsWrite("src/services/[\u{529F}\u{80FD}\u{540D}]/index.ts", "\u{4E3B}\u{5165}\u{53E3}\u{548C}MCP\u{5DE5}\u{5177}\u{5B9A}\u{4E49}")
8039
+ 5. strReplace("src/services/index.ts") \u{6DFB}\u{52A0}import\u{8BED}\u{53E5}\u{548C}\u{6CE8}\u{518C}\u{65B0}\u{5DE5}\u{5177}
8040
+ 6. fsWrite(".aico/tests/[\u{529F}\u{80FD}\u{540D}].test.ts", "\u{6D4B}\u{8BD5}\u{811A}\u{672C}")
8041
+ \`\`\`
8042
+
8043
+ **\u{6CE8}\u{610F}\u{4E8B}\u{9879}\u{FF1A}**
8044
+ - \u{9075}\u{5FAA}\u{73B0}\u{6709}\u{4EE3}\u{7801}\u{89C4}\u{8303}\u{548C}\u{547D}\u{540D}\u{7EA6}\u{5B9A}
8045
+ - \u{4F7F}\u{7528}Zod\u{8FDB}\u{884C}\u{53C2}\u{6570}\u{9A8C}\u{8BC1}
8046
+ - \u{6DFB}\u{52A0}\u{5B8C}\u{6574}\u{7684}\u{9519}\u{8BEF}\u{5904}\u{7406}
8047
+ - \u{7F16}\u{5199}\u{6E05}\u{6670}\u{7684}\u{51FD}\u{6570}\u{6CE8}\u{91CA}
8048
+
8049
+ **4.2 \u{9A8C}\u{8BC1}\u{6D4B}\u{8BD5}\u{9636}\u{6BB5}**
8050
+ **\u{5DE5}\u{5177}\u{FF1A}** getDiagnostics, executeBash
8051
+
8052
+ **\u{64CD}\u{4F5C}\u{6307}\u{5F15}\u{FF1A}**
8053
+ \`\`\`
8054
+ 1. getDiagnostics(["src/services/[\u{529F}\u{80FD}\u{540D}]/index.ts", "src/services/index.ts"])
8055
+ 2. executeBash("npm run build") \u{6267}\u{884C}\u{6784}\u{5EFA}
8056
+ 3. executeBash("node .aico/tests/[\u{529F}\u{80FD}\u{540D}].test.ts") \u{8FD0}\u{884C}\u{6D4B}\u{8BD5}
8057
+ 4. \u{5982}\u{6709}\u{9519}\u{8BEF}\u{FF0C}\u{4F7F}\u{7528} strReplace \u{4FEE}\u{590D}\u{4EE3}\u{7801}
8058
+ 5. \u{5FAA}\u{73AF}\u{6267}\u{884C}\u{76F4}\u{5230}\u{6240}\u{6709}\u{6D4B}\u{8BD5}\u{901A}\u{8FC7}
8059
+ \`\`\`
8060
+
8061
+ ### 5. \u{603B}\u{7ED3}\u{53CD}\u{9988}
8062
+ **\u{6267}\u{884C}\u{6B65}\u{9AA4}\u{FF1A}**
8063
+ - \u{8F93}\u{51FA}\u{6700}\u{7EC8}\u{6267}\u{884C}\u{7684}\u{65B9}\u{6848}
8064
+ - \u{66F4}\u{65B0}TODO\u{6E05}\u{5355}
8065
+ - \u{6839}\u{636E}\u{60C5}\u{51B5}\u{63D0}\u{4F9B}\u{4E00}\u{4E9B}\u{524D}\u{77BB}\u{6027}\u{7684}\u{601D}\u{8003}\u{6216}\u{5EFA}\u{8BAE}
8066
+
8067
+ **5.1 \u{4EE3}\u{7801}\u{5BA1}\u{67E5}**
8068
+ **\u{68C0}\u{67E5}\u{9879}\u{FF1A}**
8069
+ - [ ] \u{4EE3}\u{7801}\u{7B26}\u{5408}\u{9879}\u{76EE}\u{89C4}\u{8303}
8070
+ - [ ] \u{9519}\u{8BEF}\u{5904}\u{7406}\u{5B8C}\u{5584}
8071
+ - [ ] \u{7C7B}\u{578B}\u{5B9A}\u{4E49}\u{6E05}\u{6670}
8072
+ - [ ] \u{6CE8}\u{91CA}\u{6587}\u{6863}\u{5B8C}\u{6574}
8073
+ - [ ] \u{65E0}\u{5197}\u{4F59}\u{4EE3}\u{7801}
8074
+ - [ ] \u{6D4B}\u{8BD5}\u{8986}\u{76D6}\u{7387}\u{8FBE}\u{6807}
8075
+
8076
+ **5.2 \u{6027}\u{80FD}\u{4F18}\u{5316}**
8077
+ **\u{8003}\u{8651}\u{70B9}\u{FF1A}**
8078
+ - \u{5F02}\u{6B65}\u{64CD}\u{4F5C}\u{662F}\u{5426}\u{5408}\u{7406}
8079
+ - \u{662F}\u{5426}\u{6709}\u{4E0D}\u{5FC5}\u{8981}\u{7684}\u{6587}\u{4EF6}\u{8BFB}\u{53D6}
8080
+ - \u{9519}\u{8BEF}\u{5904}\u{7406}\u{662F}\u{5426}\u{9AD8}\u{6548}
8081
+ - \u{5185}\u{5B58}\u{4F7F}\u{7528}\u{662F}\u{5426}\u{4F18}\u{5316}
8082
+
8083
+ **5.3 \u{751F}\u{6210}\u{603B}\u{7ED3}\u{62A5}\u{544A}**
8084
+ \`\`\`markdown
8085
+ ## \u{6267}\u{884C}\u{603B}\u{7ED3}
8086
+
8087
+ ### \u{5B8C}\u{6210}\u{5185}\u{5BB9}
8088
+ - \u{521B}\u{5EFA}\u{7684}\u{6587}\u{4EF6}\u{5217}\u{8868}
8089
+ - \u{5B9E}\u{73B0}\u{7684}\u{6838}\u{5FC3}\u{529F}\u{80FD}
8090
+ - \u{96C6}\u{6210}\u{7684}\u{670D}\u{52A1}
8091
+ - \u{7F16}\u{5199}\u{7684}\u{6D4B}\u{8BD5}\u{811A}\u{672C}
8092
+
8093
+ ### \u{6280}\u{672F}\u{8981}\u{70B9}
8094
+ - \u{4F7F}\u{7528}\u{7684}\u{5173}\u{952E}\u{6280}\u{672F}
8095
+ - \u{89E3}\u{51B3}\u{7684}\u{4E3B}\u{8981}\u{95EE}\u{9898}
8096
+ - \u{590D}\u{7528}\u{7684}\u{73B0}\u{6709}\u{7EC4}\u{4EF6}
8097
+
8098
+ ### \u{9A8C}\u{8BC1}\u{7ED3}\u{679C}
8099
+ - \u{7C7B}\u{578B}\u{68C0}\u{67E5}\u{FF1A}\u{901A}\u{8FC7}/\u{5931}\u{8D25}
8100
+ - \u{6784}\u{5EFA}\u{6D4B}\u{8BD5}\u{FF1A}\u{901A}\u{8FC7}/\u{5931}\u{8D25}
8101
+ - \u{529F}\u{80FD}\u{6D4B}\u{8BD5}\u{FF1A}\u{901A}\u{8FC7}/\u{5931}\u{8D25}
8102
+ - \u{6D4B}\u{8BD5}\u{8986}\u{76D6}\u{7387}\u{FF1A}XX%
8103
+
8104
+ ### TODO\u{6E05}\u{5355}\u{66F4}\u{65B0}
8105
+ - \u{2705} \u{9700}\u{6C42}\u{5206}\u{6790}
8106
+ - \u{2705} \u{573A}\u{666F}\u{8BC6}\u{522B}
8107
+ - \u{2705} \u{65B9}\u{6848}\u{8BBE}\u{8BA1}
8108
+ - \u{2705} \u{6267}\u{884C}\u{9A8C}\u{8BC1}
8109
+ - \u{2705} \u{603B}\u{7ED3}\u{53CD}\u{9988}
8110
+
8111
+ ### \u{540E}\u{7EED}\u{5EFA}\u{8BAE}
8112
+ - \u{53EF}\u{4F18}\u{5316}\u{7684}\u{70B9}
8113
+ - \u{53EF}\u{6269}\u{5C55}\u{7684}\u{65B9}\u{5411}
8114
+ - \u{7EF4}\u{62A4}\u{5EFA}\u{8BAE}
8115
+ \`\`\`
8116
+
8117
+ ---
8118
+
8119
+ ## \u{6267}\u{884C}\u{539F}\u{5219}
8120
+
8121
+ 1. **\u{521B}\u{5EFA}\u{5E76}\u{6301}\u{7EED}\u{66F4}\u{65B0}TODO\u{6E05}\u{5355}**
8122
+ 2. **\u{6301}\u{7EED}\u{5DE5}\u{4F5C}\u{81F3}\u{5B8C}\u{6210}**
8123
+ 3. **\u{6E10}\u{8FDB}\u{5F0F}\u{5B9E}\u{73B0}**\u{FF1A}\u{5148}\u{5B9E}\u{73B0}\u{6838}\u{5FC3}\u{529F}\u{80FD}\u{FF0C}\u{518D}\u{5B8C}\u{5584}\u{7EC6}\u{8282}
8124
+ 4. **\u{6301}\u{7EED}\u{9A8C}\u{8BC1}**\u{FF1A}\u{6BCF}\u{5B8C}\u{6210}\u{4E00}\u{4E2A}\u{6A21}\u{5757}\u{7ACB}\u{5373}\u{4F7F}\u{7528} getDiagnostics \u{68C0}\u{67E5}
8125
+ 5. **\u{53C2}\u{8003}\u{73B0}\u{6709}\u{4EE3}\u{7801}**\u{FF1A}\u{4FDD}\u{6301}\u{4E0E}\u{9879}\u{76EE}\u{98CE}\u{683C}\u{4E00}\u{81F4}
8126
+ 6. **\u{9519}\u{8BEF}\u{5904}\u{7406}\u{4F18}\u{5148}**\u{FF1A}\u{786E}\u{4FDD}\u{6240}\u{6709}\u{5F02}\u{5E38}\u{60C5}\u{51B5}\u{90FD}\u{6709}\u{5904}\u{7406}
8127
+ 7. **\u{6D4B}\u{8BD5}\u{9A71}\u{52A8}**\u{FF1A}\u{8FB9}\u{5F00}\u{53D1}\u{8FB9}\u{6D4B}\u{8BD5}\u{FF0C}\u{53CA}\u{65F6}\u{53D1}\u{73B0}\u{95EE}\u{9898}
8128
+
8129
+ ## \u{5DE5}\u{5177}\u{4F7F}\u{7528}\u{4F18}\u{5148}\u{7EA7}
8130
+
8131
+ 1. **\u{5206}\u{6790}\u{9636}\u{6BB5}**\u{FF1A}listDirectory \u{2192} readFile \u{2192} grepSearch
8132
+ 2. **\u{8BBE}\u{8BA1}\u{9636}\u{6BB5}**\u{FF1A}grepSearch \u{2192} readFile\u{FF08}\u{67E5}\u{627E}\u{53EF}\u{590D}\u{7528}\u{7EC4}\u{4EF6}\u{FF09}
8133
+ 3. **\u{5B9E}\u{73B0}\u{9636}\u{6BB5}**\u{FF1A}fsWrite \u{2192} strReplace \u{2192} fsAppend
8134
+ 4. **\u{9A8C}\u{8BC1}\u{9636}\u{6BB5}**\u{FF1A}getDiagnostics \u{2192} executeBash
8135
+ 5. **\u{4FEE}\u{590D}\u{9636}\u{6BB5}**\u{FF1A}strReplace \u{2192} getDiagnostics\u{FF08}\u{5FAA}\u{73AF}\u{76F4}\u{5230}\u{65E0}\u{9519}\u{8BEF}\u{FF09}
8136
+ 6. **\u{6D4B}\u{8BD5}\u{9636}\u{6BB5}**\u{FF1A}executeBash\u{FF08}\u{8FD0}\u{884C}\u{6D4B}\u{8BD5}\u{811A}\u{672C}\u{FF09}
8137
+
8138
+ ---
8139
+
8140
+ **\u{73B0}\u{5728}\u{5F00}\u{59CB}\u{6267}\u{884C}\u{4EFB}\u{52A1}\u{FF0C}\u{6309}\u{7167}\u{7CFB}\u{7EDF}\u{5316}\u{6D41}\u{7A0B}\u{9010}\u{6B65}\u{5B8C}\u{6210}\u{5B9E}\u{65BD}\u{8BA1}\u{5212}\u{FF01}**
8141
+ `;
8142
+ return {
8143
+ content: [
8144
+ {
8145
+ type: "text",
8146
+ text: JSON.stringify({
8147
+ success: true,
8148
+ message: "\u4EFB\u52A1\u6267\u884C\u6307\u5BFC\u5DF2\u751F\u6210\uFF0CAI\u5C06\u6309\u7167\u6307\u5F15\u9010\u6B65\u5B8C\u6210\u5B9E\u65BD",
8149
+ data: {
8150
+ guidance: executionGuidance,
8151
+ implementation_plan,
8152
+ requirement_description,
8153
+ execution_phases: [
8154
+ "\u51C6\u5907\u5DE5\u4F5C - \u5206\u6790\u73B0\u6709\u4EE3\u7801",
8155
+ "\u4EE3\u7801\u5B9E\u73B0 - \u521B\u5EFA\u6587\u4EF6\u548C\u7F16\u5199\u4EE3\u7801",
8156
+ "\u9A8C\u8BC1\u6D4B\u8BD5 - \u7C7B\u578B\u68C0\u67E5\u548C\u529F\u80FD\u6D4B\u8BD5",
8157
+ "\u4F18\u5316\u5B8C\u5584 - \u4EE3\u7801\u5BA1\u67E5\u548C\u6027\u80FD\u4F18\u5316",
8158
+ "\u751F\u6210\u603B\u7ED3 - \u8F93\u51FA\u6267\u884C\u62A5\u544A"
8159
+ ],
8160
+ recommended_tool_sequence: [
8161
+ "listDirectory \u2192 readFile \u2192 grepSearch (\u5206\u6790)",
8162
+ "fsWrite \u2192 strReplace (\u5B9E\u73B0)",
8163
+ "getDiagnostics \u2192 executeBash (\u9A8C\u8BC1)",
8164
+ "strReplace \u2192 getDiagnostics (\u4FEE\u590D)"
8165
+ ]
8166
+ }
8167
+ }, null, 2)
8168
+ }
8169
+ ]
8170
+ };
8171
+ } catch (error) {
8172
+ return {
8173
+ content: [
8174
+ {
8175
+ type: "text",
8176
+ text: JSON.stringify({
8177
+ success: false,
8178
+ message: `\u{4EFB}\u{52A1}\u{6267}\u{884C}\u{5931}\u{8D25}: ${error.message}`,
8179
+ data: null
8180
+ })
8181
+ }
8182
+ ],
8183
+ isError: true
8184
+ };
8185
+ }
8186
+ }
8187
+ };
7210
8188
  function createMcpServer() {
7211
8189
  const server = new mcp_js_namespaceObject.McpServer({
7212
8190
  name: SERVICE_CONFIG.name,
@@ -7215,12 +8193,16 @@ ${JSON.stringify(filteredData.slice(0, 3), null, 2)}
7215
8193
  const tools = [
7216
8194
  word2mdTool,
7217
8195
  pdf2mdTool,
8196
+ requirementAnalyzerTool,
7218
8197
  changeSummarizer,
7219
8198
  read_imageTool,
7220
8199
  imageConverterTool,
7221
8200
  imageRecognitionAgentTool,
7222
8201
  readExcelTool,
7223
- exportExcelTool
8202
+ exportExcelTool,
8203
+ requirementIdentifierTool,
8204
+ requirementAlignerTool,
8205
+ taskExecutorTool
7224
8206
  ];
7225
8207
  tools.forEach((tool)=>{
7226
8208
  server.tool(tool.name, tool.description, tool.inputSchema, tool.handler);
@@ -7229,7 +8211,7 @@ ${JSON.stringify(filteredData.slice(0, 3), null, 2)}
7229
8211
  }
7230
8212
  const src_server = createMcpServer();
7231
8213
  const transport = new stdio_js_namespaceObject.StdioServerTransport();
7232
- logger.info("\u542F\u52A8\u667A\u80FD\u8F6F\u4EF6\u661F\u5DE5\u5382 MCP \u670D\u52A1\u5668 (stdio\u6A21\u5F0F)");
8214
+ logger_logger.info("\u542F\u52A8\u667A\u80FD\u8F6F\u4EF6\u661F\u5DE5\u5382 MCP \u670D\u52A1\u5668 (stdio\u6A21\u5F0F)");
7233
8215
  (async ()=>{
7234
8216
  await src_server.connect(transport);
7235
8217
  })();