speccore 6.6.0 → 6.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/.agents/skills/spec-ask/SKILL.md +24 -4
  2. package/README.md +10 -0
  3. package/dist/cli.js +18 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/about.d.ts.map +1 -1
  6. package/dist/commands/about.js +10 -3
  7. package/dist/commands/about.js.map +1 -1
  8. package/dist/commands/analyze.d.ts +3 -0
  9. package/dist/commands/analyze.d.ts.map +1 -1
  10. package/dist/commands/analyze.js +178 -11
  11. package/dist/commands/analyze.js.map +1 -1
  12. package/dist/commands/change.d.ts.map +1 -1
  13. package/dist/commands/change.js +16 -4
  14. package/dist/commands/change.js.map +1 -1
  15. package/dist/commands/doc2spec.d.ts +1 -0
  16. package/dist/commands/doc2spec.d.ts.map +1 -1
  17. package/dist/commands/doc2spec.js +175 -0
  18. package/dist/commands/doc2spec.js.map +1 -1
  19. package/dist/commands/done.js +25 -5
  20. package/dist/commands/done.js.map +1 -1
  21. package/dist/commands/execute.d.ts.map +1 -1
  22. package/dist/commands/execute.js +20 -6
  23. package/dist/commands/execute.js.map +1 -1
  24. package/dist/commands/help.js +32 -5
  25. package/dist/commands/help.js.map +1 -1
  26. package/dist/commands/iteration/create.d.ts.map +1 -1
  27. package/dist/commands/iteration/create.js +40 -15
  28. package/dist/commands/iteration/create.js.map +1 -1
  29. package/dist/commands/iteration/split.d.ts.map +1 -1
  30. package/dist/commands/iteration/split.js +309 -36
  31. package/dist/commands/iteration/split.js.map +1 -1
  32. package/dist/commands/knowledge.d.ts +6 -0
  33. package/dist/commands/knowledge.d.ts.map +1 -0
  34. package/dist/commands/knowledge.js +94 -0
  35. package/dist/commands/knowledge.js.map +1 -0
  36. package/dist/commands/rag-index.d.ts +19 -0
  37. package/dist/commands/rag-index.d.ts.map +1 -0
  38. package/dist/commands/rag-index.js +272 -0
  39. package/dist/commands/rag-index.js.map +1 -0
  40. package/dist/commands/refresh.d.ts +21 -0
  41. package/dist/commands/refresh.d.ts.map +1 -0
  42. package/dist/commands/refresh.js +185 -0
  43. package/dist/commands/refresh.js.map +1 -0
  44. package/dist/commands/sync-global.d.ts.map +1 -1
  45. package/dist/commands/sync-global.js +59 -0
  46. package/dist/commands/sync-global.js.map +1 -1
  47. package/dist/core/ai-context-generator.d.ts +2 -0
  48. package/dist/core/ai-context-generator.d.ts.map +1 -1
  49. package/dist/core/ai-context-generator.js +8 -6
  50. package/dist/core/ai-context-generator.js.map +1 -1
  51. package/dist/core/analyze-engine.d.ts +19 -0
  52. package/dist/core/analyze-engine.d.ts.map +1 -1
  53. package/dist/core/analyze-engine.js +326 -9
  54. package/dist/core/analyze-engine.js.map +1 -1
  55. package/dist/core/ask-engine.d.ts.map +1 -1
  56. package/dist/core/ask-engine.js +134 -4
  57. package/dist/core/ask-engine.js.map +1 -1
  58. package/dist/core/ask-host-ai.d.ts.map +1 -1
  59. package/dist/core/ask-host-ai.js +9 -6
  60. package/dist/core/ask-host-ai.js.map +1 -1
  61. package/dist/core/code-scanner.d.ts +24 -2
  62. package/dist/core/code-scanner.d.ts.map +1 -1
  63. package/dist/core/code-scanner.js +310 -9
  64. package/dist/core/code-scanner.js.map +1 -1
  65. package/dist/core/context-builder.d.ts.map +1 -1
  66. package/dist/core/context-builder.js +28 -9
  67. package/dist/core/context-builder.js.map +1 -1
  68. package/dist/core/decay-detector.d.ts +2 -2
  69. package/dist/core/decay-detector.d.ts.map +1 -1
  70. package/dist/core/decay-detector.js +135 -6
  71. package/dist/core/decay-detector.js.map +1 -1
  72. package/dist/core/git-integration.d.ts +50 -2
  73. package/dist/core/git-integration.d.ts.map +1 -1
  74. package/dist/core/git-integration.js +217 -27
  75. package/dist/core/git-integration.js.map +1 -1
  76. package/dist/core/global-knowledge.d.ts +25 -0
  77. package/dist/core/global-knowledge.d.ts.map +1 -0
  78. package/dist/core/global-knowledge.js +228 -0
  79. package/dist/core/global-knowledge.js.map +1 -0
  80. package/dist/core/index-guard.d.ts +57 -0
  81. package/dist/core/index-guard.d.ts.map +1 -0
  82. package/dist/core/index-guard.js +202 -0
  83. package/dist/core/index-guard.js.map +1 -0
  84. package/dist/core/intent-cache.d.ts +3 -1
  85. package/dist/core/intent-cache.d.ts.map +1 -1
  86. package/dist/core/intent-cache.js +33 -3
  87. package/dist/core/intent-cache.js.map +1 -1
  88. package/dist/core/intent-recognition.d.ts.map +1 -1
  89. package/dist/core/intent-recognition.js +21 -2
  90. package/dist/core/intent-recognition.js.map +1 -1
  91. package/dist/core/knowledge-graph.d.ts +18 -3
  92. package/dist/core/knowledge-graph.d.ts.map +1 -1
  93. package/dist/core/knowledge-graph.js +539 -42
  94. package/dist/core/knowledge-graph.js.map +1 -1
  95. package/dist/core/knowledge-visualizer.d.ts +19 -0
  96. package/dist/core/knowledge-visualizer.d.ts.map +1 -0
  97. package/dist/core/knowledge-visualizer.js +528 -0
  98. package/dist/core/knowledge-visualizer.js.map +1 -0
  99. package/dist/core/next-steps.js +6 -0
  100. package/dist/core/next-steps.js.map +1 -1
  101. package/dist/core/platform-registry.d.ts +5 -0
  102. package/dist/core/platform-registry.d.ts.map +1 -1
  103. package/dist/core/platform-registry.js +52 -0
  104. package/dist/core/platform-registry.js.map +1 -1
  105. package/dist/core/prompt-builder.d.ts +3 -2
  106. package/dist/core/prompt-builder.d.ts.map +1 -1
  107. package/dist/core/prompt-builder.js +361 -72
  108. package/dist/core/prompt-builder.js.map +1 -1
  109. package/dist/core/rag-engine.d.ts +152 -0
  110. package/dist/core/rag-engine.d.ts.map +1 -0
  111. package/dist/core/rag-engine.js +816 -0
  112. package/dist/core/rag-engine.js.map +1 -0
  113. package/dist/core/spec-merger.d.ts +133 -0
  114. package/dist/core/spec-merger.d.ts.map +1 -0
  115. package/dist/core/spec-merger.js +735 -0
  116. package/dist/core/spec-merger.js.map +1 -0
  117. package/dist/core/unified-retrieval.d.ts +141 -0
  118. package/dist/core/unified-retrieval.d.ts.map +1 -0
  119. package/dist/core/unified-retrieval.js +471 -0
  120. package/dist/core/unified-retrieval.js.map +1 -0
  121. package/package.json +1 -1
@@ -1,6 +1,8 @@
1
1
  export interface AIContextInput {
2
2
  /** 需求文档路径列表 */
3
3
  requirements: string[];
4
+ /** 已读取的需求内容(避免重复 readFile) */
5
+ reqContents?: string[];
4
6
  /** 源码目录列表 */
5
7
  sources: string[];
6
8
  /** 分析范围 */
@@ -1 +1 @@
1
- {"version":3,"file":"ai-context-generator.d.ts","sourceRoot":"","sources":["../../src/core/ai-context-generator.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,cAAc;IAC7B,eAAe;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW;IACX,KAAK,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;IACvC,WAAW;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AASD,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAkEvF"}
1
+ {"version":3,"file":"ai-context-generator.d.ts","sourceRoot":"","sources":["../../src/core/ai-context-generator.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,cAAc;IAC7B,eAAe;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW;IACX,KAAK,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;IACvC,WAAW;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AASD,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAoEvF"}
@@ -17,12 +17,14 @@ const INDEX_PATH = (0, path_1.join)('.speccore', 'cache', 'code-structure.json')
17
17
  // ── 主入口 ──
18
18
  async function generateAIContext(input) {
19
19
  await (0, fs_extra_1.ensureDir)(PROMPTS_DIR);
20
- // 1. 读取需求文档
21
- const reqContents = [];
22
- for (const reqPath of input.requirements) {
23
- if (await (0, fs_extra_1.pathExists)(reqPath)) {
24
- const content = await (0, fs_extra_1.readFile)(reqPath, 'utf-8');
25
- reqContents.push(`## 来源: ${reqPath}\n\n${content}`);
20
+ // 1. 读取需求文档(若调用方已提供则跳过重复读取)
21
+ let reqContents = input.reqContents || [];
22
+ if (reqContents.length === 0) {
23
+ for (const reqPath of input.requirements) {
24
+ if (await (0, fs_extra_1.pathExists)(reqPath)) {
25
+ const content = await (0, fs_extra_1.readFile)(reqPath, 'utf-8');
26
+ reqContents.push(`## 来源: ${reqPath}\n\n${content}`);
27
+ }
26
28
  }
27
29
  }
28
30
  // 1.5 读取 CONSTITUTION.md 获取工程配置映射
@@ -1 +1 @@
1
- {"version":3,"file":"ai-context-generator.js","sourceRoot":"","sources":["../../src/core/ai-context-generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ai-context-generator.js","sourceRoot":"","sources":["../../src/core/ai-context-generator.ts"],"names":[],"mappings":"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"}
@@ -33,6 +33,25 @@ export interface AnalysisResult {
33
33
  };
34
34
  }
35
35
  export declare function runAnalysis(input: AnalyzeInput): Promise<AnalysisResult>;
36
+ /**
37
+ * 局部分析:只分析单个功能模块,写入 020-specs/features/{feature}.md
38
+ * 用于 --feature 模式,避免全量重跑
39
+ */
40
+ export declare function analyzeSingleFeature(iterDir: string, featureName: string): Promise<{
41
+ outputPath: string;
42
+ report: string;
43
+ } | null>;
44
+ /**
45
+ * 局部分析:单个类型文档(bugs/refactors/research)
46
+ *
47
+ * @param iterDir 迭代目录
48
+ * @param docPath 类型路径,如 "bugs/login-timeout" 或 "refactors/db-pool"
49
+ * 对应 010-requirements/{typeDir}/{slug}.md
50
+ */
51
+ export declare function analyzeSingleTypedDoc(iterDir: string, docPath: string): Promise<{
52
+ outputPath: string;
53
+ report: string;
54
+ } | null>;
36
55
  export interface SupplementResult {
37
56
  outputPath: string;
38
57
  addedFiles: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-engine.d.ts","sourceRoot":"","sources":["../../src/core/analyze-engine.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,YAAY;IAC3B,aAAa;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW;IACX,KAAK,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;IACvC,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnC,YAAY;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAMD,wBAAsB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CA6E9E;AAumCD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAsJnC"}
1
+ {"version":3,"file":"analyze-engine.d.ts","sourceRoot":"","sources":["../../src/core/analyze-engine.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,YAAY;IAC3B,aAAa;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,eAAe;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW;IACX,KAAK,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;IACvC,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnC,YAAY;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,OAAO,EAAE;QACP,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAMD,wBAAsB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAoI9E;AA4pCD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAoDxD;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA8CxD;AA+GD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAsJnC"}
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.runAnalysis = runAnalysis;
4
+ exports.analyzeSingleFeature = analyzeSingleFeature;
5
+ exports.analyzeSingleTypedDoc = analyzeSingleTypedDoc;
4
6
  exports.supplementAnalysis = supplementAnalysis;
5
7
  /**
6
8
  * analyze-engine — 统一分析引擎
@@ -24,6 +26,8 @@ const task_utils_1 = require("../utils/task-utils");
24
26
  const code_scanner_1 = require("./code-scanner");
25
27
  const ai_context_generator_1 = require("./ai-context-generator");
26
28
  const git_integration_1 = require("./git-integration");
29
+ const rag_engine_1 = require("./rag-engine");
30
+ const knowledge_graph_1 = require("./knowledge-graph");
27
31
  // ================================================================
28
32
  // 主入口
29
33
  // ================================================================
@@ -89,8 +93,8 @@ async function runAnalysis(input) {
89
93
  break;
90
94
  default: throw new Error(`Unknown analysis type: ${type}`);
91
95
  }
92
- // ── 所有模式生成 AI 上下文(如果还没生成) ──
93
- if (type !== 'combined') {
96
+ // ── code 模式生成 AI 上下文(req/combined 已在各自分析函数内处理) ──
97
+ if (type === 'code') {
94
98
  try {
95
99
  await (0, ai_context_generator_1.generateAIContext)({
96
100
  requirements: effectiveInput.requirements,
@@ -103,6 +107,64 @@ async function runAnalysis(input) {
103
107
  }
104
108
  catch { } // 非关键,静默失败
105
109
  }
110
+ // ── 为当前 scope 构建/刷新 RAG 索引(按 scope 分文件,避免互相覆盖)──
111
+ try {
112
+ const cwd = process.cwd();
113
+ if (effectiveInput.scope === 'task' && effectiveInput.taskId && effectiveInput.iteration) {
114
+ // task 模式:索引任务目录(默认文件名 rag-index.json)
115
+ const taskDir = (0, path_1.join)(`Iteration-${effectiveInput.iteration}`, '030-tasks', effectiveInput.taskId);
116
+ if (await (0, fs_extra_1.pathExists)(taskDir)) {
117
+ const { staleFiles, newFiles } = await (0, rag_engine_1.checkRagIndexFreshness)(cwd);
118
+ await (0, rag_engine_1.refreshRagIndex)(cwd, taskDir, effectiveInput.iteration);
119
+ const totalChanges = staleFiles.length + newFiles.length;
120
+ if (totalChanges > 0) {
121
+ logger_1.logger.info(` 🔄 RAG 索引已增量刷新 (${totalChanges} 个文件更新): ${taskDir}`);
122
+ }
123
+ else {
124
+ logger_1.logger.info(` 🔍 RAG 索引已生成: ${taskDir}`);
125
+ }
126
+ }
127
+ }
128
+ else if (effectiveInput.scope === 'iteration' && effectiveInput.iteration) {
129
+ // iteration 模式:索引 020-specs/ 目录(独立文件名)
130
+ const specsDir = (0, path_1.join)(`Iteration-${effectiveInput.iteration}`, '020-specs');
131
+ if (await (0, fs_extra_1.pathExists)(specsDir)) {
132
+ const scope = `${effectiveInput.iteration}_020-specs_iteration_all`;
133
+ const fileName = `rag-index-${effectiveInput.iteration}.json`;
134
+ await (0, rag_engine_1.indexDirectoryDocuments)(cwd, specsDir, scope, fileName);
135
+ logger_1.logger.info(` 🔍 迭代 RAG 索引已生成: ${specsDir} → ${fileName}`);
136
+ }
137
+ }
138
+ else if (effectiveInput.scope === 'global') {
139
+ // global 模式:索引全局 specs 目录(独立文件名)
140
+ const globalSpecsDir = (0, path_1.join)(cwd, '.speccore', 'GLOBAL', '020-specs');
141
+ const fallbackDir = (0, path_1.join)(cwd, '.speccore');
142
+ const targetDir = await (0, fs_extra_1.pathExists)(globalSpecsDir) ? globalSpecsDir : fallbackDir;
143
+ const scope = 'GLOBAL_020-specs_global_all';
144
+ await (0, rag_engine_1.indexDirectoryDocuments)(cwd, targetDir, scope, 'rag-index-global.json');
145
+ logger_1.logger.info(` 🔍 全局 RAG 索引已生成: ${targetDir} → rag-index-global.json`);
146
+ }
147
+ }
148
+ catch (e) {
149
+ logger_1.logger.debug('RAG 索引生成失败(非关键):', e);
150
+ }
151
+ // ── 统一刷新代码索引 + 知识图谱(所有 scope)──
152
+ try {
153
+ logger_1.logger.info(' 🔄 刷新代码索引...');
154
+ await (0, code_scanner_1.buildCodeIndex)(undefined, true);
155
+ logger_1.logger.info(' ✅ 代码索引已刷新');
156
+ }
157
+ catch (e) {
158
+ logger_1.logger.debug('代码索引刷新失败(非关键):', e);
159
+ }
160
+ try {
161
+ logger_1.logger.info(' 🔄 刷新知识图谱...');
162
+ await (0, knowledge_graph_1.refreshKnowledgeGraph)(process.cwd(), effectiveInput.iteration);
163
+ logger_1.logger.info(' ✅ 知识图谱已刷新');
164
+ }
165
+ catch (e) {
166
+ logger_1.logger.debug('知识图谱刷新失败(非关键):', e);
167
+ }
106
168
  return result;
107
169
  }
108
170
  // ================================================================
@@ -122,6 +184,19 @@ async function analyzeRequirements(input) {
122
184
  const fullContent = allContent.join('\n\n---\n\n');
123
185
  const issues = scanCompleteness(fullContent);
124
186
  const archImpact = await analyzeArchitectureImpact(fullContent);
187
+ // ── 需求分析时默认读取关联代码(避免分析不接地气 + 减少重复 token 消耗) ──
188
+ let sourceContents = {};
189
+ const shouldReadSource = input.readSource !== false;
190
+ if (shouldReadSource && (input.iteration || input.taskId)) {
191
+ const limit = input.depth === 'deep' ? 15 : (input.depth === 'quick' ? 3 : 8);
192
+ const maxBytes = input.depth === 'deep' ? 80000 : (input.depth === 'quick' ? 20000 : 40000);
193
+ const rawMatches = await (0, code_scanner_1.findRelevantCode)(fullContent, limit, input.sourceScope, input.iteration, input.taskId);
194
+ sourceContents = await (0, code_scanner_1.readRelevantSource)(rawMatches, maxBytes);
195
+ if (Object.keys(sourceContents).length > 0) {
196
+ const scopeHint = input.sourceScope ? ` (范围: ${input.sourceScope})` : '';
197
+ logger_1.logger.info(` 📖 需求分析已关联 ${Object.keys(sourceContents).length} 个源码文件${scopeHint}`);
198
+ }
199
+ }
125
200
  let outputPath;
126
201
  let report;
127
202
  if (input.scope === 'global') {
@@ -131,23 +206,40 @@ async function analyzeRequirements(input) {
131
206
  else if (input.scope === 'task') {
132
207
  // task scope — 已在入口校验
133
208
  outputPath = (0, path_1.join)(`Iteration-${input.iteration}`, '030-tasks', input.taskId, '00-specs', input.output || 'ANALYSIS.md');
134
- report = buildTaskReqReport(input, issues, archImpact);
209
+ report = buildTaskReqReport(input, issues, archImpact, sourceContents);
135
210
  }
136
211
  else {
137
212
  // iteration (default)
138
213
  const iterDir = `Iteration-${input.iteration || 'current'}`;
139
214
  outputPath = (0, path_1.join)(iterDir, '020-specs', input.output || 'ANALYSIS.md');
140
- report = buildIterationReqReport(input, issues, archImpact);
215
+ report = buildIterationReqReport(input, issues, archImpact, sourceContents);
141
216
  // 按端分目录输出
142
217
  await writePerPlatform(iterDir, report, input.output || 'ANALYSIS.md');
218
+ // 按功能模块输出到 020-specs/features/
219
+ await writePerFeature(iterDir, report, input.output || 'ANALYSIS.md');
220
+ // 按类型输出扁平文件到 020-specs/{bugs,refactors,research}/
221
+ await writePerTypedDoc(iterDir, report, input.output || 'ANALYSIS.md');
222
+ }
223
+ // ── 生成 AI 上下文(传入已读取的需求内容,避免重复 readFile) ──
224
+ try {
225
+ await (0, ai_context_generator_1.generateAIContext)({
226
+ requirements: input.requirements,
227
+ reqContents: allContent,
228
+ sources: input.sources,
229
+ scope: input.scope,
230
+ iteration: input.iteration,
231
+ taskId: input.taskId,
232
+ depth: input.depth,
233
+ });
143
234
  }
235
+ catch { } // 非关键,静默失败
144
236
  return {
145
237
  outputPath,
146
238
  report,
147
239
  summary: {
148
240
  issues: issues.length,
149
241
  blockers: issues.filter(i => i.severity === 'blocker').length,
150
- filesAnalyzed: input.requirements.length,
242
+ filesAnalyzed: input.requirements.length + Object.keys(sourceContents).length,
151
243
  apisFound: archImpact.apis?.length || 0,
152
244
  risks: archImpact.risks?.length || 0,
153
245
  },
@@ -179,6 +271,7 @@ async function analyzeCodebase(input) {
179
271
  outputPath = (0, path_1.join)(iterDir, '020-specs', input.output || 'CODE_ANALYSIS.md');
180
272
  report = buildIterationCodeReport(input, fileStats, apiInventory, hotspots, deps);
181
273
  await writePerPlatform(iterDir, report, input.output || 'CODE_ANALYSIS.md');
274
+ await writePerFeature(iterDir, report, input.output || 'CODE_ANALYSIS.md');
182
275
  }
183
276
  return {
184
277
  outputPath,
@@ -224,9 +317,10 @@ async function analyzeCombined(input) {
224
317
  else {
225
318
  logger_1.logger.info(' 📚 使用缓存的代码索引(1 小时内已构建)');
226
319
  }
227
- // ── AI 上下文生成: 替代关键词匹配 ──
320
+ // ── AI 上下文生成: 替代关键词匹配(传入已读取的需求内容,避免重复 readFile) ──
228
321
  const aiContext = await (0, ai_context_generator_1.generateAIContext)({
229
322
  requirements: input.requirements,
323
+ reqContents: allContent,
230
324
  sources: input.sources,
231
325
  scope: input.scope,
232
326
  iteration: input.iteration,
@@ -243,7 +337,7 @@ async function analyzeCombined(input) {
243
337
  if (shouldReadSource) {
244
338
  const limit = input.depth === 'deep' ? 20 : (input.depth === 'quick' ? 5 : 10);
245
339
  const maxBytes = input.depth === 'deep' ? 120000 : (input.depth === 'quick' ? 30000 : 60000);
246
- const rawMatches = await (0, code_scanner_1.findRelevantCode)(fullReqContent, limit, input.sourceScope);
340
+ const rawMatches = await (0, code_scanner_1.findRelevantCode)(fullReqContent, limit, input.sourceScope, input.iteration, input.taskId);
247
341
  sourceContents = await (0, code_scanner_1.readRelevantSource)(rawMatches, maxBytes);
248
342
  if (Object.keys(sourceContents).length > 0) {
249
343
  const scopeHint = input.sourceScope ? ` (范围: ${input.sourceScope})` : '';
@@ -265,6 +359,7 @@ async function analyzeCombined(input) {
265
359
  outputPath = (0, path_1.join)(iterDir, '020-specs', input.output || 'ANALYSIS.md');
266
360
  report = await buildAIEnhancedReport(input, 'iteration', { issues, archImpact, fileStats, apiInventory, aiContext, sourceContents });
267
361
  await writePerPlatform(iterDir, report, input.output || 'ANALYSIS.md');
362
+ await writePerFeature(iterDir, report, input.output || 'ANALYSIS.md');
268
363
  }
269
364
  return {
270
365
  outputPath,
@@ -657,7 +752,7 @@ function buildReqConsistencyReport(input, issues, archImpact) {
657
752
  r += `- ⚠️ ${risk}\n`;
658
753
  return r;
659
754
  }
660
- function buildIterationReqReport(input, issues, archImpact) {
755
+ function buildIterationReqReport(input, issues, archImpact, sourceContents) {
661
756
  const now = new Date().toISOString().split('T')[0];
662
757
  const iter = input.iteration || 'current';
663
758
  const blockerCount = issues.filter(i => i.severity === 'blocker').length;
@@ -699,6 +794,15 @@ function buildIterationReqReport(input, issues, archImpact) {
699
794
  r += `- [ ] ${rk}\n`;
700
795
  if (archImpact.newDependencies.length > 0)
701
796
  r += `- [ ] 确认新增依赖的引入方案和排期\n`;
797
+ // ── 代码关联分析(v6.8.0 新增:需求分析默认关联代码) ──
798
+ if (sourceContents && Object.keys(sourceContents).length > 0) {
799
+ r += `\n---\n\n## 3.5 关联代码现状\n\n`;
800
+ r += `> 以下源码文件与当前需求相关,供技术方案参考\n\n`;
801
+ for (const [path, content] of Object.entries(sourceContents)) {
802
+ const preview = content.slice(0, 600).replace(/\n/g, '\n ');
803
+ r += `### \`${path}\`\n\n\`\`\`${path.split('.').pop() || 'ts'}\n${preview}${content.length > 600 ? '\n // ... 截断 ...' : ''}\n\`\`\`\n\n`;
804
+ }
805
+ }
702
806
  r += `\n---\n\n## 4. 技术方案(待填写)\n\n`;
703
807
  r += `| 模块 | 技术方案 | 负责人 | 预计工时 |\n| :--- | :--- | :--- | :--- |\n| | | | |\n\n`;
704
808
  r += `### 数据库变更\n| 表名 | 变更类型 | 说明 |\n| :--- | :--- | :--- |\n| | | |\n\n`;
@@ -707,7 +811,7 @@ function buildIterationReqReport(input, issues, archImpact) {
707
811
  r += `- [ ] 需求确认无遗漏\n- [ ] 技术方案评审通过\n- [ ] 工时评估合理\n- [ ] 可以开始拆分任务\n`;
708
812
  return r;
709
813
  }
710
- function buildTaskReqReport(input, issues, archImpact) {
814
+ function buildTaskReqReport(input, issues, archImpact, sourceContents) {
711
815
  const now = new Date().toISOString().split('T')[0];
712
816
  let r = `# 任务需求分析\n\n`;
713
817
  r += `> 迭代: ${input.iteration} | 任务: ${input.taskId} | 分析: ${now}\n\n---\n\n`;
@@ -722,6 +826,15 @@ function buildTaskReqReport(input, issues, archImpact) {
722
826
  for (const rk of archImpact.risks)
723
827
  r += `- ⚠️ ${rk}\n`;
724
828
  }
829
+ // ── 代码关联分析(v6.8.0 新增) ──
830
+ if (sourceContents && Object.keys(sourceContents).length > 0) {
831
+ r += `\n## 关联代码\n\n`;
832
+ r += `> 以下源码与当前任务相关\n\n`;
833
+ for (const [path, content] of Object.entries(sourceContents)) {
834
+ const preview = content.slice(0, 400).replace(/\n/g, '\n ');
835
+ r += `- **\`${path}\`**\n\n \`\`\`${path.split('.').pop() || 'ts'}\n ${preview}${content.length > 400 ? '\n // ... 截断 ...' : ''}\n \`\`\`\n\n`;
836
+ }
837
+ }
725
838
  return r;
726
839
  }
727
840
  // ================================================================
@@ -1056,6 +1169,210 @@ async function writePerPlatform(iterDir, report, filename) {
1056
1169
  // 目录不存在,静默跳过
1057
1170
  }
1058
1171
  }
1172
+ /**
1173
+ * 局部分析:只分析单个功能模块,写入 020-specs/features/{feature}.md
1174
+ * 用于 --feature 模式,避免全量重跑
1175
+ */
1176
+ async function analyzeSingleFeature(iterDir, featureName) {
1177
+ const reqDir = (0, path_1.join)(iterDir, '010-requirements');
1178
+ const featureReqPath = (0, path_1.join)(reqDir, 'features', featureName, 'README.md');
1179
+ if (!(await (0, fs_extra_1.pathExists)(featureReqPath))) {
1180
+ return null;
1181
+ }
1182
+ const content = await (0, fs_extra_1.readFile)(featureReqPath, 'utf-8');
1183
+ const issues = scanCompleteness(content);
1184
+ const archImpact = await analyzeArchitectureImpact(content);
1185
+ const now = new Date().toISOString().split('T')[0];
1186
+ const blockerCount = issues.filter(i => i.severity === 'blocker').length;
1187
+ // 构建单模块分析报告
1188
+ let r = `# ${featureName} — 需求分析报告\n\n`;
1189
+ r += `> 模块: ${featureName} | 分析时间: ${now} | 模式: 局部刷新 | 状态: ${blockerCount > 0 ? '🔴 有阻断' : '🟢 可拆分'}\n\n`;
1190
+ r += `---\n\n`;
1191
+ r += `## 1. 需求完整性检查\n\n`;
1192
+ r += `| 严重度 | 分类 | 问题 |\n| :--- | :--- | :--- |\n`;
1193
+ for (const issue of issues) {
1194
+ r += `| ${icon(issue.severity)} ${issue.severity} | ${issue.category} | ${issue.message.replace(/\n/g, '<br>')} |\n`;
1195
+ }
1196
+ if (issues.length === 0)
1197
+ r += `| ✅ | - | 未发现明显问题 |\n`;
1198
+ r += `\n`;
1199
+ r += `## 2. 架构影响\n\n`;
1200
+ if (archImpact.modules.length > 0)
1201
+ r += `**影响模块**: ${archImpact.modules.join(', ')}\n\n`;
1202
+ if (archImpact.risks.length > 0) {
1203
+ r += `**风险**:\n`;
1204
+ for (const risk of archImpact.risks)
1205
+ r += `- ⚠️ ${risk}\n`;
1206
+ r += `\n`;
1207
+ }
1208
+ if (archImpact.apis.length > 0) {
1209
+ r += `**涉及接口**:\n`;
1210
+ for (const api of archImpact.apis)
1211
+ r += `- \`${api}\`\n`;
1212
+ r += `\n`;
1213
+ }
1214
+ if (archImpact.modules.length === 0 && archImpact.risks.length === 0) {
1215
+ r += `_未检测到明显架构影响_\n\n`;
1216
+ }
1217
+ r += `## 3. 需求原文\n\n${content}\n`;
1218
+ // 写入 020-specs/features/
1219
+ const featuresDir = (0, path_1.join)(iterDir, '020-specs', 'features');
1220
+ await (0, fs_extra_1.ensureDir)(featuresDir);
1221
+ const outputPath = (0, path_1.join)(featuresDir, `${featureName}.md`);
1222
+ await (0, fs_extra_1.writeFile)(outputPath, r);
1223
+ return { outputPath, report: r };
1224
+ }
1225
+ /**
1226
+ * 局部分析:单个类型文档(bugs/refactors/research)
1227
+ *
1228
+ * @param iterDir 迭代目录
1229
+ * @param docPath 类型路径,如 "bugs/login-timeout" 或 "refactors/db-pool"
1230
+ * 对应 010-requirements/{typeDir}/{slug}.md
1231
+ */
1232
+ async function analyzeSingleTypedDoc(iterDir, docPath) {
1233
+ const reqDir = (0, path_1.join)(iterDir, '010-requirements');
1234
+ const parts = docPath.split('/');
1235
+ if (parts.length !== 2)
1236
+ return null;
1237
+ const [typeDir, slug] = parts;
1238
+ if (!['bugs', 'refactors', 'research'].includes(typeDir))
1239
+ return null;
1240
+ const docFilePath = (0, path_1.join)(reqDir, typeDir, `${slug}.md`);
1241
+ if (!(await (0, fs_extra_1.pathExists)(docFilePath)))
1242
+ return null;
1243
+ const content = await (0, fs_extra_1.readFile)(docFilePath, 'utf-8');
1244
+ const issues = scanCompleteness(content);
1245
+ const archImpact = await analyzeArchitectureImpact(content);
1246
+ const now = new Date().toISOString().split('T')[0];
1247
+ const blockerCount = issues.filter(i => i.severity === 'blocker').length;
1248
+ const typeLabel = typeDir === 'bugs' ? 'Bug 分析' : typeDir === 'refactors' ? '重构分析' : '研究分析';
1249
+ let r = `# ${slug} — ${typeLabel}\n\n`;
1250
+ r += `> 类型: ${typeDir} | 分析时间: ${now} | 状态: ${blockerCount > 0 ? '🔴 有阻断' : '🟢 可拆分'}\n\n`;
1251
+ r += `---\n\n`;
1252
+ // 完整性检查
1253
+ r += `## 完整性检查\n\n`;
1254
+ if (issues.length === 0) {
1255
+ r += `✅ 无阻断项\n\n`;
1256
+ }
1257
+ else {
1258
+ for (const issue of issues) {
1259
+ const icon = issue.severity === 'blocker' ? '🔴' : issue.severity === 'warning' ? '🟡' : 'ℹ️';
1260
+ r += `${icon} **${issue.category}**: ${issue.message}\n`;
1261
+ }
1262
+ r += '\n';
1263
+ }
1264
+ // 架构影响
1265
+ r += `## 架构影响分析\n\n`;
1266
+ r += archImpact + '\n\n';
1267
+ // 写入 020-specs/{typeDir}/
1268
+ const destDir = (0, path_1.join)(iterDir, '020-specs', typeDir);
1269
+ await (0, fs_extra_1.ensureDir)(destDir);
1270
+ const outputPath = (0, path_1.join)(destDir, `${slug}.md`);
1271
+ await (0, fs_extra_1.writeFile)(outputPath, r);
1272
+ return { outputPath, report: r };
1273
+ }
1274
+ /** 按功能模块写入 020-specs/features/ */
1275
+ async function writePerFeature(iterDir, report, filename) {
1276
+ const reqDir = (0, path_1.join)(iterDir, '010-requirements');
1277
+ const featuresDir = (0, path_1.join)(iterDir, '020-specs', 'features');
1278
+ // 非 feature 型目录的排除名单
1279
+ const EXCLUDED_DIRS = new Set(['sources', 'assets', 'converted', 'staging', 'bugs', 'refactors', 'research']);
1280
+ try {
1281
+ const entries = await (0, fs_extra_1.readdir)(reqDir, { withFileTypes: true });
1282
+ const features = entries
1283
+ .filter(e => e.isDirectory() && !e.name.startsWith('_') && !e.name.startsWith('.')
1284
+ && !EXCLUDED_DIRS.has(e.name))
1285
+ .map(e => e.name);
1286
+ if (features.length === 0)
1287
+ return;
1288
+ await (0, fs_extra_1.ensureDir)(featuresDir);
1289
+ for (const feature of features) {
1290
+ // 读取该 feature 的 README.md 作为头部,拼接完整报告
1291
+ const featureReqPath = (0, path_1.join)(reqDir, feature, 'README.md');
1292
+ let featureHeader = '';
1293
+ if (await (0, fs_extra_1.pathExists)(featureReqPath)) {
1294
+ featureHeader = `# ${feature} — 需求分析\n\n> 来源: 010-requirements/features/${feature}/README.md\n\n---\n\n`;
1295
+ }
1296
+ const featureContent = featureHeader + report;
1297
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(featuresDir, `${feature}.md`), featureContent);
1298
+ }
1299
+ }
1300
+ catch { }
1301
+ }
1302
+ /**
1303
+ * 按类型写入 020-specs/{bugs,refactors,research}/
1304
+ *
1305
+ * 与 writePerFeature 的区别:
1306
+ * - feature 用子目录(features/{module}/README.md)
1307
+ * - bugfix/refactor/research 用扁平文件(bugs/{slug}.md)
1308
+ *
1309
+ * 对每个类型目录下的 .md 文件,生成对应的分析报告到 020-specs/ 下
1310
+ */
1311
+ async function writePerTypedDoc(iterDir, report, filename) {
1312
+ const reqDir = (0, path_1.join)(iterDir, '010-requirements');
1313
+ const typeDirs = ['bugs', 'refactors', 'research'];
1314
+ for (const typeDir of typeDirs) {
1315
+ const srcDir = (0, path_1.join)(reqDir, typeDir);
1316
+ const destDir = (0, path_1.join)(iterDir, '020-specs', typeDir);
1317
+ try {
1318
+ if (!(await (0, fs_extra_1.pathExists)(srcDir)))
1319
+ continue;
1320
+ const entries = await (0, fs_extra_1.readdir)(srcDir, { withFileTypes: true });
1321
+ const mdFiles = entries.filter(e => e.isFile() && e.name.endsWith('.md') && !e.name.startsWith('README') && !(0, task_utils_1.isTimestampBackup)(e.name));
1322
+ if (mdFiles.length === 0)
1323
+ continue;
1324
+ await (0, fs_extra_1.ensureDir)(destDir);
1325
+ for (const entry of mdFiles) {
1326
+ const content = await (0, fs_extra_1.readFile)((0, path_1.join)(srcDir, entry.name), 'utf-8');
1327
+ const slug = entry.name.replace(/\.md$/, '');
1328
+ const header = `# ${slug} — 需求分析\n\n> 来源: 010-requirements/${typeDir}/${entry.name}\n\n---\n\n`;
1329
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(destDir, entry.name), header + report);
1330
+ }
1331
+ }
1332
+ catch { }
1333
+ }
1334
+ // ── 处理 staging/ 目录(doc2spec --classify 产物,带 type frontmatter)──
1335
+ const stagingDir = (0, path_1.join)(reqDir, 'staging');
1336
+ try {
1337
+ if (!(await (0, fs_extra_1.pathExists)(stagingDir)))
1338
+ return;
1339
+ const stagingFiles = (await (0, fs_extra_1.readdir)(stagingDir, { withFileTypes: true }))
1340
+ .filter(e => e.isFile() && e.name.endsWith('.md') && !e.name.startsWith('README') && !(0, task_utils_1.isTimestampBackup)(e.name));
1341
+ if (stagingFiles.length === 0)
1342
+ return;
1343
+ // type frontmatter → 020-specs 目标目录
1344
+ const typeToSpecDir = {
1345
+ feature: 'features',
1346
+ bugfix: 'bugs',
1347
+ refactor: 'refactors',
1348
+ research: 'research',
1349
+ };
1350
+ for (const entry of stagingFiles) {
1351
+ const content = await (0, fs_extra_1.readFile)((0, path_1.join)(stagingDir, entry.name), 'utf-8');
1352
+ // 解析 frontmatter 中的 type 和 nature 字段
1353
+ const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
1354
+ let specType = 'features'; // 默认
1355
+ let nature = '';
1356
+ if (fmMatch) {
1357
+ const typeLine = fmMatch[1].split('\n').find(l => l.startsWith('type:'));
1358
+ if (typeLine) {
1359
+ const typeVal = typeLine.replace('type:', '').trim();
1360
+ specType = typeToSpecDir[typeVal] || 'features';
1361
+ }
1362
+ const natureLine = fmMatch[1].split('\n').find(l => l.startsWith('nature:'));
1363
+ if (natureLine) {
1364
+ nature = natureLine.replace('nature:', '').trim();
1365
+ }
1366
+ }
1367
+ const destDir = (0, path_1.join)(iterDir, '020-specs', specType);
1368
+ await (0, fs_extra_1.ensureDir)(destDir);
1369
+ const slug = entry.name.replace(/\.md$/, '');
1370
+ const header = `# ${slug} — 需求分析\n\n> 来源: 010-requirements/staging/${entry.name}\n> 意图: ${nature || '未标注'}\n\n---\n\n`;
1371
+ await (0, fs_extra_1.writeFile)((0, path_1.join)(destDir, entry.name), header + report);
1372
+ }
1373
+ }
1374
+ catch { }
1375
+ }
1059
1376
  /**
1060
1377
  * 补充分析:读取已有报告,找到未覆盖的源码文件,追加到报告中
1061
1378
  * 不重新生成全部文档,只追加源码内容