intention-coding 0.0.6 → 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/config.d.ts CHANGED
@@ -5,6 +5,6 @@ export declare const getStorageDir: () => string;
5
5
  */
6
6
  export declare const SERVICE_CONFIG: {
7
7
  name: string;
8
- version: any;
9
- description: any;
8
+ version: string;
9
+ description: string;
10
10
  };
package/dist/index.cjs CHANGED
@@ -1,8 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
- const __rslib_import_meta_url__ = /*#__PURE__*/ function() {
4
- return 'undefined' == typeof document ? new (require('url'.replace('', ''))).URL('file:' + __filename).href : document.currentScript && document.currentScript.src || new URL('main.js', document.baseURI).href;
5
- }();
6
3
  var __webpack_require__ = {};
7
4
  (()=>{
8
5
  __webpack_require__.n = (module)=>{
@@ -151,28 +148,11 @@ const external_winston_namespaceObject = require("winston");
151
148
  var external_winston_default = /*#__PURE__*/ __webpack_require__.n(external_winston_namespaceObject);
152
149
  const external_winston_daily_rotate_file_namespaceObject = require("winston-daily-rotate-file");
153
150
  var external_winston_daily_rotate_file_default = /*#__PURE__*/ __webpack_require__.n(external_winston_daily_rotate_file_namespaceObject);
154
- const external_path_namespaceObject = require("path");
155
- var external_path_default = /*#__PURE__*/ __webpack_require__.n(external_path_namespaceObject);
156
151
  const external_fs_namespaceObject = require("fs");
157
152
  var external_fs_default = /*#__PURE__*/ __webpack_require__.n(external_fs_namespaceObject);
158
- const external_url_namespaceObject = require("url");
159
- const sanitizeFileName = (input)=>input.replace(/[\\/:*?"<>|\n\r#%&]/g, '').trim().replace(/\s+/g, '_').replace(/_+/g, '_').replace(/^_+|_+$/g, '');
160
- function removeImagesFromMarkdown(content) {
161
- let cleaned = content.replace(/!\[.*?\]\(.*?\)/g, '');
162
- cleaned = cleaned.replace(/<img\b[^>]*>/g, '');
163
- cleaned = cleaned.replace(/!\[.*?\]\(data:image\/[a-z+]+;base64,[a-zA-Z0-9+/=]+\)/g, '');
164
- cleaned = cleaned.replace(/\n{3,}/g, '\n\n');
165
- return cleaned.trim();
166
- }
167
- const getPackageJson = ()=>{
168
- const __filename1 = (0, external_url_namespaceObject.fileURLToPath)(__rslib_import_meta_url__);
169
- const __dirname = external_path_default().dirname(__filename1);
170
- const packagePath = external_path_default().join(__dirname, '../../package.json');
171
- return JSON.parse(external_fs_namespaceObject.readFileSync(packagePath, 'utf8'));
172
- };
173
- external_path_default().join(process.cwd(), '.aico');
153
+ const config_PROJECT_ROOT = process.env.MCP_STORAGE_DIR || process.cwd();
174
154
  const getStorageDir = ()=>{
175
- const envDir = process.env.MCP_STORAGE_DIR + "/.aico";
155
+ const envDir = config_PROJECT_ROOT + "/.aico";
176
156
  if (!external_fs_namespaceObject.existsSync(envDir)) external_fs_namespaceObject.mkdirSync(envDir, {
177
157
  recursive: true
178
158
  });
@@ -180,9 +160,11 @@ const getStorageDir = ()=>{
180
160
  };
181
161
  const SERVICE_CONFIG = {
182
162
  name: "\u667A\u80FD\u8F6F\u4EF6\u661F\u5DE5\u5382",
183
- version: getPackageJson().version,
184
- description: getPackageJson().description
163
+ version: "0.0.1",
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"
185
165
  };
166
+ const external_path_namespaceObject = require("path");
167
+ var external_path_default = /*#__PURE__*/ __webpack_require__.n(external_path_namespaceObject);
186
168
  const logDir = getStorageDir() + '/logs';
187
169
  const levels = {
188
170
  error: 0,
@@ -212,8 +194,8 @@ const transports = [
212
194
  filename: external_path_default().join(logDir, 'application-%DATE%.log'),
213
195
  datePattern: 'YYYY-MM-DD',
214
196
  zippedArchive: true,
215
- maxSize: '20m',
216
- maxFiles: '14d',
197
+ maxSize: '2m',
198
+ maxFiles: '7d',
217
199
  format: fileFormat,
218
200
  level: 'info'
219
201
  })
@@ -231,7 +213,7 @@ const logger_logger = external_winston_default().createLogger({
231
213
  datePattern: 'YYYY-MM-DD',
232
214
  zippedArchive: true,
233
215
  maxSize: '1m',
234
- maxFiles: '14d',
216
+ maxFiles: '7d',
235
217
  format: fileFormat
236
218
  })
237
219
  ],
@@ -241,7 +223,7 @@ const logger_logger = external_winston_default().createLogger({
241
223
  datePattern: 'YYYY-MM-DD',
242
224
  zippedArchive: true,
243
225
  maxSize: '1m',
244
- maxFiles: '14d',
226
+ maxFiles: '7d',
245
227
  format: fileFormat
246
228
  })
247
229
  ]
@@ -3918,7 +3900,7 @@ const v3 = external_namespaceObject;
3918
3900
  const esm = v3;
3919
3901
  const RequirementClarifierParams = objectType({
3920
3902
  user_input: stringType().describe("\u7528\u6237\u8F93\u5165\u7684\u9700\u6C42\u63CF\u8FF0"),
3921
- file_path: stringType().describe("\u5982\u679C\u9700\u6C42\u63CF\u8FF0\u6765\u81EA\u6587\u6863\uFF0C\u9700\u8981\u63D0\u4F9B\u6587\u6863\u8F6C\u6362\u4E3Amd\u540E\u7684\u6587\u6863\u7684\u7EDD\u5BF9\u8DEF\u5F84")
3903
+ file_path: stringType().describe("\u5982\u679C\u9700\u6C42\u63CF\u8FF0\u6765\u81EA\u6587\u6863\uFF0C\u9700\u8981\u63D0\u4F9B\u6587\u6863\u8F6C\u6362\u4E3Amd\u683C\u5F0F\u540E\u7684\u6587\u6863\u7684\u7EDD\u5BF9\u8DEF\u5F84")
3922
3904
  });
3923
3905
  const RequirementManagerParams = objectType({
3924
3906
  clarified_info: stringType().describe("\u6F84\u6E05\u540E\u7684\u9700\u6C42\u4FE1\u606F"),
@@ -3935,7 +3917,7 @@ const RequirementManagerParams = objectType({
3935
3917
  ]).describe("\u9700\u6C42\u5206\u7C7B")
3936
3918
  });
3937
3919
  const ArchitectureDesignerParams = objectType({
3938
- 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")
3939
3921
  });
3940
3922
  async function invokeFlow(params, streamCb) {
3941
3923
  const { appid = 'app-ESTcrkOPOmkxdrO0120mE4s1', data, timeout = 1800000 } = params;
@@ -4100,6 +4082,14 @@ function removeCodeBlock(content) {
4100
4082
  const startRegExp = new RegExp(`^\\\`\\\`\\\`${language}\\n`);
4101
4083
  return content.trim().replace(startRegExp, '').replace(/\n?```$/, '');
4102
4084
  }
4085
+ const sanitizeFileName = (input)=>input.replace(/[\\/:*?"<>|\n\r#%&]/g, '').trim().replace(/\s+/g, '_').replace(/_+/g, '_').replace(/^_+|_+$/g, '');
4086
+ function removeImagesFromMarkdown(content) {
4087
+ let cleaned = content.replace(/!\[.*?\]\(.*?\)/g, '');
4088
+ cleaned = cleaned.replace(/<img\b[^>]*>/g, '');
4089
+ cleaned = cleaned.replace(/!\[.*?\]\(data:image\/[a-z+]+;base64,[a-zA-Z0-9+/=]+\)/g, '');
4090
+ cleaned = cleaned.replace(/\n{3,}/g, '\n\n');
4091
+ return cleaned.trim();
4092
+ }
4103
4093
  const promises_namespaceObject = require("fs/promises");
4104
4094
  var promises_default = /*#__PURE__*/ __webpack_require__.n(promises_namespaceObject);
4105
4095
  const requirementClarifier = {
@@ -4130,19 +4120,35 @@ const requirementClarifier = {
4130
4120
  user_input
4131
4121
  });
4132
4122
  const fileName = sanitizeFileName(analysisContent.length > 10 ? analysisContent.substring(0, 10) : `analysis_${Date.now()}`);
4133
- const mdDir = external_path_default().join(getStorageDir(), 'requirement');
4123
+ const mdDir = external_path_default().join(getStorageDir(), 'prd');
4134
4124
  await promises_default().mkdir(mdDir, {
4135
4125
  recursive: true
4136
4126
  });
4137
4127
  const mdPath = external_path_default().join(mdDir, `${fileName}.md`);
4138
4128
  const mdPathResolved = external_path_default().resolve(mdPath);
4139
- 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');
4140
4145
  logger_logger.info({
4141
4146
  module: 'requirement_clarifier',
4142
4147
  message: "\u9700\u6C42\u5206\u6790\u6587\u4EF6\u5DF2\u4FDD\u5B58",
4143
- path: mdPathResolved
4148
+ path: mdPathResolved,
4149
+ hasSubFiles: jumpLinks.length > 0
4144
4150
  });
4145
- return formatAnalysisPrompt(user_input, context, analysisContent, mdPathResolved);
4151
+ return formatAnalysisPrompt(user_input, finalContent, mdPathResolved);
4146
4152
  } catch (error) {
4147
4153
  const errorMsg = `\u{9700}\u{6C42}\u{5206}\u{6790}\u{5931}\u{8D25}: ${error instanceof Error ? error.message : String(error)}`;
4148
4154
  logger_logger.error({
@@ -4177,13 +4183,98 @@ const getAiAnalysis = async (input)=>{
4177
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"}`);
4178
4184
  }
4179
4185
  };
4180
- 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}
4181
4275
 
4182
4276
  ## \u{1F4DD} \u{7528}\u{6237}\u{539F}\u{59CB}\u{9700}\u{6C42}
4183
4277
  ${userInput}
4184
-
4185
- ## \u{1F4CB} \u{5F53}\u{524D}\u{4E0A}\u{4E0B}\u{6587}
4186
- ${context}
4187
4278
  ------------------------------
4188
4279
  ## \u{1F52C} \u{9700}\u{6C42}\u{5206}\u{6790}\u{7ED3}\u{679C}
4189
4280
  ${content}
@@ -4241,26 +4332,6 @@ class RequirementStorage {
4241
4332
  console.error(`\u{274C} \u{4FDD}\u{5B58}\u{9700}\u{6C42}\u{6587}\u{6863}\u{5931}\u{8D25}: ${e}`);
4242
4333
  }
4243
4334
  }
4244
- saveHistoryEntry(entryType, content, metadata = {}) {
4245
- try {
4246
- const historyEntry = {
4247
- timestamp: new Date().toISOString(),
4248
- type: entryType,
4249
- content,
4250
- metadata
4251
- };
4252
- let history = [];
4253
- if (external_fs_namespaceObject.existsSync(this.historyFile)) {
4254
- const data = external_fs_namespaceObject.readFileSync(this.historyFile, "utf8");
4255
- history = JSON.parse(data);
4256
- }
4257
- history.push(historyEntry);
4258
- external_fs_namespaceObject.writeFileSync(this.historyFile, JSON.stringify(history, null, 2), "utf8");
4259
- console.log(`\u{2705} \u{5386}\u{53F2}\u{8BB0}\u{5F55}\u{5DF2}\u{4FDD}\u{5B58}: ${entryType}`);
4260
- } catch (e) {
4261
- console.error(`\u{274C} \u{4FDD}\u{5B58}\u{5386}\u{53F2}\u{8BB0}\u{5F55}\u{5931}\u{8D25}: ${e}`);
4262
- }
4263
- }
4264
4335
  exportFinalDocument(currentRequirements) {
4265
4336
  try {
4266
4337
  const finalDoc = {
@@ -4373,9 +4444,6 @@ function addRequirementEntry(type, category, content) {
4373
4444
  requirements_utils_currentRequirements[type] = [
4374
4445
  requirementEntry
4375
4446
  ];
4376
- requirements_utils_storage.saveHistoryEntry(type, content, {
4377
- category
4378
- });
4379
4447
  requirements_utils_storage.saveRequirements(requirements_utils_currentRequirements);
4380
4448
  return requirements_utils_currentRequirements;
4381
4449
  }
@@ -4414,123 +4482,173 @@ const requirementManagerTool = {
4414
4482
  return formatRequirementUpdateResponse(category, clarified_info, requirements_utils_currentRequirements, storage.requirementsFile, storage.historyFile);
4415
4483
  }
4416
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
+ }
4417
4521
  const architectureDesignerTool = {
4418
4522
  name: "architecture_designer",
4419
- 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",
4420
4524
  parameters: ArchitectureDesignerParams,
4421
4525
  execute: async (args)=>{
4422
4526
  const { design_focus = "full_architecture" } = args;
4423
4527
  const storage = new RequirementStorage();
4424
- 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}
4425
4531
 
4426
4532
  ## \u{1F3AF} \u{8BBE}\u{8BA1}\u{76EE}\u{6807}
4427
4533
  - **\u{8BBE}\u{8BA1}\u{91CD}\u{70B9}**\u{FF1A}${design_focus}
4428
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}
4429
4535
 
4430
- ## \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}
4431
-
4432
- ### 1. \u{4F4E}\u{8026}\u{5408}\u{8BBE}\u{8BA1}\u{539F}\u{5219}
4433
- - **\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}
4434
- - **\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}
4435
- - **\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}
4436
- - **\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}
4437
-
4438
- ### 2. AI\u{53CB}\u{597D}\u{67B6}\u{6784}\u{539F}\u{5219}
4439
- - **\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}
4440
- - **\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}
4441
- - **\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}
4442
- - **\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}
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})
4443
4538
 
4444
- ## \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}
4445
4540
 
4446
- ### \u{524D}\u{7AEF}\u{67B6}\u{6784}
4447
- **\u{63A8}\u{8350}\u{6280}\u{672F}\u{6808}\u{FF1A}**
4448
- - \u{6846}\u{67B6}\u{FF1A}React 18 / Vue 3 / Next.js 15
4449
- - \u{72B6}\u{6001}\u{7BA1}\u{7406}\u{FF1A}Redux Toolkit / Zustand / Pinia
4450
- - 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}
4451
4545
 
4452
- ### \u{540E}\u{7AEF}\u{67B6}\u{6784}
4453
- **\u{63A8}\u{8350}\u{6280}\u{672F}\u{6808}\u{FF1A}**
4454
- - \u{6846}\u{67B6}\u{FF1A}FastAPI / Express.js / Spring Boot
4455
- - \u{6570}\u{636E}\u{5E93}\u{FF1A}PostgreSQL / MySQL / MongoDB
4456
- - \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}
4457
4548
 
4458
- ## \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}
4459
4557
 
4460
- ### \u{6838}\u{5FC3}\u{4E1A}\u{52A1}\u{6A21}\u{5757}
4461
- 1. **\u{7528}\u{6237}\u{7BA1}\u{7406}\u{6A21}\u{5757}**
4462
- - \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}
4463
- - \u{63A5}\u{53E3}\u{FF1A}\u{7528}\u{6237}CRUD\u{3001}\u{8BA4}\u{8BC1}API
4464
- - 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}
4465
4565
 
4466
- 2. **\u{4E1A}\u{52A1}\u{6838}\u{5FC3}\u{6A21}\u{5757}**
4467
- - \u{529F}\u{80FD}\u{FF1A}[\u{6839}\u{636E}\u{5177}\u{4F53}\u{9700}\u{6C42}\u{5B9A}\u{5236}]
4468
- - \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}
4469
- - 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}
4470
4574
 
4471
- ## \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}
4472
4582
 
4473
- ### \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}
4474
- - \u{9879}\u{76EE}\u{521D}\u{59CB}\u{5316}\u{548C}\u{73AF}\u{5883}\u{914D}\u{7F6E}
4475
- - \u{57FA}\u{7840}\u{6846}\u{67B6}\u{4EE3}\u{7801}\u{642D}\u{5EFA}
4476
- - \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}
4477
4584
 
4478
- ### \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}
4479
- - \u{7528}\u{6237}\u{7BA1}\u{7406}\u{529F}\u{80FD}\u{5B9E}\u{73B0}
4480
- - \u{6838}\u{5FC3}\u{4E1A}\u{52A1}\u{903B}\u{8F91}\u{5F00}\u{53D1}
4481
- - \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}
4482
4592
 
4483
- ### \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}
4484
- - \u{6B21}\u{8981}\u{529F}\u{80FD}\u{5B9E}\u{73B0}
4485
- - \u{6027}\u{80FD}\u{4F18}\u{5316}\u{548C}\u{8C03}\u{8BD5}
4486
- - \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}
4487
4600
 
4488
- ## \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}
4489
4602
 
4490
- ### \u{6A21}\u{5757}\u{5F00}\u{53D1}\u{6307}\u{5BFC}
4491
- 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}
4492
- 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}
4493
- 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}
4494
4610
 
4495
- ### \u{63A5}\u{53E3}\u{8BBE}\u{8BA1}\u{89C4}\u{8303}
4496
- - GET /api/users - \u{83B7}\u{53D6}\u{7528}\u{6237}\u{5217}\u{8868}
4497
- - POST /api/users - \u{521B}\u{5EFA}\u{7528}\u{6237}
4498
- - PUT /api/users/:id - \u{66F4}\u{65B0}\u{7528}\u{6237}
4499
- - 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}
4500
4612
 
4501
- ## \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}
4502
4620
 
4503
- ### \u{67B6}\u{6784}\u{4F18}\u{52BF}
4504
- 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}
4505
- 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}
4506
- 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}
4507
4622
 
4508
- ### \u{5B9E}\u{65BD}\u{5EFA}\u{8BAE}
4509
- 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}
4510
- 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}
4511
- 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}
4512
4630
 
4631
+ \u{5305}\u{542B}\u{5177}\u{4F53}\u{7684}\u{4F18}\u{5316}\u{5EFA}\u{8BAE}\u{3002}
4513
4632
  ---
4514
4633
 
4515
4634
  **\u{1F389} \u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{5B8C}\u{6210}\u{FF01}**
4516
4635
 
4517
- \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}
4518
-
4519
4636
  ## \u{1F4BE} \u{6587}\u{6863}\u{5B58}\u{50A8}\u{4FE1}\u{606F}
4520
4637
  - **\u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{5DF2}\u{4FDD}\u{5B58}\u{5230}**: \`${storage.requirementsFile}\`
4521
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}
4522
4639
  `;
4523
- requirements_utils_currentRequirements.architecture_designs = requirements_utils_currentRequirements.architecture_designs || [];
4524
- requirements_utils_currentRequirements.architecture_designs.push({
4525
- timestamp: new Date().toISOString(),
4526
- design_focus,
4527
- content: architecture_design
4528
- });
4529
- storage.saveHistoryEntry("architecture_design", architecture_design, {
4530
- design_focus
4531
- });
4532
- storage.saveRequirements(requirements_utils_currentRequirements);
4533
- 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
+ }
4534
4652
  }
4535
4653
  };
4536
4654
  const exportFinalDocumentTool = {
package/dist/index.js CHANGED
@@ -2,10 +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";
7
- import { fileURLToPath } from "url";
6
+ import path_0, { join } from "path";
8
7
  import promises, { mkdir, readFile, stat, writeFile } from "fs/promises";
8
+ import { runCli as external_aico_pack_runCli } from "aico-pack";
9
9
  import { convertToHtml } from "mammoth";
10
10
  import html_to_md from "html-to-md";
11
11
  var __webpack_require__ = {};
@@ -141,23 +141,9 @@ __webpack_require__.d(external_namespaceObject, {
141
141
  util: ()=>util_util,
142
142
  void: ()=>voidType
143
143
  });
144
- const sanitizeFileName = (input)=>input.replace(/[\\/:*?"<>|\n\r#%&]/g, '').trim().replace(/\s+/g, '_').replace(/_+/g, '_').replace(/^_+|_+$/g, '');
145
- function removeImagesFromMarkdown(content) {
146
- let cleaned = content.replace(/!\[.*?\]\(.*?\)/g, '');
147
- cleaned = cleaned.replace(/<img\b[^>]*>/g, '');
148
- cleaned = cleaned.replace(/!\[.*?\]\(data:image\/[a-z+]+;base64,[a-zA-Z0-9+/=]+\)/g, '');
149
- cleaned = cleaned.replace(/\n{3,}/g, '\n\n');
150
- return cleaned.trim();
151
- }
152
- const getPackageJson = ()=>{
153
- const __filename = fileURLToPath(import.meta.url);
154
- const __dirname = path_0.dirname(__filename);
155
- const packagePath = path_0.join(__dirname, '../../package.json');
156
- return JSON.parse(readFileSync(packagePath, 'utf8'));
157
- };
158
- path_0.join(process.cwd(), '.aico');
144
+ const config_PROJECT_ROOT = process.env.MCP_STORAGE_DIR || process.cwd();
159
145
  const getStorageDir = ()=>{
160
- const envDir = process.env.MCP_STORAGE_DIR + "/.aico";
146
+ const envDir = config_PROJECT_ROOT + "/.aico";
161
147
  if (!existsSync(envDir)) mkdirSync(envDir, {
162
148
  recursive: true
163
149
  });
@@ -165,8 +151,8 @@ const getStorageDir = ()=>{
165
151
  };
166
152
  const SERVICE_CONFIG = {
167
153
  name: "\u667A\u80FD\u8F6F\u4EF6\u661F\u5DE5\u5382",
168
- version: getPackageJson().version,
169
- description: getPackageJson().description
154
+ version: "0.0.1",
155
+ 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"
170
156
  };
171
157
  const logDir = getStorageDir() + '/logs';
172
158
  const levels = {
@@ -197,8 +183,8 @@ const transports = [
197
183
  filename: path_0.join(logDir, 'application-%DATE%.log'),
198
184
  datePattern: 'YYYY-MM-DD',
199
185
  zippedArchive: true,
200
- maxSize: '20m',
201
- maxFiles: '14d',
186
+ maxSize: '2m',
187
+ maxFiles: '7d',
202
188
  format: fileFormat,
203
189
  level: 'info'
204
190
  })
@@ -216,7 +202,7 @@ const logger_logger = winston.createLogger({
216
202
  datePattern: 'YYYY-MM-DD',
217
203
  zippedArchive: true,
218
204
  maxSize: '1m',
219
- maxFiles: '14d',
205
+ maxFiles: '7d',
220
206
  format: fileFormat
221
207
  })
222
208
  ],
@@ -226,7 +212,7 @@ const logger_logger = winston.createLogger({
226
212
  datePattern: 'YYYY-MM-DD',
227
213
  zippedArchive: true,
228
214
  maxSize: '1m',
229
- maxFiles: '14d',
215
+ maxFiles: '7d',
230
216
  format: fileFormat
231
217
  })
232
218
  ]
@@ -3903,7 +3889,7 @@ const v3 = external_namespaceObject;
3903
3889
  const esm = v3;
3904
3890
  const RequirementClarifierParams = objectType({
3905
3891
  user_input: stringType().describe("\u7528\u6237\u8F93\u5165\u7684\u9700\u6C42\u63CF\u8FF0"),
3906
- file_path: stringType().describe("\u5982\u679C\u9700\u6C42\u63CF\u8FF0\u6765\u81EA\u6587\u6863\uFF0C\u9700\u8981\u63D0\u4F9B\u6587\u6863\u8F6C\u6362\u4E3Amd\u540E\u7684\u6587\u6863\u7684\u7EDD\u5BF9\u8DEF\u5F84")
3892
+ file_path: stringType().describe("\u5982\u679C\u9700\u6C42\u63CF\u8FF0\u6765\u81EA\u6587\u6863\uFF0C\u9700\u8981\u63D0\u4F9B\u6587\u6863\u8F6C\u6362\u4E3Amd\u683C\u5F0F\u540E\u7684\u6587\u6863\u7684\u7EDD\u5BF9\u8DEF\u5F84")
3907
3893
  });
3908
3894
  const RequirementManagerParams = objectType({
3909
3895
  clarified_info: stringType().describe("\u6F84\u6E05\u540E\u7684\u9700\u6C42\u4FE1\u606F"),
@@ -3920,7 +3906,7 @@ const RequirementManagerParams = objectType({
3920
3906
  ]).describe("\u9700\u6C42\u5206\u7C7B")
3921
3907
  });
3922
3908
  const ArchitectureDesignerParams = objectType({
3923
- 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")
3924
3910
  });
3925
3911
  async function invokeFlow(params, streamCb) {
3926
3912
  const { appid = 'app-ESTcrkOPOmkxdrO0120mE4s1', data, timeout = 1800000 } = params;
@@ -4085,6 +4071,14 @@ function removeCodeBlock(content) {
4085
4071
  const startRegExp = new RegExp(`^\\\`\\\`\\\`${language}\\n`);
4086
4072
  return content.trim().replace(startRegExp, '').replace(/\n?```$/, '');
4087
4073
  }
4074
+ const sanitizeFileName = (input)=>input.replace(/[\\/:*?"<>|\n\r#%&]/g, '').trim().replace(/\s+/g, '_').replace(/_+/g, '_').replace(/^_+|_+$/g, '');
4075
+ function removeImagesFromMarkdown(content) {
4076
+ let cleaned = content.replace(/!\[.*?\]\(.*?\)/g, '');
4077
+ cleaned = cleaned.replace(/<img\b[^>]*>/g, '');
4078
+ cleaned = cleaned.replace(/!\[.*?\]\(data:image\/[a-z+]+;base64,[a-zA-Z0-9+/=]+\)/g, '');
4079
+ cleaned = cleaned.replace(/\n{3,}/g, '\n\n');
4080
+ return cleaned.trim();
4081
+ }
4088
4082
  const requirementClarifier = {
4089
4083
  name: "requirement_clarifier",
4090
4084
  description: "\u9700\u6C42\u5DE5\u7A0B\u5E08 - \u5206\u6790\u7528\u6237\u9700\u6C42\u5B8C\u6574\u6027\uFF0C\u4E3B\u52A8\u53D1\u73B0\u4E0D\u660E\u786E\u7684\u5730\u65B9",
@@ -4113,19 +4107,35 @@ const requirementClarifier = {
4113
4107
  user_input
4114
4108
  });
4115
4109
  const fileName = sanitizeFileName(analysisContent.length > 10 ? analysisContent.substring(0, 10) : `analysis_${Date.now()}`);
4116
- const mdDir = path_0.join(getStorageDir(), 'requirement');
4110
+ const mdDir = path_0.join(getStorageDir(), 'prd');
4117
4111
  await promises.mkdir(mdDir, {
4118
4112
  recursive: true
4119
4113
  });
4120
4114
  const mdPath = path_0.join(mdDir, `${fileName}.md`);
4121
4115
  const mdPathResolved = path_0.resolve(mdPath);
4122
- 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');
4123
4132
  logger_logger.info({
4124
4133
  module: 'requirement_clarifier',
4125
4134
  message: "\u9700\u6C42\u5206\u6790\u6587\u4EF6\u5DF2\u4FDD\u5B58",
4126
- path: mdPathResolved
4135
+ path: mdPathResolved,
4136
+ hasSubFiles: jumpLinks.length > 0
4127
4137
  });
4128
- return formatAnalysisPrompt(user_input, context, analysisContent, mdPathResolved);
4138
+ return formatAnalysisPrompt(user_input, finalContent, mdPathResolved);
4129
4139
  } catch (error) {
4130
4140
  const errorMsg = `\u{9700}\u{6C42}\u{5206}\u{6790}\u{5931}\u{8D25}: ${error instanceof Error ? error.message : String(error)}`;
4131
4141
  logger_logger.error({
@@ -4160,13 +4170,98 @@ const getAiAnalysis = async (input)=>{
4160
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"}`);
4161
4171
  }
4162
4172
  };
4163
- 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}
4164
4262
 
4165
4263
  ## \u{1F4DD} \u{7528}\u{6237}\u{539F}\u{59CB}\u{9700}\u{6C42}
4166
4264
  ${userInput}
4167
-
4168
- ## \u{1F4CB} \u{5F53}\u{524D}\u{4E0A}\u{4E0B}\u{6587}
4169
- ${context}
4170
4265
  ------------------------------
4171
4266
  ## \u{1F52C} \u{9700}\u{6C42}\u{5206}\u{6790}\u{7ED3}\u{679C}
4172
4267
  ${content}
@@ -4224,26 +4319,6 @@ class RequirementStorage {
4224
4319
  console.error(`\u{274C} \u{4FDD}\u{5B58}\u{9700}\u{6C42}\u{6587}\u{6863}\u{5931}\u{8D25}: ${e}`);
4225
4320
  }
4226
4321
  }
4227
- saveHistoryEntry(entryType, content, metadata = {}) {
4228
- try {
4229
- const historyEntry = {
4230
- timestamp: new Date().toISOString(),
4231
- type: entryType,
4232
- content,
4233
- metadata
4234
- };
4235
- let history = [];
4236
- if (existsSync(this.historyFile)) {
4237
- const data = readFileSync(this.historyFile, "utf8");
4238
- history = JSON.parse(data);
4239
- }
4240
- history.push(historyEntry);
4241
- writeFileSync(this.historyFile, JSON.stringify(history, null, 2), "utf8");
4242
- console.log(`\u{2705} \u{5386}\u{53F2}\u{8BB0}\u{5F55}\u{5DF2}\u{4FDD}\u{5B58}: ${entryType}`);
4243
- } catch (e) {
4244
- console.error(`\u{274C} \u{4FDD}\u{5B58}\u{5386}\u{53F2}\u{8BB0}\u{5F55}\u{5931}\u{8D25}: ${e}`);
4245
- }
4246
- }
4247
4322
  exportFinalDocument(currentRequirements) {
4248
4323
  try {
4249
4324
  const finalDoc = {
@@ -4356,9 +4431,6 @@ function addRequirementEntry(type, category, content) {
4356
4431
  requirements_utils_currentRequirements[type] = [
4357
4432
  requirementEntry
4358
4433
  ];
4359
- requirements_utils_storage.saveHistoryEntry(type, content, {
4360
- category
4361
- });
4362
4434
  requirements_utils_storage.saveRequirements(requirements_utils_currentRequirements);
4363
4435
  return requirements_utils_currentRequirements;
4364
4436
  }
@@ -4397,123 +4469,172 @@ const requirementManagerTool = {
4397
4469
  return formatRequirementUpdateResponse(category, clarified_info, requirements_utils_currentRequirements, storage.requirementsFile, storage.historyFile);
4398
4470
  }
4399
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
+ }
4400
4507
  const architectureDesignerTool = {
4401
4508
  name: "architecture_designer",
4402
- 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",
4403
4510
  parameters: ArchitectureDesignerParams,
4404
4511
  execute: async (args)=>{
4405
4512
  const { design_focus = "full_architecture" } = args;
4406
4513
  const storage = new RequirementStorage();
4407
- 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}
4408
4517
 
4409
4518
  ## \u{1F3AF} \u{8BBE}\u{8BA1}\u{76EE}\u{6807}
4410
4519
  - **\u{8BBE}\u{8BA1}\u{91CD}\u{70B9}**\u{FF1A}${design_focus}
4411
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}
4412
4521
 
4413
- ## \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}
4414
-
4415
- ### 1. \u{4F4E}\u{8026}\u{5408}\u{8BBE}\u{8BA1}\u{539F}\u{5219}
4416
- - **\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}
4417
- - **\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}
4418
- - **\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}
4419
- - **\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}
4420
-
4421
- ### 2. AI\u{53CB}\u{597D}\u{67B6}\u{6784}\u{539F}\u{5219}
4422
- - **\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}
4423
- - **\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}
4424
- - **\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}
4425
- - **\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}
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})
4426
4524
 
4427
- ## \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}
4428
4526
 
4429
- ### \u{524D}\u{7AEF}\u{67B6}\u{6784}
4430
- **\u{63A8}\u{8350}\u{6280}\u{672F}\u{6808}\u{FF1A}**
4431
- - \u{6846}\u{67B6}\u{FF1A}React 18 / Vue 3 / Next.js 15
4432
- - \u{72B6}\u{6001}\u{7BA1}\u{7406}\u{FF1A}Redux Toolkit / Zustand / Pinia
4433
- - 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}
4434
4531
 
4435
- ### \u{540E}\u{7AEF}\u{67B6}\u{6784}
4436
- **\u{63A8}\u{8350}\u{6280}\u{672F}\u{6808}\u{FF1A}**
4437
- - \u{6846}\u{67B6}\u{FF1A}FastAPI / Express.js / Spring Boot
4438
- - \u{6570}\u{636E}\u{5E93}\u{FF1A}PostgreSQL / MySQL / MongoDB
4439
- - \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}
4440
4534
 
4441
- ## \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}
4442
4543
 
4443
- ### \u{6838}\u{5FC3}\u{4E1A}\u{52A1}\u{6A21}\u{5757}
4444
- 1. **\u{7528}\u{6237}\u{7BA1}\u{7406}\u{6A21}\u{5757}**
4445
- - \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}
4446
- - \u{63A5}\u{53E3}\u{FF1A}\u{7528}\u{6237}CRUD\u{3001}\u{8BA4}\u{8BC1}API
4447
- - 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}
4448
4551
 
4449
- 2. **\u{4E1A}\u{52A1}\u{6838}\u{5FC3}\u{6A21}\u{5757}**
4450
- - \u{529F}\u{80FD}\u{FF1A}[\u{6839}\u{636E}\u{5177}\u{4F53}\u{9700}\u{6C42}\u{5B9A}\u{5236}]
4451
- - \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}
4452
- - 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}
4453
4560
 
4454
- ## \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}
4455
4568
 
4456
- ### \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}
4457
- - \u{9879}\u{76EE}\u{521D}\u{59CB}\u{5316}\u{548C}\u{73AF}\u{5883}\u{914D}\u{7F6E}
4458
- - \u{57FA}\u{7840}\u{6846}\u{67B6}\u{4EE3}\u{7801}\u{642D}\u{5EFA}
4459
- - \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}
4460
4570
 
4461
- ### \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}
4462
- - \u{7528}\u{6237}\u{7BA1}\u{7406}\u{529F}\u{80FD}\u{5B9E}\u{73B0}
4463
- - \u{6838}\u{5FC3}\u{4E1A}\u{52A1}\u{903B}\u{8F91}\u{5F00}\u{53D1}
4464
- - \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}
4465
4578
 
4466
- ### \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}
4467
- - \u{6B21}\u{8981}\u{529F}\u{80FD}\u{5B9E}\u{73B0}
4468
- - \u{6027}\u{80FD}\u{4F18}\u{5316}\u{548C}\u{8C03}\u{8BD5}
4469
- - \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}
4470
4586
 
4471
- ## \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}
4472
4588
 
4473
- ### \u{6A21}\u{5757}\u{5F00}\u{53D1}\u{6307}\u{5BFC}
4474
- 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}
4475
- 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}
4476
- 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}
4477
4596
 
4478
- ### \u{63A5}\u{53E3}\u{8BBE}\u{8BA1}\u{89C4}\u{8303}
4479
- - GET /api/users - \u{83B7}\u{53D6}\u{7528}\u{6237}\u{5217}\u{8868}
4480
- - POST /api/users - \u{521B}\u{5EFA}\u{7528}\u{6237}
4481
- - PUT /api/users/:id - \u{66F4}\u{65B0}\u{7528}\u{6237}
4482
- - 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}
4483
4598
 
4484
- ## \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}
4485
4606
 
4486
- ### \u{67B6}\u{6784}\u{4F18}\u{52BF}
4487
- 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}
4488
- 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}
4489
- 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}
4490
4608
 
4491
- ### \u{5B9E}\u{65BD}\u{5EFA}\u{8BAE}
4492
- 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}
4493
- 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}
4494
- 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}
4495
4616
 
4617
+ \u{5305}\u{542B}\u{5177}\u{4F53}\u{7684}\u{4F18}\u{5316}\u{5EFA}\u{8BAE}\u{3002}
4496
4618
  ---
4497
4619
 
4498
4620
  **\u{1F389} \u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{5B8C}\u{6210}\u{FF01}**
4499
4621
 
4500
- \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}
4501
-
4502
4622
  ## \u{1F4BE} \u{6587}\u{6863}\u{5B58}\u{50A8}\u{4FE1}\u{606F}
4503
4623
  - **\u{67B6}\u{6784}\u{8BBE}\u{8BA1}\u{5DF2}\u{4FDD}\u{5B58}\u{5230}**: \`${storage.requirementsFile}\`
4504
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}
4505
4625
  `;
4506
- requirements_utils_currentRequirements.architecture_designs = requirements_utils_currentRequirements.architecture_designs || [];
4507
- requirements_utils_currentRequirements.architecture_designs.push({
4508
- timestamp: new Date().toISOString(),
4509
- design_focus,
4510
- content: architecture_design
4511
- });
4512
- storage.saveHistoryEntry("architecture_design", architecture_design, {
4513
- design_focus
4514
- });
4515
- storage.saveRequirements(requirements_utils_currentRequirements);
4516
- 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
+ }
4517
4638
  }
4518
4639
  };
4519
4640
  const exportFinalDocumentTool = {
@@ -0,0 +1 @@
1
+ export declare const apiPrompt: (path: string) => Promise<string>;
@@ -6,11 +6,6 @@ export declare const sanitizeFileName: (input: string) => string;
6
6
  * @returns 不含图片的纯文本Markdown
7
7
  */
8
8
  export declare function removeImagesFromMarkdown(content: string): string;
9
- /**
10
- * 获取package信息
11
- * @returns
12
- */
13
- export declare const getPackageJson: () => any;
14
9
  /**
15
10
  * 验证文件路径安全性
16
11
  */
@@ -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.6",
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
  },