autosnippet 3.3.5 → 3.3.6

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 (203) hide show
  1. package/dashboard/dist/assets/icons-D1aVZYFW.js +1 -0
  2. package/dashboard/dist/assets/index-CxHOu8Hd.css +1 -0
  3. package/dashboard/dist/assets/index-DDdAOpYT.js +128 -0
  4. package/dashboard/dist/index.html +3 -3
  5. package/dist/bin/api-server.js +1 -0
  6. package/dist/bin/cli.d.ts +1 -0
  7. package/dist/bin/cli.js +136 -9
  8. package/dist/lib/agent/AgentFactory.d.ts +0 -17
  9. package/dist/lib/agent/AgentFactory.js +1 -25
  10. package/dist/lib/agent/capabilities.d.ts +11 -0
  11. package/dist/lib/agent/capabilities.js +29 -5
  12. package/dist/lib/agent/context/ExplorationTracker.js +10 -1
  13. package/dist/lib/agent/context/exploration/ExplorationStrategies.d.ts +2 -0
  14. package/dist/lib/agent/context/exploration/ExplorationStrategies.js +2 -2
  15. package/dist/lib/agent/domain/insight-analyst.d.ts +47 -3
  16. package/dist/lib/agent/domain/insight-analyst.js +111 -11
  17. package/dist/lib/agent/domain/insight-evolver.d.ts +69 -0
  18. package/dist/lib/agent/domain/insight-evolver.js +230 -0
  19. package/dist/lib/agent/domain/insight-gate.d.ts +42 -0
  20. package/dist/lib/agent/domain/insight-gate.js +41 -0
  21. package/dist/lib/agent/domain/insight-producer.d.ts +27 -2
  22. package/dist/lib/agent/domain/insight-producer.js +60 -5
  23. package/dist/lib/agent/domain/scan-prompts.js +10 -7
  24. package/dist/lib/agent/memory/ActiveContext.d.ts +2 -28
  25. package/dist/lib/agent/memory/MemoryCoordinator.d.ts +2 -2
  26. package/dist/lib/agent/memory/SessionStore.d.ts +6 -12
  27. package/dist/lib/agent/memory/SessionStore.js +9 -15
  28. package/dist/lib/agent/memory/memory-flush-contract.d.ts +49 -0
  29. package/dist/lib/agent/memory/memory-flush-contract.js +16 -0
  30. package/dist/lib/agent/memory/session-store-schema.d.ts +20 -0
  31. package/dist/lib/agent/memory/session-store-schema.js +41 -0
  32. package/dist/lib/agent/presets.d.ts +89 -1
  33. package/dist/lib/agent/presets.js +53 -5
  34. package/dist/lib/agent/tools/_shared.d.ts +7 -15
  35. package/dist/lib/agent/tools/_shared.js +20 -21
  36. package/dist/lib/agent/tools/composite.d.ts +25 -22
  37. package/dist/lib/agent/tools/composite.js +108 -109
  38. package/dist/lib/agent/tools/evolution-tools.d.ts +145 -0
  39. package/dist/lib/agent/tools/evolution-tools.js +161 -0
  40. package/dist/lib/agent/tools/index.d.ts +163 -92
  41. package/dist/lib/agent/tools/index.js +9 -1
  42. package/dist/lib/agent/tools/lifecycle.d.ts +7 -1
  43. package/dist/lib/agent/tools/lifecycle.js +59 -75
  44. package/dist/lib/cli/AiScanService.js +1 -1
  45. package/dist/lib/cli/KnowledgeSyncService.js +1 -1
  46. package/dist/lib/core/AstAnalyzer.d.ts +1 -0
  47. package/dist/lib/{service/bootstrap/DimensionCopyRegistry.d.ts → domain/dimension/DimensionCopy.d.ts} +2 -2
  48. package/dist/lib/{service/bootstrap/DimensionCopyRegistry.js → domain/dimension/DimensionCopy.js} +22 -72
  49. package/dist/lib/domain/dimension/DimensionRegistry.d.ts +54 -0
  50. package/dist/lib/domain/dimension/DimensionRegistry.js +620 -0
  51. package/dist/lib/domain/dimension/DimensionSop.d.ts +55 -0
  52. package/dist/lib/domain/dimension/DimensionSop.js +1604 -0
  53. package/dist/lib/domain/dimension/UnifiedDimension.d.ts +61 -0
  54. package/dist/lib/domain/dimension/UnifiedDimension.js +53 -0
  55. package/dist/lib/domain/dimension/index.d.ts +10 -0
  56. package/dist/lib/domain/dimension/index.js +9 -0
  57. package/dist/lib/domain/knowledge/FieldSpec.d.ts +1 -1
  58. package/dist/lib/domain/knowledge/FieldSpec.js +29 -16
  59. package/dist/lib/domain/knowledge/KnowledgeEntry.d.ts +33 -111
  60. package/dist/lib/domain/knowledge/KnowledgeEntry.js +27 -6
  61. package/dist/lib/domain/knowledge/KnowledgeRepository.d.ts +1 -0
  62. package/dist/lib/domain/knowledge/KnowledgeRepository.js +3 -0
  63. package/dist/lib/domain/knowledge/Lifecycle.js +1 -1
  64. package/dist/lib/domain/knowledge/StyleGuide.d.ts +1 -1
  65. package/dist/lib/domain/knowledge/StyleGuide.js +1 -1
  66. package/dist/lib/domain/knowledge/UnifiedValidator.js +15 -0
  67. package/dist/lib/external/mcp/McpServer.js +4 -0
  68. package/dist/lib/external/mcp/handlers/TargetClassifier.d.ts +1 -1
  69. package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.d.ts +8 -16
  70. package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.js +10 -10
  71. package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.d.ts +7 -0
  72. package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.js +20 -0
  73. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.d.ts +52 -132
  74. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.js +204 -17
  75. package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.d.ts +11 -75
  76. package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.js +40 -191
  77. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.d.ts +13 -78
  78. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.js +30 -52
  79. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-context.d.ts +0 -1
  80. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.d.ts +99 -12
  81. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +172 -161
  82. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/tier-scheduler.js +7 -17
  83. package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.d.ts +46 -0
  84. package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.js +58 -0
  85. package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.d.ts +25 -0
  86. package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.js +47 -0
  87. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.d.ts +50 -12
  88. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.js +30 -10
  89. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-text.js +1 -1
  90. package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.d.ts +24 -0
  91. package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.js +14 -0
  92. package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.d.ts +14 -0
  93. package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.js +48 -0
  94. package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.d.ts +21 -0
  95. package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.js +45 -0
  96. package/dist/lib/external/mcp/handlers/bootstrap/shared/skill-generator.d.ts +1 -1
  97. package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.d.ts +27 -0
  98. package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.js +44 -0
  99. package/dist/lib/external/mcp/handlers/bootstrap-external.d.ts +14 -10
  100. package/dist/lib/external/mcp/handlers/bootstrap-external.js +39 -51
  101. package/dist/lib/external/mcp/handlers/bootstrap-internal.d.ts +2 -0
  102. package/dist/lib/external/mcp/handlers/bootstrap-internal.js +115 -82
  103. package/dist/lib/external/mcp/handlers/consolidated.d.ts +4 -4
  104. package/dist/lib/external/mcp/handlers/consolidated.js +107 -332
  105. package/dist/lib/external/mcp/handlers/dimension-complete-external.js +69 -1
  106. package/dist/lib/external/mcp/handlers/evolve-external.d.ts +54 -0
  107. package/dist/lib/external/mcp/handlers/evolve-external.js +226 -0
  108. package/dist/lib/external/mcp/handlers/knowledge.js +26 -2
  109. package/dist/lib/external/mcp/handlers/rescan-external.d.ts +76 -0
  110. package/dist/lib/external/mcp/handlers/rescan-external.js +335 -0
  111. package/dist/lib/external/mcp/handlers/rescan-internal.d.ts +120 -0
  112. package/dist/lib/external/mcp/handlers/rescan-internal.js +359 -0
  113. package/dist/lib/external/mcp/handlers/search.d.ts +6 -5
  114. package/dist/lib/external/mcp/handlers/search.js +6 -5
  115. package/dist/lib/external/mcp/handlers/types.d.ts +2 -1
  116. package/dist/lib/external/mcp/handlers/wiki-external.js +2 -2
  117. package/dist/lib/external/mcp/tools.d.ts +8 -18
  118. package/dist/lib/external/mcp/tools.js +58 -2
  119. package/dist/lib/http/routes/knowledge.js +122 -1
  120. package/dist/lib/http/routes/modules.js +25 -3
  121. package/dist/lib/http/routes/panorama.js +16 -4
  122. package/dist/lib/infrastructure/cache/CacheCoordinator.d.ts +41 -0
  123. package/dist/lib/infrastructure/cache/CacheCoordinator.js +105 -0
  124. package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.d.ts +7 -0
  125. package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.js +28 -0
  126. package/dist/lib/infrastructure/vector/HnswVectorAdapter.js +1 -1
  127. package/dist/lib/injection/ServiceContainer.js +55 -0
  128. package/dist/lib/injection/ServiceMap.d.ts +8 -1
  129. package/dist/lib/injection/modules/KnowledgeModule.js +15 -1
  130. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.d.ts +4 -0
  131. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.js +16 -1
  132. package/dist/lib/service/bootstrap/BootstrapEventEmitter.d.ts +3 -2
  133. package/dist/lib/service/bootstrap/BootstrapEventEmitter.js +1 -1
  134. package/dist/lib/service/bootstrap/DeliveryVerifier.d.ts +51 -0
  135. package/dist/lib/service/bootstrap/DeliveryVerifier.js +163 -0
  136. package/dist/lib/service/bootstrap/UiStartupTasks.d.ts +5 -0
  137. package/dist/lib/service/bootstrap/UiStartupTasks.js +20 -0
  138. package/dist/lib/service/bootstrap/bootstrap-event-types.d.ts +54 -0
  139. package/dist/lib/service/bootstrap/bootstrap-event-types.js +10 -0
  140. package/dist/lib/service/cleanup/CleanupService.d.ts +85 -0
  141. package/dist/lib/service/cleanup/CleanupService.js +324 -0
  142. package/dist/lib/service/delivery/AgentInstructionsGenerator.js +39 -43
  143. package/dist/lib/service/delivery/FileProtection.d.ts +20 -0
  144. package/dist/lib/service/delivery/FileProtection.js +54 -0
  145. package/dist/lib/service/delivery/SkillsSyncer.js +16 -21
  146. package/dist/lib/service/evolution/ContentPatcher.d.ts +44 -0
  147. package/dist/lib/service/evolution/ContentPatcher.js +310 -0
  148. package/dist/lib/service/evolution/ProposalExecutor.d.ts +4 -0
  149. package/dist/lib/service/evolution/ProposalExecutor.js +77 -13
  150. package/dist/lib/service/evolution/RecipeLifecycleSupervisor.d.ts +64 -0
  151. package/dist/lib/service/evolution/RecipeLifecycleSupervisor.js +458 -0
  152. package/dist/lib/service/evolution/RecipeRelevanceAuditor.d.ts +89 -0
  153. package/dist/lib/service/evolution/RecipeRelevanceAuditor.js +492 -0
  154. package/dist/lib/service/evolution/createSupersedeProposal.d.ts +44 -0
  155. package/dist/lib/service/evolution/createSupersedeProposal.js +81 -0
  156. package/dist/lib/service/guard/ComplianceReporter.d.ts +4 -0
  157. package/dist/lib/service/guard/ComplianceReporter.js +51 -0
  158. package/dist/lib/service/guard/GuardCheckEngine.js +5 -4
  159. package/dist/lib/service/knowledge/ConfidenceRouter.js +1 -1
  160. package/dist/lib/service/knowledge/KnowledgeService.d.ts +11 -1
  161. package/dist/lib/service/knowledge/KnowledgeService.js +44 -4
  162. package/dist/lib/service/knowledge/RecipeProductionGateway.d.ts +225 -0
  163. package/dist/lib/service/knowledge/RecipeProductionGateway.js +384 -0
  164. package/dist/lib/service/panorama/DimensionAnalyzer.d.ts +3 -2
  165. package/dist/lib/service/panorama/DimensionAnalyzer.js +15 -140
  166. package/dist/lib/service/search/BM25Scorer.d.ts +2 -2
  167. package/dist/lib/service/search/SearchEngine.d.ts +11 -10
  168. package/dist/lib/service/search/SearchEngine.js +38 -36
  169. package/dist/lib/service/search/SearchTypes.d.ts +14 -8
  170. package/dist/lib/service/search/SearchTypes.js +1 -1
  171. package/dist/lib/service/search/tokenizer.d.ts +1 -1
  172. package/dist/lib/service/search/tokenizer.js +2 -2
  173. package/dist/lib/shared/schemas/common.d.ts +4 -4
  174. package/dist/lib/shared/schemas/http-requests.d.ts +12 -1
  175. package/dist/lib/shared/schemas/http-requests.js +8 -0
  176. package/dist/lib/shared/schemas/mcp-tools.d.ts +32 -2
  177. package/dist/lib/shared/schemas/mcp-tools.js +38 -0
  178. package/dist/lib/types/evolution.d.ts +135 -0
  179. package/dist/lib/types/evolution.js +6 -0
  180. package/dist/lib/types/graph-shared.d.ts +25 -0
  181. package/dist/lib/types/graph-shared.js +7 -0
  182. package/dist/lib/types/knowledge-wire.d.ts +131 -0
  183. package/dist/lib/types/knowledge-wire.js +7 -0
  184. package/dist/lib/types/project-snapshot-builder.d.ts +19 -0
  185. package/dist/lib/types/project-snapshot-builder.js +189 -0
  186. package/dist/lib/types/project-snapshot.d.ts +399 -0
  187. package/dist/lib/types/project-snapshot.js +17 -0
  188. package/dist/lib/types/search-wire.d.ts +46 -0
  189. package/dist/lib/types/search-wire.js +7 -0
  190. package/dist/lib/types/snapshot-views.d.ts +58 -0
  191. package/dist/lib/types/snapshot-views.js +103 -0
  192. package/package.json +1 -1
  193. package/skills/autosnippet-recipes/SKILL.md +1 -1
  194. package/templates/instructions/agent-static.md +2 -0
  195. package/templates/instructions/conventions.md +3 -1
  196. package/templates/recipes-setup/README.md +2 -2
  197. package/dashboard/dist/assets/icons-BJ2mUBi8.js +0 -1
  198. package/dashboard/dist/assets/index-B659K9t5.js +0 -128
  199. package/dashboard/dist/assets/index-NCm40PMD.css +0 -1
  200. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.d.ts +0 -169
  201. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.js +0 -727
  202. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.d.ts +0 -370
  203. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.js +0 -821
@@ -5,13 +5,13 @@
5
5
  <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>AutoSnippet Dashboard</title>
8
- <script type="module" crossorigin src="/assets/index-B659K9t5.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-DDdAOpYT.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/yaml-qRaU8Ldn.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/vendor-BZEJEVBn.js">
11
- <link rel="modulepreload" crossorigin href="/assets/icons-BJ2mUBi8.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/icons-D1aVZYFW.js">
12
12
  <link rel="modulepreload" crossorigin href="/assets/axios-42ANG6Sg.js">
13
13
  <link rel="modulepreload" crossorigin href="/assets/framer-motion-CZfOSYpP.js">
14
- <link rel="stylesheet" crossorigin href="/assets/index-NCm40PMD.css">
14
+ <link rel="stylesheet" crossorigin href="/assets/index-CxHOu8Hd.css">
15
15
  </head>
16
16
  <body>
17
17
  <div id="root"></div>
@@ -3,6 +3,7 @@
3
3
  * HTTP API 服务器启动脚本
4
4
  * 用于开发和测试 REST API
5
5
  */
6
+ process.env.ASD_API_SERVER = '1';
6
7
  import Bootstrap from '../lib/bootstrap.js';
7
8
  import HttpServer from '../lib/http/HttpServer.js';
8
9
  import Logger from '../lib/infrastructure/logging/Logger.js';
package/dist/bin/cli.d.ts CHANGED
@@ -6,6 +6,7 @@
6
6
  * asd setup - 初始化项目(--repo 指定子仓库远程地址)
7
7
  * asd remote <url> - 将 recipes 目录转为独立子仓库并关联远程仓库
8
8
  * asd coldstart - 冷启动知识库(9 维度分析 + AI 填充)
9
+ * asd rescan - 增量知识更新(保留 Recipe,重新扫描)
9
10
  * asd ais [Target] - AI 扫描 Target → 直接发布 Recipes
10
11
  * asd search <query> - 搜索知识库
11
12
  * asd guard <file> - Guard 检查
package/dist/bin/cli.js CHANGED
@@ -6,6 +6,7 @@
6
6
  * asd setup - 初始化项目(--repo 指定子仓库远程地址)
7
7
  * asd remote <url> - 将 recipes 目录转为独立子仓库并关联远程仓库
8
8
  * asd coldstart - 冷启动知识库(9 维度分析 + AI 填充)
9
+ * asd rescan - 增量知识更新(保留 Recipe,重新扫描)
9
10
  * asd ais [Target] - AI 扫描 Target → 直接发布 Recipes
10
11
  * asd search <query> - 搜索知识库
11
12
  * asd guard <file> - Guard 检查
@@ -158,6 +159,7 @@ program
158
159
  .description('冷启动知识库:9 维度项目分析 + AI 异步填充(与 Dashboard 点击冷启动流程一致)')
159
160
  .option('-d, --dir <path>', '项目目录', '.')
160
161
  .option('-m, --max-files <n>', '最大扫描文件数', '500')
162
+ .option('--dims <ids...>', '仅运行指定维度(逗号分隔或多次指定)')
161
163
  .option('--skip-guard', '跳过 Guard 审计')
162
164
  .option('--no-skills', '禁用 Skill 加载')
163
165
  .option('--wait', '等待 AI 异步填充完成(默认骨架完成即退出)')
@@ -169,17 +171,21 @@ program
169
171
  }
170
172
  try {
171
173
  const { bootstrap, container } = await initContainer({ projectRoot });
172
- // 通过 Agent 统一管道执行 bootstrap_knowledge
173
- const agentFactory = container.get('agentFactory');
174
174
  const ora = (await import('ora')).default;
175
175
  const spinner = ora('Phase 1-4: 收集文件、AST 分析、SPM 依赖、Guard 审计...').start();
176
- const result = await agentFactory.bootstrapKnowledge({
176
+ // 直接调用 bootstrap-internal handler(统一编排管线)
177
+ const { bootstrapKnowledge } = await import('../lib/external/mcp/handlers/bootstrap-internal.js');
178
+ const logger = container.get('logger');
179
+ const raw = await bootstrapKnowledge({ container, logger }, {
177
180
  maxFiles: parseInt(opts.maxFiles, 10),
178
181
  skipGuard: opts.skipGuard || false,
179
182
  contentMaxLines: 120,
180
183
  loadSkills: opts.skills !== false,
181
- skipAsyncFill: !opts.wait, // CLI 非 --wait 模式: 跳过异步 AI 填充 (DB 将被关闭)
184
+ skipAsyncFill: !opts.wait,
185
+ dimensions: opts.dims,
182
186
  });
187
+ const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;
188
+ const result = parsed?.data || parsed;
183
189
  spinner.stop();
184
190
  if (opts.json) {
185
191
  cli.json(result);
@@ -239,7 +245,7 @@ program
239
245
  const waitSpinner = ora2('Phase 5: AI 正在逐维度填充知识...').start();
240
246
  let lastStatus = '';
241
247
  let attempts = 0;
242
- const maxAttempts = 600; // 最多等 10 分钟(每秒轮询)
248
+ const maxAttempts = Infinity; // 不限时——冷启动/增量扫描本身就耗时较长
243
249
  while (attempts < maxAttempts) {
244
250
  await new Promise((r) => setTimeout(r, 1000));
245
251
  attempts++;
@@ -279,9 +285,6 @@ program
279
285
  // bootstrapTaskManager 可能还没就绪
280
286
  }
281
287
  }
282
- if (attempts >= maxAttempts) {
283
- waitSpinner.warn('AI 填充超时(10 分钟),可通过 asd ui 查看进度');
284
- }
285
288
  }
286
289
  else if (!opts.json) {
287
290
  cli.log('');
@@ -303,6 +306,128 @@ program
303
306
  }
304
307
  });
305
308
  // ─────────────────────────────────────────────────────
309
+ // rescan 命令 (增量知识更新)
310
+ // ─────────────────────────────────────────────────────
311
+ program
312
+ .command('rescan')
313
+ .description('增量知识更新:保留已审核 Recipe,清理衍生缓存,重新扫描项目 + AI 补齐')
314
+ .option('-d, --dir <path>', '项目目录', '.')
315
+ .option('-m, --max-files <n>', '最大扫描文件数', '500')
316
+ .option('--dims <ids...>', '仅扫描指定维度(逗号分隔或多次指定)')
317
+ .option('--reason <text>', '重扫原因(记录到日志)')
318
+ .option('--wait', '等待 AI 异步填充完成(默认骨架完成即退出)')
319
+ .option('--json', '以 JSON 格式输出')
320
+ .action(async (opts) => {
321
+ const projectRoot = resolve(opts.dir);
322
+ try {
323
+ const { bootstrap, container } = await initContainer({ projectRoot });
324
+ const ora = (await import('ora')).default;
325
+ const spinner = ora('Rescan: 快照 Recipe → 清理缓存 → Phase 1-4 + 证据审计...').start();
326
+ // 直接调用 rescan-internal handler(统一编排管线)
327
+ const { rescanInternal } = await import('../lib/external/mcp/handlers/rescan-internal.js');
328
+ const logger = container.get('logger');
329
+ const raw = await rescanInternal({ container, logger }, {
330
+ reason: opts.reason || 'cli-rescan',
331
+ dimensions: opts.dims,
332
+ skipAsyncFill: !opts.wait,
333
+ });
334
+ const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;
335
+ const result = parsed?.data || parsed;
336
+ spinner.stop();
337
+ if (opts.json) {
338
+ cli.json(result);
339
+ }
340
+ else {
341
+ cli.log('\n📊 Rescan Report');
342
+ cli.log(`${'─'.repeat(50)}`);
343
+ const rescan = result.rescan || {};
344
+ const audit = result.relevanceAudit || {};
345
+ const gap = result.gapAnalysis || {};
346
+ cli.log(` 保留 Recipe: ${rescan.preservedRecipes ?? '?'}`);
347
+ cli.log(` 扫描文件: ${result.files ?? '?'}`);
348
+ cli.log(` 维度: ${gap.totalDimensions ?? '?'} (gap: ${gap.gapDimensions ?? 0})`);
349
+ cli.log('\n 证据审计:');
350
+ cli.log(` 健康: ${audit.healthy ?? '?'} 观察: ${audit.watch ?? '?'}`);
351
+ cli.log(` 衰退: ${audit.decay ?? '?'} 严重: ${audit.severe ?? '?'} 死亡: ${audit.dead ?? '?'}`);
352
+ if (audit.proposalsCreated > 0) {
353
+ cli.log(` 创建进化提案: ${audit.proposalsCreated}`);
354
+ }
355
+ if (audit.immediateDeprecated > 0) {
356
+ cli.log(` 即时淘汰: ${audit.immediateDeprecated}`);
357
+ }
358
+ if (gap.gapDimensions > 0 && opts.wait) {
359
+ cli.log(`\n AI 正在异步填充 ${gap.gapDimensions} 个 gap 维度...`);
360
+ }
361
+ else if (gap.gapDimensions > 0) {
362
+ cli.log(`\n ${gap.gapDimensions} 个 gap 维度可通过 --wait 等待 AI 填充`);
363
+ }
364
+ else {
365
+ cli.log('\n 所有维度已完全覆盖,无需 AI 补齐。');
366
+ }
367
+ }
368
+ // --wait 模式: 轮询 BootstrapTaskManager
369
+ if (opts.wait && result.asyncFill) {
370
+ const ora2 = (await import('ora')).default;
371
+ const waitSpinner = ora2('AI 正在逐维度填充知识...').start();
372
+ let lastStatus = '';
373
+ let attempts = 0;
374
+ const maxAttempts = Infinity; // 不限时——增量扫描本身就耗时较长
375
+ while (attempts < maxAttempts) {
376
+ await new Promise((r) => setTimeout(r, 1000));
377
+ attempts++;
378
+ try {
379
+ const taskManager = container.get('bootstrapTaskManager');
380
+ const sessionStatus = taskManager.getSessionStatus();
381
+ if (!sessionStatus || !('tasks' in sessionStatus)) {
382
+ break;
383
+ }
384
+ const total = sessionStatus.tasks.length;
385
+ const done = sessionStatus.tasks.filter((t) => t.status === 'done' || t.status === 'error').length;
386
+ const current = sessionStatus.tasks.find((t) => t.status === 'running');
387
+ const statusText = current
388
+ ? `[${done}/${total}] 正在处理: ${current.meta?.label || current.id}`
389
+ : `[${done}/${total}] 等待中...`;
390
+ if (statusText !== lastStatus) {
391
+ waitSpinner.text = statusText;
392
+ lastStatus = statusText;
393
+ }
394
+ if (done >= total) {
395
+ waitSpinner.succeed(`AI 填充完成: ${total} 个维度`);
396
+ if (!opts.json) {
397
+ const succeeded = sessionStatus.tasks.filter((t) => t.status === 'done').length;
398
+ const failed = sessionStatus.tasks.filter((t) => t.status === 'error').length;
399
+ cli.log(`\n Results: ${succeeded} succeeded, ${failed} failed`);
400
+ for (const t of sessionStatus.tasks) {
401
+ const icon = t.status === 'done' ? '✅' : '❌';
402
+ cli.log(` ${icon} ${t.meta?.label || t.id}`);
403
+ }
404
+ cli.blank();
405
+ }
406
+ break;
407
+ }
408
+ }
409
+ catch {
410
+ /* bootstrapTaskManager 可能还没就绪 */
411
+ }
412
+ }
413
+ }
414
+ await bootstrap.shutdown();
415
+ if (process.stdout.writableLength > 0) {
416
+ await new Promise((resolve) => process.stdout.once('drain', resolve));
417
+ }
418
+ await new Promise((resolve) => setTimeout(resolve, 50));
419
+ process.exit(0);
420
+ }
421
+ catch (err) {
422
+ const msg = err instanceof Error ? err.message : String(err);
423
+ cli.error(`\n❌ ${msg}`);
424
+ if (err instanceof Error && err.stack) {
425
+ cli.debug(err.stack);
426
+ }
427
+ process.exit(1);
428
+ }
429
+ });
430
+ // ─────────────────────────────────────────────────────
306
431
  // ais 命令 (AI Scan)
307
432
  // ─────────────────────────────────────────────────────
308
433
  program
@@ -368,7 +493,7 @@ program
368
493
  .command('search <query>')
369
494
  .description('搜索知识库')
370
495
  .option('-t, --type <type>', '搜索类型: all, recipe, solution, rule', 'all')
371
- .option('-m, --mode <mode>', '搜索模式: keyword, bm25, semantic, auto', 'bm25')
496
+ .option('-m, --mode <mode>', '搜索模式: keyword, weighted, semantic, auto', 'auto')
372
497
  .option('-l, --limit <n>', '结果数量', '10')
373
498
  .option('-r, --rank', '启用排序管线 (CoarseRanker + MultiSignalRanker)')
374
499
  .option('-o, --output <format>', '输出格式: text, json', 'text')
@@ -720,6 +845,8 @@ program
720
845
  .option('--api-only', '仅启动 API 服务(不启动前端)')
721
846
  .action(async (opts) => {
722
847
  const { spawn } = await import('node:child_process');
848
+ // 标记为长驻 API 服务进程(CacheCoordinator 用于判断是否启动轮询)
849
+ process.env.ASD_API_SERVER = '1';
723
850
  // 项目根目录:-d 选项 > 环境变量 ASD_CWD > 当前目录
724
851
  const projectRoot = opts.dir || process.env.ASD_CWD || process.cwd();
725
852
  const port = opts.port;
@@ -64,14 +64,6 @@ interface ScanKnowledgeOptions {
64
64
  lang?: string;
65
65
  comprehensive?: boolean;
66
66
  }
67
- /** Options for bootstrapKnowledge */
68
- interface BootstrapKnowledgeOptions {
69
- maxFiles?: number;
70
- skipGuard?: boolean;
71
- contentMaxLines?: number;
72
- loadSkills?: boolean;
73
- skipAsyncFill?: boolean;
74
- }
75
67
  export declare class AgentFactory {
76
68
  #private;
77
69
  /**
@@ -204,15 +196,6 @@ export declare class AgentFactory {
204
196
  * @returns >}
205
197
  */
206
198
  translateToEnglish(summary: string, usageGuide?: string): Promise<any>;
207
- /**
208
- * 冷启动知识库 — 直接调用 handler(纯启发式,不需要 LLM)
209
- *
210
- * bootstrap_knowledge 是纯启发式工具:SPM Target 扫描 → 依赖图谱 → Guard 审计 →
211
- * Candidate 创建,全程无 AI 推理。直接调用 handler 即可,无需创建 Agent。
212
- *
213
- * @param [opts]
214
- */
215
- bootstrapKnowledge(opts?: BootstrapKnowledgeOptions): Promise<any>;
216
199
  /**
217
200
  * 通用工具执行 — 直接调用工具 handler
218
201
  *
@@ -247,7 +247,7 @@ export class AgentFactory {
247
247
  maxIterations: 30, // 24 stage budget + 6 tracker grace
248
248
  maxTokens: 8192,
249
249
  temperature: 0.3,
250
- timeoutMs: 600_000,
250
+ timeoutMs: 3_600_000,
251
251
  }),
252
252
  ],
253
253
  memory: { enabled: false },
@@ -370,30 +370,6 @@ export class AgentFactory {
370
370
  usageGuideEn: usageGuide || '',
371
371
  });
372
372
  }
373
- /**
374
- * 冷启动知识库 — 直接调用 handler(纯启发式,不需要 LLM)
375
- *
376
- * bootstrap_knowledge 是纯启发式工具:SPM Target 扫描 → 依赖图谱 → Guard 审计 →
377
- * Candidate 创建,全程无 AI 推理。直接调用 handler 即可,无需创建 Agent。
378
- *
379
- * @param [opts]
380
- */
381
- async bootstrapKnowledge(opts = {}) {
382
- const { bootstrapKnowledge } = await import('#external/mcp/handlers/bootstrap-internal.js');
383
- const result = await bootstrapKnowledge({
384
- container: this
385
- .#container,
386
- logger: this.#logger,
387
- }, {
388
- maxFiles: opts.maxFiles || 500,
389
- skipGuard: opts.skipGuard || false,
390
- contentMaxLines: opts.contentMaxLines || 120,
391
- loadSkills: opts.loadSkills ?? true,
392
- skipAsyncFill: opts.skipAsyncFill || false,
393
- });
394
- const parsed = typeof result === 'string' ? JSON.parse(result) : result;
395
- return parsed?.data || parsed;
396
- }
397
373
  /**
398
374
  * 通用工具执行 — 直接调用工具 handler
399
375
  *
@@ -142,6 +142,16 @@ export declare class ScanProduction extends Capability {
142
142
  get promptFragment(): string;
143
143
  get tools(): string[];
144
144
  }
145
+ /**
146
+ * Evolution Analysis — 现有 Recipe 进化决策能力
147
+ *
148
+ * 用于: evolution preset 的 evolve 阶段
149
+ */
150
+ export declare class EvolutionAnalysis extends Capability {
151
+ get name(): string;
152
+ get promptFragment(): string;
153
+ get tools(): string[];
154
+ }
145
155
  /**
146
156
  * 所有内置 Capability 的注册表
147
157
  *
@@ -163,6 +173,7 @@ declare const _default: {
163
173
  CodeAnalysis: typeof CodeAnalysis;
164
174
  KnowledgeProduction: typeof KnowledgeProduction;
165
175
  SystemInteraction: typeof SystemInteraction;
176
+ EvolutionAnalysis: typeof EvolutionAnalysis;
166
177
  CapabilityRegistry: {
167
178
  _registry: Map<string, typeof Capability>;
168
179
  /** 按名称创建 Capability 实例 */
@@ -214,7 +214,7 @@ export class KnowledgeProduction extends Capability {
214
214
  你是知识管理专家,将代码分析转化为结构化知识候选。
215
215
 
216
216
  每个候选必须有:
217
- 1. 清晰的标题 (使用项目真实类名/模块名)
217
+ 1. 清晰的标题 (使用项目真实类名/模块名,不以项目名开头)
218
218
  2. 项目特写风格的正文 (content.markdown)
219
219
  3. 相关文件路径
220
220
  4. 正确的 kind (rule / pattern / fact)
@@ -222,14 +222,13 @@ export class KnowledgeProduction extends Capability {
222
222
 
223
223
  工作流:
224
224
  1. 识别分析中的知识点
225
- 2. read_project_file 获取代码片段 (如需)
225
+ 2. read_project_file 批量获取代码片段 (如需)
226
226
  3. submit_knowledge 或 submit_with_check 提交
227
227
  4. 提交优先于完美 — 文件读取失败时用已有信息直接提交`;
228
228
  }
229
229
  get tools() {
230
- // 与旧版 PRODUCER_TOOLS 保持一致: 3 个核心工具
230
+ // PRODUCER_TOOLS 保持一致: 提交 + 文件读取
231
231
  // guard_check_code / validate_candidate 不需要:提交时 UnifiedValidator 已自动校验
232
- // 额外工具会分散 LLM 注意力,浪费 produce 轮次在验证而非提交上
233
232
  return [
234
233
  'submit_knowledge',
235
234
  'submit_with_check',
@@ -321,7 +320,7 @@ export class ScanProduction extends Capability {
321
320
  你是知识管理专家,将代码分析转化为结构化知识候选。
322
321
 
323
322
  每个候选必须有:
324
- 1. 清晰的标题 (使用项目真实类名/模块名)
323
+ 1. 清晰的标题 (使用项目真实类名/模块名,不以项目名开头)
325
324
  2. 项目特写风格的正文 (content.markdown ≥200字)
326
325
  3. 设计原理说明 (content.rationale)
327
326
  4. 相关文件路径 (reasoning.sources)
@@ -341,6 +340,29 @@ export class ScanProduction extends Capability {
341
340
  ];
342
341
  }
343
342
  }
343
+ // ─── Evolution Analysis ─────────────────────────
344
+ /**
345
+ * Evolution Analysis — 现有 Recipe 进化决策能力
346
+ *
347
+ * 用于: evolution preset 的 evolve 阶段
348
+ */
349
+ export class EvolutionAnalysis extends Capability {
350
+ get name() {
351
+ return 'evolution_analysis';
352
+ }
353
+ get promptFragment() {
354
+ return '你是知识进化专家,负责验证现有 Recipe 真实性并通过提案推动知识演化。';
355
+ }
356
+ get tools() {
357
+ return [
358
+ 'read_project_file',
359
+ 'search_project_code',
360
+ 'propose_evolution',
361
+ 'confirm_deprecation',
362
+ 'skip_evolution',
363
+ ];
364
+ }
365
+ }
344
366
  // ─── Capability 注册表 ─────────────────────────
345
367
  /**
346
368
  * 所有内置 Capability 的注册表
@@ -355,6 +377,7 @@ export const CapabilityRegistry = {
355
377
  ['knowledge_production', KnowledgeProduction],
356
378
  ['scan_production', ScanProduction],
357
379
  ['system_interaction', SystemInteraction],
380
+ ['evolution_analysis', EvolutionAnalysis],
358
381
  ]),
359
382
  /** 按名称创建 Capability 实例 */
360
383
  create(name, opts = {}) {
@@ -379,5 +402,6 @@ export default {
379
402
  CodeAnalysis,
380
403
  KnowledgeProduction,
381
404
  SystemInteraction,
405
+ EvolutionAnalysis,
382
406
  CapabilityRegistry,
383
407
  };
@@ -54,6 +54,7 @@ export class ExplorationTracker {
54
54
  iteration: 0,
55
55
  searchRoundsInPhase: 0,
56
56
  phaseRounds: 0,
57
+ consecutiveIdleRounds: 0,
57
58
  };
58
59
  // ── 阶段控制 ──
59
60
  /** 是否刚完成阶段转换(用于 pending nudge) */
@@ -273,6 +274,13 @@ export class ExplorationTracker {
273
274
  if (hasSearchTool) {
274
275
  this.#metrics.searchRoundsInPhase++;
275
276
  }
277
+ // 2.5 连续空闲轮次追踪(无任何工具调用 = 真正空转,有工具调用 = 活跃工作)
278
+ if (toolNames.length === 0) {
279
+ this.#metrics.consecutiveIdleRounds++;
280
+ }
281
+ else {
282
+ this.#metrics.consecutiveIdleRounds = 0;
283
+ }
276
284
  // 3. 检查 metrics 驱动的阶段转换
277
285
  this.#checkMetricsTransition();
278
286
  // 4. 如果发生了转换,生成 nudge
@@ -446,8 +454,9 @@ export class ExplorationTracker {
446
454
  // (SCAN 阶段的 roundsSinceNewInfo 不应影响 EXPLORE→VERIFY 的判定)
447
455
  this.#metrics.roundsSinceNewInfo = 0;
448
456
  this.#metrics.roundsSinceSubmit = 0;
457
+ this.#metrics.consecutiveIdleRounds = 0;
449
458
  this.#justTransitioned = true;
450
- this.#logger.info(`[ExplorationTracker] ${oldPhase} → ${newPhase} (iter=${this.#metrics.iteration}, submits=${this.#metrics.submitCount})`);
459
+ this.#logger.info(`[ExplorationTracker] ${oldPhase} → ${newPhase} (iter=${this.#metrics.iteration}, submits=${this.#metrics.submitCount}, phaseRounds=${this.#metrics.phaseRounds}, idleRounds=${this.#metrics.consecutiveIdleRounds})`);
451
460
  // Phase 3: 发射阶段转换信号
452
461
  if (this.#signalBus) {
453
462
  const terminalPhase = this.#getTerminalPhase();
@@ -30,6 +30,8 @@ export interface ExplorationMetrics {
30
30
  phaseRounds: number;
31
31
  roundsSinceSubmit: number;
32
32
  roundsSinceNewInfo: number;
33
+ /** 连续无任何工具调用的轮次数(用于 grace exit 判定) */
34
+ consecutiveIdleRounds: number;
33
35
  }
34
36
  /** 探索预算配置 */
35
37
  export interface ExplorationBudget {
@@ -37,7 +37,7 @@ export function createBootstrapStrategy(isSkillOnly = false) {
37
37
  'PRODUCE→SUMMARIZE': {
38
38
  onMetrics: (m, b) => m.submitCount >= b.maxSubmits ||
39
39
  (m.submitCount > 0 && m.roundsSinceSubmit >= b.idleRoundsToExit) ||
40
- (m.phaseRounds >= b.searchBudgetGrace && m.submitCount === 0),
40
+ (m.consecutiveIdleRounds >= b.searchBudgetGrace && m.submitCount === 0),
41
41
  onTextResponse: (m, b) => m.submitCount >= b.softSubmitLimit,
42
42
  },
43
43
  }),
@@ -106,7 +106,7 @@ export const STRATEGY_PRODUCER = {
106
106
  'PRODUCE→SUMMARIZE': {
107
107
  onMetrics: (m, b) => m.submitCount >= b.maxSubmits ||
108
108
  (m.submitCount > 0 && m.roundsSinceSubmit >= b.idleRoundsToExit) ||
109
- (m.phaseRounds >= b.searchBudgetGrace && m.submitCount === 0),
109
+ (m.consecutiveIdleRounds >= b.searchBudgetGrace && m.submitCount === 0),
110
110
  onTextResponse: (m, b) => m.submitCount >= b.softSubmitLimit,
111
111
  },
112
112
  },
@@ -59,7 +59,7 @@ interface CodeEntityGraphLike {
59
59
  maxEdges: number;
60
60
  }): string | null;
61
61
  }
62
- export declare const ANALYST_SYSTEM_PROMPT = "\u4F60\u662F\u4E00\u4F4D\u9AD8\u7EA7\u8F6F\u4EF6\u67B6\u6784\u5E08\uFF0C\u6B63\u5728\u6DF1\u5EA6\u5206\u6790\u4E00\u4E2A\u771F\u5B9E\u9879\u76EE\u7684\u67D0\u4E2A\u7EF4\u5EA6\u3002\n\n## \u6267\u884C\u8BA1\u5212\n\u4F60\u6709 **N \u8F6E**\u5DE5\u5177\u8C03\u7528\u673A\u4F1A\uFF08\u7CFB\u7EDF\u4F1A\u544A\u77E5\u5177\u4F53\u6570\u5B57\uFF09\u3002\u8BF7\u4E25\u683C\u6309\u4EE5\u4E0B\u8282\u594F\u5206\u914D\uFF1A\n\n| \u9636\u6BB5 | \u8F6E\u6B21\u5360\u6BD4 | \u76EE\u6807 |\n|------|---------|------|\n| 1. \u5168\u5C40\u626B\u63CF | \u7B2C 1-3 \u8F6E | get_project_overview + list_project_structure \u4E86\u89E3\u9879\u76EE\u7ED3\u6784 |\n| 2. \u7ED3\u6784\u5316\u63A2\u7D22 | \u7B2C 4-N\u00D760% \u8F6E | get_class_hierarchy / get_class_info \u7406\u89E3\u6838\u5FC3\u7C7B\uFF1Bsearch_project_code \u6279\u91CF\u641C\u7D22\u5173\u952E\u6A21\u5F0F |\n| 3. \u6DF1\u5EA6\u9A8C\u8BC1 | \u7B2C N\u00D760%-N\u00D780% \u8F6E | read_project_file \u9605\u8BFB\u5173\u952E\u5B9E\u73B0\uFF0C\u786E\u8BA4\u7EC6\u8282 |\n| 4. \u8F93\u51FA\u603B\u7ED3 | \u6700\u540E 20% | **\u505C\u6B62\u8C03\u7528\u5DE5\u5177**\uFF0C\u76F4\u63A5\u8F93\u51FA\u4F60\u7684\u5206\u6790\u6587\u672C |\n\n## \u5173\u952E\u89C4\u5219\n- **\u5230\u8FBE 80% \u8F6E\u6B21\u65F6\u5FC5\u987B\u5F00\u59CB\u5199\u603B\u7ED3**\uFF0C\u4E0D\u8981\u7B49\u7CFB\u7EDF\u63D0\u9192\n- \u6BCF\u4E00\u8F6E\u90FD\u5FC5\u987B\u8C03\u7528\u5DE5\u5177\u83B7\u53D6\u65B0\u4FE1\u606F\uFF0C\u4E0D\u8981\u82B1\u8F6E\u6B21\u5728\u7EAF\u6587\u672C\u601D\u8003\u4E0A\n- \u4E0D\u8981\u91CD\u590D\u641C\u7D22\u76F8\u540C\u5173\u952E\u8BCD\u6216\u8BFB\u53D6\u76F8\u540C\u6587\u4EF6\uFF08\u7CFB\u7EDF\u4F1A\u8FD4\u56DE\u7F13\u5B58\u5E76\u6263\u8F6E\u6B21\uFF09\n\n## \u5DE5\u5177\u6548\u7387\n- **\u6279\u91CF\u641C\u7D22**: search_project_code({ patterns: [\"keywordA\", \"keywordB\", \"keywordC\"] }) \u2014 \u4E00\u6B21\u641C 3-5 \u4E2A\n- **\u6279\u91CF\u8BFB\u6587\u4EF6**: read_project_file({ filePaths: [\"a.m\", \"b.m\", \"c.m\"] }) \u2014 \u4E00\u6B21\u8BFB 3-5 \u4E2A\n- **\u7ED3\u6784\u5316\u67E5\u8BE2\u4F18\u5148**: get_class_hierarchy / get_class_info \u6BD4\u6587\u672C\u641C\u7D22\u66F4\u7CBE\u786E\u9AD8\u6548\n\n## \u8F93\u51FA\u8981\u6C42\n\u8F93\u51FA\u4F60\u7684\u5206\u6790\u53D1\u73B0\uFF0C\u5305\u62EC\u5177\u4F53\u7684\u6587\u4EF6\u8DEF\u5F84\u548C\u4EE3\u7801\u4F4D\u7F6E\u3002\n\u7528\u81EA\u7136\u8BED\u8A00\u63CF\u8FF0\u4F60\u7684\u7406\u89E3\uFF0C\u4E0D\u9700\u8981\u7279\u5B9A\u683C\u5F0F\u3002";
62
+ export declare const ANALYST_SYSTEM_PROMPT = "\u4F60\u662F\u4E00\u4F4D\u9AD8\u7EA7\u8F6F\u4EF6\u67B6\u6784\u5E08\uFF0C\u6B63\u5728\u6DF1\u5EA6\u5206\u6790\u4E00\u4E2A\u771F\u5B9E\u9879\u76EE\u7684\u67D0\u4E2A\u7EF4\u5EA6\u3002\n\n## \u6267\u884C\u8BA1\u5212\n\u4F60\u6709 **N \u8F6E**\u5DE5\u5177\u8C03\u7528\u673A\u4F1A\uFF08\u7CFB\u7EDF\u4F1A\u544A\u77E5\u5177\u4F53\u6570\u5B57\uFF09\u3002\u8BF7\u4E25\u683C\u6309\u4EE5\u4E0B\u8282\u594F\u5206\u914D\uFF1A\n\n| \u9636\u6BB5 | \u8F6E\u6B21\u5360\u6BD4 | \u76EE\u6807 |\n|------|---------|------|\n| 1. \u5168\u5C40\u626B\u63CF | \u7B2C 1-3 \u8F6E | get_project_overview + list_project_structure \u4E86\u89E3\u9879\u76EE\u7ED3\u6784 |\n| 2. \u7ED3\u6784\u5316\u63A2\u7D22 | \u7B2C 4-N\u00D760% \u8F6E | get_class_hierarchy / get_class_info \u7406\u89E3\u6838\u5FC3\u7C7B\uFF1Bsearch_project_code \u6279\u91CF\u641C\u7D22\u5173\u952E\u6A21\u5F0F |\n| 3. \u6DF1\u5EA6\u9A8C\u8BC1 | \u7B2C N\u00D760%-N\u00D780% \u8F6E | read_project_file \u9605\u8BFB\u5173\u952E\u5B9E\u73B0\uFF0C\u786E\u8BA4\u7EC6\u8282 |\n| 4. \u8F93\u51FA\u603B\u7ED3 | \u6700\u540E 20% | **\u505C\u6B62\u8C03\u7528\u5DE5\u5177**\uFF0C\u76F4\u63A5\u8F93\u51FA\u4F60\u7684\u5206\u6790\u6587\u672C |\n\n## \u5173\u952E\u89C4\u5219\n- **\u5230\u8FBE 80% \u8F6E\u6B21\u65F6\u5FC5\u987B\u5F00\u59CB\u5199\u603B\u7ED3**\uFF0C\u4E0D\u8981\u7B49\u7CFB\u7EDF\u63D0\u9192\n- \u6BCF\u4E00\u8F6E\u90FD\u5FC5\u987B\u8C03\u7528\u5DE5\u5177\u83B7\u53D6\u65B0\u4FE1\u606F\uFF0C\u4E0D\u8981\u82B1\u8F6E\u6B21\u5728\u7EAF\u6587\u672C\u601D\u8003\u4E0A\n- \u4E0D\u8981\u91CD\u590D\u641C\u7D22\u76F8\u540C\u5173\u952E\u8BCD\u6216\u8BFB\u53D6\u76F8\u540C\u6587\u4EF6\uFF08\u7CFB\u7EDF\u4F1A\u8FD4\u56DE\u7F13\u5B58\u5E76\u6263\u8F6E\u6B21\uFF09\n\n## \u5DE5\u5177\u6548\u7387\n- **\u6279\u91CF\u641C\u7D22**: search_project_code({ patterns: [\"keywordA\", \"keywordB\", \"keywordC\"] }) \u2014 \u4E00\u6B21\u641C 3-5 \u4E2A\n- **\u6279\u91CF\u8BFB\u6587\u4EF6**: read_project_file({ filePaths: [\"a.m\", \"b.m\", \"c.m\"] }) \u2014 \u4E00\u6B21\u8BFB 3-5 \u4E2A\n- **\u7ED3\u6784\u5316\u67E5\u8BE2\u4F18\u5148**: get_class_hierarchy / get_class_info \u6BD4\u6587\u672C\u641C\u7D22\u66F4\u7CBE\u786E\u9AD8\u6548\n\n## \u8F93\u51FA\u8981\u6C42\n\u8F93\u51FA\u4F60\u7684\u5206\u6790\u53D1\u73B0\uFF0C\u5305\u62EC\u5177\u4F53\u7684\u6587\u4EF6\u5B8C\u6574\u76F8\u5BF9\u8DEF\u5F84\uFF08\u4ECE\u9879\u76EE\u6839\u76EE\u5F55\u5F00\u59CB\uFF09\u548C\u884C\u53F7\u3002\n\u6BCF\u4E2A\u6587\u4EF6\u5F15\u7528\u683C\u5F0F: (\u6765\u6E90: Full/Relative/Path/FileName.ext:\u884C\u53F7)\n\u7981\u6B62\u53EA\u5199\u6587\u4EF6\u540D\uFF0C\u5FC5\u987B\u5199\u4ECE\u9879\u76EE\u6839\u5F00\u59CB\u7684\u5B8C\u6574\u8DEF\u5F84\u3002\n\u6807\u6CE8\u6BCF\u4E2A\u53D1\u73B0\u6240\u5C5E\u7684\u6A21\u5757/\u5305\u540D\u3002\n\u7528\u81EA\u7136\u8BED\u8A00\u63CF\u8FF0\u4F60\u7684\u7406\u89E3\uFF0C\u4E0D\u9700\u8981\u7279\u5B9A\u683C\u5F0F\u3002";
63
63
  export declare const ANALYST_TOOLS: string[];
64
64
  export declare const ANALYST_BUDGET: {
65
65
  maxIterations: number;
@@ -69,10 +69,42 @@ export declare const ANALYST_BUDGET: {
69
69
  softSubmitLimit: number;
70
70
  idleRoundsToExit: number;
71
71
  };
72
+ /** Panorama context — module role, layer, coupling, gaps */
73
+ interface PanoramaContextLike {
74
+ moduleRole: string | null;
75
+ moduleLayer: number | null;
76
+ moduleCoupling: {
77
+ fanIn: number;
78
+ fanOut: number;
79
+ } | null;
80
+ knownGaps: string[];
81
+ layerContext: string | null;
82
+ }
83
+ /** Evidence starters — per-dimension evidence hints from Phase 1-4 */
84
+ interface EvidenceStarterEntry {
85
+ hint: string;
86
+ data: unknown;
87
+ strength?: number;
88
+ }
89
+ /** Rescan context — existing recipes in this dimension */
90
+ interface RescanContextLike {
91
+ existingRecipes: Array<{
92
+ title: string;
93
+ trigger: string;
94
+ }>;
95
+ decayingRecipes?: Array<{
96
+ title: string;
97
+ trigger: string;
98
+ id?: string;
99
+ decayReason?: string;
100
+ }>;
101
+ gap: number;
102
+ existing: number;
103
+ }
72
104
  /**
73
105
  * 构建 Analyst Prompt
74
106
  *
75
- * 9 段结构:
107
+ * 12 段结构:
76
108
  * §1 任务描述
77
109
  * §2 维度指引
78
110
  * §3 SOP (分析步骤 + 常见错误)
@@ -82,6 +114,9 @@ export declare const ANALYST_BUDGET: {
82
114
  * §7 Tier Reflection 洞察
83
115
  * §8 历史语义记忆 (Tier 3)
84
116
  * §9 代码实体图谱 (Phase E)
117
+ * §ES 分析起点证据 (Phase 1-4 Evidence Starters)
118
+ * §M1 全景上下文 (Panorama Phase 1.8)
119
+ * §10 Rescan 已有知识上下文
85
120
  *
86
121
  * @param dimConfig 维度配置 { id, label, guide, focusKeywords, outputType }
87
122
  * @param projectInfo { name, lang, fileCount }
@@ -89,6 +124,15 @@ export declare const ANALYST_BUDGET: {
89
124
  * @param [episodicMemory] SessionStore 实例 (v4.0 增强上下文)
90
125
  * @param [semanticMemory] PersistentMemory 实例 (v4.1 历史记忆)
91
126
  * @param [codeEntityGraph] CodeEntityGraph 实例 (Phase E 代码实体图谱)
127
+ * @param [rescanContext] Rescan 已有知识上下文 (增量扫描时注入)
128
+ * @param [panorama] 全景上下文 — 模块角色/层级/耦合/空白区 (Phase 1.8)
129
+ * @param [evidenceStarters] Phase 1-4 证据启发 — 维度级分析起点
130
+ * @param [evolutionResult] Evolution Stage 产出 — 避免重复分析已处理的 Recipe
92
131
  */
93
- export declare function buildAnalystPrompt(dimConfig: AnalystDimConfig, projectInfo: AnalystProjectInfo, dimensionContext: DimensionContextLike | null | undefined, episodicMemory: EpisodicMemoryLike | null | undefined, semanticMemory: SemanticMemoryLike | null | undefined, codeEntityGraph: CodeEntityGraphLike | null | undefined): Promise<string>;
132
+ export declare function buildAnalystPrompt(dimConfig: AnalystDimConfig, projectInfo: AnalystProjectInfo, dimensionContext: DimensionContextLike | null | undefined, episodicMemory: EpisodicMemoryLike | null | undefined, semanticMemory: SemanticMemoryLike | null | undefined, codeEntityGraph: CodeEntityGraphLike | null | undefined, rescanContext?: RescanContextLike | null, panorama?: PanoramaContextLike | null, evidenceStarters?: Record<string, EvidenceStarterEntry> | null, evolutionResult?: {
133
+ evolved?: number;
134
+ deprecated?: number;
135
+ skipped?: number;
136
+ totalRecipes?: number;
137
+ } | null): Promise<string>;
94
138
  export {};