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.
Files changed (245) hide show
  1. package/dashboard/dist/assets/icons-BJ2mUBi8.js +1 -0
  2. package/dashboard/dist/assets/index-B659K9t5.js +128 -0
  3. package/dashboard/dist/assets/index-NCm40PMD.css +1 -0
  4. package/dashboard/dist/index.html +3 -3
  5. package/dist/bin/cli.d.ts +1 -0
  6. package/dist/bin/cli.js +284 -142
  7. package/dist/lib/agent/context/ExplorationTracker.d.ts +2 -0
  8. package/dist/lib/agent/context/ExplorationTracker.js +21 -3
  9. package/dist/lib/agent/core/ToolExecutionPipeline.d.ts +3 -1
  10. package/dist/lib/agent/core/ToolExecutionPipeline.js +8 -1
  11. package/dist/lib/agent/forge/DynamicComposer.d.ts +58 -0
  12. package/dist/lib/agent/forge/DynamicComposer.js +99 -0
  13. package/dist/lib/agent/forge/SandboxRunner.d.ts +60 -0
  14. package/dist/lib/agent/forge/SandboxRunner.js +251 -0
  15. package/dist/lib/agent/forge/TemporaryToolRegistry.d.ts +76 -0
  16. package/dist/lib/agent/forge/TemporaryToolRegistry.js +154 -0
  17. package/dist/lib/agent/forge/ToolForge.d.ts +92 -0
  18. package/dist/lib/agent/forge/ToolForge.js +239 -0
  19. package/dist/lib/agent/forge/ToolRequirementAnalyzer.d.ts +44 -0
  20. package/dist/lib/agent/forge/ToolRequirementAnalyzer.js +119 -0
  21. package/dist/lib/agent/tools/ToolRegistry.d.ts +2 -0
  22. package/dist/lib/agent/tools/ToolRegistry.js +4 -0
  23. package/dist/lib/agent/tools/composite.js +0 -1
  24. package/dist/lib/agent/tools/index.d.ts +2 -50
  25. package/dist/lib/agent/tools/index.js +2 -3
  26. package/dist/lib/agent/tools/lifecycle.d.ts +1 -58
  27. package/dist/lib/agent/tools/lifecycle.js +2 -75
  28. package/dist/lib/cli/KnowledgeSyncService.d.ts +26 -0
  29. package/dist/lib/cli/KnowledgeSyncService.js +33 -1
  30. package/dist/lib/cli/deploy/FileManifest.d.ts +0 -21
  31. package/dist/lib/cli/deploy/FileManifest.js +0 -11
  32. package/dist/lib/domain/knowledge/KnowledgeEntry.d.ts +10 -0
  33. package/dist/lib/domain/knowledge/KnowledgeEntry.js +2 -0
  34. package/dist/lib/domain/knowledge/Lifecycle.d.ts +19 -2
  35. package/dist/lib/domain/knowledge/Lifecycle.js +32 -6
  36. package/dist/lib/domain/knowledge/UnifiedValidator.d.ts +1 -5
  37. package/dist/lib/domain/knowledge/UnifiedValidator.js +7 -44
  38. package/dist/lib/domain/knowledge/values/Stats.d.ts +29 -0
  39. package/dist/lib/domain/knowledge/values/Stats.js +41 -0
  40. package/dist/lib/external/mcp/McpServer.d.ts +19 -38
  41. package/dist/lib/external/mcp/McpServer.js +145 -117
  42. package/dist/lib/external/mcp/autoApproveInjector.js +0 -2
  43. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.d.ts +26 -1
  44. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.js +41 -0
  45. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +49 -0
  46. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.d.ts +3 -0
  47. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.js +27 -0
  48. package/dist/lib/external/mcp/handlers/bootstrap/skills.js +1 -1
  49. package/dist/lib/external/mcp/handlers/bootstrap-external.js +1 -0
  50. package/dist/lib/external/mcp/handlers/bootstrap-internal.js +2 -0
  51. package/dist/lib/external/mcp/handlers/browse.d.ts +1 -0
  52. package/dist/lib/external/mcp/handlers/browse.js +2 -1
  53. package/dist/lib/external/mcp/handlers/consolidated.d.ts +117 -6
  54. package/dist/lib/external/mcp/handlers/consolidated.js +251 -71
  55. package/dist/lib/external/mcp/handlers/guard.d.ts +150 -0
  56. package/dist/lib/external/mcp/handlers/guard.js +239 -5
  57. package/dist/lib/external/mcp/handlers/knowledge.d.ts +0 -29
  58. package/dist/lib/external/mcp/handlers/knowledge.js +1 -76
  59. package/dist/lib/external/mcp/handlers/panorama.d.ts +36 -0
  60. package/dist/lib/external/mcp/handlers/panorama.js +156 -0
  61. package/dist/lib/external/mcp/handlers/system.d.ts +2 -54
  62. package/dist/lib/external/mcp/handlers/system.js +3 -113
  63. package/dist/lib/external/mcp/handlers/task.d.ts +13 -24
  64. package/dist/lib/external/mcp/handlers/task.js +218 -557
  65. package/dist/lib/external/mcp/handlers/types.d.ts +91 -8
  66. package/dist/lib/external/mcp/handlers/types.js +18 -1
  67. package/dist/lib/external/mcp/handlers/wiki-external.d.ts +18 -1
  68. package/dist/lib/external/mcp/handlers/wiki-external.js +16 -1
  69. package/dist/lib/external/mcp/tools.d.ts +18 -24
  70. package/dist/lib/external/mcp/tools.js +132 -159
  71. package/dist/lib/http/HttpServer.js +52 -0
  72. package/dist/lib/http/middleware/validate.js +7 -3
  73. package/dist/lib/http/routes/audit.d.ts +8 -0
  74. package/dist/lib/http/routes/audit.js +51 -0
  75. package/dist/lib/http/routes/guardReport.d.ts +10 -0
  76. package/dist/lib/http/routes/guardReport.js +143 -0
  77. package/dist/lib/http/routes/knowledge.js +32 -1
  78. package/dist/lib/http/routes/panorama.d.ts +11 -0
  79. package/dist/lib/http/routes/panorama.js +322 -0
  80. package/dist/lib/http/routes/signals.d.ts +10 -0
  81. package/dist/lib/http/routes/signals.js +104 -0
  82. package/dist/lib/http/routes/task.d.ts +2 -3
  83. package/dist/lib/http/routes/task.js +17 -347
  84. package/dist/lib/http/routes/violations.js +1 -1
  85. package/dist/lib/infrastructure/audit/AuditLogger.d.ts +6 -1
  86. package/dist/lib/infrastructure/audit/AuditLogger.js +14 -1
  87. package/dist/lib/infrastructure/database/drizzle/schema.d.ts +202 -504
  88. package/dist/lib/infrastructure/database/drizzle/schema.js +38 -69
  89. package/dist/lib/infrastructure/database/migrations/004_evolution_proposals.d.ts +8 -0
  90. package/dist/lib/infrastructure/database/migrations/004_evolution_proposals.js +43 -0
  91. package/dist/lib/infrastructure/database/migrations/005_recipe_source_refs.d.ts +9 -0
  92. package/dist/lib/infrastructure/database/migrations/005_recipe_source_refs.js +24 -0
  93. package/dist/lib/infrastructure/logging/Logger.d.ts +2 -0
  94. package/dist/lib/infrastructure/logging/Logger.js +34 -7
  95. package/dist/lib/infrastructure/monitoring/ErrorTracker.js +3 -1
  96. package/dist/lib/infrastructure/monitoring/PerformanceMonitor.d.ts +2 -2
  97. package/dist/lib/infrastructure/monitoring/PerformanceMonitor.js +12 -10
  98. package/dist/lib/infrastructure/notification/LarkNotifier.d.ts +24 -0
  99. package/dist/lib/infrastructure/notification/LarkNotifier.js +97 -0
  100. package/dist/lib/infrastructure/report/ReportStore.d.ts +45 -0
  101. package/dist/lib/infrastructure/report/ReportStore.js +133 -0
  102. package/dist/lib/infrastructure/signal/SignalAggregator.d.ts +18 -0
  103. package/dist/lib/infrastructure/signal/SignalAggregator.js +84 -0
  104. package/dist/lib/infrastructure/signal/SignalBridge.d.ts +13 -0
  105. package/dist/lib/infrastructure/signal/SignalBridge.js +20 -0
  106. package/dist/lib/infrastructure/signal/SignalBus.d.ts +63 -0
  107. package/dist/lib/infrastructure/signal/SignalBus.js +106 -0
  108. package/dist/lib/infrastructure/signal/SignalTraceWriter.d.ts +36 -0
  109. package/dist/lib/infrastructure/signal/SignalTraceWriter.js +130 -0
  110. package/dist/lib/infrastructure/vector/HnswVectorAdapter.js +18 -2
  111. package/dist/lib/injection/ServiceContainer.js +8 -0
  112. package/dist/lib/injection/ServiceMap.d.ts +16 -10
  113. package/dist/lib/injection/modules/AgentModule.d.ts +1 -1
  114. package/dist/lib/injection/modules/AgentModule.js +7 -1
  115. package/dist/lib/injection/modules/AppModule.d.ts +1 -1
  116. package/dist/lib/injection/modules/AppModule.js +4 -13
  117. package/dist/lib/injection/modules/GuardModule.js +27 -2
  118. package/dist/lib/injection/modules/InfraModule.d.ts +0 -1
  119. package/dist/lib/injection/modules/InfraModule.js +9 -7
  120. package/dist/lib/injection/modules/KnowledgeModule.d.ts +5 -0
  121. package/dist/lib/injection/modules/KnowledgeModule.js +131 -0
  122. package/dist/lib/injection/modules/PanoramaModule.d.ts +18 -0
  123. package/dist/lib/injection/modules/PanoramaModule.js +76 -0
  124. package/dist/lib/injection/modules/SignalModule.d.ts +10 -0
  125. package/dist/lib/injection/modules/SignalModule.js +84 -0
  126. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.d.ts +1 -0
  127. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.js +6 -0
  128. package/dist/lib/service/bootstrap/BootstrapTaskManager.d.ts +3 -1
  129. package/dist/lib/service/bootstrap/BootstrapTaskManager.js +20 -1
  130. package/dist/lib/service/bootstrap/UiStartupTasks.d.ts +45 -0
  131. package/dist/lib/service/bootstrap/UiStartupTasks.js +101 -0
  132. package/dist/lib/service/delivery/AgentInstructionsGenerator.js +4 -5
  133. package/dist/lib/service/delivery/CursorDeliveryPipeline.d.ts +3 -1
  134. package/dist/lib/service/delivery/CursorDeliveryPipeline.js +13 -10
  135. package/dist/lib/service/delivery/RulesGenerator.js +3 -2
  136. package/dist/lib/service/evolution/ConsolidationAdvisor.d.ts +114 -0
  137. package/dist/lib/service/evolution/ConsolidationAdvisor.js +542 -0
  138. package/dist/lib/service/evolution/ContradictionDetector.d.ts +54 -0
  139. package/dist/lib/service/evolution/ContradictionDetector.js +253 -0
  140. package/dist/lib/service/evolution/DecayDetector.d.ts +71 -0
  141. package/dist/lib/service/evolution/DecayDetector.js +244 -0
  142. package/dist/lib/service/evolution/EnhancementSuggester.d.ts +38 -0
  143. package/dist/lib/service/evolution/EnhancementSuggester.js +220 -0
  144. package/dist/lib/service/evolution/KnowledgeMetabolism.d.ts +82 -0
  145. package/dist/lib/service/evolution/KnowledgeMetabolism.js +167 -0
  146. package/dist/lib/service/evolution/RedundancyAnalyzer.d.ts +53 -0
  147. package/dist/lib/service/evolution/RedundancyAnalyzer.js +210 -0
  148. package/dist/lib/service/evolution/StagingManager.d.ts +57 -0
  149. package/dist/lib/service/evolution/StagingManager.js +201 -0
  150. package/dist/lib/service/guard/ComplianceReporter.d.ts +42 -2
  151. package/dist/lib/service/guard/ComplianceReporter.js +43 -5
  152. package/dist/lib/service/guard/CoverageAnalyzer.d.ts +54 -0
  153. package/dist/lib/service/guard/CoverageAnalyzer.js +149 -0
  154. package/dist/lib/service/guard/GuardCheckEngine.d.ts +42 -0
  155. package/dist/lib/service/guard/GuardCheckEngine.js +465 -14
  156. package/dist/lib/service/guard/GuardFeedbackLoop.d.ts +3 -0
  157. package/dist/lib/service/guard/GuardFeedbackLoop.js +9 -0
  158. package/dist/lib/service/guard/ReverseGuard.d.ts +73 -0
  159. package/dist/lib/service/guard/ReverseGuard.js +256 -0
  160. package/dist/lib/service/guard/RuleLearner.d.ts +12 -0
  161. package/dist/lib/service/guard/RuleLearner.js +38 -0
  162. package/dist/lib/service/guard/UncertaintyCollector.d.ts +83 -0
  163. package/dist/lib/service/guard/UncertaintyCollector.js +149 -0
  164. package/dist/lib/service/guard/ViolationsStore.d.ts +1 -0
  165. package/dist/lib/service/guard/ViolationsStore.js +33 -3
  166. package/dist/lib/service/knowledge/ConfidenceRouter.d.ts +13 -0
  167. package/dist/lib/service/knowledge/ConfidenceRouter.js +14 -0
  168. package/dist/lib/service/knowledge/KnowledgeService.js +22 -4
  169. package/dist/lib/service/knowledge/SourceRefReconciler.d.ts +68 -0
  170. package/dist/lib/service/knowledge/SourceRefReconciler.js +309 -0
  171. package/dist/lib/service/panorama/CouplingAnalyzer.d.ts +27 -0
  172. package/dist/lib/service/panorama/CouplingAnalyzer.js +192 -0
  173. package/dist/lib/service/panorama/DimensionAnalyzer.d.ts +28 -0
  174. package/dist/lib/service/panorama/DimensionAnalyzer.js +320 -0
  175. package/dist/lib/service/panorama/LayerInferrer.d.ts +19 -0
  176. package/dist/lib/service/panorama/LayerInferrer.js +182 -0
  177. package/dist/lib/service/panorama/ModuleDiscoverer.d.ts +24 -0
  178. package/dist/lib/service/panorama/ModuleDiscoverer.js +185 -0
  179. package/dist/lib/service/panorama/PanoramaAggregator.d.ts +29 -0
  180. package/dist/lib/service/panorama/PanoramaAggregator.js +228 -0
  181. package/dist/lib/service/panorama/PanoramaScanner.d.ts +52 -0
  182. package/dist/lib/service/panorama/PanoramaScanner.js +188 -0
  183. package/dist/lib/service/panorama/PanoramaService.d.ts +125 -0
  184. package/dist/lib/service/panorama/PanoramaService.js +363 -0
  185. package/dist/lib/service/panorama/PanoramaTypes.d.ts +134 -0
  186. package/dist/lib/service/panorama/PanoramaTypes.js +6 -0
  187. package/dist/lib/service/panorama/RoleRefiner.d.ts +48 -0
  188. package/dist/lib/service/panorama/RoleRefiner.js +535 -0
  189. package/dist/lib/service/search/BM25Scorer.d.ts +2 -2
  190. package/dist/lib/service/search/CoarseRanker.d.ts +7 -6
  191. package/dist/lib/service/search/CoarseRanker.js +11 -10
  192. package/dist/lib/service/search/FieldWeightedScorer.d.ts +81 -0
  193. package/dist/lib/service/search/FieldWeightedScorer.js +318 -0
  194. package/dist/lib/service/search/MultiSignalRanker.d.ts +3 -2
  195. package/dist/lib/service/search/MultiSignalRanker.js +17 -1
  196. package/dist/lib/service/search/SearchEngine.d.ts +9 -7
  197. package/dist/lib/service/search/SearchEngine.js +67 -10
  198. package/dist/lib/service/search/SearchTypes.d.ts +25 -3
  199. package/dist/lib/service/search/SearchTypes.js +6 -1
  200. package/dist/lib/service/signal/HitRecorder.d.ts +68 -0
  201. package/dist/lib/service/signal/HitRecorder.js +173 -0
  202. package/dist/lib/service/skills/SignalCollector.d.ts +3 -1
  203. package/dist/lib/service/skills/SignalCollector.js +31 -1
  204. package/dist/lib/service/task/IntentExtractor.d.ts +66 -0
  205. package/dist/lib/service/task/IntentExtractor.js +256 -0
  206. package/dist/lib/service/task/PrimeSearchPipeline.d.ts +54 -0
  207. package/dist/lib/service/task/PrimeSearchPipeline.js +113 -0
  208. package/dist/lib/service/vector/VectorService.d.ts +3 -0
  209. package/dist/lib/service/vector/VectorService.js +38 -4
  210. package/dist/lib/shared/schemas/mcp-tools.d.ts +41 -96
  211. package/dist/lib/shared/schemas/mcp-tools.js +59 -119
  212. package/dist/scripts/analyze-signals.d.ts +20 -0
  213. package/dist/scripts/analyze-signals.js +155 -0
  214. package/dist/scripts/diagnose-mcp.js +1 -1
  215. package/package.json +1 -1
  216. package/skills/autosnippet-create/SKILL.md +98 -89
  217. package/skills/autosnippet-devdocs/SKILL.md +55 -57
  218. package/templates/claude-code/hooks/autosnippet-session.sh +10 -15
  219. package/templates/cursor-hooks/hooks/session-start.sh +1 -1
  220. package/templates/guard-ci.yml +2 -2
  221. package/templates/instructions/agent-static.md +2 -1
  222. package/templates/instructions/conventions.md +5 -6
  223. package/templates/recipes-setup/README.md +1 -2
  224. package/templates/recipes-setup/_template.md +39 -39
  225. package/dashboard/dist/assets/icons-BofcEZ3f.js +0 -1
  226. package/dashboard/dist/assets/index-D0whuycy.css +0 -1
  227. package/dashboard/dist/assets/index-SiN1GChm.js +0 -128
  228. package/dist/lib/domain/task/Task.d.ts +0 -140
  229. package/dist/lib/domain/task/Task.js +0 -254
  230. package/dist/lib/domain/task/TaskDependency.d.ts +0 -23
  231. package/dist/lib/domain/task/TaskDependency.js +0 -34
  232. package/dist/lib/domain/task/TaskIdGenerator.d.ts +0 -40
  233. package/dist/lib/domain/task/TaskIdGenerator.js +0 -75
  234. package/dist/lib/domain/task/index.d.ts +0 -4
  235. package/dist/lib/domain/task/index.js +0 -4
  236. package/dist/lib/infrastructure/database/migrations/002_add_tasks.d.ts +0 -11
  237. package/dist/lib/infrastructure/database/migrations/002_add_tasks.js +0 -86
  238. package/dist/lib/repository/task/TaskRepository.impl.d.ts +0 -171
  239. package/dist/lib/repository/task/TaskRepository.impl.js +0 -347
  240. package/dist/lib/service/task/TaskGraphService.d.ts +0 -222
  241. package/dist/lib/service/task/TaskGraphService.js +0 -597
  242. package/dist/lib/service/task/TaskKnowledgeBridge.d.ts +0 -95
  243. package/dist/lib/service/task/TaskKnowledgeBridge.js +0 -298
  244. package/dist/lib/service/task/TaskReadyEngine.d.ts +0 -84
  245. package/dist/lib/service/task/TaskReadyEngine.js +0 -115
@@ -0,0 +1,149 @@
1
+ /**
2
+ * CoverageAnalyzer — Guard 覆盖率矩阵 + Panorama 协同
3
+ *
4
+ * 计算模块级 Rule 覆盖率,识别零覆盖和低覆盖模块。
5
+ * 与 PanoramaService 协同:利用模块划分 + gaps 数据做精准评估。
6
+ */
7
+ import Logger from '../../infrastructure/logging/Logger.js';
8
+ import { LanguageService } from '../../shared/LanguageService.js';
9
+ /* ────────────────────── 常量 ────────────────────── */
10
+ const LOW_COVERAGE_THRESHOLD = 50;
11
+ /* ────────────────────── Class ────────────────────── */
12
+ export class CoverageAnalyzer {
13
+ #db;
14
+ #ruleLearner;
15
+ #logger = Logger.getInstance();
16
+ constructor(db, options = {}) {
17
+ this.#db = db;
18
+ this.#ruleLearner = options.ruleLearner ?? null;
19
+ }
20
+ /**
21
+ * 计算覆盖率矩阵
22
+ * @param moduleFiles 模块名 → 文件路径列表的映射
23
+ */
24
+ analyze(moduleFiles) {
25
+ // 1. 加载所有 active rule recipes
26
+ const rules = this.#loadActiveRules();
27
+ // 2. 构建 rule → 文件路径映射 (从 guard_violations 历史推断)
28
+ const ruleFileMap = this.#buildRuleFileMap();
29
+ // 3. 加载规则健康数据
30
+ const allStats = this.#ruleLearner?.getAllStats() ?? {};
31
+ // 4. 对每个模块计算覆盖率
32
+ const modules = [];
33
+ for (const [moduleName, files] of moduleFiles) {
34
+ if (files.length === 0) {
35
+ modules.push({
36
+ module: moduleName,
37
+ ruleCount: 0,
38
+ fpRate: 0,
39
+ coverage: 0,
40
+ level: 'zero',
41
+ });
42
+ continue;
43
+ }
44
+ // 找出与该模块文件匹配的 rule
45
+ const fileSet = new Set(files);
46
+ const matchedRules = new Set();
47
+ // 方式 1: rule 的 guard_violations 历史曾命中该模块的文件
48
+ for (const [ruleId, rulePaths] of ruleFileMap) {
49
+ for (const rp of rulePaths) {
50
+ if (fileSet.has(rp)) {
51
+ matchedRules.add(ruleId);
52
+ break;
53
+ }
54
+ }
55
+ }
56
+ // 方式 2: rule 的 scope/language 与模块语言匹配 (基于文件扩展名推断)
57
+ const moduleLanguages = this.#inferLanguages(files);
58
+ for (const rule of rules) {
59
+ if (rule.languages.length === 0 || rule.languages.some((l) => moduleLanguages.has(l))) {
60
+ matchedRules.add(rule.id);
61
+ }
62
+ }
63
+ const ruleCount = matchedRules.size;
64
+ // 计算该模块关联规则的平均 FP 率
65
+ let fpRateSum = 0;
66
+ let fpRuleCount = 0;
67
+ for (const ruleId of matchedRules) {
68
+ const stat = allStats[ruleId];
69
+ if (stat?.triggers && stat.triggers > 0) {
70
+ const metrics = this.#ruleLearner?.getMetrics(ruleId);
71
+ if (metrics) {
72
+ fpRateSum += metrics.falsePositiveRate;
73
+ fpRuleCount++;
74
+ }
75
+ }
76
+ }
77
+ const fpRate = fpRuleCount > 0 ? Math.round((fpRateSum / fpRuleCount) * 100) : 0;
78
+ // 覆盖率 = 匹配到的规则数 / (模块文件数 × 权重因子)
79
+ // 简化公式: 每个文件理论上应有 ≥1 条规则覆盖
80
+ const coverage = Math.min(100, Math.round((ruleCount / Math.max(1, files.length)) * 100));
81
+ const level = coverage === 0 ? 'zero' : coverage < LOW_COVERAGE_THRESHOLD ? 'low' : 'good';
82
+ modules.push({ module: moduleName, ruleCount, fpRate, coverage, level });
83
+ }
84
+ // 5. 总体覆盖率
85
+ const totalModules = modules.length;
86
+ const overallCoverage = totalModules > 0
87
+ ? Math.round(modules.reduce((sum, m) => sum + m.coverage, 0) / totalModules)
88
+ : 0;
89
+ const zeroModules = modules.filter((m) => m.level === 'zero').map((m) => m.module);
90
+ const lowModules = modules.filter((m) => m.level === 'low').map((m) => m.module);
91
+ return { modules, overallCoverage, zeroModules, lowModules };
92
+ }
93
+ /* ── 内部 ── */
94
+ #loadActiveRules() {
95
+ try {
96
+ const rows = this.#db
97
+ .prepare(`SELECT id, language FROM knowledge_entries WHERE lifecycle = 'active' AND kind = 'rule'`)
98
+ .all();
99
+ return rows.map((r) => ({
100
+ id: r.id,
101
+ languages: r.language
102
+ ? r.language.split(',').map((l) => LanguageService.normalize(l.trim()))
103
+ : [],
104
+ }));
105
+ }
106
+ catch {
107
+ return [];
108
+ }
109
+ }
110
+ #buildRuleFileMap() {
111
+ const map = new Map();
112
+ try {
113
+ const rows = this.#db
114
+ .prepare(`SELECT file_path, violations_json FROM guard_violations ORDER BY created_at DESC LIMIT 200`)
115
+ .all();
116
+ for (const row of rows) {
117
+ try {
118
+ const violations = JSON.parse(row.violations_json || '[]');
119
+ const filePath = row.file_path;
120
+ for (const v of violations) {
121
+ if (!v.ruleId) {
122
+ continue;
123
+ }
124
+ const list = map.get(v.ruleId) || [];
125
+ list.push(filePath);
126
+ map.set(v.ruleId, list);
127
+ }
128
+ }
129
+ catch {
130
+ // invalid json
131
+ }
132
+ }
133
+ }
134
+ catch {
135
+ // table doesn't exist
136
+ }
137
+ return map;
138
+ }
139
+ #inferLanguages(files) {
140
+ const langs = new Set();
141
+ for (const f of files) {
142
+ const lang = LanguageService.inferLang(f);
143
+ if (lang !== 'unknown') {
144
+ langs.add(lang);
145
+ }
146
+ }
147
+ return langs;
148
+ }
149
+ }
@@ -6,6 +6,9 @@
6
6
  */
7
7
  import * as AstAnalyzerModule from '../../core/AstAnalyzer.js';
8
8
  import Logger from '../../infrastructure/logging/Logger.js';
9
+ import type { SignalBus } from '../../infrastructure/signal/SignalBus.js';
10
+ import type { GuardCapabilityReport, UncertainResult } from './UncertaintyCollector.js';
11
+ import { UncertaintyCollector } from './UncertaintyCollector.js';
9
12
  /** Minimal DB interface for Guard engine */
10
13
  interface DatabaseLike {
11
14
  prepare(sql: string): {
@@ -76,6 +79,7 @@ interface GuardConfig {
76
79
  interface GuardCheckEngineOptions {
77
80
  cacheTTL?: number;
78
81
  guardConfig?: GuardConfig;
82
+ signalBus?: SignalBus;
79
83
  }
80
84
  interface ExternalRuleInput {
81
85
  ruleId: string;
@@ -91,10 +95,12 @@ interface AuditFileResult {
91
95
  filePath: string;
92
96
  language: string;
93
97
  violations: GuardViolation[];
98
+ uncertainResults: UncertainResult[];
94
99
  summary: {
95
100
  total: number;
96
101
  errors: number;
97
102
  warnings: number;
103
+ uncertain: number;
98
104
  };
99
105
  }
100
106
  interface AuditFilesInput {
@@ -112,6 +118,11 @@ export declare class GuardCheckEngine {
112
118
  _epInjected: boolean;
113
119
  _externalRules: Map<string, GuardRule>;
114
120
  _guardConfig: GuardConfig;
121
+ _signalBus: SignalBus | null;
122
+ /** 上次 guard 信号指纹,用于去重(相同结果不重复发射) */
123
+ _lastGuardSignalKey: string;
124
+ _lastBlindSpotSignalKey: string;
125
+ _uncertaintyCollector: UncertaintyCollector;
115
126
  db: DatabaseLike;
116
127
  logger: ReturnType<typeof Logger.getInstance>;
117
128
  constructor(db: DatabaseLike | {
@@ -162,6 +173,33 @@ export declare class GuardCheckEngine {
162
173
  * @returns violations
163
174
  */
164
175
  _runAstRuleChecks(code: string, language: string): GuardViolation[];
176
+ /**
177
+ * AST Layer 2: analyzeFile() 深层检查
178
+ *
179
+ * 利用 AstAnalyzer.analyzeFile() 的完整输出产出 violations:
180
+ *
181
+ * --- 方法度量 ---
182
+ * - ast_class_bloat: 类方法数过多 (>20)
183
+ * - ast_method_complexity: 高圈复杂度 (>15)
184
+ * - ast_method_too_long: 方法行数过长 (>80)
185
+ * - ast_deep_nesting: 方法嵌套过深 (>5)
186
+ *
187
+ * --- 继承图检查 ---
188
+ * - ast_deep_inheritance: 继承链过深 (>4)
189
+ * - ast_wide_protocol_conformance: 单类遵守协议过多 (>5)
190
+ * - ast_missing_super: 子类未调用 super 的关键方法
191
+ *
192
+ * --- 属性规范 ---
193
+ * - ast_assign_object_property: ObjC assign 修饰对象类型属性
194
+ * - ast_missing_nonatomic: ObjC 属性缺少 nonatomic
195
+ * - ast_mutable_public_collection: 公开可变集合属性
196
+ *
197
+ * --- 设计模式/反模式检测 ---
198
+ * - ast_god_class: 方法+属性过多的上帝类 (>30 methods + >15 properties)
199
+ * - ast_singleton_abuse: 过多单例模式
200
+ * - ast_missing_weakify: block 内 self 捕获但未使用 weakify
201
+ */
202
+ _runAstLayer2Checks(code: string, language: string, filePath: string): GuardViolation[];
165
203
  /** 获取 AstAnalyzer 模块(静态 import,带可用性检测) */
166
204
  _getAstAnalyzer(): typeof AstAnalyzerModule;
167
205
  /**
@@ -198,9 +236,13 @@ export declare class GuardCheckEngine {
198
236
  filesChecked: number;
199
237
  totalViolations: number;
200
238
  totalErrors: number;
239
+ totalUncertain: number;
201
240
  filesWithViolations: number;
202
241
  };
242
+ capabilityReport: GuardCapabilityReport;
203
243
  };
244
+ /** 获取 uncertainty collector(供外部读取单文件 uncertain 状态) */
245
+ getUncertaintyCollector(): UncertaintyCollector;
204
246
  /** 清除规则缓存 */
205
247
  clearCache(): void;
206
248
  /** 获取内置规则列表 */