autosnippet 3.3.0 → 3.3.3
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-BJ2mUBi8.js +1 -0
- package/dashboard/dist/assets/index-B659K9t5.js +128 -0
- package/dashboard/dist/assets/index-NCm40PMD.css +1 -0
- package/dashboard/dist/index.html +3 -3
- package/dist/bin/cli.d.ts +1 -0
- package/dist/bin/cli.js +284 -142
- package/dist/lib/agent/context/ExplorationTracker.d.ts +2 -0
- package/dist/lib/agent/context/ExplorationTracker.js +21 -3
- package/dist/lib/agent/core/ToolExecutionPipeline.d.ts +3 -1
- package/dist/lib/agent/core/ToolExecutionPipeline.js +8 -1
- package/dist/lib/agent/forge/DynamicComposer.d.ts +58 -0
- package/dist/lib/agent/forge/DynamicComposer.js +99 -0
- package/dist/lib/agent/forge/SandboxRunner.d.ts +60 -0
- package/dist/lib/agent/forge/SandboxRunner.js +251 -0
- package/dist/lib/agent/forge/TemporaryToolRegistry.d.ts +76 -0
- package/dist/lib/agent/forge/TemporaryToolRegistry.js +154 -0
- package/dist/lib/agent/forge/ToolForge.d.ts +92 -0
- package/dist/lib/agent/forge/ToolForge.js +239 -0
- package/dist/lib/agent/forge/ToolRequirementAnalyzer.d.ts +44 -0
- package/dist/lib/agent/forge/ToolRequirementAnalyzer.js +119 -0
- package/dist/lib/agent/tools/ToolRegistry.d.ts +2 -0
- package/dist/lib/agent/tools/ToolRegistry.js +4 -0
- package/dist/lib/agent/tools/composite.js +0 -1
- package/dist/lib/agent/tools/index.d.ts +2 -50
- package/dist/lib/agent/tools/index.js +2 -3
- package/dist/lib/agent/tools/lifecycle.d.ts +1 -58
- package/dist/lib/agent/tools/lifecycle.js +2 -75
- package/dist/lib/cli/KnowledgeSyncService.d.ts +26 -0
- package/dist/lib/cli/KnowledgeSyncService.js +33 -1
- package/dist/lib/cli/deploy/FileManifest.d.ts +0 -21
- package/dist/lib/cli/deploy/FileManifest.js +0 -11
- package/dist/lib/domain/knowledge/KnowledgeEntry.d.ts +10 -0
- package/dist/lib/domain/knowledge/KnowledgeEntry.js +2 -0
- package/dist/lib/domain/knowledge/Lifecycle.d.ts +19 -2
- package/dist/lib/domain/knowledge/Lifecycle.js +32 -6
- package/dist/lib/domain/knowledge/UnifiedValidator.d.ts +1 -5
- package/dist/lib/domain/knowledge/UnifiedValidator.js +7 -44
- package/dist/lib/domain/knowledge/values/Stats.d.ts +29 -0
- package/dist/lib/domain/knowledge/values/Stats.js +41 -0
- package/dist/lib/external/mcp/McpServer.d.ts +19 -38
- package/dist/lib/external/mcp/McpServer.js +145 -117
- package/dist/lib/external/mcp/autoApproveInjector.js +0 -2
- package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.d.ts +26 -1
- package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.js +41 -0
- package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +49 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.d.ts +3 -0
- package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.js +27 -0
- package/dist/lib/external/mcp/handlers/bootstrap/skills.js +1 -1
- package/dist/lib/external/mcp/handlers/bootstrap-external.js +1 -0
- package/dist/lib/external/mcp/handlers/bootstrap-internal.js +2 -0
- package/dist/lib/external/mcp/handlers/browse.d.ts +1 -0
- package/dist/lib/external/mcp/handlers/browse.js +2 -1
- package/dist/lib/external/mcp/handlers/consolidated.d.ts +117 -6
- package/dist/lib/external/mcp/handlers/consolidated.js +251 -71
- package/dist/lib/external/mcp/handlers/guard.d.ts +150 -0
- package/dist/lib/external/mcp/handlers/guard.js +239 -5
- package/dist/lib/external/mcp/handlers/knowledge.d.ts +0 -29
- package/dist/lib/external/mcp/handlers/knowledge.js +1 -76
- package/dist/lib/external/mcp/handlers/panorama.d.ts +36 -0
- package/dist/lib/external/mcp/handlers/panorama.js +156 -0
- package/dist/lib/external/mcp/handlers/system.d.ts +2 -54
- package/dist/lib/external/mcp/handlers/system.js +3 -113
- package/dist/lib/external/mcp/handlers/task.d.ts +13 -24
- package/dist/lib/external/mcp/handlers/task.js +218 -557
- package/dist/lib/external/mcp/handlers/types.d.ts +91 -8
- package/dist/lib/external/mcp/handlers/types.js +18 -1
- package/dist/lib/external/mcp/handlers/wiki-external.d.ts +18 -1
- package/dist/lib/external/mcp/handlers/wiki-external.js +16 -1
- package/dist/lib/external/mcp/tools.d.ts +18 -24
- package/dist/lib/external/mcp/tools.js +132 -159
- package/dist/lib/http/HttpServer.js +52 -0
- package/dist/lib/http/middleware/validate.js +7 -3
- package/dist/lib/http/routes/audit.d.ts +8 -0
- package/dist/lib/http/routes/audit.js +51 -0
- package/dist/lib/http/routes/guardReport.d.ts +10 -0
- package/dist/lib/http/routes/guardReport.js +143 -0
- package/dist/lib/http/routes/knowledge.js +32 -1
- package/dist/lib/http/routes/panorama.d.ts +11 -0
- package/dist/lib/http/routes/panorama.js +322 -0
- package/dist/lib/http/routes/signals.d.ts +10 -0
- package/dist/lib/http/routes/signals.js +104 -0
- package/dist/lib/http/routes/task.d.ts +2 -3
- package/dist/lib/http/routes/task.js +17 -347
- package/dist/lib/http/routes/violations.js +1 -1
- package/dist/lib/infrastructure/audit/AuditLogger.d.ts +6 -1
- package/dist/lib/infrastructure/audit/AuditLogger.js +14 -1
- package/dist/lib/infrastructure/database/drizzle/schema.d.ts +202 -504
- package/dist/lib/infrastructure/database/drizzle/schema.js +38 -69
- package/dist/lib/infrastructure/database/migrations/004_evolution_proposals.d.ts +8 -0
- package/dist/lib/infrastructure/database/migrations/004_evolution_proposals.js +43 -0
- package/dist/lib/infrastructure/database/migrations/005_recipe_source_refs.d.ts +9 -0
- package/dist/lib/infrastructure/database/migrations/005_recipe_source_refs.js +24 -0
- package/dist/lib/infrastructure/logging/Logger.d.ts +2 -0
- package/dist/lib/infrastructure/logging/Logger.js +34 -7
- package/dist/lib/infrastructure/monitoring/ErrorTracker.js +3 -1
- package/dist/lib/infrastructure/monitoring/PerformanceMonitor.d.ts +2 -2
- package/dist/lib/infrastructure/monitoring/PerformanceMonitor.js +12 -10
- package/dist/lib/infrastructure/notification/LarkNotifier.d.ts +24 -0
- package/dist/lib/infrastructure/notification/LarkNotifier.js +97 -0
- package/dist/lib/infrastructure/report/ReportStore.d.ts +45 -0
- package/dist/lib/infrastructure/report/ReportStore.js +133 -0
- package/dist/lib/infrastructure/signal/SignalAggregator.d.ts +18 -0
- package/dist/lib/infrastructure/signal/SignalAggregator.js +84 -0
- package/dist/lib/infrastructure/signal/SignalBridge.d.ts +13 -0
- package/dist/lib/infrastructure/signal/SignalBridge.js +20 -0
- package/dist/lib/infrastructure/signal/SignalBus.d.ts +63 -0
- package/dist/lib/infrastructure/signal/SignalBus.js +106 -0
- package/dist/lib/infrastructure/signal/SignalTraceWriter.d.ts +36 -0
- package/dist/lib/infrastructure/signal/SignalTraceWriter.js +130 -0
- package/dist/lib/infrastructure/vector/HnswVectorAdapter.js +18 -2
- package/dist/lib/injection/ServiceContainer.js +8 -0
- package/dist/lib/injection/ServiceMap.d.ts +16 -10
- package/dist/lib/injection/modules/AgentModule.d.ts +1 -1
- package/dist/lib/injection/modules/AgentModule.js +7 -1
- package/dist/lib/injection/modules/AppModule.d.ts +1 -1
- package/dist/lib/injection/modules/AppModule.js +4 -13
- package/dist/lib/injection/modules/GuardModule.js +27 -2
- package/dist/lib/injection/modules/InfraModule.d.ts +0 -1
- package/dist/lib/injection/modules/InfraModule.js +9 -7
- package/dist/lib/injection/modules/KnowledgeModule.d.ts +5 -0
- package/dist/lib/injection/modules/KnowledgeModule.js +131 -0
- package/dist/lib/injection/modules/PanoramaModule.d.ts +18 -0
- package/dist/lib/injection/modules/PanoramaModule.js +76 -0
- package/dist/lib/injection/modules/SignalModule.d.ts +10 -0
- package/dist/lib/injection/modules/SignalModule.js +84 -0
- package/dist/lib/repository/knowledge/KnowledgeRepository.impl.d.ts +1 -0
- package/dist/lib/repository/knowledge/KnowledgeRepository.impl.js +6 -0
- package/dist/lib/service/bootstrap/BootstrapTaskManager.d.ts +3 -1
- package/dist/lib/service/bootstrap/BootstrapTaskManager.js +20 -1
- package/dist/lib/service/bootstrap/UiStartupTasks.d.ts +45 -0
- package/dist/lib/service/bootstrap/UiStartupTasks.js +101 -0
- package/dist/lib/service/delivery/AgentInstructionsGenerator.js +4 -5
- package/dist/lib/service/delivery/CursorDeliveryPipeline.d.ts +3 -1
- package/dist/lib/service/delivery/CursorDeliveryPipeline.js +13 -10
- package/dist/lib/service/delivery/RulesGenerator.js +3 -2
- package/dist/lib/service/evolution/ConsolidationAdvisor.d.ts +114 -0
- package/dist/lib/service/evolution/ConsolidationAdvisor.js +542 -0
- package/dist/lib/service/evolution/ContradictionDetector.d.ts +54 -0
- package/dist/lib/service/evolution/ContradictionDetector.js +253 -0
- package/dist/lib/service/evolution/DecayDetector.d.ts +71 -0
- package/dist/lib/service/evolution/DecayDetector.js +244 -0
- package/dist/lib/service/evolution/EnhancementSuggester.d.ts +38 -0
- package/dist/lib/service/evolution/EnhancementSuggester.js +220 -0
- package/dist/lib/service/evolution/KnowledgeMetabolism.d.ts +82 -0
- package/dist/lib/service/evolution/KnowledgeMetabolism.js +167 -0
- package/dist/lib/service/evolution/RedundancyAnalyzer.d.ts +53 -0
- package/dist/lib/service/evolution/RedundancyAnalyzer.js +210 -0
- package/dist/lib/service/evolution/StagingManager.d.ts +57 -0
- package/dist/lib/service/evolution/StagingManager.js +201 -0
- package/dist/lib/service/guard/ComplianceReporter.d.ts +42 -2
- package/dist/lib/service/guard/ComplianceReporter.js +43 -5
- package/dist/lib/service/guard/CoverageAnalyzer.d.ts +54 -0
- package/dist/lib/service/guard/CoverageAnalyzer.js +149 -0
- package/dist/lib/service/guard/GuardCheckEngine.d.ts +42 -0
- package/dist/lib/service/guard/GuardCheckEngine.js +465 -14
- package/dist/lib/service/guard/GuardFeedbackLoop.d.ts +3 -0
- package/dist/lib/service/guard/GuardFeedbackLoop.js +9 -0
- package/dist/lib/service/guard/ReverseGuard.d.ts +73 -0
- package/dist/lib/service/guard/ReverseGuard.js +256 -0
- package/dist/lib/service/guard/RuleLearner.d.ts +12 -0
- package/dist/lib/service/guard/RuleLearner.js +38 -0
- package/dist/lib/service/guard/UncertaintyCollector.d.ts +83 -0
- package/dist/lib/service/guard/UncertaintyCollector.js +149 -0
- package/dist/lib/service/guard/ViolationsStore.d.ts +1 -0
- package/dist/lib/service/guard/ViolationsStore.js +33 -3
- package/dist/lib/service/knowledge/ConfidenceRouter.d.ts +13 -0
- package/dist/lib/service/knowledge/ConfidenceRouter.js +14 -0
- package/dist/lib/service/knowledge/KnowledgeService.js +22 -4
- package/dist/lib/service/knowledge/SourceRefReconciler.d.ts +68 -0
- package/dist/lib/service/knowledge/SourceRefReconciler.js +309 -0
- package/dist/lib/service/panorama/CouplingAnalyzer.d.ts +27 -0
- package/dist/lib/service/panorama/CouplingAnalyzer.js +192 -0
- package/dist/lib/service/panorama/DimensionAnalyzer.d.ts +28 -0
- package/dist/lib/service/panorama/DimensionAnalyzer.js +320 -0
- package/dist/lib/service/panorama/LayerInferrer.d.ts +19 -0
- package/dist/lib/service/panorama/LayerInferrer.js +182 -0
- package/dist/lib/service/panorama/ModuleDiscoverer.d.ts +24 -0
- package/dist/lib/service/panorama/ModuleDiscoverer.js +185 -0
- package/dist/lib/service/panorama/PanoramaAggregator.d.ts +29 -0
- package/dist/lib/service/panorama/PanoramaAggregator.js +228 -0
- package/dist/lib/service/panorama/PanoramaScanner.d.ts +52 -0
- package/dist/lib/service/panorama/PanoramaScanner.js +188 -0
- package/dist/lib/service/panorama/PanoramaService.d.ts +125 -0
- package/dist/lib/service/panorama/PanoramaService.js +363 -0
- package/dist/lib/service/panorama/PanoramaTypes.d.ts +134 -0
- package/dist/lib/service/panorama/PanoramaTypes.js +6 -0
- package/dist/lib/service/panorama/RoleRefiner.d.ts +48 -0
- package/dist/lib/service/panorama/RoleRefiner.js +535 -0
- package/dist/lib/service/search/BM25Scorer.d.ts +2 -2
- package/dist/lib/service/search/CoarseRanker.d.ts +7 -6
- package/dist/lib/service/search/CoarseRanker.js +11 -10
- package/dist/lib/service/search/FieldWeightedScorer.d.ts +81 -0
- package/dist/lib/service/search/FieldWeightedScorer.js +318 -0
- package/dist/lib/service/search/MultiSignalRanker.d.ts +3 -2
- package/dist/lib/service/search/MultiSignalRanker.js +17 -1
- package/dist/lib/service/search/SearchEngine.d.ts +9 -7
- package/dist/lib/service/search/SearchEngine.js +67 -10
- package/dist/lib/service/search/SearchTypes.d.ts +25 -3
- package/dist/lib/service/search/SearchTypes.js +6 -1
- package/dist/lib/service/signal/HitRecorder.d.ts +68 -0
- package/dist/lib/service/signal/HitRecorder.js +173 -0
- package/dist/lib/service/skills/SignalCollector.d.ts +3 -1
- package/dist/lib/service/skills/SignalCollector.js +31 -1
- package/dist/lib/service/task/IntentExtractor.d.ts +66 -0
- package/dist/lib/service/task/IntentExtractor.js +256 -0
- package/dist/lib/service/task/PrimeSearchPipeline.d.ts +54 -0
- package/dist/lib/service/task/PrimeSearchPipeline.js +113 -0
- package/dist/lib/service/vector/VectorService.d.ts +3 -0
- package/dist/lib/service/vector/VectorService.js +38 -4
- package/dist/lib/shared/schemas/mcp-tools.d.ts +41 -96
- package/dist/lib/shared/schemas/mcp-tools.js +59 -119
- package/dist/scripts/analyze-signals.d.ts +20 -0
- package/dist/scripts/analyze-signals.js +155 -0
- package/dist/scripts/diagnose-mcp.js +1 -1
- package/package.json +1 -1
- package/skills/autosnippet-create/SKILL.md +98 -89
- package/skills/autosnippet-devdocs/SKILL.md +55 -57
- package/templates/claude-code/hooks/autosnippet-session.sh +10 -15
- package/templates/cursor-hooks/hooks/session-start.sh +1 -1
- package/templates/guard-ci.yml +2 -2
- package/templates/instructions/agent-static.md +2 -1
- package/templates/instructions/conventions.md +5 -6
- package/templates/recipes-setup/README.md +1 -2
- package/templates/recipes-setup/_template.md +39 -39
- package/dashboard/dist/assets/icons-BofcEZ3f.js +0 -1
- package/dashboard/dist/assets/index-D0whuycy.css +0 -1
- package/dashboard/dist/assets/index-SiN1GChm.js +0 -128
- package/dist/lib/domain/task/Task.d.ts +0 -140
- package/dist/lib/domain/task/Task.js +0 -254
- package/dist/lib/domain/task/TaskDependency.d.ts +0 -23
- package/dist/lib/domain/task/TaskDependency.js +0 -34
- package/dist/lib/domain/task/TaskIdGenerator.d.ts +0 -40
- package/dist/lib/domain/task/TaskIdGenerator.js +0 -75
- package/dist/lib/domain/task/index.d.ts +0 -4
- package/dist/lib/domain/task/index.js +0 -4
- package/dist/lib/infrastructure/database/migrations/002_add_tasks.d.ts +0 -11
- package/dist/lib/infrastructure/database/migrations/002_add_tasks.js +0 -86
- package/dist/lib/repository/task/TaskRepository.impl.d.ts +0 -171
- package/dist/lib/repository/task/TaskRepository.impl.js +0 -347
- package/dist/lib/service/task/TaskGraphService.d.ts +0 -222
- package/dist/lib/service/task/TaskGraphService.js +0 -597
- package/dist/lib/service/task/TaskKnowledgeBridge.d.ts +0 -95
- package/dist/lib/service/task/TaskKnowledgeBridge.js +0 -298
- package/dist/lib/service/task/TaskReadyEngine.d.ts +0 -84
- package/dist/lib/service/task/TaskReadyEngine.js +0 -115
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PanoramaScanner — 全景数据内置扫描器
|
|
3
|
+
*
|
|
4
|
+
* 在全景数据缺失时自动运行轻量级结构扫描(Phase 1→2.1),
|
|
5
|
+
* 填充 code_entities + knowledge_edges,使 PanoramaService 能产生有效数据。
|
|
6
|
+
*
|
|
7
|
+
* 非 MCP 操作,而是 PanoramaService 的内置依赖。
|
|
8
|
+
* 调用时机:
|
|
9
|
+
* - PanoramaService 发现 DB 中无 code_entities 时自动触发
|
|
10
|
+
* - 手动调用 invalidate + getResult 时检查并补充
|
|
11
|
+
*
|
|
12
|
+
* @module PanoramaScanner
|
|
13
|
+
*/
|
|
14
|
+
export interface PanoramaScannerOptions {
|
|
15
|
+
projectRoot: string;
|
|
16
|
+
container: ScannerContainer;
|
|
17
|
+
logger?: ScannerLogger;
|
|
18
|
+
}
|
|
19
|
+
export interface ScannerContainer {
|
|
20
|
+
get(name: string): any;
|
|
21
|
+
}
|
|
22
|
+
export interface ScannerLogger {
|
|
23
|
+
info(...args: unknown[]): void;
|
|
24
|
+
warn(...args: unknown[]): void;
|
|
25
|
+
}
|
|
26
|
+
export interface ScanResult {
|
|
27
|
+
entities: number;
|
|
28
|
+
edges: number;
|
|
29
|
+
modules: number;
|
|
30
|
+
durationMs: number;
|
|
31
|
+
}
|
|
32
|
+
export declare class PanoramaScanner {
|
|
33
|
+
#private;
|
|
34
|
+
constructor(opts: PanoramaScannerOptions);
|
|
35
|
+
/**
|
|
36
|
+
* 检测 DB 中是否已有该项目的 code_entities 数据
|
|
37
|
+
*/
|
|
38
|
+
hasData(): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* 确保全景数据存在。无数据时自动执行扫描。
|
|
41
|
+
* 幂等:扫描过一次后不再重复(重启进程或手动 reset 可重新触发)。
|
|
42
|
+
*/
|
|
43
|
+
ensureData(): Promise<ScanResult | null>;
|
|
44
|
+
/**
|
|
45
|
+
* 执行完整扫描(强制,不检查缓存)
|
|
46
|
+
*/
|
|
47
|
+
scan(): Promise<ScanResult>;
|
|
48
|
+
/**
|
|
49
|
+
* 重置扫描状态(允许下次 ensureData 重新扫描)
|
|
50
|
+
*/
|
|
51
|
+
reset(): void;
|
|
52
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PanoramaScanner — 全景数据内置扫描器
|
|
3
|
+
*
|
|
4
|
+
* 在全景数据缺失时自动运行轻量级结构扫描(Phase 1→2.1),
|
|
5
|
+
* 填充 code_entities + knowledge_edges,使 PanoramaService 能产生有效数据。
|
|
6
|
+
*
|
|
7
|
+
* 非 MCP 操作,而是 PanoramaService 的内置依赖。
|
|
8
|
+
* 调用时机:
|
|
9
|
+
* - PanoramaService 发现 DB 中无 code_entities 时自动触发
|
|
10
|
+
* - 手动调用 invalidate + getResult 时检查并补充
|
|
11
|
+
*
|
|
12
|
+
* @module PanoramaScanner
|
|
13
|
+
*/
|
|
14
|
+
/* ═══ Silent Logger (fallback) ════════════════════════════ */
|
|
15
|
+
const SILENT_LOGGER = {
|
|
16
|
+
info() { },
|
|
17
|
+
warn() { },
|
|
18
|
+
};
|
|
19
|
+
/* ═══ PanoramaScanner Class ═══════════════════════════════ */
|
|
20
|
+
export class PanoramaScanner {
|
|
21
|
+
#projectRoot;
|
|
22
|
+
#container;
|
|
23
|
+
#logger;
|
|
24
|
+
#hasScanned = false;
|
|
25
|
+
constructor(opts) {
|
|
26
|
+
this.#projectRoot = opts.projectRoot;
|
|
27
|
+
this.#container = opts.container;
|
|
28
|
+
this.#logger = opts.logger ?? SILENT_LOGGER;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 检测 DB 中是否已有该项目的 code_entities 数据
|
|
32
|
+
*/
|
|
33
|
+
hasData() {
|
|
34
|
+
try {
|
|
35
|
+
const db = this.#container.get('database');
|
|
36
|
+
const rawDb = db?.getDb ? db.getDb() : db;
|
|
37
|
+
if (!rawDb?.prepare) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
const row = rawDb
|
|
41
|
+
.prepare(`SELECT COUNT(*) as cnt FROM code_entities WHERE project_root = ?`)
|
|
42
|
+
.get(this.#projectRoot);
|
|
43
|
+
return (row?.cnt ?? 0) > 0;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 确保全景数据存在。无数据时自动执行扫描。
|
|
51
|
+
* 幂等:扫描过一次后不再重复(重启进程或手动 reset 可重新触发)。
|
|
52
|
+
*/
|
|
53
|
+
async ensureData() {
|
|
54
|
+
if (this.#hasScanned || this.hasData()) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
return this.scan();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 执行完整扫描(强制,不检查缓存)
|
|
61
|
+
*/
|
|
62
|
+
async scan() {
|
|
63
|
+
const t0 = Date.now();
|
|
64
|
+
this.#logger.info('[PanoramaScanner] Starting structure scan...');
|
|
65
|
+
let entities = 0;
|
|
66
|
+
let edges = 0;
|
|
67
|
+
let modules = 0;
|
|
68
|
+
try {
|
|
69
|
+
const { runPhase1_FileCollection, runPhase1_5_AstAnalysis, runPhase1_6_EntityGraph, runPhase1_7_CallGraph, runPhase2_DependencyGraph, runPhase2_1_ModuleEntities, } = await import('../../external/mcp/handlers/bootstrap/shared/bootstrap-phases.js');
|
|
70
|
+
// Phase 1: 文件收集
|
|
71
|
+
const phase1 = await runPhase1_FileCollection(this.#projectRoot, this.#logger, {
|
|
72
|
+
maxFiles: 500,
|
|
73
|
+
});
|
|
74
|
+
if (!phase1.allFiles?.length) {
|
|
75
|
+
this.#logger.warn('[PanoramaScanner] No files found, skipping scan');
|
|
76
|
+
this.#hasScanned = true;
|
|
77
|
+
return { entities: 0, edges: 0, modules: 0, durationMs: Date.now() - t0 };
|
|
78
|
+
}
|
|
79
|
+
// Phase 1.5: AST 分析
|
|
80
|
+
const phase1_5 = await runPhase1_5_AstAnalysis(phase1.allFiles, phase1.langStats, this.#logger);
|
|
81
|
+
// Phase 1.6: Entity Graph 写入
|
|
82
|
+
if (phase1_5.astProjectSummary) {
|
|
83
|
+
const phase1_6 = await runPhase1_6_EntityGraph(phase1_5.astProjectSummary, this.#projectRoot, this.#container, this.#logger);
|
|
84
|
+
entities = phase1_6.codeEntityResult?.entitiesUpserted ?? 0;
|
|
85
|
+
edges = phase1_6.codeEntityResult?.edgesCreated ?? 0;
|
|
86
|
+
}
|
|
87
|
+
// Phase 1.7: Call Graph (增强耦合准确度)
|
|
88
|
+
if (phase1_5.astProjectSummary) {
|
|
89
|
+
try {
|
|
90
|
+
await runPhase1_7_CallGraph(phase1_5.astProjectSummary, this.#projectRoot, this.#container, this.#logger);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Call graph 失败不阻塞
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Phase 2: 依赖图
|
|
97
|
+
if (phase1.discoverer) {
|
|
98
|
+
const phase2 = await runPhase2_DependencyGraph(phase1.discoverer, this.#container, this.#logger);
|
|
99
|
+
edges += phase2.depEdgesWritten;
|
|
100
|
+
// Phase 2.1: Module 实体
|
|
101
|
+
if (phase2.depGraphData) {
|
|
102
|
+
await runPhase2_1_ModuleEntities(phase2.depGraphData, this.#projectRoot, this.#container, this.#logger);
|
|
103
|
+
modules = phase2.depGraphData.nodes?.length ?? 0;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Phase 2.2: 目录推断兜底
|
|
107
|
+
// 当 Phase 2.1 未产出 module 实体时(无 Package.swift / build.gradle 等),
|
|
108
|
+
// 从已有 code_entities 按顶层目录分组写入 module 实体
|
|
109
|
+
if (modules === 0 && entities > 0) {
|
|
110
|
+
modules = this.#inferModulesFromDirectories();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
this.#logger.warn(`[PanoramaScanner] Scan failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
115
|
+
}
|
|
116
|
+
this.#hasScanned = true;
|
|
117
|
+
const durationMs = Date.now() - t0;
|
|
118
|
+
this.#logger.info(`[PanoramaScanner] Scan complete: ${entities} entities, ${edges} edges, ${modules} modules (${durationMs}ms)`);
|
|
119
|
+
return { entities, edges, modules, durationMs };
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 重置扫描状态(允许下次 ensureData 重新扫描)
|
|
123
|
+
*/
|
|
124
|
+
reset() {
|
|
125
|
+
this.#hasScanned = false;
|
|
126
|
+
}
|
|
127
|
+
/* ─── 目录推断兜底 ─────────────────────────────── */
|
|
128
|
+
/**
|
|
129
|
+
* 从 code_entities 中按顶层目录分组写入 module 实体 + is_part_of 边。
|
|
130
|
+
* 仅在 Phase 2.1 未产出 module 时调用。
|
|
131
|
+
*/
|
|
132
|
+
#inferModulesFromDirectories() {
|
|
133
|
+
try {
|
|
134
|
+
const db = this.#container.get('database');
|
|
135
|
+
const rawDb = db?.getDb ? db.getDb() : db;
|
|
136
|
+
if (!rawDb?.prepare) {
|
|
137
|
+
return 0;
|
|
138
|
+
}
|
|
139
|
+
// 查询所有非 module 实体的文件路径
|
|
140
|
+
const rows = rawDb
|
|
141
|
+
.prepare(`SELECT DISTINCT entity_id, file_path FROM code_entities
|
|
142
|
+
WHERE project_root = ? AND file_path IS NOT NULL AND entity_type != 'module'`)
|
|
143
|
+
.all(this.#projectRoot);
|
|
144
|
+
if (rows.length === 0) {
|
|
145
|
+
return 0;
|
|
146
|
+
}
|
|
147
|
+
// 按顶层目录分组
|
|
148
|
+
const groups = new Map();
|
|
149
|
+
for (const row of rows) {
|
|
150
|
+
const filePath = row.file_path;
|
|
151
|
+
if (!filePath) {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
const relative = filePath.startsWith(this.#projectRoot)
|
|
155
|
+
? filePath.slice(this.#projectRoot.length).replace(/^\//, '')
|
|
156
|
+
: filePath;
|
|
157
|
+
const firstDir = relative.split('/')[0];
|
|
158
|
+
if (!firstDir || firstDir.startsWith('.')) {
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (!groups.has(firstDir)) {
|
|
162
|
+
groups.set(firstDir, []);
|
|
163
|
+
}
|
|
164
|
+
groups.get(firstDir).push(row.entity_id);
|
|
165
|
+
}
|
|
166
|
+
if (groups.size === 0) {
|
|
167
|
+
return 0;
|
|
168
|
+
}
|
|
169
|
+
// 写入 module 实体 + is_part_of 边
|
|
170
|
+
const insertEntity = rawDb.prepare(`INSERT OR IGNORE INTO code_entities (entity_id, name, entity_type, file_path, project_root)
|
|
171
|
+
VALUES (?, ?, 'module', NULL, ?)`);
|
|
172
|
+
const insertEdge = rawDb.prepare(`INSERT OR IGNORE INTO knowledge_edges (from_id, from_type, to_id, to_type, relation, weight)
|
|
173
|
+
VALUES (?, 'entity', ?, 'module', 'is_part_of', 1.0)`);
|
|
174
|
+
for (const [dirName, entityIds] of groups) {
|
|
175
|
+
insertEntity.run(dirName, dirName, this.#projectRoot);
|
|
176
|
+
for (const entityId of entityIds) {
|
|
177
|
+
insertEdge.run(entityId, dirName);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
this.#logger.info(`[PanoramaScanner] Directory fallback: inferred ${groups.size} modules from top-level dirs`);
|
|
181
|
+
return groups.size;
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
this.#logger.warn(`[PanoramaScanner] Directory fallback failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
185
|
+
return 0;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PanoramaService — 全景服务主入口
|
|
3
|
+
*
|
|
4
|
+
* 提供 4 个 operation:
|
|
5
|
+
* overview — 项目骨架 + 层级 + token 预算截断
|
|
6
|
+
* module — 单模块详情 + Recipe 覆盖率
|
|
7
|
+
* gaps — 知识空白区 (有代码无 Recipe)
|
|
8
|
+
* health — 全景健康度 (覆盖率 + 耦合度 + 衰退)
|
|
9
|
+
*
|
|
10
|
+
* 模块发现委托给 ModuleDiscoverer(SRP)。
|
|
11
|
+
* 内存缓存 + 24h 过期策略。
|
|
12
|
+
*
|
|
13
|
+
* @module PanoramaService
|
|
14
|
+
*/
|
|
15
|
+
import type { SignalBus } from '../../infrastructure/signal/SignalBus.js';
|
|
16
|
+
import { ModuleDiscoverer } from './ModuleDiscoverer.js';
|
|
17
|
+
import type { PanoramaAggregator } from './PanoramaAggregator.js';
|
|
18
|
+
import type { PanoramaScanner } from './PanoramaScanner.js';
|
|
19
|
+
import type { CeDbLike, HealthRadar, KnowledgeGap, PanoramaModule, PanoramaResult } from './PanoramaTypes.js';
|
|
20
|
+
export interface PanoramaServiceOptions {
|
|
21
|
+
aggregator: PanoramaAggregator;
|
|
22
|
+
db: CeDbLike;
|
|
23
|
+
projectRoot: string;
|
|
24
|
+
scanner?: PanoramaScanner;
|
|
25
|
+
moduleDiscoverer?: ModuleDiscoverer;
|
|
26
|
+
signalBus?: SignalBus;
|
|
27
|
+
}
|
|
28
|
+
export interface PanoramaOverview {
|
|
29
|
+
projectRoot: string;
|
|
30
|
+
moduleCount: number;
|
|
31
|
+
layerCount: number;
|
|
32
|
+
totalFiles: number;
|
|
33
|
+
totalRecipes: number;
|
|
34
|
+
overallCoverage: number;
|
|
35
|
+
layers: Array<{
|
|
36
|
+
level: number;
|
|
37
|
+
name: string;
|
|
38
|
+
modules: Array<{
|
|
39
|
+
name: string;
|
|
40
|
+
role: string;
|
|
41
|
+
fileCount: number;
|
|
42
|
+
recipeCount: number;
|
|
43
|
+
}>;
|
|
44
|
+
}>;
|
|
45
|
+
cycleCount: number;
|
|
46
|
+
gapCount: number;
|
|
47
|
+
/** 多维度知识健康雷达 */
|
|
48
|
+
healthRadar: HealthRadar;
|
|
49
|
+
computedAt: number;
|
|
50
|
+
stale: boolean;
|
|
51
|
+
}
|
|
52
|
+
export interface PanoramaModuleDetail {
|
|
53
|
+
module: PanoramaModule;
|
|
54
|
+
layerName: string;
|
|
55
|
+
neighbors: Array<{
|
|
56
|
+
name: string;
|
|
57
|
+
direction: 'in' | 'out';
|
|
58
|
+
weight: number;
|
|
59
|
+
}>;
|
|
60
|
+
/** File groups by subdirectory within the module */
|
|
61
|
+
fileGroups: Array<{
|
|
62
|
+
group: string;
|
|
63
|
+
files: string[];
|
|
64
|
+
count: number;
|
|
65
|
+
}>;
|
|
66
|
+
/** Recipes matched to this module (by category/trigger/file path) */
|
|
67
|
+
recipes: Array<{
|
|
68
|
+
id: string;
|
|
69
|
+
title: string;
|
|
70
|
+
trigger: string;
|
|
71
|
+
kind: string;
|
|
72
|
+
}>;
|
|
73
|
+
/** Files not covered by any matched recipe */
|
|
74
|
+
uncoveredFileCount: number;
|
|
75
|
+
/** Auto-generated structural summary for the agent */
|
|
76
|
+
summary: string;
|
|
77
|
+
}
|
|
78
|
+
export interface PanoramaHealth {
|
|
79
|
+
/** 多维度知识健康雷达 */
|
|
80
|
+
healthRadar: HealthRadar;
|
|
81
|
+
avgCoupling: number;
|
|
82
|
+
cycleCount: number;
|
|
83
|
+
gapCount: number;
|
|
84
|
+
highPriorityGaps: number;
|
|
85
|
+
moduleCount: number;
|
|
86
|
+
/** 综合健康分 0-100 (维度覆盖 60 + 无循环 20 + 无高优空白 10 + 耦合适中 10) */
|
|
87
|
+
healthScore: number;
|
|
88
|
+
}
|
|
89
|
+
export declare class PanoramaService {
|
|
90
|
+
#private;
|
|
91
|
+
constructor(opts: PanoramaServiceOptions);
|
|
92
|
+
/**
|
|
93
|
+
* 获取项目全景概览
|
|
94
|
+
*/
|
|
95
|
+
getOverview(): PanoramaOverview;
|
|
96
|
+
/**
|
|
97
|
+
* 获取单模块详情 (enriched with file groups, recipes, and summary)
|
|
98
|
+
*/
|
|
99
|
+
getModule(moduleName: string): PanoramaModuleDetail | null;
|
|
100
|
+
/**
|
|
101
|
+
* 获取知识空白区
|
|
102
|
+
*/
|
|
103
|
+
getGaps(): KnowledgeGap[];
|
|
104
|
+
/**
|
|
105
|
+
* 获取全景健康度
|
|
106
|
+
*/
|
|
107
|
+
getHealth(): PanoramaHealth;
|
|
108
|
+
/**
|
|
109
|
+
* 获取完整 PanoramaResult(内部使用或 Bootstrap 注入)
|
|
110
|
+
*/
|
|
111
|
+
getResult(): PanoramaResult;
|
|
112
|
+
/**
|
|
113
|
+
* 确保全景数据已就绪(无数据时自动扫描)
|
|
114
|
+
* MCP handler / HTTP route 应在返回数据前调用此方法
|
|
115
|
+
*/
|
|
116
|
+
ensureData(): Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* 强制刷新缓存
|
|
119
|
+
*/
|
|
120
|
+
invalidate(): void;
|
|
121
|
+
/**
|
|
122
|
+
* 强制重新扫描(invalidate + 重置 scanner)
|
|
123
|
+
*/
|
|
124
|
+
rescan(): Promise<void>;
|
|
125
|
+
}
|