intention-coding 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,4 +1,7 @@
1
1
  "use strict";
2
+ const __rslib_import_meta_url__ = /*#__PURE__*/ function() {
3
+ return 'undefined' == typeof document ? new (require('url'.replace('', ''))).URL('file:' + __filename).href : document.currentScript && document.currentScript.src || new URL('main.js', document.baseURI).href;
4
+ }();
2
5
  var __webpack_modules__ = {
3
6
  "fs/promises": function(module) {
4
7
  module.exports = import("fs/promises").then(function(module) {
@@ -6372,9 +6375,9 @@ Scenario Outline: \u{7528}\u{6237}\u{901A}\u{8FC7}API\u{67E5}\u{8BE2}\u{8BA2}\u{
6372
6375
  }
6373
6376
  return null;
6374
6377
  }
6375
- saveToCache(cacheKey, document) {
6378
+ saveToCache(cacheKey, document1) {
6376
6379
  DocumentGenerator.cache.set(cacheKey, {
6377
- document,
6380
+ document: document1,
6378
6381
  timestamp: Date.now()
6379
6382
  });
6380
6383
  logger.info("\u6587\u6863\u5DF2\u4FDD\u5B58\u5230\u7F13\u5B58", {
@@ -6608,19 +6611,19 @@ ${combinedFeatureContent}
6608
6611
  async generateDocument(content, title, requirementType, projectInfo, customPrompt, outputPath) {
6609
6612
  try {
6610
6613
  const cacheKey = this.generateCacheKey(content, requirementType, customPrompt);
6611
- let document = this.getCachedDocument(cacheKey);
6612
- if (document) {
6614
+ let document1 = this.getCachedDocument(cacheKey);
6615
+ if (document1) {
6613
6616
  logger.info("\u4F7F\u7528\u7F13\u5B58\u7684\u6587\u6863", {
6614
6617
  title,
6615
6618
  requirementType
6616
6619
  });
6617
- return document;
6620
+ return document1;
6618
6621
  }
6619
6622
  const template = this.templateSelector.selectTemplate(requirementType);
6620
6623
  this.templateSelector.validateTemplate(template, requirementType);
6621
6624
  const fullPrompt = this.buildDocumentPrompt(template, content, title, projectInfo, customPrompt, requirementType);
6622
6625
  if (outputPath) try {
6623
- document = await this.generateDocumentStream(fullPrompt, outputPath, title, "", {
6626
+ document1 = await this.generateDocumentStream(fullPrompt, outputPath, title, "", {
6624
6627
  realTimeMode: true
6625
6628
  });
6626
6629
  } catch (streamError) {
@@ -6628,18 +6631,18 @@ ${combinedFeatureContent}
6628
6631
  error: streamError,
6629
6632
  requirementType
6630
6633
  });
6631
- document = await openAIService.generateText({
6634
+ document1 = await openAIService.generateText({
6632
6635
  prompt: fullPrompt,
6633
6636
  system_prompt: "\u4F60\u662F\u4E00\u4F4D\u4E13\u4E1A\u7684\u6280\u672F\u6587\u6863\u7F16\u5199\u4E13\u5BB6\uFF0C\u8BF7\u751F\u6210\u5B8C\u6574\u3001\u8BE6\u7EC6\u7684\u6280\u672F\u9700\u6C42\u6587\u6863\u3002"
6634
6637
  });
6635
6638
  }
6636
- else document = await openAIService.generateText({
6639
+ else document1 = await openAIService.generateText({
6637
6640
  prompt: fullPrompt,
6638
6641
  system_prompt: "\u4F60\u662F\u4E00\u4F4D\u4E13\u4E1A\u7684\u6280\u672F\u6587\u6863\u7F16\u5199\u4E13\u5BB6\uFF0C\u8BF7\u751F\u6210\u5B8C\u6574\u3001\u8BE6\u7EC6\u7684\u6280\u672F\u9700\u6C42\u6587\u6863\u3002"
6639
6642
  });
6640
- this.validateGeneratedDocument(document, title);
6641
- this.saveToCache(cacheKey, document);
6642
- return document;
6643
+ this.validateGeneratedDocument(document1, title);
6644
+ this.saveToCache(cacheKey, document1);
6645
+ return document1;
6643
6646
  } catch (error) {
6644
6647
  logger.error("\u6280\u672F\u6587\u6863\u751F\u6210\u5931\u8D25", {
6645
6648
  error,
@@ -6927,9 +6930,9 @@ ${existingContent}
6927
6930
 
6928
6931
  \u{8BF7}\u{7EE7}\u{7EED}\u{751F}\u{6210}\u{FF1A}`;
6929
6932
  }
6930
- isDocumentComplete(document) {
6931
- const hasEnding = document.includes("## \u66F4\u65B0\u65E5\u5FD7") || document.includes("---\n\n**") || document.trim().endsWith("---") || document.trim().endsWith("\u3002") || document.trim().endsWith("\uFF09");
6932
- const hasReasonableLength = document.length >= 1000;
6933
+ isDocumentComplete(document1) {
6934
+ const hasEnding = document1.includes("## \u66F4\u65B0\u65E5\u5FD7") || document1.includes("---\n\n**") || document1.trim().endsWith("---") || document1.trim().endsWith("\u3002") || document1.trim().endsWith("\uFF09");
6935
+ const hasReasonableLength = document1.length >= 1000;
6933
6936
  return hasEnding && hasReasonableLength;
6934
6937
  }
6935
6938
  async continueDocumentGeneration(originalPrompt, existingContent, outputPath) {
@@ -7124,15 +7127,15 @@ ${customPrompt}` : ""}
7124
7127
  });
7125
7128
  }
7126
7129
  }
7127
- validateGeneratedDocument(document, title) {
7128
- if (!document || document.trim().length < 100) throw new RequirementAnalysisError("\u751F\u6210\u7684\u6280\u672F\u6587\u6863\u5185\u5BB9\u8FC7\u77ED\uFF0C\u53EF\u80FD\u5B58\u5728\u95EE\u9898", types_ErrorCodes.DOCUMENT_GENERATION_FAILED, {
7130
+ validateGeneratedDocument(document1, title) {
7131
+ if (!document1 || document1.trim().length < 100) throw new RequirementAnalysisError("\u751F\u6210\u7684\u6280\u672F\u6587\u6863\u5185\u5BB9\u8FC7\u77ED\uFF0C\u53EF\u80FD\u5B58\u5728\u95EE\u9898", types_ErrorCodes.DOCUMENT_GENERATION_FAILED, {
7129
7132
  title,
7130
- documentLength: document?.length || 0
7133
+ documentLength: document1?.length || 0
7131
7134
  });
7132
- if (!document.includes(title)) logger.warn("\u751F\u6210\u7684\u6587\u6863\u53EF\u80FD\u4E0E\u9700\u6C42\u6807\u9898\u4E0D\u5339\u914D", {
7135
+ if (!document1.includes(title)) logger.warn("\u751F\u6210\u7684\u6587\u6863\u53EF\u80FD\u4E0E\u9700\u6C42\u6807\u9898\u4E0D\u5339\u914D", {
7133
7136
  title
7134
7137
  });
7135
- if (document.includes("## 3.1 ER\u903B\u8F91\u56FE\u8BBE\u8BA1") && !document.includes("erDiagram") && !document.includes("entity")) logger.warn("\u751F\u6210\u7684\u6587\u6863\u53EF\u80FD\u7F3A\u5C11ER\u56FE\u5185\u5BB9", {
7138
+ if (document1.includes("## 3.1 ER\u903B\u8F91\u56FE\u8BBE\u8BA1") && !document1.includes("erDiagram") && !document1.includes("entity")) logger.warn("\u751F\u6210\u7684\u6587\u6863\u53EF\u80FD\u7F3A\u5C11ER\u56FE\u5185\u5BB9", {
7136
7139
  title
7137
7140
  });
7138
7141
  }
@@ -7531,6 +7534,7 @@ ${generationTasks?.map((task, i)=>`
7531
7534
  }
7532
7535
  }
7533
7536
  const apiLimiter = new ConcurrencyLimiter(18);
7537
+ const EXECUTION_TIMEOUT_MS = 40000;
7534
7538
  async function generateApiSection(sectionDef, templateVariables) {
7535
7539
  return apiLimiter.run(async ()=>{
7536
7540
  try {
@@ -7663,11 +7667,28 @@ ${pageStyle}
7663
7667
  ],
7664
7668
  isError: true
7665
7669
  };
7666
- logger.info(`\u{5F00}\u{59CB}\u{5B8C}\u{5168}\u{5E76}\u{884C}\u{751F}\u{6210} ${generationTasks.length} \u{4EFD}\u{6587}\u{6863}...`);
7670
+ logger.info(`\u{5F00}\u{59CB}\u{5B8C}\u{5168}\u{5E76}\u{884C}\u{751F}\u{6210} ${generationTasks.length} \u{4EFD}\u{6587}\u{6863}\u{FF08}\u{8D85}\u{65F6}: ${EXECUTION_TIMEOUT_MS}ms\u{FF09}...`);
7667
7671
  const startTime = Date.now();
7668
7672
  const apiTask = generationTasks.find((t)=>"API" === t.requirementType);
7669
7673
  const htmlTask = generationTasks.find((t)=>"HTML" === t.requirementType);
7670
- const results = [];
7674
+ const taskStatus = new Map();
7675
+ if (apiTask) taskStatus.set("API", {
7676
+ type: "API",
7677
+ content: "",
7678
+ outputPath: apiTask.outputPath,
7679
+ success: false,
7680
+ completed: false
7681
+ });
7682
+ if (htmlTask) {
7683
+ const htmlOutputPath = htmlTask.outputPath.replace(/\.md$/, ".html");
7684
+ taskStatus.set("HTML", {
7685
+ type: "HTML",
7686
+ content: "",
7687
+ outputPath: htmlOutputPath,
7688
+ success: false,
7689
+ completed: false
7690
+ });
7691
+ }
7671
7692
  const parallelTasks = [];
7672
7693
  if (apiTask) {
7673
7694
  const apiPromise = (async ()=>{
@@ -7683,28 +7704,30 @@ ${pageStyle}
7683
7704
  ---
7684
7705
 
7685
7706
  `;
7686
- const document = header + successSections.map((s)=>s.content).join("\n\n---\n\n");
7707
+ const document1 = header + successSections.map((s)=>s.content).join("\n\n---\n\n");
7687
7708
  const outputDir = external_path_default().dirname(apiTask.outputPath);
7688
7709
  await promises_namespaceObject.mkdir(outputDir, {
7689
7710
  recursive: true
7690
7711
  });
7691
- await promises_namespaceObject.writeFile(apiTask.outputPath, document, "utf-8");
7692
- results.push({
7712
+ await promises_namespaceObject.writeFile(apiTask.outputPath, document1, "utf-8");
7713
+ taskStatus.set("API", {
7693
7714
  type: "API",
7694
- content: document,
7715
+ content: document1,
7695
7716
  outputPath: apiTask.outputPath,
7696
- success: true
7717
+ success: true,
7718
+ completed: true
7697
7719
  });
7698
7720
  logger.info(`API\u{6587}\u{6863}\u{751F}\u{6210}\u{5B8C}\u{6210}`, {
7699
- length: document.length
7721
+ length: document1.length
7700
7722
  });
7701
7723
  } catch (error) {
7702
- results.push({
7724
+ taskStatus.set("API", {
7703
7725
  type: "API",
7704
7726
  content: "",
7705
7727
  outputPath: apiTask.outputPath,
7706
7728
  success: false,
7707
- error: error.message
7729
+ error: error.message,
7730
+ completed: true
7708
7731
  });
7709
7732
  }
7710
7733
  })();
@@ -7721,44 +7744,128 @@ ${pageStyle}
7721
7744
  recursive: true
7722
7745
  });
7723
7746
  await promises_namespaceObject.writeFile(htmlOutputPath, htmlContent, "utf-8");
7724
- results.push({
7747
+ taskStatus.set("HTML", {
7725
7748
  type: "HTML",
7726
7749
  content: htmlContent,
7727
7750
  outputPath: htmlOutputPath,
7728
- success: true
7751
+ success: true,
7752
+ completed: true
7729
7753
  });
7730
7754
  logger.info(`HTML\u{9875}\u{9762}\u{751F}\u{6210}\u{5B8C}\u{6210}`, {
7731
7755
  length: htmlContent.length
7732
7756
  });
7733
7757
  } catch (error) {
7734
- results.push({
7758
+ taskStatus.set("HTML", {
7735
7759
  type: "HTML",
7736
7760
  content: "",
7737
- outputPath: htmlTask.outputPath,
7761
+ outputPath: htmlTask.outputPath.replace(/\.md$/, ".html"),
7738
7762
  success: false,
7739
- error: error.message
7763
+ error: error.message,
7764
+ completed: true
7740
7765
  });
7741
7766
  }
7742
7767
  })();
7743
7768
  parallelTasks.push(htmlPromise);
7744
7769
  }
7745
- await Promise.all(parallelTasks);
7770
+ const timeoutPromise = new Promise((resolve)=>{
7771
+ setTimeout(()=>resolve("timeout"), EXECUTION_TIMEOUT_MS);
7772
+ });
7773
+ const raceResult = await Promise.race([
7774
+ Promise.all(parallelTasks).then(()=>"completed"),
7775
+ timeoutPromise
7776
+ ]);
7746
7777
  const totalDuration = Date.now() - startTime;
7747
- const successCount = results.filter((r)=>r.success).length;
7748
- const failedCount = results.filter((r)=>!r.success).length;
7749
- const generatedFiles = results.filter((r)=>r.success).map((r)=>r.outputPath);
7750
- logger.info(`\u{5E76}\u{884C}\u{751F}\u{6210}\u{5B8C}\u{6210}`, {
7778
+ const isTimeout = "timeout" === raceResult;
7779
+ const results = Array.from(taskStatus.values());
7780
+ const completedResults = results.filter((r)=>r.completed);
7781
+ const pendingResults = results.filter((r)=>!r.completed);
7782
+ const successCount = completedResults.filter((r)=>r.success).length;
7783
+ const failedCount = completedResults.filter((r)=>!r.success && r.completed).length;
7784
+ const generatedFiles = completedResults.filter((r)=>r.success).map((r)=>r.outputPath);
7785
+ logger.info(`\u{5E76}\u{884C}\u{751F}\u{6210}${isTimeout ? "\u8D85\u65F6" : "\u5B8C\u6210"}`, {
7751
7786
  total: results.length,
7787
+ completed: completedResults.length,
7788
+ pending: pendingResults.length,
7752
7789
  success: successCount,
7753
7790
  failed: failedCount,
7754
- totalDuration: `${totalDuration}ms`
7791
+ totalDuration: `${totalDuration}ms`,
7792
+ isTimeout
7755
7793
  });
7794
+ if (isTimeout && pendingResults.length > 0) {
7795
+ const pendingPrompts = pendingResults.map((task)=>{
7796
+ if ("API" === task.type && apiTask) return {
7797
+ type: "API",
7798
+ outputPath: task.outputPath,
7799
+ prompt: `\u{8BF7}\u{4E3A}"${apiTask.templateVariables.featureName}"\u{751F}\u{6210}API\u{6280}\u{672F}\u{9700}\u{6C42}\u{6587}\u{6863}\u{FF0C}\u{5305}\u{542B}\u{4EE5}\u{4E0B}\u{7AE0}\u{8282}\u{FF1A}
7800
+ 1. \u{6587}\u{6863}\u{5934}\u{90E8}\u{FF08}\u{6807}\u{9898}\u{3001}\u{751F}\u{6210}\u{65F6}\u{95F4}\u{3001}\u{4E1A}\u{52A1}\u{9886}\u{57DF}\u{FF09}
7801
+ 2. \u{9700}\u{6C42}\u{80CC}\u{666F}\u{FF08}\u{9700}\u{6C42}\u{80CC}\u{666F}\u{3001}\u{5173}\u{952E}\u{529F}\u{80FD}\u{3001}\u{6D89}\u{53CA}\u{89D2}\u{8272}\u{FF09}
7802
+ 3. \u{529F}\u{80FD}\u{8BBE}\u{8BA1}\u{8BF4}\u{660E}\u{FF08}\u{6D41}\u{7A0B}\u{7F16}\u{53F7}\u{3001}\u{524D}\u{7F6E}\u{6761}\u{4EF6}\u{3001}\u{89D2}\u{8272}\u{7B49}\u{8868}\u{683C}\u{FF09}
7803
+ 4. \u{6570}\u{636E}\u{5EFA}\u{6A21}\u{FF08}ER\u{903B}\u{8F91}\u{56FE}mermaid erDiagram + \u{6570}\u{636E}\u{8868}\u{5B9E}\u{4F53}\u{8BBE}\u{8BA1}\u{FF09}
7804
+ 5. API\u{63A5}\u{53E3}\u{8BBE}\u{8BA1}\u{FF08}\u{63A5}\u{53E3}\u{5217}\u{8868}\u{3001}\u{8BF7}\u{6C42}\u{53C2}\u{6570}\u{3001}\u{54CD}\u{5E94}\u{53C2}\u{6570}\u{3001}\u{9519}\u{8BEF}\u{7801}\u{FF09}
7805
+ 6. \u{4E1A}\u{52A1}\u{65F6}\u{5E8F}\u{56FE}\u{FF08}mermaid sequenceDiagram\u{FF09}
7806
+ 7. \u{4E1A}\u{52A1}\u{72B6}\u{6001}\u{FF08}\u{72B6}\u{6001}\u{63CF}\u{8FF0}\u{8868}\u{683C}\u{FF09}
7807
+ 8. \u{4F2A}\u{4EE3}\u{7801}\u{793A}\u{4F8B}\u{FF08}\u{6838}\u{5FC3}\u{4E1A}\u{52A1}\u{903B}\u{8F91}\u{FF09}
7808
+
7809
+ \u{4E1A}\u{52A1}\u{9886}\u{57DF}: ${apiTask.templateVariables.businessDomain}
7810
+ \u{9700}\u{6C42}\u{8BE6}\u{60C5}: ${apiTask.templateVariables.inputContent?.substring(0, 500) || ''}
7811
+
7812
+ \u{8BF7}\u{751F}\u{6210}\u{5B8C}\u{6574}\u{7684}Markdown\u{6587}\u{6863}\u{5E76}\u{4FDD}\u{5B58}\u{5230}: ${task.outputPath}`
7813
+ };
7814
+ if ("HTML" === task.type && htmlTask) return {
7815
+ type: "HTML",
7816
+ outputPath: task.outputPath,
7817
+ prompt: `\u{8BF7}\u{4E3A}"${htmlTask.templateVariables.featureName}"\u{751F}\u{6210}\u{53EF}\u{4EA4}\u{4E92}\u{7684}HTML\u{9875}\u{9762}\u{FF1A}
7818
+
7819
+ \u{6280}\u{672F}\u{8981}\u{6C42}\u{FF1A}
7820
+ 1. \u{5B8C}\u{6574}HTML\u{6587}\u{4EF6}\u{FF08}<!DOCTYPE html>\u{3001}<html>\u{3001}<head>\u{3001}<body>\u{FF09}
7821
+ 2. \u{4F7F}\u{7528}TailwindCSS\u{FF08}CDN\u{5F15}\u{5165}\u{FF09}\u{8FDB}\u{884C}\u{6837}\u{5F0F}\u{8BBE}\u{8BA1}
7822
+ 3. \u{9875}\u{9762}\u{7C7B}\u{578B}: ${htmlTask.templateVariables.pageType || 'responsive'}\u{5E03}\u{5C40}
7823
+ 4. \u{5305}\u{542B}\u{8868}\u{5355}\u{9A8C}\u{8BC1}\u{548C}\u{4EA4}\u{4E92}\u{903B}\u{8F91}\u{FF08}\u{539F}\u{751F}JavaScript\u{FF09}
7824
+ 5. \u{5305}\u{542B}\u{52A0}\u{8F7D}\u{72B6}\u{6001}\u{3001}\u{6210}\u{529F}/\u{5931}\u{8D25}\u{63D0}\u{793A}
7825
+ 6. \u{6240}\u{6709}\u{6587}\u{672C}\u{4F7F}\u{7528}\u{4E2D}\u{6587}
7826
+
7827
+ \u{9875}\u{9762}\u{98CE}\u{683C}\u{FF1A}
7828
+ ${htmlTask.templateVariables.pageStyle || DEFAULT_PAGE_STYLE}
7829
+
7830
+ \u{9700}\u{6C42}\u{8BE6}\u{60C5}: ${htmlTask.templateVariables.inputContent?.substring(0, 500) || ''}
7831
+
7832
+ \u{8BF7}\u{751F}\u{6210}\u{5B8C}\u{6574}\u{7684}HTML\u{4EE3}\u{7801}\u{5E76}\u{4FDD}\u{5B58}\u{5230}: ${task.outputPath}`
7833
+ };
7834
+ return null;
7835
+ }).filter(Boolean);
7836
+ return {
7837
+ content: [
7838
+ {
7839
+ type: "text",
7840
+ text: JSON.stringify({
7841
+ success: successCount > 0,
7842
+ timeout: true,
7843
+ message: `\u{6267}\u{884C}\u{8D85}\u{65F6}(${EXECUTION_TIMEOUT_MS}ms)\u{FF1A}${successCount} \u{5B8C}\u{6210}\u{FF0C}${pendingResults.length} \u{5F85}\u{6267}\u{884C}\u{FF0C}\u{8BF7}\u{7EE7}\u{7EED}\u{6267}\u{884C}\u{4EE5}\u{4E0B}\u{4EFB}\u{52A1}`,
7844
+ data: {
7845
+ outputPath: serviceResult.outputPath,
7846
+ generatedFiles,
7847
+ analysisInfo: serviceResult.analysisInfo || {},
7848
+ completedResults: completedResults.map((r)=>({
7849
+ type: r.type,
7850
+ outputPath: r.outputPath,
7851
+ success: r.success,
7852
+ error: r.error,
7853
+ contentLength: r.content?.length || 0
7854
+ })),
7855
+ pendingTasks: pendingPrompts
7856
+ }
7857
+ })
7858
+ }
7859
+ ]
7860
+ };
7861
+ }
7756
7862
  return {
7757
7863
  content: [
7758
7864
  {
7759
7865
  type: "text",
7760
7866
  text: JSON.stringify({
7761
7867
  success: successCount > 0,
7868
+ timeout: false,
7762
7869
  message: `\u{6587}\u{6863}\u{751F}\u{6210}\u{5B8C}\u{6210}\u{FF1A}${successCount} \u{6210}\u{529F}\u{FF0C}${failedCount} \u{5931}\u{8D25}\u{FF0C}\u{603B}\u{8017}\u{65F6} ${totalDuration}ms`,
7763
7870
  data: {
7764
7871
  outputPath: serviceResult.outputPath,
@@ -10821,6 +10928,264 @@ ${requirement_description}
10821
10928
  }
10822
10929
  }
10823
10930
  };
10931
+ const external_url_namespaceObject = require("url");
10932
+ const external_docxtemplater_namespaceObject = require("docxtemplater");
10933
+ var external_docxtemplater_default = /*#__PURE__*/ __webpack_require__.n(external_docxtemplater_namespaceObject);
10934
+ const external_pizzip_namespaceObject = require("pizzip");
10935
+ var external_pizzip_default = /*#__PURE__*/ __webpack_require__.n(external_pizzip_namespaceObject);
10936
+ function getTemplatePath() {
10937
+ let currentDir;
10938
+ try {
10939
+ currentDir = external_path_namespaceObject.dirname((0, external_url_namespaceObject.fileURLToPath)(__rslib_import_meta_url__));
10940
+ } catch {
10941
+ currentDir = __dirname;
10942
+ }
10943
+ return external_path_namespaceObject.resolve(currentDir, "\u6280\u672F\u89C4\u683C\u8BF4\u660E\u4E66\u6A21\u677F.docx");
10944
+ }
10945
+ async function renderTechSpecDoc(data, outputDir) {
10946
+ try {
10947
+ const templatePath = getTemplatePath();
10948
+ try {
10949
+ await promises_namespaceObject.access(templatePath);
10950
+ } catch {
10951
+ return {
10952
+ success: false,
10953
+ outputPath: null,
10954
+ error: `\u{6A21}\u{677F}\u{6587}\u{4EF6}\u{4E0D}\u{5B58}\u{5728}: ${templatePath}`
10955
+ };
10956
+ }
10957
+ const templateContent = await promises_namespaceObject.readFile(templatePath);
10958
+ const zip = new (external_pizzip_default())(templateContent);
10959
+ const doc = new (external_docxtemplater_default())(zip, {
10960
+ paragraphLoop: true,
10961
+ linebreaks: true,
10962
+ delimiters: {
10963
+ start: '{',
10964
+ end: '}'
10965
+ }
10966
+ });
10967
+ doc.render(data);
10968
+ const output = doc.getZip().generate({
10969
+ type: 'nodebuffer',
10970
+ compression: 'DEFLATE'
10971
+ });
10972
+ await promises_namespaceObject.mkdir(outputDir, {
10973
+ recursive: true
10974
+ });
10975
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
10976
+ const outputFileName = `\u{6280}\u{672F}\u{89C4}\u{683C}\u{8BF4}\u{660E}\u{4E66}_${data.projectName}_${data.moduleName}_${timestamp}.docx`;
10977
+ const outputPath = external_path_namespaceObject.join(outputDir, outputFileName);
10978
+ await promises_namespaceObject.writeFile(outputPath, output);
10979
+ logger.info("\u6280\u672F\u89C4\u683C\u8BF4\u660E\u4E66\u751F\u6210\u6210\u529F", {
10980
+ outputPath
10981
+ });
10982
+ return {
10983
+ success: true,
10984
+ outputPath
10985
+ };
10986
+ } catch (error) {
10987
+ logger.error("\u6280\u672F\u89C4\u683C\u8BF4\u660E\u4E66\u751F\u6210\u5931\u8D25", {
10988
+ error: error.message
10989
+ });
10990
+ if (error.properties && error.properties.errors) {
10991
+ const errorMessages = error.properties.errors.map((e)=>e.properties?.explanation || e.message).join('; ');
10992
+ return {
10993
+ success: false,
10994
+ outputPath: null,
10995
+ error: `\u{6A21}\u{677F}\u{6E32}\u{67D3}\u{9519}\u{8BEF}: ${errorMessages}`
10996
+ };
10997
+ }
10998
+ return {
10999
+ success: false,
11000
+ outputPath: null,
11001
+ error: error.message || "\u672A\u77E5\u9519\u8BEF"
11002
+ };
11003
+ }
11004
+ }
11005
+ const TableFieldDetailSchema = objectType({
11006
+ id: stringType().describe("\u5E8F\u53F7"),
11007
+ fieldName: stringType().describe("\u5B57\u6BB5\u540D"),
11008
+ fieldType: stringType().describe("\u5B57\u6BB5\u7C7B\u578B"),
11009
+ fieldDescription: stringType().describe("\u5B57\u6BB5\u63CF\u8FF0"),
11010
+ fieldLength: stringType().describe("\u5B57\u6BB5\u957F\u5EA6")
11011
+ });
11012
+ const TableInfoSchema = objectType({
11013
+ id: stringType().describe("\u5E8F\u53F7"),
11014
+ tableName: stringType().describe("\u8868\u540D\u79F0"),
11015
+ entityName: stringType().describe("\u5BF9\u5E94\u5B9E\u4F53\u540D\u79F0"),
11016
+ tableDescription: stringType().describe("\u63CF\u8FF0"),
11017
+ tableDetailList: arrayType(TableFieldDetailSchema).default([]).describe("\u8868\u5B57\u6BB5\u8BE6\u60C5\u5217\u8868")
11018
+ });
11019
+ const ParameterInfoSchema = objectType({
11020
+ id: stringType().describe("\u5E8F\u53F7"),
11021
+ propertyType: stringType().describe("\u7C7B\u578B"),
11022
+ propertyName: stringType().describe("\u5C5E\u6027\u540D"),
11023
+ required: stringType().describe("\u662F\u5426\u5FC5\u586B"),
11024
+ propertyDesc: stringType().describe("\u63CF\u8FF0")
11025
+ });
11026
+ const ReturnResultInfoSchema = objectType({
11027
+ id: stringType().describe("\u5E8F\u53F7"),
11028
+ propertyType: stringType().describe("\u7C7B\u578B"),
11029
+ propertyName: stringType().describe("\u5C5E\u6027\u540D"),
11030
+ propertyDesc: stringType().describe("\u63CF\u8FF0")
11031
+ });
11032
+ const InterfaceDesignDetailSchema = objectType({
11033
+ functionName: stringType().describe("\u529F\u80FD\u540D\u79F0"),
11034
+ interfaceDesc: stringType().describe("\u63A5\u53E3\u63CF\u8FF0"),
11035
+ className: stringType().describe("\u63A5\u53E3\u7C7B\u540D"),
11036
+ methodName: stringType().describe("\u65B9\u6CD5\u540D"),
11037
+ parameterList: arrayType(ParameterInfoSchema).default([]).describe("\u53C2\u6570\u5217\u8868"),
11038
+ returnResultList: arrayType(ReturnResultInfoSchema).default([]).describe("\u8FD4\u56DE\u7ED3\u679C\u5217\u8868"),
11039
+ implementLogic: stringType().describe("\u5B9E\u73B0\u903B\u8F91")
11040
+ });
11041
+ const DesignDetailSchema = objectType({
11042
+ serviceName: stringType().describe("\u670D\u52A1\u540D\u79F0"),
11043
+ serviceDesc: stringType().describe("\u529F\u80FD\u63CF\u8FF0"),
11044
+ interfaceDesignDetailList: arrayType(InterfaceDesignDetailSchema).default([]).describe("\u63A5\u53E3\u8BBE\u8BA1\u8BE6\u60C5\u5217\u8868")
11045
+ });
11046
+ const InterfaceDetailSchema = objectType({
11047
+ id: stringType().describe("\u5E8F\u53F7"),
11048
+ functionDescription: stringType().describe("\u529F\u80FD\u63CF\u8FF0"),
11049
+ serviceName: stringType().describe("\u670D\u52A1\u540D"),
11050
+ methodName: stringType().describe("\u65B9\u6CD5\u540D")
11051
+ });
11052
+ const ServiceInterfaceSchema = objectType({
11053
+ id: stringType().describe("\u5E8F\u53F7"),
11054
+ serviceType: stringType().describe("\u670D\u52A1\u7C7B\u578B"),
11055
+ serviceEnglishName: stringType().describe("\u670D\u52A1\u82F1\u6587\u540D\u79F0"),
11056
+ serviceChineseName: stringType().describe("\u670D\u52A1\u4E2D\u6587\u540D\u79F0"),
11057
+ serviceDescription: stringType().describe("\u670D\u52A1\u63CF\u8FF0"),
11058
+ interfaceDetailList: arrayType(InterfaceDetailSchema).default([]).describe("\u63A5\u53E3\u8BE6\u60C5\u5217\u8868")
11059
+ });
11060
+ const techSpecGeneratorTool = {
11061
+ name: 'tech-spec-generator',
11062
+ description: `\u{6280}\u{672F}\u{89C4}\u{683C}\u{8BF4}\u{660E}\u{4E66}\u{751F}\u{6210}\u{5DE5}\u{5177} - \u{6839}\u{636E}\u{6536}\u{96C6}\u{7684}\u{4EE3}\u{7801}\u{4FE1}\u{606F}\u{751F}\u{6210}\u{6280}\u{672F}\u{89C4}\u{683C}\u{8BF4}\u{660E}\u{4E66}\u{3002}
11063
+
11064
+ \u{4F7F}\u{7528}\u{6D41}\u{7A0B}\u{FF1A}
11065
+ 1. MCP\u{5BA2}\u{6237}\u{7AEF}\u{5148}\u{8BFB}\u{53D6}\u{76EE}\u{6807}\u{4EE3}\u{7801}\u{76EE}\u{5F55}\u{FF0C}\u{5206}\u{6790}\u{5E76}\u{6536}\u{96C6}\u{4EE5}\u{4E0B}\u{4FE1}\u{606F}\u{FF1A}
11066
+ - \u{6570}\u{636E}\u{8868}\u{8BBE}\u{8BA1}\u{FF08}\u{8868}\u{540D}\u{3001}\u{5B57}\u{6BB5}\u{4FE1}\u{606F}\u{7B49}\u{FF09}
11067
+ - \u{670D}\u{52A1}\u{63A5}\u{53E3}\u{8BBE}\u{8BA1}\u{FF08}\u{670D}\u{52A1}\u{540D}\u{3001}\u{63A5}\u{53E3}\u{65B9}\u{6CD5}\u{3001}\u{53C2}\u{6570}\u{3001}\u{8FD4}\u{56DE}\u{503C}\u{7B49}\u{FF09}
11068
+ - \u{529F}\u{80FD}\u{8BBE}\u{8BA1}\u{8BE6}\u{60C5}\u{FF08}\u{529F}\u{80FD}\u{540D}\u{79F0}\u{3001}\u{63CF}\u{8FF0}\u{3001}\u{5B9E}\u{73B0}\u{903B}\u{8F91}\u{7B49}\u{FF09}
11069
+ 2. \u{5C06}\u{6536}\u{96C6}\u{7684}\u{6570}\u{636E}\u{901A}\u{8FC7} techSpecData \u{53C2}\u{6570}\u{4F20}\u{9012}\u{7ED9}\u{8BE5}\u{5DE5}\u{5177}
11070
+ 3. \u{5DE5}\u{5177}\u{4F7F}\u{7528} .aico/create-tect-docs/\u{6280}\u{672F}\u{89C4}\u{683C}\u{8BF4}\u{660E}\u{4E66}\u{6A21}\u{677F}.docx \u{6A21}\u{677F}\u{6E32}\u{67D3}\u{751F}\u{6210}\u{6587}\u{6863}
11071
+ 4. \u{6587}\u{6863}\u{8F93}\u{51FA}\u{5230} projectPath/.aico/tect/ \u{76EE}\u{5F55}`,
11072
+ inputSchema: {
11073
+ projectPath: stringType().min(1).describe("\u5F53\u524D\u9879\u76EE\u8DEF\u5F84\uFF0C\u751F\u6210\u7684\u6280\u672F\u89C4\u683C\u8BF4\u660E\u4E66\u4FDD\u5B58\u5230\u8BE5\u8DEF\u5F84\u4E0B\u7684.aico/tect\u76EE\u5F55"),
11074
+ techSpecData: objectType({
11075
+ projectName: stringType().describe("\u9879\u76EE\u540D\u79F0"),
11076
+ moduleName: stringType().describe("\u6A21\u5757\u540D\u79F0"),
11077
+ year: stringType().optional().describe("\u5E74\u4EFD\uFF0C\u9ED8\u8BA4\u5F53\u524D\u5E74\u4EFD"),
11078
+ month: stringType().optional().describe("\u6708\u4EFD\uFF0C\u9ED8\u8BA4\u5F53\u524D\u6708\u4EFD"),
11079
+ referDoc: stringType().optional().describe("\u53C2\u8003\u6587\u6863"),
11080
+ serviceInterfaceList: arrayType(ServiceInterfaceSchema).default([]).describe("\u670D\u52A1\u63A5\u53E3\u6E05\u5355"),
11081
+ designDetailList: arrayType(DesignDetailSchema).default([]).describe("\u670D\u52A1\u63A5\u53E3\u8BBE\u8BA1\u8BE6\u60C5"),
11082
+ tableInfoList: arrayType(TableInfoSchema).default([]).describe("\u6570\u636E\u5E93\u8868\u4FE1\u606F\u5217\u8868")
11083
+ }).describe("\u6280\u672F\u89C4\u683C\u6570\u636E\uFF0C\u7531MCP\u5BA2\u6237\u7AEF\u901A\u8FC7\u5206\u6790\u4EE3\u7801\u76EE\u5F55\u6536\u96C6")
11084
+ },
11085
+ handler: async (args)=>{
11086
+ try {
11087
+ const { projectPath, techSpecData } = args;
11088
+ if (!projectPath) return {
11089
+ content: [
11090
+ {
11091
+ type: 'text',
11092
+ text: JSON.stringify({
11093
+ success: false,
11094
+ message: "\u7F3A\u5C11\u5FC5\u586B\u53C2\u6570\uFF1AprojectPath",
11095
+ data: null
11096
+ })
11097
+ }
11098
+ ],
11099
+ isError: true
11100
+ };
11101
+ if (!techSpecData) return {
11102
+ content: [
11103
+ {
11104
+ type: 'text',
11105
+ text: JSON.stringify({
11106
+ success: false,
11107
+ message: "\u7F3A\u5C11\u5FC5\u586B\u53C2\u6570\uFF1AtechSpecData",
11108
+ data: null
11109
+ })
11110
+ }
11111
+ ],
11112
+ isError: true
11113
+ };
11114
+ const now = new Date();
11115
+ const data = {
11116
+ projectName: techSpecData.projectName || "\u672A\u547D\u540D\u9879\u76EE",
11117
+ moduleName: techSpecData.moduleName || "\u672A\u547D\u540D\u6A21\u5757",
11118
+ year: techSpecData.year || String(now.getFullYear()),
11119
+ month: techSpecData.month || String(now.getMonth() + 1).padStart(2, '0'),
11120
+ referDoc: techSpecData.referDoc || "\u65E0",
11121
+ serviceInterfaceList: techSpecData.serviceInterfaceList || [],
11122
+ designDetailList: techSpecData.designDetailList || [],
11123
+ tableInfoList: techSpecData.tableInfoList || []
11124
+ };
11125
+ const outputDir = external_path_namespaceObject.join(projectPath, '.aico', 'tect');
11126
+ logger.info("\u5F00\u59CB\u751F\u6210\u6280\u672F\u89C4\u683C\u8BF4\u660E\u4E66", {
11127
+ projectPath,
11128
+ outputDir,
11129
+ projectName: data.projectName,
11130
+ moduleName: data.moduleName,
11131
+ tableCount: data.tableInfoList.length,
11132
+ serviceCount: data.serviceInterfaceList.length
11133
+ });
11134
+ const result = await renderTechSpecDoc(data, outputDir);
11135
+ if (result.success) return {
11136
+ content: [
11137
+ {
11138
+ type: 'text',
11139
+ text: JSON.stringify({
11140
+ success: true,
11141
+ message: "\u6280\u672F\u89C4\u683C\u8BF4\u660E\u4E66\u751F\u6210\u6210\u529F",
11142
+ data: {
11143
+ outputPath: result.outputPath,
11144
+ projectName: data.projectName,
11145
+ moduleName: data.moduleName,
11146
+ statistics: {
11147
+ tableCount: data.tableInfoList.length,
11148
+ serviceCount: data.serviceInterfaceList.length,
11149
+ designCount: data.designDetailList.length
11150
+ }
11151
+ }
11152
+ })
11153
+ }
11154
+ ]
11155
+ };
11156
+ return {
11157
+ content: [
11158
+ {
11159
+ type: 'text',
11160
+ text: JSON.stringify({
11161
+ success: false,
11162
+ message: result.error || "\u6587\u6863\u751F\u6210\u5931\u8D25",
11163
+ data: null
11164
+ })
11165
+ }
11166
+ ],
11167
+ isError: true
11168
+ };
11169
+ } catch (error) {
11170
+ logger.error("\u6280\u672F\u89C4\u683C\u8BF4\u660E\u4E66\u751F\u6210\u5F02\u5E38", {
11171
+ error: error.message
11172
+ });
11173
+ return {
11174
+ content: [
11175
+ {
11176
+ type: 'text',
11177
+ text: JSON.stringify({
11178
+ success: false,
11179
+ message: error.message || "\u751F\u6210\u8FC7\u7A0B\u4E2D\u53D1\u751F\u9519\u8BEF",
11180
+ data: null
11181
+ })
11182
+ }
11183
+ ],
11184
+ isError: true
11185
+ };
11186
+ }
11187
+ }
11188
+ };
10824
11189
  function createMcpServer() {
10825
11190
  const server = new mcp_js_namespaceObject.McpServer({
10826
11191
  name: SERVICE_CONFIG.name,
@@ -10838,7 +11203,8 @@ ${requirement_description}
10838
11203
  exportExcelTool,
10839
11204
  requirementIdentifierTool,
10840
11205
  requirementAlignerTool,
10841
- taskExecutorTool
11206
+ taskExecutorTool,
11207
+ techSpecGeneratorTool
10842
11208
  ];
10843
11209
  tools.forEach((tool)=>{
10844
11210
  server.tool(tool.name, tool.description, tool.inputSchema, tool.handler);
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmBpE,wBAAgB,eAAe,cAgC9B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoBpE,wBAAgB,eAAe,cAiC9B"}
@@ -65,6 +65,8 @@ export interface GenerationTask {
65
65
  businessDomain: string;
66
66
  generateSequenceDiagram: string;
67
67
  customPrompt?: string;
68
+ pageType?: "pc" | "mobile" | "responsive";
69
+ pageStyle?: string;
68
70
  };
69
71
  existingContent?: string;
70
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/services/requirement-analyzer/core/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/services/requirement-analyzer/core/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/requirement-analyzer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAuKxB;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;oBA+BZ,GAAG;;;;;;;;;;;;;CA4M1B,CAAC;AAGF,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACpE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/requirement-analyzer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA0KxB;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;oBA+BZ,GAAG;;;;;;;;;;;;;CAwU1B,CAAC;AAGF,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACpE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 文档渲染服务
3
+ * 使用 docxtemplater 将数据渲染到技术规格说明书模板
4
+ */
5
+ import { TechSpecData, DocGenerationResult } from './types';
6
+ /**
7
+ * 渲染技术规格说明书文档
8
+ * @param data 技术规格数据
9
+ * @param outputDir 输出目录
10
+ * @returns 生成结果
11
+ */
12
+ export declare function renderTechSpecDoc(data: TechSpecData, outputDir: string): Promise<DocGenerationResult>;
13
+ //# sourceMappingURL=doc-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-renderer.d.ts","sourceRoot":"","sources":["../../../src/services/tech-spec-generator/doc-renderer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAmB5D;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,CAAC,CA8E9B"}
@@ -0,0 +1,380 @@
1
+ /**
2
+ * 技术规格说明书生成工具
3
+ *
4
+ * 该工具用于根据代码目录生成技术规格说明书
5
+ * 工作流程:
6
+ * 1. MCP客户端读取代码目录,收集技术规格数据
7
+ * 2. 将收集的数据传递给该工具
8
+ * 3. 工具使用模板渲染生成技术规格说明书
9
+ */
10
+ import { z } from 'zod';
11
+ /**
12
+ * 技术规格说明书生成工具
13
+ */
14
+ export declare const techSpecGeneratorTool: {
15
+ name: string;
16
+ description: string;
17
+ inputSchema: {
18
+ projectPath: z.ZodString;
19
+ techSpecData: z.ZodObject<{
20
+ projectName: z.ZodString;
21
+ moduleName: z.ZodString;
22
+ year: z.ZodOptional<z.ZodString>;
23
+ month: z.ZodOptional<z.ZodString>;
24
+ referDoc: z.ZodOptional<z.ZodString>;
25
+ serviceInterfaceList: z.ZodDefault<z.ZodArray<z.ZodObject<{
26
+ id: z.ZodString;
27
+ serviceType: z.ZodString;
28
+ serviceEnglishName: z.ZodString;
29
+ serviceChineseName: z.ZodString;
30
+ serviceDescription: z.ZodString;
31
+ interfaceDetailList: z.ZodDefault<z.ZodArray<z.ZodObject<{
32
+ id: z.ZodString;
33
+ functionDescription: z.ZodString;
34
+ serviceName: z.ZodString;
35
+ methodName: z.ZodString;
36
+ }, "strip", z.ZodTypeAny, {
37
+ id: string;
38
+ methodName: string;
39
+ serviceName: string;
40
+ functionDescription: string;
41
+ }, {
42
+ id: string;
43
+ methodName: string;
44
+ serviceName: string;
45
+ functionDescription: string;
46
+ }>, "many">>;
47
+ }, "strip", z.ZodTypeAny, {
48
+ id: string;
49
+ serviceType: string;
50
+ serviceEnglishName: string;
51
+ serviceChineseName: string;
52
+ serviceDescription: string;
53
+ interfaceDetailList: {
54
+ id: string;
55
+ methodName: string;
56
+ serviceName: string;
57
+ functionDescription: string;
58
+ }[];
59
+ }, {
60
+ id: string;
61
+ serviceType: string;
62
+ serviceEnglishName: string;
63
+ serviceChineseName: string;
64
+ serviceDescription: string;
65
+ interfaceDetailList?: {
66
+ id: string;
67
+ methodName: string;
68
+ serviceName: string;
69
+ functionDescription: string;
70
+ }[] | undefined;
71
+ }>, "many">>;
72
+ designDetailList: z.ZodDefault<z.ZodArray<z.ZodObject<{
73
+ serviceName: z.ZodString;
74
+ serviceDesc: z.ZodString;
75
+ interfaceDesignDetailList: z.ZodDefault<z.ZodArray<z.ZodObject<{
76
+ functionName: z.ZodString;
77
+ interfaceDesc: z.ZodString;
78
+ className: z.ZodString;
79
+ methodName: z.ZodString;
80
+ parameterList: z.ZodDefault<z.ZodArray<z.ZodObject<{
81
+ id: z.ZodString;
82
+ propertyType: z.ZodString;
83
+ propertyName: z.ZodString;
84
+ required: z.ZodString;
85
+ propertyDesc: z.ZodString;
86
+ }, "strip", z.ZodTypeAny, {
87
+ id: string;
88
+ propertyType: string;
89
+ propertyName: string;
90
+ required: string;
91
+ propertyDesc: string;
92
+ }, {
93
+ id: string;
94
+ propertyType: string;
95
+ propertyName: string;
96
+ required: string;
97
+ propertyDesc: string;
98
+ }>, "many">>;
99
+ returnResultList: z.ZodDefault<z.ZodArray<z.ZodObject<{
100
+ id: z.ZodString;
101
+ propertyType: z.ZodString;
102
+ propertyName: z.ZodString;
103
+ propertyDesc: z.ZodString;
104
+ }, "strip", z.ZodTypeAny, {
105
+ id: string;
106
+ propertyType: string;
107
+ propertyName: string;
108
+ propertyDesc: string;
109
+ }, {
110
+ id: string;
111
+ propertyType: string;
112
+ propertyName: string;
113
+ propertyDesc: string;
114
+ }>, "many">>;
115
+ implementLogic: z.ZodString;
116
+ }, "strip", z.ZodTypeAny, {
117
+ functionName: string;
118
+ interfaceDesc: string;
119
+ className: string;
120
+ methodName: string;
121
+ parameterList: {
122
+ id: string;
123
+ propertyType: string;
124
+ propertyName: string;
125
+ required: string;
126
+ propertyDesc: string;
127
+ }[];
128
+ returnResultList: {
129
+ id: string;
130
+ propertyType: string;
131
+ propertyName: string;
132
+ propertyDesc: string;
133
+ }[];
134
+ implementLogic: string;
135
+ }, {
136
+ functionName: string;
137
+ interfaceDesc: string;
138
+ className: string;
139
+ methodName: string;
140
+ implementLogic: string;
141
+ parameterList?: {
142
+ id: string;
143
+ propertyType: string;
144
+ propertyName: string;
145
+ required: string;
146
+ propertyDesc: string;
147
+ }[] | undefined;
148
+ returnResultList?: {
149
+ id: string;
150
+ propertyType: string;
151
+ propertyName: string;
152
+ propertyDesc: string;
153
+ }[] | undefined;
154
+ }>, "many">>;
155
+ }, "strip", z.ZodTypeAny, {
156
+ serviceName: string;
157
+ serviceDesc: string;
158
+ interfaceDesignDetailList: {
159
+ functionName: string;
160
+ interfaceDesc: string;
161
+ className: string;
162
+ methodName: string;
163
+ parameterList: {
164
+ id: string;
165
+ propertyType: string;
166
+ propertyName: string;
167
+ required: string;
168
+ propertyDesc: string;
169
+ }[];
170
+ returnResultList: {
171
+ id: string;
172
+ propertyType: string;
173
+ propertyName: string;
174
+ propertyDesc: string;
175
+ }[];
176
+ implementLogic: string;
177
+ }[];
178
+ }, {
179
+ serviceName: string;
180
+ serviceDesc: string;
181
+ interfaceDesignDetailList?: {
182
+ functionName: string;
183
+ interfaceDesc: string;
184
+ className: string;
185
+ methodName: string;
186
+ implementLogic: string;
187
+ parameterList?: {
188
+ id: string;
189
+ propertyType: string;
190
+ propertyName: string;
191
+ required: string;
192
+ propertyDesc: string;
193
+ }[] | undefined;
194
+ returnResultList?: {
195
+ id: string;
196
+ propertyType: string;
197
+ propertyName: string;
198
+ propertyDesc: string;
199
+ }[] | undefined;
200
+ }[] | undefined;
201
+ }>, "many">>;
202
+ tableInfoList: z.ZodDefault<z.ZodArray<z.ZodObject<{
203
+ id: z.ZodString;
204
+ tableName: z.ZodString;
205
+ entityName: z.ZodString;
206
+ tableDescription: z.ZodString;
207
+ tableDetailList: z.ZodDefault<z.ZodArray<z.ZodObject<{
208
+ id: z.ZodString;
209
+ fieldName: z.ZodString;
210
+ fieldType: z.ZodString;
211
+ fieldDescription: z.ZodString;
212
+ fieldLength: z.ZodString;
213
+ }, "strip", z.ZodTypeAny, {
214
+ id: string;
215
+ fieldName: string;
216
+ fieldType: string;
217
+ fieldDescription: string;
218
+ fieldLength: string;
219
+ }, {
220
+ id: string;
221
+ fieldName: string;
222
+ fieldType: string;
223
+ fieldDescription: string;
224
+ fieldLength: string;
225
+ }>, "many">>;
226
+ }, "strip", z.ZodTypeAny, {
227
+ id: string;
228
+ tableName: string;
229
+ entityName: string;
230
+ tableDescription: string;
231
+ tableDetailList: {
232
+ id: string;
233
+ fieldName: string;
234
+ fieldType: string;
235
+ fieldDescription: string;
236
+ fieldLength: string;
237
+ }[];
238
+ }, {
239
+ id: string;
240
+ tableName: string;
241
+ entityName: string;
242
+ tableDescription: string;
243
+ tableDetailList?: {
244
+ id: string;
245
+ fieldName: string;
246
+ fieldType: string;
247
+ fieldDescription: string;
248
+ fieldLength: string;
249
+ }[] | undefined;
250
+ }>, "many">>;
251
+ }, "strip", z.ZodTypeAny, {
252
+ projectName: string;
253
+ moduleName: string;
254
+ serviceInterfaceList: {
255
+ id: string;
256
+ serviceType: string;
257
+ serviceEnglishName: string;
258
+ serviceChineseName: string;
259
+ serviceDescription: string;
260
+ interfaceDetailList: {
261
+ id: string;
262
+ methodName: string;
263
+ serviceName: string;
264
+ functionDescription: string;
265
+ }[];
266
+ }[];
267
+ designDetailList: {
268
+ serviceName: string;
269
+ serviceDesc: string;
270
+ interfaceDesignDetailList: {
271
+ functionName: string;
272
+ interfaceDesc: string;
273
+ className: string;
274
+ methodName: string;
275
+ parameterList: {
276
+ id: string;
277
+ propertyType: string;
278
+ propertyName: string;
279
+ required: string;
280
+ propertyDesc: string;
281
+ }[];
282
+ returnResultList: {
283
+ id: string;
284
+ propertyType: string;
285
+ propertyName: string;
286
+ propertyDesc: string;
287
+ }[];
288
+ implementLogic: string;
289
+ }[];
290
+ }[];
291
+ tableInfoList: {
292
+ id: string;
293
+ tableName: string;
294
+ entityName: string;
295
+ tableDescription: string;
296
+ tableDetailList: {
297
+ id: string;
298
+ fieldName: string;
299
+ fieldType: string;
300
+ fieldDescription: string;
301
+ fieldLength: string;
302
+ }[];
303
+ }[];
304
+ year?: string | undefined;
305
+ month?: string | undefined;
306
+ referDoc?: string | undefined;
307
+ }, {
308
+ projectName: string;
309
+ moduleName: string;
310
+ year?: string | undefined;
311
+ month?: string | undefined;
312
+ referDoc?: string | undefined;
313
+ serviceInterfaceList?: {
314
+ id: string;
315
+ serviceType: string;
316
+ serviceEnglishName: string;
317
+ serviceChineseName: string;
318
+ serviceDescription: string;
319
+ interfaceDetailList?: {
320
+ id: string;
321
+ methodName: string;
322
+ serviceName: string;
323
+ functionDescription: string;
324
+ }[] | undefined;
325
+ }[] | undefined;
326
+ designDetailList?: {
327
+ serviceName: string;
328
+ serviceDesc: string;
329
+ interfaceDesignDetailList?: {
330
+ functionName: string;
331
+ interfaceDesc: string;
332
+ className: string;
333
+ methodName: string;
334
+ implementLogic: string;
335
+ parameterList?: {
336
+ id: string;
337
+ propertyType: string;
338
+ propertyName: string;
339
+ required: string;
340
+ propertyDesc: string;
341
+ }[] | undefined;
342
+ returnResultList?: {
343
+ id: string;
344
+ propertyType: string;
345
+ propertyName: string;
346
+ propertyDesc: string;
347
+ }[] | undefined;
348
+ }[] | undefined;
349
+ }[] | undefined;
350
+ tableInfoList?: {
351
+ id: string;
352
+ tableName: string;
353
+ entityName: string;
354
+ tableDescription: string;
355
+ tableDetailList?: {
356
+ id: string;
357
+ fieldName: string;
358
+ fieldType: string;
359
+ fieldDescription: string;
360
+ fieldLength: string;
361
+ }[] | undefined;
362
+ }[] | undefined;
363
+ }>;
364
+ };
365
+ handler: (args: any) => Promise<{
366
+ content: {
367
+ type: string;
368
+ text: string;
369
+ }[];
370
+ isError: boolean;
371
+ } | {
372
+ content: {
373
+ type: string;
374
+ text: string;
375
+ }[];
376
+ isError?: undefined;
377
+ }>;
378
+ };
379
+ export * from './types';
380
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/tech-spec-generator/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA6FxB;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBA4BV,GAAG;;;;;;;;;;;;;CA6G1B,CAAC;AAGF,cAAc,SAAS,CAAC"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * 技术规格说明书数据类型定义
3
+ * 基于 .aico/create-tect-docs/技术规格说明书模板.docx 中的占位符
4
+ */
5
+ /**
6
+ * 表字段详情 - 用于 tableDetailList 循环
7
+ */
8
+ export interface TableFieldDetail {
9
+ id: string;
10
+ fieldName: string;
11
+ fieldType: string;
12
+ fieldDescription: string;
13
+ fieldLength: string;
14
+ }
15
+ /**
16
+ * 数据表信息 - 用于 tableInfoList 循环
17
+ */
18
+ export interface TableInfo {
19
+ id: string;
20
+ tableName: string;
21
+ entityName: string;
22
+ tableDescription: string;
23
+ tableDetailList: TableFieldDetail[];
24
+ }
25
+ /**
26
+ * 接口参数信息 - 用于 parameterList 循环
27
+ */
28
+ export interface ParameterInfo {
29
+ id: string;
30
+ propertyType: string;
31
+ propertyName: string;
32
+ required: string;
33
+ propertyDesc: string;
34
+ }
35
+ /**
36
+ * 返回结果信息 - 用于 returnResultList 循环
37
+ */
38
+ export interface ReturnResultInfo {
39
+ id: string;
40
+ propertyType: string;
41
+ propertyName: string;
42
+ propertyDesc: string;
43
+ }
44
+ /**
45
+ * 接口设计详情 - 用于 interfaceDesignDetailList 循环
46
+ */
47
+ export interface InterfaceDesignDetail {
48
+ functionName: string;
49
+ interfaceDesc: string;
50
+ className: string;
51
+ methodName: string;
52
+ parameterList: ParameterInfo[];
53
+ returnResultList: ReturnResultInfo[];
54
+ implementLogic: string;
55
+ }
56
+ /**
57
+ * 设计详情 - 用于 designDetailList 循环
58
+ */
59
+ export interface DesignDetail {
60
+ serviceName: string;
61
+ serviceDesc: string;
62
+ interfaceDesignDetailList: InterfaceDesignDetail[];
63
+ }
64
+ /**
65
+ * 接口详情 - 用于 interfaceDetailList 循环
66
+ */
67
+ export interface InterfaceDetail {
68
+ id: string;
69
+ functionDescription: string;
70
+ serviceName: string;
71
+ methodName: string;
72
+ }
73
+ /**
74
+ * 服务接口信息 - 用于 serviceInterfaceList 循环
75
+ */
76
+ export interface ServiceInterface {
77
+ id: string;
78
+ serviceType: string;
79
+ serviceEnglishName: string;
80
+ serviceChineseName: string;
81
+ serviceDescription: string;
82
+ interfaceDetailList: InterfaceDetail[];
83
+ }
84
+ /**
85
+ * 技术规格说明书完整数据结构
86
+ * 模板占位符对应关系:
87
+ * - {projectName} - 项目名称
88
+ * - {moduleName} - 模块名称
89
+ * - {year} - 年份
90
+ * - {month} - 月份
91
+ * - {referDoc} - 参考文档
92
+ * - {#serviceInterfaceList}...{/serviceInterfaceList} - 服务接口列表循环
93
+ * - {#designDetailList}...{/designDetailList} - 设计详情列表循环
94
+ * - {#tableInfoList}...{/tableInfoList} - 数据表信息列表循环
95
+ */
96
+ export interface TechSpecData {
97
+ projectName: string;
98
+ moduleName: string;
99
+ year: string;
100
+ month: string;
101
+ referDoc: string;
102
+ serviceInterfaceList: ServiceInterface[];
103
+ designDetailList: DesignDetail[];
104
+ tableInfoList: TableInfo[];
105
+ }
106
+ /**
107
+ * 代码分析结果
108
+ */
109
+ export interface CodeAnalysisResult {
110
+ success: boolean;
111
+ data: TechSpecData | null;
112
+ error?: string;
113
+ }
114
+ /**
115
+ * 文档生成结果
116
+ */
117
+ export interface DocGenerationResult {
118
+ success: boolean;
119
+ outputPath: string | null;
120
+ error?: string;
121
+ }
122
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/tech-spec-generator/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,gBAAgB,EAAE,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,aAAa,EAAE,CAAC;IAC/B,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,yBAAyB,EAAE,qBAAqB,EAAE,CAAC;CACpD;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,eAAe,EAAE,CAAC;CACxC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,YAAY;IAE3B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IAGjB,oBAAoB,EAAE,gBAAgB,EAAE,CAAC;IAGzC,gBAAgB,EAAE,YAAY,EAAE,CAAC;IAGjC,aAAa,EAAE,SAAS,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "intention-coding",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "软件工程化的需求分析,功能设计,代码编写,测试运行和发布部署",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@10.11.0",
@@ -34,11 +34,13 @@
34
34
  "@modelcontextprotocol/sdk": "^1.17.5",
35
35
  "aico-pack": "2.1.0",
36
36
  "axios": "^1.10.0",
37
+ "docxtemplater": "^3.67.6",
37
38
  "html-to-md": "^0.8.8",
38
39
  "jimp": "^1.6.0",
39
40
  "lru-cache": "^11.1.0",
40
41
  "mammoth": "^1.9.1",
41
42
  "pdf-parse": "^1.1.1",
43
+ "pizzip": "^3.2.0",
42
44
  "sharp": "^0.34.3",
43
45
  "uuid": "^11.1.0",
44
46
  "winston": "^3.17.0",
@@ -57,6 +59,7 @@
57
59
  "@types/lodash": "^4.17.16",
58
60
  "@types/node": "^24.0.0",
59
61
  "@types/pdf-parse": "^1.1.5",
62
+ "@types/pizzip": "^3.0.5",
60
63
  "@types/uuid": "^10.0.0",
61
64
  "@typescript-eslint/eslint-plugin": "^8.32.1",
62
65
  "@typescript-eslint/parser": "^8.32.1",