intention-coding 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -148,13 +148,11 @@ const external_winston_namespaceObject = require("winston");
148
148
  var external_winston_default = /*#__PURE__*/ __webpack_require__.n(external_winston_namespaceObject);
149
149
  const external_winston_daily_rotate_file_namespaceObject = require("winston-daily-rotate-file");
150
150
  var external_winston_daily_rotate_file_default = /*#__PURE__*/ __webpack_require__.n(external_winston_daily_rotate_file_namespaceObject);
151
- const external_path_namespaceObject = require("path");
152
- var external_path_default = /*#__PURE__*/ __webpack_require__.n(external_path_namespaceObject);
153
151
  const external_fs_namespaceObject = require("fs");
154
152
  var external_fs_default = /*#__PURE__*/ __webpack_require__.n(external_fs_namespaceObject);
155
- external_path_default().join(process.cwd(), '.aico');
153
+ const config_PROJECT_ROOT = process.env.MCP_STORAGE_DIR || process.cwd();
156
154
  const getStorageDir = ()=>{
157
- const envDir = process.env.MCP_STORAGE_DIR + "/.aico";
155
+ const envDir = config_PROJECT_ROOT + "/.aico";
158
156
  if (!external_fs_namespaceObject.existsSync(envDir)) external_fs_namespaceObject.mkdirSync(envDir, {
159
157
  recursive: true
160
158
  });
@@ -165,6 +163,8 @@ const SERVICE_CONFIG = {
165
163
  version: "0.0.1",
166
164
  description: "\u8F6F\u4EF6\u5DE5\u7A0B\u5316\u7684\u9700\u6C42\u5206\u6790\uFF0C\u529F\u80FD\u8BBE\u8BA1\uFF0C\u4EE3\u7801\u7F16\u5199\uFF0C\u6D4B\u8BD5\u8FD0\u884C\u548C\u53D1\u5E03\u90E8\u7F72"
167
165
  };
166
+ const external_path_namespaceObject = require("path");
167
+ var external_path_default = /*#__PURE__*/ __webpack_require__.n(external_path_namespaceObject);
168
168
  const logDir = getStorageDir() + '/logs';
169
169
  const levels = {
170
170
  error: 0,
@@ -194,8 +194,8 @@ const transports = [
194
194
  filename: external_path_default().join(logDir, 'application-%DATE%.log'),
195
195
  datePattern: 'YYYY-MM-DD',
196
196
  zippedArchive: true,
197
- maxSize: '20m',
198
- maxFiles: '14d',
197
+ maxSize: '2m',
198
+ maxFiles: '7d',
199
199
  format: fileFormat,
200
200
  level: 'info'
201
201
  })
@@ -213,7 +213,7 @@ const logger_logger = external_winston_default().createLogger({
213
213
  datePattern: 'YYYY-MM-DD',
214
214
  zippedArchive: true,
215
215
  maxSize: '1m',
216
- maxFiles: '14d',
216
+ maxFiles: '7d',
217
217
  format: fileFormat
218
218
  })
219
219
  ],
@@ -223,7 +223,7 @@ const logger_logger = external_winston_default().createLogger({
223
223
  datePattern: 'YYYY-MM-DD',
224
224
  zippedArchive: true,
225
225
  maxSize: '1m',
226
- maxFiles: '14d',
226
+ maxFiles: '7d',
227
227
  format: fileFormat
228
228
  })
229
229
  ]
@@ -3917,7 +3917,7 @@ const RequirementManagerParams = objectType({
3917
3917
  ]).describe("\u9700\u6C42\u5206\u7C7B")
3918
3918
  });
3919
3919
  const ArchitectureDesignerParams = objectType({
3920
- design_focus: stringType().optional().default("full_architecture").describe("\u8BBE\u8BA1\u91CD\u70B9")
3920
+ design_focus: stringType().optional().default("full_architecture").describe("\u8BBE\u8BA1\u91CD\u70B9,\u9879\u76EE\u67B6\u6784\u8BBE\u8BA1")
3921
3921
  });
3922
3922
  async function invokeFlow(params, streamCb) {
3923
3923
  const { appid = 'app-ESTcrkOPOmkxdrO0120mE4s1', data, timeout = 1800000 } = params;
@@ -4120,19 +4120,35 @@ const requirementClarifier = {
4120
4120
  user_input
4121
4121
  });
4122
4122
  const fileName = sanitizeFileName(analysisContent.length > 10 ? analysisContent.substring(0, 10) : `analysis_${Date.now()}`);
4123
- const mdDir = external_path_default().join(getStorageDir(), 'requirement');
4123
+ const mdDir = external_path_default().join(getStorageDir(), 'prd');
4124
4124
  await promises_default().mkdir(mdDir, {
4125
4125
  recursive: true
4126
4126
  });
4127
4127
  const mdPath = external_path_default().join(mdDir, `${fileName}.md`);
4128
4128
  const mdPathResolved = external_path_default().resolve(mdPath);
4129
- await promises_default().writeFile(mdPath, analysisContent, 'utf8');
4129
+ const subContents = await getSubAnalysis(analysisContent);
4130
+ let finalContent = analysisContent;
4131
+ let jumpLinks = [];
4132
+ if (subContents.length > 0) {
4133
+ jumpLinks = await saveSubAnalysisFiles(mdDir, subContents);
4134
+ finalContent = addJumpLinks(analysisContent, jumpLinks);
4135
+ logger_logger.info({
4136
+ module: 'requirement_clarifier',
4137
+ message: `\u{6210}\u{529F}\u{5904}\u{7406}${subContents.length}\u{4E2A}\u{7EC6}\u{5206}\u{9879}`,
4138
+ jumpLinks: jumpLinks.map((link)=>({
4139
+ title: link.title,
4140
+ file: external_path_default().basename(link.path)
4141
+ }))
4142
+ });
4143
+ }
4144
+ await promises_default().writeFile(mdPath, finalContent, 'utf8');
4130
4145
  logger_logger.info({
4131
4146
  module: 'requirement_clarifier',
4132
4147
  message: "\u9700\u6C42\u5206\u6790\u6587\u4EF6\u5DF2\u4FDD\u5B58",
4133
- path: mdPathResolved
4148
+ path: mdPathResolved,
4149
+ hasSubFiles: jumpLinks.length > 0
4134
4150
  });
4135
- return formatAnalysisPrompt(user_input, context, analysisContent, mdPathResolved);
4151
+ return formatAnalysisPrompt(user_input, finalContent, mdPathResolved);
4136
4152
  } catch (error) {
4137
4153
  const errorMsg = `\u{9700}\u{6C42}\u{5206}\u{6790}\u{5931}\u{8D25}: ${error instanceof Error ? error.message : String(error)}`;
4138
4154
  logger_logger.error({
@@ -4167,13 +4183,98 @@ const getAiAnalysis = async (input)=>{
4167
4183
  throw new Error(`AI\u{5206}\u{6790}\u{8BF7}\u{6C42}\u{5931}\u{8D25}: ${error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF"}`);
4168
4184
  }
4169
4185
  };
4170
- const formatAnalysisPrompt = (userInput, context, content, filePath)=>`# \u{1F50D} AI\u{9700}\u{6C42}\u{5206}\u{6790}\u{5B8C}\u{6210}
4186
+ const getSubAnalysis = async (content)=>{
4187
+ try {
4188
+ const response = await invokeFlow({
4189
+ appid: 'app-aiEw80lPBus0DfybAGbW8PvX',
4190
+ data: {
4191
+ content
4192
+ }
4193
+ });
4194
+ return response.outputs.result;
4195
+ } catch (error) {
4196
+ const errorMsg = `\u{7EC6}\u{5206}\u{5206}\u{6790}\u{8BF7}\u{6C42}\u{5931}\u{8D25}: ${error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF"}`;
4197
+ logger_logger.error({
4198
+ module: 'requirement_clarifier',
4199
+ message: errorMsg,
4200
+ stack: error instanceof Error ? error.stack : void 0
4201
+ });
4202
+ return [];
4203
+ }
4204
+ };
4205
+ const saveSubAnalysisFiles = async (mainDir, contentArray)=>{
4206
+ const subFiles = [];
4207
+ for(let i = 0; i < contentArray.length; i++){
4208
+ const content = contentArray[i];
4209
+ let title = `\u{5B50}\u{529F}\u{80FD}-${i + 1}`;
4210
+ const titleMatch = content.replace(/\n/g, '').match(/^###\s+([\s\S]*?)(?=#|$)/);
4211
+ if (titleMatch) title = titleMatch[1].trim();
4212
+ const safeFileName = `${sanitizeFileName(title)}.md`;
4213
+ const filePath = external_path_default().join(mainDir, safeFileName);
4214
+ try {
4215
+ await promises_default().writeFile(filePath, content, 'utf8');
4216
+ subFiles.push({
4217
+ title,
4218
+ path: filePath
4219
+ });
4220
+ logger_logger.debug({
4221
+ module: 'requirement_clarifier',
4222
+ message: "\u7EC6\u5206\u5206\u6790\u6587\u4EF6\u5DF2\u4FDD\u5B58",
4223
+ path: filePath,
4224
+ title
4225
+ });
4226
+ } catch (error) {
4227
+ logger_logger.error({
4228
+ module: 'requirement_clarifier',
4229
+ message: `\u{4FDD}\u{5B58}\u{7EC6}\u{5206}\u{6587}\u{4EF6}\u{5931}\u{8D25}: ${error instanceof Error ? error.message : String(error)}`,
4230
+ filePath,
4231
+ contentPreview: content.substring(0, 50) + '...'
4232
+ });
4233
+ }
4234
+ }
4235
+ return subFiles;
4236
+ };
4237
+ const addJumpLinks = (mainContent, subFiles)=>{
4238
+ if (!subFiles.length) return mainContent;
4239
+ const titleMap = new Map();
4240
+ subFiles.forEach((file)=>{
4241
+ const simpleTitle = file.title.replace(/[^\w\u4e00-\u9fa5]+/g, '').toLowerCase();
4242
+ titleMap.set(simpleTitle, external_path_default().basename(file.path));
4243
+ });
4244
+ const sections = mainContent.split(/(\n###\s+[^\n]+\n)/);
4245
+ const processedSections = [];
4246
+ for(let i = 0; i < sections.length; i++){
4247
+ const section = sections[i];
4248
+ if (section.startsWith('\n### ')) {
4249
+ const titleMatch = section.match(/###\s+([\s\S]+?)\n/);
4250
+ if (!titleMatch) {
4251
+ processedSections.push(section);
4252
+ continue;
4253
+ }
4254
+ const rawTitle = titleMatch[1].trim();
4255
+ const simpleTitle = rawTitle.replace(/[^\w\u4e00-\u9fa5]+/g, '').toLowerCase();
4256
+ const fileName = titleMap.get(simpleTitle);
4257
+ if (fileName) {
4258
+ const linkedSection = section.replace(/(###\s+)([\s\S]+?)(\n)/, `$1$2 <a href="./${fileName}" style="float:right;">\u{1F4CE}</a>$3`);
4259
+ processedSections.push(linkedSection);
4260
+ titleMap.delete(simpleTitle);
4261
+ continue;
4262
+ }
4263
+ }
4264
+ processedSections.push(section);
4265
+ }
4266
+ if (titleMap.size > 0) {
4267
+ processedSections.push("\n\n### \u8BE6\u7EC6\u5206\u6790\n");
4268
+ titleMap.forEach((fileName, title)=>{
4269
+ processedSections.push(`- [\u{67E5}\u{770B}${title}\u{5206}\u{6790}](./${fileName})\n`);
4270
+ });
4271
+ }
4272
+ return processedSections.join('');
4273
+ };
4274
+ const formatAnalysisPrompt = (userInput, content, filePath)=>`# \u{1F50D} AI\u{9700}\u{6C42}\u{5206}\u{6790}\u{5B8C}\u{6210}
4171
4275
 
4172
4276
  ## \u{1F4DD} \u{7528}\u{6237}\u{539F}\u{59CB}\u{9700}\u{6C42}
4173
4277
  ${userInput}
4174
-
4175
- ## \u{1F4CB} \u{5F53}\u{524D}\u{4E0A}\u{4E0B}\u{6587}
4176
- ${context}
4177
4278
  ------------------------------
4178
4279
  ## \u{1F52C} \u{9700}\u{6C42}\u{5206}\u{6790}\u{7ED3}\u{679C}
4179
4280
  ${content}
@@ -4231,26 +4332,6 @@ class RequirementStorage {
4231
4332
  console.error(`\u{274C} \u{4FDD}\u{5B58}\u{9700}\u{6C42}\u{6587}\u{6863}\u{5931}\u{8D25}: ${e}`);
4232
4333
  }
4233
4334
  }
4234
- saveHistoryEntry(entryType, content, metadata = {}) {
4235
- try {
4236
- const historyEntry = {
4237
- timestamp: new Date().toISOString(),
4238
- type: entryType,
4239
- content,
4240
- metadata
4241
- };
4242
- let history = [];
4243
- if (external_fs_namespaceObject.existsSync(this.historyFile)) {
4244
- const data = external_fs_namespaceObject.readFileSync(this.historyFile, "utf8");
4245
- history = JSON.parse(data);
4246
- }
4247
- history.push(historyEntry);
4248
- external_fs_namespaceObject.writeFileSync(this.historyFile, JSON.stringify(history, null, 2), "utf8");
4249
- console.log(`\u{2705} \u{5386}\u{53F2}\u{8BB0}\u{5F55}\u{5DF2}\u{4FDD}\u{5B58}: ${entryType}`);
4250
- } catch (e) {
4251
- console.error(`\u{274C} \u{4FDD}\u{5B58}\u{5386}\u{53F2}\u{8BB0}\u{5F55}\u{5931}\u{8D25}: ${e}`);
4252
- }
4253
- }
4254
4335
  exportFinalDocument(currentRequirements) {
4255
4336
  try {
4256
4337
  const finalDoc = {
@@ -4363,9 +4444,6 @@ function addRequirementEntry(type, category, content) {
4363
4444
  requirements_utils_currentRequirements[type] = [
4364
4445
  requirementEntry
4365
4446
  ];
4366
- requirements_utils_storage.saveHistoryEntry(type, content, {
4367
- category
4368
- });
4369
4447
  requirements_utils_storage.saveRequirements(requirements_utils_currentRequirements);
4370
4448
  return requirements_utils_currentRequirements;
4371
4449
  }
@@ -4404,123 +4482,173 @@ const requirementManagerTool = {
4404
4482
  return formatRequirementUpdateResponse(category, clarified_info, requirements_utils_currentRequirements, storage.requirementsFile, storage.historyFile);
4405
4483
  }
4406
4484
  };
4485
+ const external_aico_pack_namespaceObject = require("aico-pack");
4486
+ async function packProject() {
4487
+ const mdDir = external_path_default().join(getStorageDir(), 'tech');
4488
+ await promises_default().mkdir(mdDir, {
4489
+ recursive: true
4490
+ });
4491
+ logger_logger.info(`\u{1F4C2} \u{6B63}\u{5728}\u{5206}\u{6790}\u{5F53}\u{524D}\u{672C}\u{5730}\u{9879}\u{76EE}`);
4492
+ const mdPath = external_path_default().join(mdDir, `\u{9879}\u{76EE}\u{67B6}\u{6784}\u{5206}\u{6790}.md`);
4493
+ const options = {
4494
+ output: mdPath,
4495
+ style: 'markdown',
4496
+ headerText: "\u667A\u80FD\u8F6F\u4EF6\u661F\u5DE5\u5382",
4497
+ fileSummary: true,
4498
+ removeEmptyLines: true,
4499
+ removeComments: true,
4500
+ showLineNumbers: true,
4501
+ compress: true,
4502
+ quiet: true,
4503
+ customPatterns: [
4504
+ "**/*.md",
4505
+ "**/*.log",
4506
+ "**/*.json",
4507
+ "**/*.dockerfile",
4508
+ "**/*.yml",
4509
+ "**/*.yaml",
4510
+ "**/*.sh",
4511
+ "**/*.env",
4512
+ "**/*.env.example",
4513
+ "**/LICENSE"
4514
+ ]
4515
+ };
4516
+ await (0, external_aico_pack_namespaceObject.runCli)([
4517
+ config_PROJECT_ROOT
4518
+ ], process.cwd(), options);
4519
+ return mdPath;
4520
+ }
4407
4521
  const architectureDesignerTool = {
4408
4522
  name: "architecture_designer",
4409
- description: "\u67B6\u6784\u8BBE\u8BA1\u751F\u6210\u5668 - \u57FA\u4E8E\u5B8C\u6574\u9700\u6C42\u751F\u6210\u6700\u4F18\u6280\u672F\u67B6\u6784\u65B9\u6848",
4523
+ description: "\u9879\u76EE\u67B6\u6784\u8BBE\u8BA1\u5E08 - \u57FA\u4E8E\u5B8C\u6574\u9700\u6C42\u751F\u6210\u6700\u4F18\u6280\u672F\u67B6\u6784\u65B9\u6848",
4410
4524
  parameters: ArchitectureDesignerParams,
4411
4525
  execute: async (args)=>{
4412
4526
  const { design_focus = "full_architecture" } = args;
4413
4527
  const storage = new RequirementStorage();
4414
- const architecture_design = `# \u{1F3D7}\u{FE0F} \u{9879}\u{76EE}\u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{65B9}\u{6848}
4528
+ try {
4529
+ const mdPath = await packProject();
4530
+ const architecture_design = `# \u{1F3D7}\u{FE0F} \u{9879}\u{76EE}\u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{65B9}\u{6848}
4415
4531
 
4416
4532
  ## \u{1F3AF} \u{8BBE}\u{8BA1}\u{76EE}\u{6807}
4417
4533
  - **\u{8BBE}\u{8BA1}\u{91CD}\u{70B9}**\u{FF1A}${design_focus}
4418
4534
  - **\u{4F18}\u{5316}\u{76EE}\u{6807}**\u{FF1A}AI\u{53CB}\u{597D}\u{3001}\u{4F4E}\u{8026}\u{5408}\u{3001}\u{53EF}\u{7EF4}\u{62A4}
4419
4535
 
4420
- ## \u{1F3DB}\u{FE0F} \u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{539F}\u{5219}\u{FF08}\u{9488}\u{5BF9}AI\u{5F00}\u{53D1}\u{4F18}\u{5316}\u{FF09}
4421
-
4422
- ### 1. \u{4F4E}\u{8026}\u{5408}\u{8BBE}\u{8BA1}\u{539F}\u{5219}
4423
- - **\u{6A21}\u{5757}\u{72EC}\u{7ACB}\u{6027}**\u{FF1A}\u{6BCF}\u{4E2A}\u{6A21}\u{5757}\u{529F}\u{80FD}\u{5355}\u{4E00}\u{FF0C}\u{8FB9}\u{754C}\u{6E05}\u{6670}
4424
- - **\u{63A5}\u{53E3}\u{6807}\u{51C6}\u{5316}**\u{FF1A}\u{7EDF}\u{4E00}\u{7684}API\u{63A5}\u{53E3}\u{89C4}\u{8303}
4425
- - **\u{4F9D}\u{8D56}\u{6700}\u{5C0F}\u{5316}**\u{FF1A}\u{51CF}\u{5C11}\u{6A21}\u{5757}\u{95F4}\u{7684}\u{5F3A}\u{4F9D}\u{8D56}\u{5173}\u{7CFB}
4426
- - **\u{9519}\u{8BEF}\u{9694}\u{79BB}**\u{FF1A}\u{5355}\u{4E2A}\u{6A21}\u{5757}\u{95EE}\u{9898}\u{4E0D}\u{5F71}\u{54CD}\u{6574}\u{4F53}\u{7CFB}\u{7EDF}
4536
+ ## \u{1F4C4} \u{5173}\u{952E}\u{6587}\u{6863}
4537
+ - [\u{1F517} \u{5B8C}\u{6574}\u{67B6}\u{6784}\u{5206}\u{6790}\u{62A5}\u{544A}](${mdPath})
4427
4538
 
4428
- ### 2. AI\u{53CB}\u{597D}\u{67B6}\u{6784}\u{539F}\u{5219}
4429
- - **\u{4EE3}\u{7801}\u{53EF}\u{7406}\u{89E3}\u{6027}**\u{FF1A}\u{6E05}\u{6670}\u{7684}\u{547D}\u{540D}\u{548C}\u{6CE8}\u{91CA}\u{89C4}\u{8303}
4430
- - **\u{6A21}\u{5757}\u{5316}\u{5F00}\u{53D1}**\u{FF1A}\u{907F}\u{514D}\u{5927}\u{6587}\u{4EF6}\u{FF0C}\u{4FBF}\u{4E8E}AI\u{7406}\u{89E3}\u{548C}\u{4FEE}\u{6539}
4431
- - **\u{6807}\u{51C6}\u{5316}\u{7ED3}\u{6784}**\u{FF1A}\u{7EDF}\u{4E00}\u{7684}\u{9879}\u{76EE}\u{7ED3}\u{6784}\u{548C}\u{4EE3}\u{7801}\u{7EC4}\u{7EC7}
4432
- - **\u{6E10}\u{8FDB}\u{5F0F}\u{5F00}\u{53D1}**\u{FF1A}\u{652F}\u{6301}\u{5206}\u{9636}\u{6BB5}\u{5B9E}\u{73B0}\u{548C}\u{6D4B}\u{8BD5}
4433
-
4434
- ## \u{1F527} \u{6280}\u{672F}\u{67B6}\u{6784}\u{5EFA}\u{8BAE}
4539
+ ## \u{1F916} AI\u{5F00}\u{53D1}\u{6700}\u{4F73}\u{5B9E}\u{8DF5}
4435
4540
 
4436
- ### \u{524D}\u{7AEF}\u{67B6}\u{6784}
4437
- **\u{63A8}\u{8350}\u{6280}\u{672F}\u{6808}\u{FF1A}**
4438
- - \u{6846}\u{67B6}\u{FF1A}React 18 / Vue 3 / Next.js 15
4439
- - \u{72B6}\u{6001}\u{7BA1}\u{7406}\u{FF1A}Redux Toolkit / Zustand / Pinia
4440
- - UI\u{7EC4}\u{4EF6}\u{FF1A}Ant Design / Material-UI / Tailwind CSS
4541
+ ### \u{6A21}\u{5757}\u{5F00}\u{53D1}\u{6307}\u{5BFC}
4542
+ 1. **\u{5148}\u{5B9E}\u{73B0}\u{6838}\u{5FC3}\u{903B}\u{8F91}**\u{FF1A}\u{4E13}\u{6CE8}\u{4E3B}\u{8981}\u{529F}\u{80FD}
4543
+ 2. **\u{518D}\u{6DFB}\u{52A0}\u{9519}\u{8BEF}\u{5904}\u{7406}**\u{FF1A}\u{5B8C}\u{5584}\u{5F02}\u{5E38}\u{5904}\u{7406}
4544
+ 3. **\u{6700}\u{540E}\u{8FDB}\u{884C}\u{4F18}\u{5316}**\u{FF1A}\u{6027}\u{80FD}\u{4F18}\u{5316}\u{548C}\u{4EE3}\u{7801}\u{91CD}\u{6784}
4441
4545
 
4442
- ### \u{540E}\u{7AEF}\u{67B6}\u{6784}
4443
- **\u{63A8}\u{8350}\u{6280}\u{672F}\u{6808}\u{FF1A}**
4444
- - \u{6846}\u{67B6}\u{FF1A}FastAPI / Express.js / Spring Boot
4445
- - \u{6570}\u{636E}\u{5E93}\u{FF1A}PostgreSQL / MySQL / MongoDB
4446
- - \u{7F13}\u{5B58}\u{FF1A}Redis / Memcached
4546
+ ### \u{80FD}\u{529B}\u{4F7F}\u{7528}\u{6307}\u{5357}
4547
+ > \u{5C06}\u{5B8C}\u{6574}\u{67B6}\u{6784}\u{5206}\u{6790}\u{62A5}\u{544A}\u{4F5C}\u{4E3A}\u{9644}\u{4EF6}\u{53D1}\u{9001}\u{7ED9}AI\u{FF0C}\u{53EF}\u{7528}\u{4E8E}\u{5B8C}\u{6210}\u{5982}\u{4E0B}\u{80FD}\u{529B}\u{FF1A}
4447
4548
 
4448
- ## \u{1F4E6} \u{529F}\u{80FD}\u{6A21}\u{5757}\u{5212}\u{5206}
4549
+ #### \u{5F00}\u{53D1}\u{8005}\u{6307}\u{5357}
4550
+ **\u{63D0}\u{793A}\u{8BCD}**\u{FF1A}
4551
+ \u{521B}\u{5EFA}\u{5305}\u{542B}\u{4EE5}\u{4E0B}\u{5185}\u{5BB9}\u{7684}\u{5F00}\u{53D1}\u{8005}\u{6307}\u{5357}\u{FF1A}
4552
+ 1. \u{73AF}\u{5883}\u{642D}\u{5EFA}\u{8BF4}\u{660E}
4553
+ 2. \u{9879}\u{76EE}\u{7ED3}\u{6784}\u{6982}\u{89C8}
4554
+ 3. \u{5F00}\u{53D1}\u{5DE5}\u{4F5C}\u{6D41}\u{7A0B}
4555
+ 4. \u{6D4B}\u{8BD5}\u{65B9}\u{6CD5}
4556
+ 5. \u{5E38}\u{89C1}\u{95EE}\u{9898}\u{6392}\u{67E5}\u{6B65}\u{9AA4}
4449
4557
 
4450
- ### \u{6838}\u{5FC3}\u{4E1A}\u{52A1}\u{6A21}\u{5757}
4451
- 1. **\u{7528}\u{6237}\u{7BA1}\u{7406}\u{6A21}\u{5757}**
4452
- - \u{529F}\u{80FD}\u{FF1A}\u{7528}\u{6237}\u{6CE8}\u{518C}\u{3001}\u{767B}\u{5F55}\u{3001}\u{6743}\u{9650}\u{7BA1}\u{7406}
4453
- - \u{63A5}\u{53E3}\u{FF1A}\u{7528}\u{6237}CRUD\u{3001}\u{8BA4}\u{8BC1}API
4454
- - AI\u{5F00}\u{53D1}\u{63D0}\u{793A}\u{FF1A}\u{5148}\u{5B9E}\u{73B0}\u{57FA}\u{7840}\u{8BA4}\u{8BC1}\u{FF0C}\u{518D}\u{6DFB}\u{52A0}\u{9AD8}\u{7EA7}\u{529F}\u{80FD}
4558
+ #### API \u{6587}\u{6863}
4559
+ **\u{63D0}\u{793A}\u{8BCD}**\u{FF1A}
4560
+ \u{751F}\u{6210}\u{5168}\u{9762}\u{7684} API \u{6587}\u{6863}\u{FF1A}
4561
+ 1. \u{5217}\u{51FA}\u{5E76}\u{63CF}\u{8FF0}\u{6240}\u{6709}\u{516C}\u{5171}\u{7AEF}\u{70B9}
4562
+ 2. \u{8BB0}\u{5F55}\u{8BF7}\u{6C42}/\u{54CD}\u{5E94}\u{683C}\u{5F0F}
4563
+ 3. \u{5305}\u{542B}\u{4F7F}\u{7528}\u{793A}\u{4F8B}
4564
+ 4. \u{8BF4}\u{660E}\u{9650}\u{5236}\u{548C}\u{7EA6}\u{675F}
4455
4565
 
4456
- 2. **\u{4E1A}\u{52A1}\u{6838}\u{5FC3}\u{6A21}\u{5757}**
4457
- - \u{529F}\u{80FD}\u{FF1A}[\u{6839}\u{636E}\u{5177}\u{4F53}\u{9700}\u{6C42}\u{5B9A}\u{5236}]
4458
- - \u{63A5}\u{53E3}\u{FF1A}\u{4E1A}\u{52A1}\u{903B}\u{8F91}API\u{3001}\u{6570}\u{636E}\u{5904}\u{7406}\u{63A5}\u{53E3}
4459
- - AI\u{5F00}\u{53D1}\u{63D0}\u{793A}\u{FF1A}\u{6309}\u{529F}\u{80FD}\u{4F18}\u{5148}\u{7EA7}\u{9010}\u{6B65}\u{5B9E}\u{73B0}
4566
+ #### \u{67B6}\u{6784}\u{6587}\u{6863}
4567
+ **\u{63D0}\u{793A}\u{8BCD}**\u{FF1A}
4568
+ \u{8BB0}\u{5F55}\u{7CFB}\u{7EDF}\u{67B6}\u{6784}\u{FF1A}
4569
+ 1. \u{9AD8}\u{5C42}\u{6982}\u{8FF0}
4570
+ 2. \u{7EC4}\u{4EF6}\u{4EA4}\u{4E92}
4571
+ 3. \u{6570}\u{636E}\u{6D41}\u{7A0B}\u{56FE}
4572
+ 4. \u{8BBE}\u{8BA1}\u{51B3}\u{7B56}\u{53CA}\u{7406}\u{7531}
4573
+ 5. \u{7CFB}\u{7EDF}\u{9650}\u{5236}\u{548C}\u{7EA6}\u{675F}
4460
4574
 
4461
- ## \u{1F4C5} \u{5F00}\u{53D1}\u{9636}\u{6BB5}\u{89C4}\u{5212}
4575
+ #### \u{4F9D}\u{8D56}\u{9879}\u{5206}\u{6790}
4576
+ **\u{63D0}\u{793A}\u{8BCD}**\u{FF1A}
4577
+ \u{5206}\u{6790}\u{9879}\u{76EE}\u{4F9D}\u{8D56}\u{FF1A}
4578
+ 1. \u{8BC6}\u{522B}\u{8FC7}\u{65F6}\u{7684}\u{5305}
4579
+ 2. \u{68C0}\u{67E5}\u{5B89}\u{5168}\u{6F0F}\u{6D1E}
4580
+ 3. \u{5EFA}\u{8BAE}\u{66FF}\u{4EE3}\u{5305}
4581
+ 4. \u{8BC4}\u{5BA1}\u{4F9D}\u{8D56}\u{4F7F}\u{7528}\u{6A21}\u{5F0F}
4462
4582
 
4463
- ### \u{7B2C}\u{4E00}\u{9636}\u{6BB5}\u{FF1A}\u{57FA}\u{7840}\u{6846}\u{67B6}\u{642D}\u{5EFA}\u{FF08}1-2\u{5468}\u{FF09}
4464
- - \u{9879}\u{76EE}\u{521D}\u{59CB}\u{5316}\u{548C}\u{73AF}\u{5883}\u{914D}\u{7F6E}
4465
- - \u{57FA}\u{7840}\u{6846}\u{67B6}\u{4EE3}\u{7801}\u{642D}\u{5EFA}
4466
- - \u{6570}\u{636E}\u{5E93}\u{8BBE}\u{8BA1}\u{548C}\u{521D}\u{59CB}\u{5316}
4583
+ \u{5305}\u{542B}\u{5177}\u{4F53}\u{7684}\u{5347}\u{7EA7}\u{5EFA}\u{8BAE}\u{3002}
4467
4584
 
4468
- ### \u{7B2C}\u{4E8C}\u{9636}\u{6BB5}\u{FF1A}\u{6838}\u{5FC3}\u{529F}\u{80FD}\u{5F00}\u{53D1}\u{FF08}2-4\u{5468}\u{FF09}
4469
- - \u{7528}\u{6237}\u{7BA1}\u{7406}\u{529F}\u{80FD}\u{5B9E}\u{73B0}
4470
- - \u{6838}\u{5FC3}\u{4E1A}\u{52A1}\u{903B}\u{8F91}\u{5F00}\u{53D1}
4471
- - \u{524D}\u{7AEF}\u{4E3B}\u{8981}\u{9875}\u{9762}\u{5B9E}\u{73B0}
4585
+ #### \u{6D4B}\u{8BD5}\u{8986}\u{76D6}\u{7387}
4586
+ **\u{63D0}\u{793A}\u{8BCD}**\u{FF1A}
4587
+ \u{8BC4}\u{5BA1}\u{6D4B}\u{8BD5}\u{8986}\u{76D6}\u{7387}\u{FF1A}
4588
+ 1. \u{8BC6}\u{522B}\u{672A}\u{6D4B}\u{8BD5}\u{7684}\u{7EC4}\u{4EF6}
4589
+ 2. \u{5EFA}\u{8BAE}\u{989D}\u{5916}\u{7684}\u{6D4B}\u{8BD5}\u{7528}\u{4F8B}
4590
+ 3. \u{8BC4}\u{5BA1}\u{6D4B}\u{8BD5}\u{8D28}\u{91CF}
4591
+ 4. \u{63A8}\u{8350}\u{6D4B}\u{8BD5}\u{7B56}\u{7565}
4472
4592
 
4473
- ### \u{7B2C}\u{4E09}\u{9636}\u{6BB5}\u{FF1A}\u{529F}\u{80FD}\u{5B8C}\u{5584}\u{548C}\u{4F18}\u{5316}\u{FF08}1-3\u{5468}\u{FF09}
4474
- - \u{6B21}\u{8981}\u{529F}\u{80FD}\u{5B9E}\u{73B0}
4475
- - \u{6027}\u{80FD}\u{4F18}\u{5316}\u{548C}\u{8C03}\u{8BD5}
4476
- - \u{7528}\u{6237}\u{4F53}\u{9A8C}\u{4F18}\u{5316}
4593
+ #### \u{4EE3}\u{7801}\u{8D28}\u{91CF}
4594
+ **\u{63D0}\u{793A}\u{8BCD}**\u{FF1A}
4595
+ \u{8BC4}\u{4F30}\u{4EE3}\u{7801}\u{8D28}\u{91CF}\u{5E76}\u{63D0}\u{51FA}\u{6539}\u{8FDB}\u{5EFA}\u{8BAE}\u{FF1A}
4596
+ 1. \u{8BC4}\u{5BA1}\u{547D}\u{540D}\u{89C4}\u{8303}
4597
+ 2. \u{68C0}\u{67E5}\u{4EE3}\u{7801}\u{7EC4}\u{7EC7}
4598
+ 3. \u{8BC4}\u{4F30}\u{9519}\u{8BEF}\u{5904}\u{7406}
4599
+ 4. \u{8BC4}\u{5BA1}\u{6CE8}\u{91CA}\u{5B9E}\u{8DF5}
4477
4600
 
4478
- ## \u{1F916} AI\u{5F00}\u{53D1}\u{6700}\u{4F73}\u{5B9E}\u{8DF5}
4601
+ \u{63D0}\u{4F9B}\u{5177}\u{4F53}\u{7684}\u{826F}\u{597D}\u{548C}\u{95EE}\u{9898}\u{6A21}\u{5F0F}\u{793A}\u{4F8B}\u{3002}
4479
4602
 
4480
- ### \u{6A21}\u{5757}\u{5F00}\u{53D1}\u{6307}\u{5BFC}
4481
- 1. **\u{5148}\u{5B9E}\u{73B0}\u{6838}\u{5FC3}\u{903B}\u{8F91}**\u{FF1A}\u{4E13}\u{6CE8}\u{4E3B}\u{8981}\u{529F}\u{80FD}
4482
- 2. **\u{518D}\u{6DFB}\u{52A0}\u{9519}\u{8BEF}\u{5904}\u{7406}**\u{FF1A}\u{5B8C}\u{5584}\u{5F02}\u{5E38}\u{5904}\u{7406}
4483
- 3. **\u{6700}\u{540E}\u{8FDB}\u{884C}\u{4F18}\u{5316}**\u{FF1A}\u{6027}\u{80FD}\u{4F18}\u{5316}\u{548C}\u{4EE3}\u{7801}\u{91CD}\u{6784}
4603
+ #### \u{67B6}\u{6784}\u{8BC4}\u{5BA1}
4604
+ **\u{63D0}\u{793A}\u{8BCD}**\u{FF1A}
4605
+ \u{5206}\u{6790}\u{6B64}\u{4EE3}\u{7801}\u{5E93}\u{7684}\u{67B6}\u{6784}\u{FF1A}
4606
+ 1. \u{8BC4}\u{4F30}\u{6574}\u{4F53}\u{7ED3}\u{6784}\u{548C}\u{6A21}\u{5F0F}
4607
+ 2. \u{8BC6}\u{522B}\u{6F5C}\u{5728}\u{7684}\u{67B6}\u{6784}\u{95EE}\u{9898}
4608
+ 3. \u{63D0}\u{51FA}\u{6539}\u{8FDB}\u{53EF}\u{6269}\u{5C55}\u{6027}\u{7684}\u{5EFA}\u{8BAE}
4609
+ 4. \u{6807}\u{6CE8}\u{9075}\u{5FAA}\u{6700}\u{4F73}\u{5B9E}\u{8DF5}\u{7684}\u{90E8}\u{5206}
4484
4610
 
4485
- ### \u{63A5}\u{53E3}\u{8BBE}\u{8BA1}\u{89C4}\u{8303}
4486
- - GET /api/users - \u{83B7}\u{53D6}\u{7528}\u{6237}\u{5217}\u{8868}
4487
- - POST /api/users - \u{521B}\u{5EFA}\u{7528}\u{6237}
4488
- - PUT /api/users/:id - \u{66F4}\u{65B0}\u{7528}\u{6237}
4489
- - DELETE /api/users/:id - \u{5220}\u{9664}\u{7528}\u{6237}
4611
+ \u{91CD}\u{70B9}\u{5173}\u{6CE8}\u{53EF}\u{7EF4}\u{62A4}\u{6027}\u{548C}\u{6A21}\u{5757}\u{5316}\u{3002}
4490
4612
 
4491
- ## \u{1F3AF} \u{603B}\u{7ED3}\u{548C}\u{5EFA}\u{8BAE}
4613
+ #### \u{5B89}\u{5168}\u{6027}\u{8BC4}\u{5BA1}
4614
+ **\u{63D0}\u{793A}\u{8BCD}**\u{FF1A}
4615
+ \u{5BF9}\u{6B64}\u{4EE3}\u{7801}\u{5E93}\u{8FDB}\u{884C}\u{5B89}\u{5168}\u{6027}\u{8BC4}\u{5BA1}\u{FF1A}
4616
+ 1. \u{8BC6}\u{522B}\u{6F5C}\u{5728}\u{7684}\u{5B89}\u{5168}\u{6F0F}\u{6D1E}
4617
+ 2. \u{68C0}\u{67E5}\u{5E38}\u{89C1}\u{7684}\u{5B89}\u{5168}\u{53CD}\u{6A21}\u{5F0F}
4618
+ 3. \u{8BC4}\u{5BA1}\u{9519}\u{8BEF}\u{5904}\u{7406}\u{548C}\u{8F93}\u{5165}\u{9A8C}\u{8BC1}
4619
+ 4. \u{8BC4}\u{4F30}\u{4F9D}\u{8D56}\u{9879}\u{7684}\u{5B89}\u{5168}\u{6027}
4492
4620
 
4493
- ### \u{67B6}\u{6784}\u{4F18}\u{52BF}
4494
- 1. **\u{4F4E}\u{8026}\u{5408}\u{8BBE}\u{8BA1}**\u{FF1A}\u{6A21}\u{5757}\u{72EC}\u{7ACB}\u{FF0C}\u{4FBF}\u{4E8E}\u{7EF4}\u{62A4}\u{548C}\u{6269}\u{5C55}
4495
- 2. **AI\u{53CB}\u{597D}**\u{FF1A}\u{6E05}\u{6670}\u{7684}\u{7ED3}\u{6784}\u{FF0C}\u{4FBF}\u{4E8E}AI\u{7406}\u{89E3}\u{548C}\u{5F00}\u{53D1}
4496
- 3. **\u{53EF}\u{6269}\u{5C55}\u{6027}**\u{FF1A}\u{652F}\u{6301}\u{4E1A}\u{52A1}\u{589E}\u{957F}\u{548C}\u{529F}\u{80FD}\u{6269}\u{5C55}
4621
+ \u{8BF7}\u{63D0}\u{4F9B}\u{5177}\u{4F53}\u{793A}\u{4F8B}\u{548C}\u{4FEE}\u{590D}\u{6B65}\u{9AA4}\u{3002}
4497
4622
 
4498
- ### \u{5B9E}\u{65BD}\u{5EFA}\u{8BAE}
4499
- 1. **\u{5206}\u{9636}\u{6BB5}\u{5B9E}\u{65BD}**\u{FF1A}\u{6309}\u{8BA1}\u{5212}\u{9010}\u{6B65}\u{5B9E}\u{73B0}
4500
- 2. **\u{6301}\u{7EED}\u{6D4B}\u{8BD5}**\u{FF1A}\u{6BCF}\u{4E2A}\u{9636}\u{6BB5}\u{90FD}\u{8981}\u{8FDB}\u{884C}\u{5145}\u{5206}\u{6D4B}\u{8BD5}
4501
- 3. **\u{6587}\u{6863}\u{540C}\u{6B65}**\u{FF1A}\u{53CA}\u{65F6}\u{66F4}\u{65B0}\u{6587}\u{6863}
4623
+ #### \u{6027}\u{80FD}\u{8BC4}\u{5BA1}
4624
+ **\u{63D0}\u{793A}\u{8BCD}**\u{FF1A}
4625
+ \u{4ECE}\u{6027}\u{80FD}\u{89D2}\u{5EA6}\u{8BC4}\u{5BA1}\u{4EE3}\u{7801}\u{5E93}\u{FF1A}
4626
+ 1. \u{8BC6}\u{522B}\u{6027}\u{80FD}\u{74F6}\u{9888}
4627
+ 2. \u{68C0}\u{67E5}\u{8D44}\u{6E90}\u{4F7F}\u{7528}\u{60C5}\u{51B5}
4628
+ 3. \u{8BC4}\u{5BA1}\u{7B97}\u{6CD5}\u{6548}\u{7387}
4629
+ 4. \u{8BC4}\u{4F30}\u{7F13}\u{5B58}\u{7B56}\u{7565}
4502
4630
 
4631
+ \u{5305}\u{542B}\u{5177}\u{4F53}\u{7684}\u{4F18}\u{5316}\u{5EFA}\u{8BAE}\u{3002}
4503
4632
  ---
4504
4633
 
4505
4634
  **\u{1F389} \u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{5B8C}\u{6210}\u{FF01}**
4506
4635
 
4507
- \u{8FD9}\u{4E2A}\u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{65B9}\u{6848}\u{4E13}\u{95E8}\u{9488}\u{5BF9}AI\u{5F00}\u{53D1}\u{8FDB}\u{884C}\u{4E86}\u{4F18}\u{5316}\u{FF0C}\u{786E}\u{4FDD}\u{4F4E}\u{8026}\u{5408}\u{3001}AI\u{53CB}\u{597D}\u{7684}\u{5F00}\u{53D1}\u{4F53}\u{9A8C}\u{FF01}
4508
-
4509
4636
  ## \u{1F4BE} \u{6587}\u{6863}\u{5B58}\u{50A8}\u{4FE1}\u{606F}
4510
4637
  - **\u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{5DF2}\u{4FDD}\u{5B58}\u{5230}**: \`${storage.requirementsFile}\`
4511
4638
  - **\u{5B8C}\u{6574}\u{6587}\u{6863}\u{5BFC}\u{51FA}**: \u{4F7F}\u{7528} \`export_final_document\` \u{5DE5}\u{5177}\u{5BFC}\u{51FA}\u{5B8C}\u{6574}\u{9879}\u{76EE}\u{6587}\u{6863}
4512
4639
  `;
4513
- requirements_utils_currentRequirements.architecture_designs = requirements_utils_currentRequirements.architecture_designs || [];
4514
- requirements_utils_currentRequirements.architecture_designs.push({
4515
- timestamp: new Date().toISOString(),
4516
- design_focus,
4517
- content: architecture_design
4518
- });
4519
- storage.saveHistoryEntry("architecture_design", architecture_design, {
4520
- design_focus
4521
- });
4522
- storage.saveRequirements(requirements_utils_currentRequirements);
4523
- return architecture_design;
4640
+ requirements_utils_currentRequirements.architecture_designs = requirements_utils_currentRequirements.architecture_designs || [];
4641
+ requirements_utils_currentRequirements.architecture_designs.push({
4642
+ timestamp: new Date().toISOString(),
4643
+ design_focus,
4644
+ content: architecture_design
4645
+ });
4646
+ storage.saveRequirements(requirements_utils_currentRequirements);
4647
+ return architecture_design;
4648
+ } catch (error) {
4649
+ logger_logger.error(`\u{274C} \u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{751F}\u{6210}\u{5931}\u{8D25}: ${error instanceof Error ? error.message : String(error)}`);
4650
+ throw new Error(`\u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{751F}\u{6210}\u{5931}\u{8D25}: ${error instanceof Error ? error.message : String(error)}`);
4651
+ }
4524
4652
  }
4525
4653
  };
4526
4654
  const exportFinalDocumentTool = {
package/dist/index.js CHANGED
@@ -2,9 +2,10 @@
2
2
  import { FastMCP } from "fastmcp";
3
3
  import winston from "winston";
4
4
  import winston_daily_rotate_file from "winston-daily-rotate-file";
5
- import path_0, { join } from "path";
6
5
  import fs_0, { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
6
+ import path_0, { join } from "path";
7
7
  import promises, { mkdir, readFile, stat, writeFile } from "fs/promises";
8
+ import { runCli as external_aico_pack_runCli } from "aico-pack";
8
9
  import { convertToHtml } from "mammoth";
9
10
  import html_to_md from "html-to-md";
10
11
  var __webpack_require__ = {};
@@ -140,9 +141,9 @@ __webpack_require__.d(external_namespaceObject, {
140
141
  util: ()=>util_util,
141
142
  void: ()=>voidType
142
143
  });
143
- path_0.join(process.cwd(), '.aico');
144
+ const config_PROJECT_ROOT = process.env.MCP_STORAGE_DIR || process.cwd();
144
145
  const getStorageDir = ()=>{
145
- const envDir = process.env.MCP_STORAGE_DIR + "/.aico";
146
+ const envDir = config_PROJECT_ROOT + "/.aico";
146
147
  if (!existsSync(envDir)) mkdirSync(envDir, {
147
148
  recursive: true
148
149
  });
@@ -182,8 +183,8 @@ const transports = [
182
183
  filename: path_0.join(logDir, 'application-%DATE%.log'),
183
184
  datePattern: 'YYYY-MM-DD',
184
185
  zippedArchive: true,
185
- maxSize: '20m',
186
- maxFiles: '14d',
186
+ maxSize: '2m',
187
+ maxFiles: '7d',
187
188
  format: fileFormat,
188
189
  level: 'info'
189
190
  })
@@ -201,7 +202,7 @@ const logger_logger = winston.createLogger({
201
202
  datePattern: 'YYYY-MM-DD',
202
203
  zippedArchive: true,
203
204
  maxSize: '1m',
204
- maxFiles: '14d',
205
+ maxFiles: '7d',
205
206
  format: fileFormat
206
207
  })
207
208
  ],
@@ -211,7 +212,7 @@ const logger_logger = winston.createLogger({
211
212
  datePattern: 'YYYY-MM-DD',
212
213
  zippedArchive: true,
213
214
  maxSize: '1m',
214
- maxFiles: '14d',
215
+ maxFiles: '7d',
215
216
  format: fileFormat
216
217
  })
217
218
  ]
@@ -3905,7 +3906,7 @@ const RequirementManagerParams = objectType({
3905
3906
  ]).describe("\u9700\u6C42\u5206\u7C7B")
3906
3907
  });
3907
3908
  const ArchitectureDesignerParams = objectType({
3908
- design_focus: stringType().optional().default("full_architecture").describe("\u8BBE\u8BA1\u91CD\u70B9")
3909
+ design_focus: stringType().optional().default("full_architecture").describe("\u8BBE\u8BA1\u91CD\u70B9,\u9879\u76EE\u67B6\u6784\u8BBE\u8BA1")
3909
3910
  });
3910
3911
  async function invokeFlow(params, streamCb) {
3911
3912
  const { appid = 'app-ESTcrkOPOmkxdrO0120mE4s1', data, timeout = 1800000 } = params;
@@ -4106,19 +4107,35 @@ const requirementClarifier = {
4106
4107
  user_input
4107
4108
  });
4108
4109
  const fileName = sanitizeFileName(analysisContent.length > 10 ? analysisContent.substring(0, 10) : `analysis_${Date.now()}`);
4109
- const mdDir = path_0.join(getStorageDir(), 'requirement');
4110
+ const mdDir = path_0.join(getStorageDir(), 'prd');
4110
4111
  await promises.mkdir(mdDir, {
4111
4112
  recursive: true
4112
4113
  });
4113
4114
  const mdPath = path_0.join(mdDir, `${fileName}.md`);
4114
4115
  const mdPathResolved = path_0.resolve(mdPath);
4115
- await promises.writeFile(mdPath, analysisContent, 'utf8');
4116
+ const subContents = await getSubAnalysis(analysisContent);
4117
+ let finalContent = analysisContent;
4118
+ let jumpLinks = [];
4119
+ if (subContents.length > 0) {
4120
+ jumpLinks = await saveSubAnalysisFiles(mdDir, subContents);
4121
+ finalContent = addJumpLinks(analysisContent, jumpLinks);
4122
+ logger_logger.info({
4123
+ module: 'requirement_clarifier',
4124
+ message: `\u{6210}\u{529F}\u{5904}\u{7406}${subContents.length}\u{4E2A}\u{7EC6}\u{5206}\u{9879}`,
4125
+ jumpLinks: jumpLinks.map((link)=>({
4126
+ title: link.title,
4127
+ file: path_0.basename(link.path)
4128
+ }))
4129
+ });
4130
+ }
4131
+ await promises.writeFile(mdPath, finalContent, 'utf8');
4116
4132
  logger_logger.info({
4117
4133
  module: 'requirement_clarifier',
4118
4134
  message: "\u9700\u6C42\u5206\u6790\u6587\u4EF6\u5DF2\u4FDD\u5B58",
4119
- path: mdPathResolved
4135
+ path: mdPathResolved,
4136
+ hasSubFiles: jumpLinks.length > 0
4120
4137
  });
4121
- return formatAnalysisPrompt(user_input, context, analysisContent, mdPathResolved);
4138
+ return formatAnalysisPrompt(user_input, finalContent, mdPathResolved);
4122
4139
  } catch (error) {
4123
4140
  const errorMsg = `\u{9700}\u{6C42}\u{5206}\u{6790}\u{5931}\u{8D25}: ${error instanceof Error ? error.message : String(error)}`;
4124
4141
  logger_logger.error({
@@ -4153,13 +4170,98 @@ const getAiAnalysis = async (input)=>{
4153
4170
  throw new Error(`AI\u{5206}\u{6790}\u{8BF7}\u{6C42}\u{5931}\u{8D25}: ${error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF"}`);
4154
4171
  }
4155
4172
  };
4156
- const formatAnalysisPrompt = (userInput, context, content, filePath)=>`# \u{1F50D} AI\u{9700}\u{6C42}\u{5206}\u{6790}\u{5B8C}\u{6210}
4173
+ const getSubAnalysis = async (content)=>{
4174
+ try {
4175
+ const response = await invokeFlow({
4176
+ appid: 'app-aiEw80lPBus0DfybAGbW8PvX',
4177
+ data: {
4178
+ content
4179
+ }
4180
+ });
4181
+ return response.outputs.result;
4182
+ } catch (error) {
4183
+ const errorMsg = `\u{7EC6}\u{5206}\u{5206}\u{6790}\u{8BF7}\u{6C42}\u{5931}\u{8D25}: ${error instanceof Error ? error.message : "\u672A\u77E5\u9519\u8BEF"}`;
4184
+ logger_logger.error({
4185
+ module: 'requirement_clarifier',
4186
+ message: errorMsg,
4187
+ stack: error instanceof Error ? error.stack : void 0
4188
+ });
4189
+ return [];
4190
+ }
4191
+ };
4192
+ const saveSubAnalysisFiles = async (mainDir, contentArray)=>{
4193
+ const subFiles = [];
4194
+ for(let i = 0; i < contentArray.length; i++){
4195
+ const content = contentArray[i];
4196
+ let title = `\u{5B50}\u{529F}\u{80FD}-${i + 1}`;
4197
+ const titleMatch = content.replace(/\n/g, '').match(/^###\s+([\s\S]*?)(?=#|$)/);
4198
+ if (titleMatch) title = titleMatch[1].trim();
4199
+ const safeFileName = `${sanitizeFileName(title)}.md`;
4200
+ const filePath = path_0.join(mainDir, safeFileName);
4201
+ try {
4202
+ await promises.writeFile(filePath, content, 'utf8');
4203
+ subFiles.push({
4204
+ title,
4205
+ path: filePath
4206
+ });
4207
+ logger_logger.debug({
4208
+ module: 'requirement_clarifier',
4209
+ message: "\u7EC6\u5206\u5206\u6790\u6587\u4EF6\u5DF2\u4FDD\u5B58",
4210
+ path: filePath,
4211
+ title
4212
+ });
4213
+ } catch (error) {
4214
+ logger_logger.error({
4215
+ module: 'requirement_clarifier',
4216
+ message: `\u{4FDD}\u{5B58}\u{7EC6}\u{5206}\u{6587}\u{4EF6}\u{5931}\u{8D25}: ${error instanceof Error ? error.message : String(error)}`,
4217
+ filePath,
4218
+ contentPreview: content.substring(0, 50) + '...'
4219
+ });
4220
+ }
4221
+ }
4222
+ return subFiles;
4223
+ };
4224
+ const addJumpLinks = (mainContent, subFiles)=>{
4225
+ if (!subFiles.length) return mainContent;
4226
+ const titleMap = new Map();
4227
+ subFiles.forEach((file)=>{
4228
+ const simpleTitle = file.title.replace(/[^\w\u4e00-\u9fa5]+/g, '').toLowerCase();
4229
+ titleMap.set(simpleTitle, path_0.basename(file.path));
4230
+ });
4231
+ const sections = mainContent.split(/(\n###\s+[^\n]+\n)/);
4232
+ const processedSections = [];
4233
+ for(let i = 0; i < sections.length; i++){
4234
+ const section = sections[i];
4235
+ if (section.startsWith('\n### ')) {
4236
+ const titleMatch = section.match(/###\s+([\s\S]+?)\n/);
4237
+ if (!titleMatch) {
4238
+ processedSections.push(section);
4239
+ continue;
4240
+ }
4241
+ const rawTitle = titleMatch[1].trim();
4242
+ const simpleTitle = rawTitle.replace(/[^\w\u4e00-\u9fa5]+/g, '').toLowerCase();
4243
+ const fileName = titleMap.get(simpleTitle);
4244
+ if (fileName) {
4245
+ const linkedSection = section.replace(/(###\s+)([\s\S]+?)(\n)/, `$1$2 <a href="./${fileName}" style="float:right;">\u{1F4CE}</a>$3`);
4246
+ processedSections.push(linkedSection);
4247
+ titleMap.delete(simpleTitle);
4248
+ continue;
4249
+ }
4250
+ }
4251
+ processedSections.push(section);
4252
+ }
4253
+ if (titleMap.size > 0) {
4254
+ processedSections.push("\n\n### \u8BE6\u7EC6\u5206\u6790\n");
4255
+ titleMap.forEach((fileName, title)=>{
4256
+ processedSections.push(`- [\u{67E5}\u{770B}${title}\u{5206}\u{6790}](./${fileName})\n`);
4257
+ });
4258
+ }
4259
+ return processedSections.join('');
4260
+ };
4261
+ const formatAnalysisPrompt = (userInput, content, filePath)=>`# \u{1F50D} AI\u{9700}\u{6C42}\u{5206}\u{6790}\u{5B8C}\u{6210}
4157
4262
 
4158
4263
  ## \u{1F4DD} \u{7528}\u{6237}\u{539F}\u{59CB}\u{9700}\u{6C42}
4159
4264
  ${userInput}
4160
-
4161
- ## \u{1F4CB} \u{5F53}\u{524D}\u{4E0A}\u{4E0B}\u{6587}
4162
- ${context}
4163
4265
  ------------------------------
4164
4266
  ## \u{1F52C} \u{9700}\u{6C42}\u{5206}\u{6790}\u{7ED3}\u{679C}
4165
4267
  ${content}
@@ -4217,26 +4319,6 @@ class RequirementStorage {
4217
4319
  console.error(`\u{274C} \u{4FDD}\u{5B58}\u{9700}\u{6C42}\u{6587}\u{6863}\u{5931}\u{8D25}: ${e}`);
4218
4320
  }
4219
4321
  }
4220
- saveHistoryEntry(entryType, content, metadata = {}) {
4221
- try {
4222
- const historyEntry = {
4223
- timestamp: new Date().toISOString(),
4224
- type: entryType,
4225
- content,
4226
- metadata
4227
- };
4228
- let history = [];
4229
- if (existsSync(this.historyFile)) {
4230
- const data = readFileSync(this.historyFile, "utf8");
4231
- history = JSON.parse(data);
4232
- }
4233
- history.push(historyEntry);
4234
- writeFileSync(this.historyFile, JSON.stringify(history, null, 2), "utf8");
4235
- console.log(`\u{2705} \u{5386}\u{53F2}\u{8BB0}\u{5F55}\u{5DF2}\u{4FDD}\u{5B58}: ${entryType}`);
4236
- } catch (e) {
4237
- console.error(`\u{274C} \u{4FDD}\u{5B58}\u{5386}\u{53F2}\u{8BB0}\u{5F55}\u{5931}\u{8D25}: ${e}`);
4238
- }
4239
- }
4240
4322
  exportFinalDocument(currentRequirements) {
4241
4323
  try {
4242
4324
  const finalDoc = {
@@ -4349,9 +4431,6 @@ function addRequirementEntry(type, category, content) {
4349
4431
  requirements_utils_currentRequirements[type] = [
4350
4432
  requirementEntry
4351
4433
  ];
4352
- requirements_utils_storage.saveHistoryEntry(type, content, {
4353
- category
4354
- });
4355
4434
  requirements_utils_storage.saveRequirements(requirements_utils_currentRequirements);
4356
4435
  return requirements_utils_currentRequirements;
4357
4436
  }
@@ -4390,123 +4469,172 @@ const requirementManagerTool = {
4390
4469
  return formatRequirementUpdateResponse(category, clarified_info, requirements_utils_currentRequirements, storage.requirementsFile, storage.historyFile);
4391
4470
  }
4392
4471
  };
4472
+ async function packProject() {
4473
+ const mdDir = path_0.join(getStorageDir(), 'tech');
4474
+ await promises.mkdir(mdDir, {
4475
+ recursive: true
4476
+ });
4477
+ logger_logger.info(`\u{1F4C2} \u{6B63}\u{5728}\u{5206}\u{6790}\u{5F53}\u{524D}\u{672C}\u{5730}\u{9879}\u{76EE}`);
4478
+ const mdPath = path_0.join(mdDir, `\u{9879}\u{76EE}\u{67B6}\u{6784}\u{5206}\u{6790}.md`);
4479
+ const options = {
4480
+ output: mdPath,
4481
+ style: 'markdown',
4482
+ headerText: "\u667A\u80FD\u8F6F\u4EF6\u661F\u5DE5\u5382",
4483
+ fileSummary: true,
4484
+ removeEmptyLines: true,
4485
+ removeComments: true,
4486
+ showLineNumbers: true,
4487
+ compress: true,
4488
+ quiet: true,
4489
+ customPatterns: [
4490
+ "**/*.md",
4491
+ "**/*.log",
4492
+ "**/*.json",
4493
+ "**/*.dockerfile",
4494
+ "**/*.yml",
4495
+ "**/*.yaml",
4496
+ "**/*.sh",
4497
+ "**/*.env",
4498
+ "**/*.env.example",
4499
+ "**/LICENSE"
4500
+ ]
4501
+ };
4502
+ await external_aico_pack_runCli([
4503
+ config_PROJECT_ROOT
4504
+ ], process.cwd(), options);
4505
+ return mdPath;
4506
+ }
4393
4507
  const architectureDesignerTool = {
4394
4508
  name: "architecture_designer",
4395
- description: "\u67B6\u6784\u8BBE\u8BA1\u751F\u6210\u5668 - \u57FA\u4E8E\u5B8C\u6574\u9700\u6C42\u751F\u6210\u6700\u4F18\u6280\u672F\u67B6\u6784\u65B9\u6848",
4509
+ description: "\u9879\u76EE\u67B6\u6784\u8BBE\u8BA1\u5E08 - \u57FA\u4E8E\u5B8C\u6574\u9700\u6C42\u751F\u6210\u6700\u4F18\u6280\u672F\u67B6\u6784\u65B9\u6848",
4396
4510
  parameters: ArchitectureDesignerParams,
4397
4511
  execute: async (args)=>{
4398
4512
  const { design_focus = "full_architecture" } = args;
4399
4513
  const storage = new RequirementStorage();
4400
- const architecture_design = `# \u{1F3D7}\u{FE0F} \u{9879}\u{76EE}\u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{65B9}\u{6848}
4514
+ try {
4515
+ const mdPath = await packProject();
4516
+ const architecture_design = `# \u{1F3D7}\u{FE0F} \u{9879}\u{76EE}\u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{65B9}\u{6848}
4401
4517
 
4402
4518
  ## \u{1F3AF} \u{8BBE}\u{8BA1}\u{76EE}\u{6807}
4403
4519
  - **\u{8BBE}\u{8BA1}\u{91CD}\u{70B9}**\u{FF1A}${design_focus}
4404
4520
  - **\u{4F18}\u{5316}\u{76EE}\u{6807}**\u{FF1A}AI\u{53CB}\u{597D}\u{3001}\u{4F4E}\u{8026}\u{5408}\u{3001}\u{53EF}\u{7EF4}\u{62A4}
4405
4521
 
4406
- ## \u{1F3DB}\u{FE0F} \u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{539F}\u{5219}\u{FF08}\u{9488}\u{5BF9}AI\u{5F00}\u{53D1}\u{4F18}\u{5316}\u{FF09}
4522
+ ## \u{1F4C4} \u{5173}\u{952E}\u{6587}\u{6863}
4523
+ - [\u{1F517} \u{5B8C}\u{6574}\u{67B6}\u{6784}\u{5206}\u{6790}\u{62A5}\u{544A}](${mdPath})
4407
4524
 
4408
- ### 1. \u{4F4E}\u{8026}\u{5408}\u{8BBE}\u{8BA1}\u{539F}\u{5219}
4409
- - **\u{6A21}\u{5757}\u{72EC}\u{7ACB}\u{6027}**\u{FF1A}\u{6BCF}\u{4E2A}\u{6A21}\u{5757}\u{529F}\u{80FD}\u{5355}\u{4E00}\u{FF0C}\u{8FB9}\u{754C}\u{6E05}\u{6670}
4410
- - **\u{63A5}\u{53E3}\u{6807}\u{51C6}\u{5316}**\u{FF1A}\u{7EDF}\u{4E00}\u{7684}API\u{63A5}\u{53E3}\u{89C4}\u{8303}
4411
- - **\u{4F9D}\u{8D56}\u{6700}\u{5C0F}\u{5316}**\u{FF1A}\u{51CF}\u{5C11}\u{6A21}\u{5757}\u{95F4}\u{7684}\u{5F3A}\u{4F9D}\u{8D56}\u{5173}\u{7CFB}
4412
- - **\u{9519}\u{8BEF}\u{9694}\u{79BB}**\u{FF1A}\u{5355}\u{4E2A}\u{6A21}\u{5757}\u{95EE}\u{9898}\u{4E0D}\u{5F71}\u{54CD}\u{6574}\u{4F53}\u{7CFB}\u{7EDF}
4413
-
4414
- ### 2. AI\u{53CB}\u{597D}\u{67B6}\u{6784}\u{539F}\u{5219}
4415
- - **\u{4EE3}\u{7801}\u{53EF}\u{7406}\u{89E3}\u{6027}**\u{FF1A}\u{6E05}\u{6670}\u{7684}\u{547D}\u{540D}\u{548C}\u{6CE8}\u{91CA}\u{89C4}\u{8303}
4416
- - **\u{6A21}\u{5757}\u{5316}\u{5F00}\u{53D1}**\u{FF1A}\u{907F}\u{514D}\u{5927}\u{6587}\u{4EF6}\u{FF0C}\u{4FBF}\u{4E8E}AI\u{7406}\u{89E3}\u{548C}\u{4FEE}\u{6539}
4417
- - **\u{6807}\u{51C6}\u{5316}\u{7ED3}\u{6784}**\u{FF1A}\u{7EDF}\u{4E00}\u{7684}\u{9879}\u{76EE}\u{7ED3}\u{6784}\u{548C}\u{4EE3}\u{7801}\u{7EC4}\u{7EC7}
4418
- - **\u{6E10}\u{8FDB}\u{5F0F}\u{5F00}\u{53D1}**\u{FF1A}\u{652F}\u{6301}\u{5206}\u{9636}\u{6BB5}\u{5B9E}\u{73B0}\u{548C}\u{6D4B}\u{8BD5}
4419
-
4420
- ## \u{1F527} \u{6280}\u{672F}\u{67B6}\u{6784}\u{5EFA}\u{8BAE}
4525
+ ## \u{1F916} AI\u{5F00}\u{53D1}\u{6700}\u{4F73}\u{5B9E}\u{8DF5}
4421
4526
 
4422
- ### \u{524D}\u{7AEF}\u{67B6}\u{6784}
4423
- **\u{63A8}\u{8350}\u{6280}\u{672F}\u{6808}\u{FF1A}**
4424
- - \u{6846}\u{67B6}\u{FF1A}React 18 / Vue 3 / Next.js 15
4425
- - \u{72B6}\u{6001}\u{7BA1}\u{7406}\u{FF1A}Redux Toolkit / Zustand / Pinia
4426
- - UI\u{7EC4}\u{4EF6}\u{FF1A}Ant Design / Material-UI / Tailwind CSS
4527
+ ### \u{6A21}\u{5757}\u{5F00}\u{53D1}\u{6307}\u{5BFC}
4528
+ 1. **\u{5148}\u{5B9E}\u{73B0}\u{6838}\u{5FC3}\u{903B}\u{8F91}**\u{FF1A}\u{4E13}\u{6CE8}\u{4E3B}\u{8981}\u{529F}\u{80FD}
4529
+ 2. **\u{518D}\u{6DFB}\u{52A0}\u{9519}\u{8BEF}\u{5904}\u{7406}**\u{FF1A}\u{5B8C}\u{5584}\u{5F02}\u{5E38}\u{5904}\u{7406}
4530
+ 3. **\u{6700}\u{540E}\u{8FDB}\u{884C}\u{4F18}\u{5316}**\u{FF1A}\u{6027}\u{80FD}\u{4F18}\u{5316}\u{548C}\u{4EE3}\u{7801}\u{91CD}\u{6784}
4427
4531
 
4428
- ### \u{540E}\u{7AEF}\u{67B6}\u{6784}
4429
- **\u{63A8}\u{8350}\u{6280}\u{672F}\u{6808}\u{FF1A}**
4430
- - \u{6846}\u{67B6}\u{FF1A}FastAPI / Express.js / Spring Boot
4431
- - \u{6570}\u{636E}\u{5E93}\u{FF1A}PostgreSQL / MySQL / MongoDB
4432
- - \u{7F13}\u{5B58}\u{FF1A}Redis / Memcached
4532
+ ### \u{80FD}\u{529B}\u{4F7F}\u{7528}\u{6307}\u{5357}
4533
+ > \u{5C06}\u{5B8C}\u{6574}\u{67B6}\u{6784}\u{5206}\u{6790}\u{62A5}\u{544A}\u{4F5C}\u{4E3A}\u{9644}\u{4EF6}\u{53D1}\u{9001}\u{7ED9}AI\u{FF0C}\u{53EF}\u{7528}\u{4E8E}\u{5B8C}\u{6210}\u{5982}\u{4E0B}\u{80FD}\u{529B}\u{FF1A}
4433
4534
 
4434
- ## \u{1F4E6} \u{529F}\u{80FD}\u{6A21}\u{5757}\u{5212}\u{5206}
4535
+ #### \u{5F00}\u{53D1}\u{8005}\u{6307}\u{5357}
4536
+ **\u{63D0}\u{793A}\u{8BCD}**\u{FF1A}
4537
+ \u{521B}\u{5EFA}\u{5305}\u{542B}\u{4EE5}\u{4E0B}\u{5185}\u{5BB9}\u{7684}\u{5F00}\u{53D1}\u{8005}\u{6307}\u{5357}\u{FF1A}
4538
+ 1. \u{73AF}\u{5883}\u{642D}\u{5EFA}\u{8BF4}\u{660E}
4539
+ 2. \u{9879}\u{76EE}\u{7ED3}\u{6784}\u{6982}\u{89C8}
4540
+ 3. \u{5F00}\u{53D1}\u{5DE5}\u{4F5C}\u{6D41}\u{7A0B}
4541
+ 4. \u{6D4B}\u{8BD5}\u{65B9}\u{6CD5}
4542
+ 5. \u{5E38}\u{89C1}\u{95EE}\u{9898}\u{6392}\u{67E5}\u{6B65}\u{9AA4}
4435
4543
 
4436
- ### \u{6838}\u{5FC3}\u{4E1A}\u{52A1}\u{6A21}\u{5757}
4437
- 1. **\u{7528}\u{6237}\u{7BA1}\u{7406}\u{6A21}\u{5757}**
4438
- - \u{529F}\u{80FD}\u{FF1A}\u{7528}\u{6237}\u{6CE8}\u{518C}\u{3001}\u{767B}\u{5F55}\u{3001}\u{6743}\u{9650}\u{7BA1}\u{7406}
4439
- - \u{63A5}\u{53E3}\u{FF1A}\u{7528}\u{6237}CRUD\u{3001}\u{8BA4}\u{8BC1}API
4440
- - AI\u{5F00}\u{53D1}\u{63D0}\u{793A}\u{FF1A}\u{5148}\u{5B9E}\u{73B0}\u{57FA}\u{7840}\u{8BA4}\u{8BC1}\u{FF0C}\u{518D}\u{6DFB}\u{52A0}\u{9AD8}\u{7EA7}\u{529F}\u{80FD}
4544
+ #### API \u{6587}\u{6863}
4545
+ **\u{63D0}\u{793A}\u{8BCD}**\u{FF1A}
4546
+ \u{751F}\u{6210}\u{5168}\u{9762}\u{7684} API \u{6587}\u{6863}\u{FF1A}
4547
+ 1. \u{5217}\u{51FA}\u{5E76}\u{63CF}\u{8FF0}\u{6240}\u{6709}\u{516C}\u{5171}\u{7AEF}\u{70B9}
4548
+ 2. \u{8BB0}\u{5F55}\u{8BF7}\u{6C42}/\u{54CD}\u{5E94}\u{683C}\u{5F0F}
4549
+ 3. \u{5305}\u{542B}\u{4F7F}\u{7528}\u{793A}\u{4F8B}
4550
+ 4. \u{8BF4}\u{660E}\u{9650}\u{5236}\u{548C}\u{7EA6}\u{675F}
4441
4551
 
4442
- 2. **\u{4E1A}\u{52A1}\u{6838}\u{5FC3}\u{6A21}\u{5757}**
4443
- - \u{529F}\u{80FD}\u{FF1A}[\u{6839}\u{636E}\u{5177}\u{4F53}\u{9700}\u{6C42}\u{5B9A}\u{5236}]
4444
- - \u{63A5}\u{53E3}\u{FF1A}\u{4E1A}\u{52A1}\u{903B}\u{8F91}API\u{3001}\u{6570}\u{636E}\u{5904}\u{7406}\u{63A5}\u{53E3}
4445
- - AI\u{5F00}\u{53D1}\u{63D0}\u{793A}\u{FF1A}\u{6309}\u{529F}\u{80FD}\u{4F18}\u{5148}\u{7EA7}\u{9010}\u{6B65}\u{5B9E}\u{73B0}
4552
+ #### \u{67B6}\u{6784}\u{6587}\u{6863}
4553
+ **\u{63D0}\u{793A}\u{8BCD}**\u{FF1A}
4554
+ \u{8BB0}\u{5F55}\u{7CFB}\u{7EDF}\u{67B6}\u{6784}\u{FF1A}
4555
+ 1. \u{9AD8}\u{5C42}\u{6982}\u{8FF0}
4556
+ 2. \u{7EC4}\u{4EF6}\u{4EA4}\u{4E92}
4557
+ 3. \u{6570}\u{636E}\u{6D41}\u{7A0B}\u{56FE}
4558
+ 4. \u{8BBE}\u{8BA1}\u{51B3}\u{7B56}\u{53CA}\u{7406}\u{7531}
4559
+ 5. \u{7CFB}\u{7EDF}\u{9650}\u{5236}\u{548C}\u{7EA6}\u{675F}
4446
4560
 
4447
- ## \u{1F4C5} \u{5F00}\u{53D1}\u{9636}\u{6BB5}\u{89C4}\u{5212}
4561
+ #### \u{4F9D}\u{8D56}\u{9879}\u{5206}\u{6790}
4562
+ **\u{63D0}\u{793A}\u{8BCD}**\u{FF1A}
4563
+ \u{5206}\u{6790}\u{9879}\u{76EE}\u{4F9D}\u{8D56}\u{FF1A}
4564
+ 1. \u{8BC6}\u{522B}\u{8FC7}\u{65F6}\u{7684}\u{5305}
4565
+ 2. \u{68C0}\u{67E5}\u{5B89}\u{5168}\u{6F0F}\u{6D1E}
4566
+ 3. \u{5EFA}\u{8BAE}\u{66FF}\u{4EE3}\u{5305}
4567
+ 4. \u{8BC4}\u{5BA1}\u{4F9D}\u{8D56}\u{4F7F}\u{7528}\u{6A21}\u{5F0F}
4448
4568
 
4449
- ### \u{7B2C}\u{4E00}\u{9636}\u{6BB5}\u{FF1A}\u{57FA}\u{7840}\u{6846}\u{67B6}\u{642D}\u{5EFA}\u{FF08}1-2\u{5468}\u{FF09}
4450
- - \u{9879}\u{76EE}\u{521D}\u{59CB}\u{5316}\u{548C}\u{73AF}\u{5883}\u{914D}\u{7F6E}
4451
- - \u{57FA}\u{7840}\u{6846}\u{67B6}\u{4EE3}\u{7801}\u{642D}\u{5EFA}
4452
- - \u{6570}\u{636E}\u{5E93}\u{8BBE}\u{8BA1}\u{548C}\u{521D}\u{59CB}\u{5316}
4569
+ \u{5305}\u{542B}\u{5177}\u{4F53}\u{7684}\u{5347}\u{7EA7}\u{5EFA}\u{8BAE}\u{3002}
4453
4570
 
4454
- ### \u{7B2C}\u{4E8C}\u{9636}\u{6BB5}\u{FF1A}\u{6838}\u{5FC3}\u{529F}\u{80FD}\u{5F00}\u{53D1}\u{FF08}2-4\u{5468}\u{FF09}
4455
- - \u{7528}\u{6237}\u{7BA1}\u{7406}\u{529F}\u{80FD}\u{5B9E}\u{73B0}
4456
- - \u{6838}\u{5FC3}\u{4E1A}\u{52A1}\u{903B}\u{8F91}\u{5F00}\u{53D1}
4457
- - \u{524D}\u{7AEF}\u{4E3B}\u{8981}\u{9875}\u{9762}\u{5B9E}\u{73B0}
4571
+ #### \u{6D4B}\u{8BD5}\u{8986}\u{76D6}\u{7387}
4572
+ **\u{63D0}\u{793A}\u{8BCD}**\u{FF1A}
4573
+ \u{8BC4}\u{5BA1}\u{6D4B}\u{8BD5}\u{8986}\u{76D6}\u{7387}\u{FF1A}
4574
+ 1. \u{8BC6}\u{522B}\u{672A}\u{6D4B}\u{8BD5}\u{7684}\u{7EC4}\u{4EF6}
4575
+ 2. \u{5EFA}\u{8BAE}\u{989D}\u{5916}\u{7684}\u{6D4B}\u{8BD5}\u{7528}\u{4F8B}
4576
+ 3. \u{8BC4}\u{5BA1}\u{6D4B}\u{8BD5}\u{8D28}\u{91CF}
4577
+ 4. \u{63A8}\u{8350}\u{6D4B}\u{8BD5}\u{7B56}\u{7565}
4458
4578
 
4459
- ### \u{7B2C}\u{4E09}\u{9636}\u{6BB5}\u{FF1A}\u{529F}\u{80FD}\u{5B8C}\u{5584}\u{548C}\u{4F18}\u{5316}\u{FF08}1-3\u{5468}\u{FF09}
4460
- - \u{6B21}\u{8981}\u{529F}\u{80FD}\u{5B9E}\u{73B0}
4461
- - \u{6027}\u{80FD}\u{4F18}\u{5316}\u{548C}\u{8C03}\u{8BD5}
4462
- - \u{7528}\u{6237}\u{4F53}\u{9A8C}\u{4F18}\u{5316}
4579
+ #### \u{4EE3}\u{7801}\u{8D28}\u{91CF}
4580
+ **\u{63D0}\u{793A}\u{8BCD}**\u{FF1A}
4581
+ \u{8BC4}\u{4F30}\u{4EE3}\u{7801}\u{8D28}\u{91CF}\u{5E76}\u{63D0}\u{51FA}\u{6539}\u{8FDB}\u{5EFA}\u{8BAE}\u{FF1A}
4582
+ 1. \u{8BC4}\u{5BA1}\u{547D}\u{540D}\u{89C4}\u{8303}
4583
+ 2. \u{68C0}\u{67E5}\u{4EE3}\u{7801}\u{7EC4}\u{7EC7}
4584
+ 3. \u{8BC4}\u{4F30}\u{9519}\u{8BEF}\u{5904}\u{7406}
4585
+ 4. \u{8BC4}\u{5BA1}\u{6CE8}\u{91CA}\u{5B9E}\u{8DF5}
4463
4586
 
4464
- ## \u{1F916} AI\u{5F00}\u{53D1}\u{6700}\u{4F73}\u{5B9E}\u{8DF5}
4587
+ \u{63D0}\u{4F9B}\u{5177}\u{4F53}\u{7684}\u{826F}\u{597D}\u{548C}\u{95EE}\u{9898}\u{6A21}\u{5F0F}\u{793A}\u{4F8B}\u{3002}
4465
4588
 
4466
- ### \u{6A21}\u{5757}\u{5F00}\u{53D1}\u{6307}\u{5BFC}
4467
- 1. **\u{5148}\u{5B9E}\u{73B0}\u{6838}\u{5FC3}\u{903B}\u{8F91}**\u{FF1A}\u{4E13}\u{6CE8}\u{4E3B}\u{8981}\u{529F}\u{80FD}
4468
- 2. **\u{518D}\u{6DFB}\u{52A0}\u{9519}\u{8BEF}\u{5904}\u{7406}**\u{FF1A}\u{5B8C}\u{5584}\u{5F02}\u{5E38}\u{5904}\u{7406}
4469
- 3. **\u{6700}\u{540E}\u{8FDB}\u{884C}\u{4F18}\u{5316}**\u{FF1A}\u{6027}\u{80FD}\u{4F18}\u{5316}\u{548C}\u{4EE3}\u{7801}\u{91CD}\u{6784}
4589
+ #### \u{67B6}\u{6784}\u{8BC4}\u{5BA1}
4590
+ **\u{63D0}\u{793A}\u{8BCD}**\u{FF1A}
4591
+ \u{5206}\u{6790}\u{6B64}\u{4EE3}\u{7801}\u{5E93}\u{7684}\u{67B6}\u{6784}\u{FF1A}
4592
+ 1. \u{8BC4}\u{4F30}\u{6574}\u{4F53}\u{7ED3}\u{6784}\u{548C}\u{6A21}\u{5F0F}
4593
+ 2. \u{8BC6}\u{522B}\u{6F5C}\u{5728}\u{7684}\u{67B6}\u{6784}\u{95EE}\u{9898}
4594
+ 3. \u{63D0}\u{51FA}\u{6539}\u{8FDB}\u{53EF}\u{6269}\u{5C55}\u{6027}\u{7684}\u{5EFA}\u{8BAE}
4595
+ 4. \u{6807}\u{6CE8}\u{9075}\u{5FAA}\u{6700}\u{4F73}\u{5B9E}\u{8DF5}\u{7684}\u{90E8}\u{5206}
4470
4596
 
4471
- ### \u{63A5}\u{53E3}\u{8BBE}\u{8BA1}\u{89C4}\u{8303}
4472
- - GET /api/users - \u{83B7}\u{53D6}\u{7528}\u{6237}\u{5217}\u{8868}
4473
- - POST /api/users - \u{521B}\u{5EFA}\u{7528}\u{6237}
4474
- - PUT /api/users/:id - \u{66F4}\u{65B0}\u{7528}\u{6237}
4475
- - DELETE /api/users/:id - \u{5220}\u{9664}\u{7528}\u{6237}
4597
+ \u{91CD}\u{70B9}\u{5173}\u{6CE8}\u{53EF}\u{7EF4}\u{62A4}\u{6027}\u{548C}\u{6A21}\u{5757}\u{5316}\u{3002}
4476
4598
 
4477
- ## \u{1F3AF} \u{603B}\u{7ED3}\u{548C}\u{5EFA}\u{8BAE}
4599
+ #### \u{5B89}\u{5168}\u{6027}\u{8BC4}\u{5BA1}
4600
+ **\u{63D0}\u{793A}\u{8BCD}**\u{FF1A}
4601
+ \u{5BF9}\u{6B64}\u{4EE3}\u{7801}\u{5E93}\u{8FDB}\u{884C}\u{5B89}\u{5168}\u{6027}\u{8BC4}\u{5BA1}\u{FF1A}
4602
+ 1. \u{8BC6}\u{522B}\u{6F5C}\u{5728}\u{7684}\u{5B89}\u{5168}\u{6F0F}\u{6D1E}
4603
+ 2. \u{68C0}\u{67E5}\u{5E38}\u{89C1}\u{7684}\u{5B89}\u{5168}\u{53CD}\u{6A21}\u{5F0F}
4604
+ 3. \u{8BC4}\u{5BA1}\u{9519}\u{8BEF}\u{5904}\u{7406}\u{548C}\u{8F93}\u{5165}\u{9A8C}\u{8BC1}
4605
+ 4. \u{8BC4}\u{4F30}\u{4F9D}\u{8D56}\u{9879}\u{7684}\u{5B89}\u{5168}\u{6027}
4478
4606
 
4479
- ### \u{67B6}\u{6784}\u{4F18}\u{52BF}
4480
- 1. **\u{4F4E}\u{8026}\u{5408}\u{8BBE}\u{8BA1}**\u{FF1A}\u{6A21}\u{5757}\u{72EC}\u{7ACB}\u{FF0C}\u{4FBF}\u{4E8E}\u{7EF4}\u{62A4}\u{548C}\u{6269}\u{5C55}
4481
- 2. **AI\u{53CB}\u{597D}**\u{FF1A}\u{6E05}\u{6670}\u{7684}\u{7ED3}\u{6784}\u{FF0C}\u{4FBF}\u{4E8E}AI\u{7406}\u{89E3}\u{548C}\u{5F00}\u{53D1}
4482
- 3. **\u{53EF}\u{6269}\u{5C55}\u{6027}**\u{FF1A}\u{652F}\u{6301}\u{4E1A}\u{52A1}\u{589E}\u{957F}\u{548C}\u{529F}\u{80FD}\u{6269}\u{5C55}
4607
+ \u{8BF7}\u{63D0}\u{4F9B}\u{5177}\u{4F53}\u{793A}\u{4F8B}\u{548C}\u{4FEE}\u{590D}\u{6B65}\u{9AA4}\u{3002}
4483
4608
 
4484
- ### \u{5B9E}\u{65BD}\u{5EFA}\u{8BAE}
4485
- 1. **\u{5206}\u{9636}\u{6BB5}\u{5B9E}\u{65BD}**\u{FF1A}\u{6309}\u{8BA1}\u{5212}\u{9010}\u{6B65}\u{5B9E}\u{73B0}
4486
- 2. **\u{6301}\u{7EED}\u{6D4B}\u{8BD5}**\u{FF1A}\u{6BCF}\u{4E2A}\u{9636}\u{6BB5}\u{90FD}\u{8981}\u{8FDB}\u{884C}\u{5145}\u{5206}\u{6D4B}\u{8BD5}
4487
- 3. **\u{6587}\u{6863}\u{540C}\u{6B65}**\u{FF1A}\u{53CA}\u{65F6}\u{66F4}\u{65B0}\u{6587}\u{6863}
4609
+ #### \u{6027}\u{80FD}\u{8BC4}\u{5BA1}
4610
+ **\u{63D0}\u{793A}\u{8BCD}**\u{FF1A}
4611
+ \u{4ECE}\u{6027}\u{80FD}\u{89D2}\u{5EA6}\u{8BC4}\u{5BA1}\u{4EE3}\u{7801}\u{5E93}\u{FF1A}
4612
+ 1. \u{8BC6}\u{522B}\u{6027}\u{80FD}\u{74F6}\u{9888}
4613
+ 2. \u{68C0}\u{67E5}\u{8D44}\u{6E90}\u{4F7F}\u{7528}\u{60C5}\u{51B5}
4614
+ 3. \u{8BC4}\u{5BA1}\u{7B97}\u{6CD5}\u{6548}\u{7387}
4615
+ 4. \u{8BC4}\u{4F30}\u{7F13}\u{5B58}\u{7B56}\u{7565}
4488
4616
 
4617
+ \u{5305}\u{542B}\u{5177}\u{4F53}\u{7684}\u{4F18}\u{5316}\u{5EFA}\u{8BAE}\u{3002}
4489
4618
  ---
4490
4619
 
4491
4620
  **\u{1F389} \u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{5B8C}\u{6210}\u{FF01}**
4492
4621
 
4493
- \u{8FD9}\u{4E2A}\u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{65B9}\u{6848}\u{4E13}\u{95E8}\u{9488}\u{5BF9}AI\u{5F00}\u{53D1}\u{8FDB}\u{884C}\u{4E86}\u{4F18}\u{5316}\u{FF0C}\u{786E}\u{4FDD}\u{4F4E}\u{8026}\u{5408}\u{3001}AI\u{53CB}\u{597D}\u{7684}\u{5F00}\u{53D1}\u{4F53}\u{9A8C}\u{FF01}
4494
-
4495
4622
  ## \u{1F4BE} \u{6587}\u{6863}\u{5B58}\u{50A8}\u{4FE1}\u{606F}
4496
4623
  - **\u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{5DF2}\u{4FDD}\u{5B58}\u{5230}**: \`${storage.requirementsFile}\`
4497
4624
  - **\u{5B8C}\u{6574}\u{6587}\u{6863}\u{5BFC}\u{51FA}**: \u{4F7F}\u{7528} \`export_final_document\` \u{5DE5}\u{5177}\u{5BFC}\u{51FA}\u{5B8C}\u{6574}\u{9879}\u{76EE}\u{6587}\u{6863}
4498
4625
  `;
4499
- requirements_utils_currentRequirements.architecture_designs = requirements_utils_currentRequirements.architecture_designs || [];
4500
- requirements_utils_currentRequirements.architecture_designs.push({
4501
- timestamp: new Date().toISOString(),
4502
- design_focus,
4503
- content: architecture_design
4504
- });
4505
- storage.saveHistoryEntry("architecture_design", architecture_design, {
4506
- design_focus
4507
- });
4508
- storage.saveRequirements(requirements_utils_currentRequirements);
4509
- return architecture_design;
4626
+ requirements_utils_currentRequirements.architecture_designs = requirements_utils_currentRequirements.architecture_designs || [];
4627
+ requirements_utils_currentRequirements.architecture_designs.push({
4628
+ timestamp: new Date().toISOString(),
4629
+ design_focus,
4630
+ content: architecture_design
4631
+ });
4632
+ storage.saveRequirements(requirements_utils_currentRequirements);
4633
+ return architecture_design;
4634
+ } catch (error) {
4635
+ logger_logger.error(`\u{274C} \u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{751F}\u{6210}\u{5931}\u{8D25}: ${error instanceof Error ? error.message : String(error)}`);
4636
+ throw new Error(`\u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{751F}\u{6210}\u{5931}\u{8D25}: ${error instanceof Error ? error.message : String(error)}`);
4637
+ }
4510
4638
  }
4511
4639
  };
4512
4640
  const exportFinalDocumentTool = {
@@ -0,0 +1 @@
1
+ export declare const apiPrompt: (path: string) => Promise<string>;
@@ -0,0 +1,5 @@
1
+ export declare function packProject(): Promise<string>;
2
+ /**
3
+ * 处理远程仓库生成Markdown
4
+ */
5
+ export declare function processRemoteRepo(repoUrl: string, outputPath: string): Promise<string>;
@@ -9,7 +9,6 @@ export declare class RequirementStorage {
9
9
  get storageDirectory(): string;
10
10
  loadRequirements(): void;
11
11
  saveRequirements(currentRequirements: Requirements): void;
12
- saveHistoryEntry(entryType: string, content: string, metadata?: Record<string, any>): void;
13
12
  exportFinalDocument(currentRequirements: Requirements): string | null;
14
13
  private generateMarkdownReport;
15
14
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "intention-coding",
3
- "version": "0.0.7",
3
+ "version": "0.0.8",
4
4
  "description": "软件工程化的需求分析,功能设计,代码编写,测试运行和发布部署",
5
5
  "type": "module",
6
6
  "exports": {
@@ -39,10 +39,12 @@
39
39
  "zod": "3.25.64"
40
40
  },
41
41
  "dependencies": {
42
+ "aico-pack": "2.1.0",
42
43
  "fastmcp": "^3.3.0",
43
44
  "html-to-md": "^0.8.8",
44
45
  "lru-cache": "^11.1.0",
45
46
  "mammoth": "^1.9.1",
47
+ "repomix": "^0.3.9",
46
48
  "winston": "^3.17.0",
47
49
  "winston-daily-rotate-file": "^5.0.0"
48
50
  },