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.
- package/dashboard/dist/assets/icons-D1aVZYFW.js +1 -0
- package/dashboard/dist/assets/index-CxHOu8Hd.css +1 -0
- package/dashboard/dist/assets/index-DDdAOpYT.js +128 -0
- package/dashboard/dist/index.html +3 -3
- package/dist/bin/api-server.js +1 -0
- package/dist/bin/cli.d.ts +1 -0
- package/dist/bin/cli.js +136 -9
- package/dist/lib/agent/AgentFactory.d.ts +0 -17
- package/dist/lib/agent/AgentFactory.js +1 -25
- package/dist/lib/agent/capabilities.d.ts +11 -0
- package/dist/lib/agent/capabilities.js +29 -5
- package/dist/lib/agent/context/ExplorationTracker.js +10 -1
- package/dist/lib/agent/context/exploration/ExplorationStrategies.d.ts +2 -0
- package/dist/lib/agent/context/exploration/ExplorationStrategies.js +2 -2
- package/dist/lib/agent/domain/insight-analyst.d.ts +47 -3
- package/dist/lib/agent/domain/insight-analyst.js +111 -11
- package/dist/lib/agent/domain/insight-evolver.d.ts +69 -0
- package/dist/lib/agent/domain/insight-evolver.js +230 -0
- package/dist/lib/agent/domain/insight-gate.d.ts +42 -0
- package/dist/lib/agent/domain/insight-gate.js +41 -0
- package/dist/lib/agent/domain/insight-producer.d.ts +27 -2
- package/dist/lib/agent/domain/insight-producer.js +60 -5
- package/dist/lib/agent/domain/scan-prompts.js +10 -7
- package/dist/lib/agent/memory/ActiveContext.d.ts +2 -28
- package/dist/lib/agent/memory/MemoryCoordinator.d.ts +2 -2
- package/dist/lib/agent/memory/SessionStore.d.ts +6 -12
- package/dist/lib/agent/memory/SessionStore.js +9 -15
- package/dist/lib/agent/memory/memory-flush-contract.d.ts +49 -0
- package/dist/lib/agent/memory/memory-flush-contract.js +16 -0
- package/dist/lib/agent/memory/session-store-schema.d.ts +20 -0
- package/dist/lib/agent/memory/session-store-schema.js +41 -0
- package/dist/lib/agent/presets.d.ts +89 -1
- package/dist/lib/agent/presets.js +53 -5
- package/dist/lib/agent/tools/_shared.d.ts +7 -15
- package/dist/lib/agent/tools/_shared.js +20 -21
- package/dist/lib/agent/tools/composite.d.ts +25 -22
- package/dist/lib/agent/tools/composite.js +108 -109
- package/dist/lib/agent/tools/evolution-tools.d.ts +145 -0
- package/dist/lib/agent/tools/evolution-tools.js +161 -0
- package/dist/lib/agent/tools/index.d.ts +163 -92
- package/dist/lib/agent/tools/index.js +9 -1
- package/dist/lib/agent/tools/lifecycle.d.ts +7 -1
- package/dist/lib/agent/tools/lifecycle.js +59 -75
- package/dist/lib/cli/AiScanService.js +1 -1
- package/dist/lib/cli/KnowledgeSyncService.js +1 -1
- package/dist/lib/core/AstAnalyzer.d.ts +1 -0
- package/dist/lib/{service/bootstrap/DimensionCopyRegistry.d.ts → domain/dimension/DimensionCopy.d.ts} +2 -2
- package/dist/lib/{service/bootstrap/DimensionCopyRegistry.js → domain/dimension/DimensionCopy.js} +22 -72
- package/dist/lib/domain/dimension/DimensionRegistry.d.ts +54 -0
- package/dist/lib/domain/dimension/DimensionRegistry.js +620 -0
- package/dist/lib/domain/dimension/DimensionSop.d.ts +55 -0
- package/dist/lib/domain/dimension/DimensionSop.js +1604 -0
- package/dist/lib/domain/dimension/UnifiedDimension.d.ts +61 -0
- package/dist/lib/domain/dimension/UnifiedDimension.js +53 -0
- package/dist/lib/domain/dimension/index.d.ts +10 -0
- package/dist/lib/domain/dimension/index.js +9 -0
- package/dist/lib/domain/knowledge/FieldSpec.d.ts +1 -1
- package/dist/lib/domain/knowledge/FieldSpec.js +29 -16
- package/dist/lib/domain/knowledge/KnowledgeEntry.d.ts +33 -111
- package/dist/lib/domain/knowledge/KnowledgeEntry.js +27 -6
- package/dist/lib/domain/knowledge/KnowledgeRepository.d.ts +1 -0
- package/dist/lib/domain/knowledge/KnowledgeRepository.js +3 -0
- package/dist/lib/domain/knowledge/Lifecycle.js +1 -1
- package/dist/lib/domain/knowledge/StyleGuide.d.ts +1 -1
- package/dist/lib/domain/knowledge/StyleGuide.js +1 -1
- package/dist/lib/domain/knowledge/UnifiedValidator.js +15 -0
- package/dist/lib/external/mcp/McpServer.js +4 -0
- package/dist/lib/external/mcp/handlers/TargetClassifier.d.ts +1 -1
- package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.d.ts +8 -16
- package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.js +10 -10
- package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.d.ts +7 -0
- package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.js +20 -0
- package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.d.ts +52 -132
- package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.js +204 -17
- package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.d.ts +11 -75
- package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.js +40 -191
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.d.ts +13 -78
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.js +30 -52
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-context.d.ts +0 -1
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.d.ts +99 -12
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +172 -161
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/tier-scheduler.js +7 -17
- package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.d.ts +46 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.js +58 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.d.ts +25 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.js +47 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.d.ts +50 -12
- package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.js +30 -10
- package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-text.js +1 -1
- package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.d.ts +24 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.js +14 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.d.ts +14 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.js +48 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.d.ts +21 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.js +45 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/skill-generator.d.ts +1 -1
- package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.d.ts +27 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.js +44 -0
- package/dist/lib/external/mcp/handlers/bootstrap-external.d.ts +14 -10
- package/dist/lib/external/mcp/handlers/bootstrap-external.js +39 -51
- package/dist/lib/external/mcp/handlers/bootstrap-internal.d.ts +2 -0
- package/dist/lib/external/mcp/handlers/bootstrap-internal.js +115 -82
- package/dist/lib/external/mcp/handlers/consolidated.d.ts +4 -4
- package/dist/lib/external/mcp/handlers/consolidated.js +107 -332
- package/dist/lib/external/mcp/handlers/dimension-complete-external.js +69 -1
- package/dist/lib/external/mcp/handlers/evolve-external.d.ts +54 -0
- package/dist/lib/external/mcp/handlers/evolve-external.js +226 -0
- package/dist/lib/external/mcp/handlers/knowledge.js +26 -2
- package/dist/lib/external/mcp/handlers/rescan-external.d.ts +76 -0
- package/dist/lib/external/mcp/handlers/rescan-external.js +335 -0
- package/dist/lib/external/mcp/handlers/rescan-internal.d.ts +120 -0
- package/dist/lib/external/mcp/handlers/rescan-internal.js +359 -0
- package/dist/lib/external/mcp/handlers/search.d.ts +6 -5
- package/dist/lib/external/mcp/handlers/search.js +6 -5
- package/dist/lib/external/mcp/handlers/types.d.ts +2 -1
- package/dist/lib/external/mcp/handlers/wiki-external.js +2 -2
- package/dist/lib/external/mcp/tools.d.ts +8 -18
- package/dist/lib/external/mcp/tools.js +58 -2
- package/dist/lib/http/routes/knowledge.js +122 -1
- package/dist/lib/http/routes/modules.js +25 -3
- package/dist/lib/http/routes/panorama.js +16 -4
- package/dist/lib/infrastructure/cache/CacheCoordinator.d.ts +41 -0
- package/dist/lib/infrastructure/cache/CacheCoordinator.js +105 -0
- package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.d.ts +7 -0
- package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.js +28 -0
- package/dist/lib/infrastructure/vector/HnswVectorAdapter.js +1 -1
- package/dist/lib/injection/ServiceContainer.js +55 -0
- package/dist/lib/injection/ServiceMap.d.ts +8 -1
- package/dist/lib/injection/modules/KnowledgeModule.js +15 -1
- package/dist/lib/repository/knowledge/KnowledgeRepository.impl.d.ts +4 -0
- package/dist/lib/repository/knowledge/KnowledgeRepository.impl.js +16 -1
- package/dist/lib/service/bootstrap/BootstrapEventEmitter.d.ts +3 -2
- package/dist/lib/service/bootstrap/BootstrapEventEmitter.js +1 -1
- package/dist/lib/service/bootstrap/DeliveryVerifier.d.ts +51 -0
- package/dist/lib/service/bootstrap/DeliveryVerifier.js +163 -0
- package/dist/lib/service/bootstrap/UiStartupTasks.d.ts +5 -0
- package/dist/lib/service/bootstrap/UiStartupTasks.js +20 -0
- package/dist/lib/service/bootstrap/bootstrap-event-types.d.ts +54 -0
- package/dist/lib/service/bootstrap/bootstrap-event-types.js +10 -0
- package/dist/lib/service/cleanup/CleanupService.d.ts +85 -0
- package/dist/lib/service/cleanup/CleanupService.js +324 -0
- package/dist/lib/service/delivery/AgentInstructionsGenerator.js +39 -43
- package/dist/lib/service/delivery/FileProtection.d.ts +20 -0
- package/dist/lib/service/delivery/FileProtection.js +54 -0
- package/dist/lib/service/delivery/SkillsSyncer.js +16 -21
- package/dist/lib/service/evolution/ContentPatcher.d.ts +44 -0
- package/dist/lib/service/evolution/ContentPatcher.js +310 -0
- package/dist/lib/service/evolution/ProposalExecutor.d.ts +4 -0
- package/dist/lib/service/evolution/ProposalExecutor.js +77 -13
- package/dist/lib/service/evolution/RecipeLifecycleSupervisor.d.ts +64 -0
- package/dist/lib/service/evolution/RecipeLifecycleSupervisor.js +458 -0
- package/dist/lib/service/evolution/RecipeRelevanceAuditor.d.ts +89 -0
- package/dist/lib/service/evolution/RecipeRelevanceAuditor.js +492 -0
- package/dist/lib/service/evolution/createSupersedeProposal.d.ts +44 -0
- package/dist/lib/service/evolution/createSupersedeProposal.js +81 -0
- package/dist/lib/service/guard/ComplianceReporter.d.ts +4 -0
- package/dist/lib/service/guard/ComplianceReporter.js +51 -0
- package/dist/lib/service/guard/GuardCheckEngine.js +5 -4
- package/dist/lib/service/knowledge/ConfidenceRouter.js +1 -1
- package/dist/lib/service/knowledge/KnowledgeService.d.ts +11 -1
- package/dist/lib/service/knowledge/KnowledgeService.js +44 -4
- package/dist/lib/service/knowledge/RecipeProductionGateway.d.ts +225 -0
- package/dist/lib/service/knowledge/RecipeProductionGateway.js +384 -0
- package/dist/lib/service/panorama/DimensionAnalyzer.d.ts +3 -2
- package/dist/lib/service/panorama/DimensionAnalyzer.js +15 -140
- package/dist/lib/service/search/BM25Scorer.d.ts +2 -2
- package/dist/lib/service/search/SearchEngine.d.ts +11 -10
- package/dist/lib/service/search/SearchEngine.js +38 -36
- package/dist/lib/service/search/SearchTypes.d.ts +14 -8
- package/dist/lib/service/search/SearchTypes.js +1 -1
- package/dist/lib/service/search/tokenizer.d.ts +1 -1
- package/dist/lib/service/search/tokenizer.js +2 -2
- package/dist/lib/shared/schemas/common.d.ts +4 -4
- package/dist/lib/shared/schemas/http-requests.d.ts +12 -1
- package/dist/lib/shared/schemas/http-requests.js +8 -0
- package/dist/lib/shared/schemas/mcp-tools.d.ts +32 -2
- package/dist/lib/shared/schemas/mcp-tools.js +38 -0
- package/dist/lib/types/evolution.d.ts +135 -0
- package/dist/lib/types/evolution.js +6 -0
- package/dist/lib/types/graph-shared.d.ts +25 -0
- package/dist/lib/types/graph-shared.js +7 -0
- package/dist/lib/types/knowledge-wire.d.ts +131 -0
- package/dist/lib/types/knowledge-wire.js +7 -0
- package/dist/lib/types/project-snapshot-builder.d.ts +19 -0
- package/dist/lib/types/project-snapshot-builder.js +189 -0
- package/dist/lib/types/project-snapshot.d.ts +399 -0
- package/dist/lib/types/project-snapshot.js +17 -0
- package/dist/lib/types/search-wire.d.ts +46 -0
- package/dist/lib/types/search-wire.js +7 -0
- package/dist/lib/types/snapshot-views.d.ts +58 -0
- package/dist/lib/types/snapshot-views.js +103 -0
- package/package.json +1 -1
- package/skills/autosnippet-recipes/SKILL.md +1 -1
- package/templates/instructions/agent-static.md +2 -0
- package/templates/instructions/conventions.md +3 -1
- package/templates/recipes-setup/README.md +2 -2
- package/dashboard/dist/assets/icons-BJ2mUBi8.js +0 -1
- package/dashboard/dist/assets/index-B659K9t5.js +0 -128
- package/dashboard/dist/assets/index-NCm40PMD.css +0 -1
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.d.ts +0 -169
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.js +0 -727
- package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.d.ts +0 -370
- 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-
|
|
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-
|
|
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-
|
|
14
|
+
<link rel="stylesheet" crossorigin href="/assets/index-CxHOu8Hd.css">
|
|
15
15
|
</head>
|
|
16
16
|
<body>
|
|
17
17
|
<div id="root"></div>
|
package/dist/bin/api-server.js
CHANGED
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
|
-
|
|
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,
|
|
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 =
|
|
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,
|
|
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:
|
|
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
|
-
//
|
|
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.
|
|
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.
|
|
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\
|
|
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
|
-
*
|
|
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
|
|
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 {};
|