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
@@ -104,13 +104,25 @@ export declare const CallContextInput: z.ZodObject<{
104
104
  }, z.core.$strip>;
105
105
  export type CallContextInput = z.infer<typeof CallContextInput>;
106
106
  export declare const GuardInput: z.ZodObject<{
107
+ operation: z.ZodOptional<z.ZodEnum<{
108
+ check: "check";
109
+ review: "review";
110
+ reverse_audit: "reverse_audit";
111
+ coverage_matrix: "coverage_matrix";
112
+ compliance_report: "compliance_report";
113
+ }>>;
107
114
  files: z.ZodOptional<z.ZodArray<z.ZodString>>;
108
115
  code: z.ZodOptional<z.ZodString>;
109
116
  language: z.ZodOptional<z.ZodString>;
110
117
  filePath: z.ZodOptional<z.ZodString>;
118
+ maxFiles: z.ZodOptional<z.ZodNumber>;
111
119
  }, z.core.$strip>;
112
120
  export type GuardInput = z.infer<typeof GuardInput>;
113
- export declare const SubmitKnowledgeInput: z.ZodObject<{
121
+ /**
122
+ * 单条知识条目字段定义(items 数组内部元素的严格 Schema)
123
+ * 用于文档/类型推导,实际 items 使用 z.record() 宽容接收后在 handler 层校验。
124
+ */
125
+ export declare const SubmitKnowledgeItemSchema: z.ZodObject<{
114
126
  title: z.ZodString;
115
127
  language: z.ZodString;
116
128
  content: z.ZodObject<{
@@ -162,40 +174,25 @@ export declare const SubmitKnowledgeInput: z.ZodObject<{
162
174
  moduleName: z.ZodOptional<z.ZodString>;
163
175
  includeHeaders: z.ZodOptional<z.ZodBoolean>;
164
176
  source: z.ZodOptional<z.ZodString>;
165
- client_id: z.ZodOptional<z.ZodString>;
166
- skipDuplicateCheck: z.ZodDefault<z.ZodBoolean>;
167
- dimensionId: z.ZodOptional<z.ZodString>;
168
177
  }, z.core.$strip>;
169
- export type SubmitKnowledgeInput = z.infer<typeof SubmitKnowledgeInput>;
170
- export declare const SubmitKnowledgeBatchInput: z.ZodObject<{
171
- target_name: z.ZodString;
178
+ export declare const SubmitKnowledgeInput: z.ZodObject<{
172
179
  items: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
173
- source: z.ZodDefault<z.ZodString>;
174
- deduplicate: z.ZodDefault<z.ZodBoolean>;
180
+ target_name: z.ZodOptional<z.ZodString>;
181
+ source: z.ZodOptional<z.ZodString>;
182
+ skipConsolidation: z.ZodDefault<z.ZodBoolean>;
183
+ skipDuplicateCheck: z.ZodDefault<z.ZodBoolean>;
175
184
  client_id: z.ZodOptional<z.ZodString>;
176
185
  dimensionId: z.ZodOptional<z.ZodString>;
177
186
  }, z.core.$strip>;
178
- export type SubmitKnowledgeBatchInput = z.infer<typeof SubmitKnowledgeBatchInput>;
179
- export declare const SaveDocumentInput: z.ZodObject<{
180
- title: z.ZodString;
181
- markdown: z.ZodString;
182
- description: z.ZodOptional<z.ZodString>;
183
- tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
184
- scope: z.ZodDefault<z.ZodEnum<{
185
- universal: "universal";
186
- "project-specific": "project-specific";
187
- }>>;
188
- source: z.ZodOptional<z.ZodString>;
189
- }, z.core.$strip>;
190
- export type SaveDocumentInput = z.infer<typeof SaveDocumentInput>;
187
+ export type SubmitKnowledgeInput = z.infer<typeof SubmitKnowledgeInput>;
191
188
  export declare const SkillInput: z.ZodObject<{
192
189
  operation: z.ZodEnum<{
193
190
  delete: "delete";
194
191
  create: "create";
195
192
  update: "update";
196
193
  list: "list";
197
- suggest: "suggest";
198
194
  load: "load";
195
+ suggest: "suggest";
199
196
  }>;
200
197
  name: z.ZodOptional<z.ZodString>;
201
198
  skillName: z.ZodOptional<z.ZodString>;
@@ -224,88 +221,38 @@ export declare const DimensionCompleteInput: z.ZodObject<{
224
221
  crossDimensionHints: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
225
222
  }, z.core.$strip>;
226
223
  export type DimensionCompleteInput = z.infer<typeof DimensionCompleteInput>;
227
- export declare const WikiPlanInput: z.ZodObject<{
228
- language: z.ZodDefault<z.ZodEnum<{
224
+ export declare const WikiInput: z.ZodObject<{
225
+ operation: z.ZodEnum<{
226
+ plan: "plan";
227
+ finalize: "finalize";
228
+ }>;
229
+ language: z.ZodOptional<z.ZodEnum<{
229
230
  en: "en";
230
231
  zh: "zh";
231
232
  }>>;
232
233
  sessionId: z.ZodOptional<z.ZodString>;
234
+ articlesWritten: z.ZodOptional<z.ZodArray<z.ZodString>>;
233
235
  }, z.core.$strip>;
234
- export type WikiPlanInput = z.infer<typeof WikiPlanInput>;
235
- export declare const WikiFinalizeInput: z.ZodObject<{
236
- articlesWritten: z.ZodArray<z.ZodString>;
237
- }, z.core.$strip>;
238
- export type WikiFinalizeInput = z.infer<typeof WikiFinalizeInput>;
236
+ export type WikiInput = z.infer<typeof WikiInput>;
239
237
  export declare const CapabilitiesInput: z.ZodObject<{}, z.core.$strip>;
240
238
  export type CapabilitiesInput = z.infer<typeof CapabilitiesInput>;
241
239
  export declare const TaskInput: z.ZodObject<{
242
240
  operation: z.ZodEnum<{
243
241
  create: "create";
244
- stats: "stats";
245
242
  close: "close";
246
- progress: "progress";
247
- blocked: "blocked";
248
- list: "list";
249
- ready: "ready";
250
243
  prime: "prime";
251
- claim: "claim";
252
244
  fail: "fail";
253
- defer: "defer";
254
- show: "show";
255
- decompose: "decompose";
256
- dep_add: "dep_add";
257
- dep_tree: "dep_tree";
258
245
  record_decision: "record_decision";
259
- revise_decision: "revise_decision";
260
- unpin_decision: "unpin_decision";
261
- list_decisions: "list_decisions";
262
246
  }>;
263
247
  title: z.ZodOptional<z.ZodString>;
264
248
  description: z.ZodOptional<z.ZodString>;
265
- design: z.ZodOptional<z.ZodString>;
266
- acceptance: z.ZodOptional<z.ZodString>;
267
- priority: z.ZodOptional<z.ZodNumber>;
268
- taskType: z.ZodOptional<z.ZodEnum<{
269
- task: "task";
270
- epic: "epic";
271
- bug: "bug";
272
- chore: "chore";
273
- }>>;
274
- parentId: z.ZodOptional<z.ZodString>;
275
249
  id: z.ZodOptional<z.ZodString>;
276
250
  reason: z.ZodOptional<z.ZodString>;
277
251
  rationale: z.ZodOptional<z.ZodString>;
278
252
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
279
- relatedTaskId: z.ZodOptional<z.ZodString>;
280
- dependsOn: z.ZodOptional<z.ZodString>;
281
- depType: z.ZodDefault<z.ZodEnum<{
282
- blocks: "blocks";
283
- related: "related";
284
- "waits-for": "waits-for";
285
- "parent-child": "parent-child";
286
- "discovered-from": "discovered-from";
287
- "knowledge-ref": "knowledge-ref";
288
- supersedes: "supersedes";
289
- }>>;
290
- limit: z.ZodDefault<z.ZodNumber>;
291
- status: z.ZodOptional<z.ZodEnum<{
292
- open: "open";
293
- closed: "closed";
294
- pinned: "pinned";
295
- in_progress: "in_progress";
296
- deferred: "deferred";
297
- }>>;
298
- withKnowledge: z.ZodDefault<z.ZodBoolean>;
299
253
  userQuery: z.ZodOptional<z.ZodString>;
300
254
  activeFile: z.ZodOptional<z.ZodString>;
301
255
  language: z.ZodOptional<z.ZodString>;
302
- subtasks: z.ZodOptional<z.ZodArray<z.ZodObject<{
303
- title: z.ZodString;
304
- description: z.ZodOptional<z.ZodString>;
305
- priority: z.ZodOptional<z.ZodNumber>;
306
- taskType: z.ZodOptional<z.ZodString>;
307
- blockedByIndex: z.ZodOptional<z.ZodNumber>;
308
- }, z.core.$strip>>>;
309
256
  }, z.core.$strip>;
310
257
  export type TaskInput = z.infer<typeof TaskInput>;
311
258
  export declare const EnrichCandidatesInput: z.ZodObject<{
@@ -327,20 +274,18 @@ export declare const KnowledgeLifecycleInput: z.ZodObject<{
327
274
  reason: z.ZodOptional<z.ZodString>;
328
275
  }, z.core.$strip>;
329
276
  export type KnowledgeLifecycleInput = z.infer<typeof KnowledgeLifecycleInput>;
330
- export declare const ValidateCandidateInput: z.ZodObject<{
331
- candidate: z.ZodRecord<z.ZodString, z.ZodUnknown>;
332
- strict: z.ZodDefault<z.ZodBoolean>;
333
- }, z.core.$strip>;
334
- export type ValidateCandidateInput = z.infer<typeof ValidateCandidateInput>;
335
- export declare const CheckDuplicateInput: z.ZodObject<{
336
- candidate: z.ZodObject<{
337
- title: z.ZodOptional<z.ZodString>;
338
- summary: z.ZodOptional<z.ZodString>;
339
- usageGuide: z.ZodOptional<z.ZodString>;
340
- code: z.ZodOptional<z.ZodString>;
341
- }, z.core.$strip>;
342
- threshold: z.ZodDefault<z.ZodNumber>;
343
- topK: z.ZodDefault<z.ZodNumber>;
277
+ export declare const PanoramaInput: z.ZodObject<{
278
+ operation: z.ZodDefault<z.ZodEnum<{
279
+ overview: "overview";
280
+ gaps: "gaps";
281
+ module: "module";
282
+ health: "health";
283
+ enhancement_suggestions: "enhancement_suggestions";
284
+ governance_cycle: "governance_cycle";
285
+ decay_report: "decay_report";
286
+ staging_check: "staging_check";
287
+ }>>;
288
+ module: z.ZodOptional<z.ZodString>;
344
289
  }, z.core.$strip>;
345
- export type CheckDuplicateInput = z.infer<typeof CheckDuplicateInput>;
290
+ export type PanoramaInput = z.infer<typeof PanoramaInput>;
346
291
  export declare const TOOL_SCHEMAS: Record<string, z.ZodType>;
@@ -99,15 +99,24 @@ export const CallContextInput = z.object({
99
99
  // 7. autosnippet_guard
100
100
  // ══════════════════════════════════════════════════════
101
101
  export const GuardInput = z.object({
102
+ operation: z
103
+ .enum(['check', 'review', 'reverse_audit', 'coverage_matrix', 'compliance_report'])
104
+ .optional()
105
+ .describe('Guard 操作类型。reverse_audit: Recipe→Code 反向验证;coverage_matrix: 模块覆盖率矩阵;compliance_report: 3D 合规报告(含 uncertain)。省略则按 code/files 自动路由。'),
102
106
  files: z.array(z.string()).optional(),
103
107
  code: z.string().optional(),
104
108
  language: z.string().optional(),
105
109
  filePath: z.string().optional(),
110
+ maxFiles: z.number().optional().describe('reverse_audit/coverage_matrix 时扫描的最大文件数'),
106
111
  });
107
112
  // ══════════════════════════════════════════════════════
108
- // 7b. autosnippet_submit_knowledge
113
+ // 7b. autosnippet_submit_knowledge (unified pipeline)
109
114
  // ══════════════════════════════════════════════════════
110
- export const SubmitKnowledgeInput = z.object({
115
+ /**
116
+ * 单条知识条目字段定义(items 数组内部元素的严格 Schema)
117
+ * 用于文档/类型推导,实际 items 使用 z.record() 宽容接收后在 handler 层校验。
118
+ */
119
+ export const SubmitKnowledgeItemSchema = z.object({
111
120
  // ── 必填字段 ──
112
121
  title: TitleField.describe('知识标题,简洁明确'),
113
122
  language: LanguageField.describe('编程语言,如 typescript/swift/python'),
@@ -148,37 +157,22 @@ export const SubmitKnowledgeInput = z.object({
148
157
  moduleName: z.string().optional(),
149
158
  includeHeaders: z.boolean().optional(),
150
159
  source: z.string().optional(),
151
- client_id: z.string().optional(),
152
- skipDuplicateCheck: z.boolean().default(false),
153
- dimensionId: z.string().optional(),
154
160
  });
155
- // ══════════════════════════════════════════════════════
156
- // 8. autosnippet_submit_knowledge_batch
157
- // ══════════════════════════════════════════════════════
158
- export const SubmitKnowledgeBatchInput = z.object({
159
- target_name: z
160
- .string()
161
- .min(1, 'target_name is required')
162
- .describe('批量来源标识,如 network-module-scan'),
161
+ export const SubmitKnowledgeInput = z.object({
163
162
  items: z
164
163
  .array(z.record(z.string(), z.unknown()))
165
- .min(1, 'items array must not be empty')
166
- .describe('知识条目数组,每条字段同 submit_knowledge。content/reasoning 必须是对象'),
167
- source: z.string().default('cursor-scan'),
168
- deduplicate: z.boolean().default(true).describe('基于 title 自动去重,默认开启'),
164
+ .min(1)
165
+ .describe('知识条目数组(1~N 条)。单条与批量统一处理,所有条目严格校验 + 融合分析。' +
166
+ '每条字段: title, language, content(对象), kind, doClause, dontClause, whenClause, coreCode, category, trigger, description, headers, usageGuide, knowledgeType, reasoning(对象)。'),
167
+ target_name: z.string().optional().describe('来源标识,如 network-module-scan'),
168
+ source: z.string().optional().describe('来源标记,默认 mcp'),
169
+ skipConsolidation: z
170
+ .boolean()
171
+ .default(false)
172
+ .describe('跳过融合分析(当确认需要独立新建时设为 true)'),
173
+ skipDuplicateCheck: z.boolean().default(false),
169
174
  client_id: z.string().optional(),
170
- dimensionId: z.string().optional().describe('冷启动时关联维度 ID'),
171
- });
172
- // ══════════════════════════════════════════════════════
173
- // 9. autosnippet_save_document
174
- // ══════════════════════════════════════════════════════
175
- export const SaveDocumentInput = z.object({
176
- title: TitleField,
177
- markdown: z.string().min(1, 'markdown content is required'),
178
- description: z.string().optional(),
179
- tags: z.array(z.string()).optional(),
180
- scope: z.enum(['universal', 'project-specific']).default('project-specific'),
181
- source: z.string().optional(),
175
+ dimensionId: z.string().optional().describe('冷启动关联维度 ID'),
182
176
  });
183
177
  // ══════════════════════════════════════════════════════
184
178
  // 10. autosnippet_skill
@@ -216,91 +210,41 @@ export const DimensionCompleteInput = z.object({
216
210
  crossDimensionHints: z.record(z.string(), z.string()).optional(),
217
211
  });
218
212
  // ══════════════════════════════════════════════════════
219
- // 11c. autosnippet_wiki_plan
213
+ // 11c. autosnippet_wiki (merged: plan + finalize)
220
214
  // ══════════════════════════════════════════════════════
221
- export const WikiPlanInput = z.object({
222
- language: z.enum(['zh', 'en']).default('zh'),
215
+ export const WikiInput = z.object({
216
+ operation: z
217
+ .enum(['plan', 'finalize'])
218
+ .describe('plan — 规划主题 + 数据包; finalize — 写入 meta.json + 验证'),
219
+ // plan 参数
220
+ language: z.enum(['zh', 'en']).optional().describe('Wiki 语言,默认 zh'),
223
221
  sessionId: z.string().optional(),
224
- });
225
- // ══════════════════════════════════════════════════════
226
- // 11d. autosnippet_wiki_finalize
227
- // ══════════════════════════════════════════════════════
228
- export const WikiFinalizeInput = z.object({
229
- articlesWritten: z.array(z.string()).min(1, 'articlesWritten must not be empty'),
222
+ // finalize 参数
223
+ articlesWritten: z.array(z.string()).optional(),
230
224
  });
231
225
  // ══════════════════════════════════════════════════════
232
226
  // 12. autosnippet_capabilities — 无参数
233
227
  // ══════════════════════════════════════════════════════
234
228
  export const CapabilitiesInput = z.object({});
235
229
  // ══════════════════════════════════════════════════════
236
- // 13. autosnippet_task
230
+ // 13. autosnippet_task (5 operations)
237
231
  // ══════════════════════════════════════════════════════
238
232
  export const TaskInput = z.object({
239
233
  operation: z
240
- .enum([
241
- 'prime',
242
- 'ready',
243
- 'create',
244
- 'claim',
245
- 'close',
246
- 'fail',
247
- 'defer',
248
- 'progress',
249
- 'show',
250
- 'list',
251
- 'stats',
252
- 'blocked',
253
- 'decompose',
254
- 'dep_add',
255
- 'dep_tree',
256
- 'record_decision',
257
- 'revise_decision',
258
- 'unpin_decision',
259
- 'list_decisions',
260
- ])
261
- .describe('会话: prime(首选) | ready。任务: create/claim/close/fail/defer/progress/show/list/stats/blocked。分解: decompose/dep_add/dep_tree。决策: record_decision/revise_decision/unpin_decision/list_decisions'),
262
- title: z.string().optional(),
263
- description: z.string().optional(),
264
- design: z.string().optional(),
265
- acceptance: z.string().optional(),
266
- priority: z.number().int().min(0).max(4).optional(),
267
- taskType: z.enum(['epic', 'task', 'bug', 'chore']).optional(),
268
- parentId: z.string().optional(),
269
- id: z.string().optional(),
270
- reason: z.string().optional(),
271
- rationale: z.string().optional(),
272
- tags: z.array(z.string()).optional(),
273
- relatedTaskId: z.string().optional(),
274
- dependsOn: z.string().optional(),
275
- depType: z
276
- .enum([
277
- 'blocks',
278
- 'parent-child',
279
- 'waits-for',
280
- 'discovered-from',
281
- 'related',
282
- 'knowledge-ref',
283
- 'supersedes',
284
- ])
285
- .default('blocks'),
286
- limit: z.number().int().min(1).max(200).default(10),
287
- status: z.enum(['open', 'in_progress', 'deferred', 'closed', 'pinned']).optional(),
288
- withKnowledge: z.boolean().default(true),
234
+ .enum(['prime', 'create', 'close', 'fail', 'record_decision'])
235
+ .describe('prime=加载知识上下文 | create=创建任务锚点 | close=完成+Guard | fail=放弃 | record_decision=记录用户偏好'),
236
+ title: z.string().optional().describe('Task or decision title (create / record_decision)'),
237
+ description: z.string().optional().describe('Decision description (record_decision)'),
238
+ id: z.string().optional().describe('Task ID (close / fail)'),
239
+ reason: z.string().optional().describe('Close reason or fail reason'),
240
+ rationale: z.string().optional().describe('Decision rationale (record_decision)'),
241
+ tags: z.array(z.string()).optional().describe('Decision tags (record_decision)'),
289
242
  userQuery: z
290
243
  .string()
291
244
  .optional()
292
245
  .describe('User current input / prompt text for knowledge-aware search'),
293
246
  activeFile: z.string().optional().describe('Currently active file path in IDE'),
294
247
  language: z.string().optional().describe('Current programming language'),
295
- subtasks: z
296
- .array(z.object({
297
- title: z.string().min(1),
298
- description: z.string().optional(),
299
- priority: z.number().int().min(0).max(4).optional(),
300
- taskType: z.string().optional(),
301
- blockedByIndex: z.number().int().min(0).optional(),
302
- }))
303
- .optional(),
304
248
  });
305
249
  // ══════════════════════════════════════════════════════
306
250
  // Admin Tools
@@ -329,21 +273,22 @@ export const KnowledgeLifecycleInput = z.object({
329
273
  .describe('approve/fast_track=发布 | reject=拒绝 | deprecate=废弃 | reactivate=恢复 | to_draft=回草稿'),
330
274
  reason: z.string().optional().describe('reject/deprecate 时的理由'),
331
275
  });
332
- // 16. autosnippet_validate_candidate
333
- export const ValidateCandidateInput = z.object({
334
- candidate: z.record(z.string(), z.unknown()),
335
- strict: z.boolean().default(false),
336
- });
337
- // 17. autosnippet_check_duplicate
338
- export const CheckDuplicateInput = z.object({
339
- candidate: z.object({
340
- title: z.string().optional(),
341
- summary: z.string().optional(),
342
- usageGuide: z.string().optional(),
343
- code: z.string().optional(),
344
- }),
345
- threshold: z.number().min(0).max(1).default(0.7),
346
- topK: z.number().int().min(1).max(50).default(5),
276
+ // 18. autosnippet_panorama
277
+ export const PanoramaInput = z.object({
278
+ operation: z
279
+ .enum([
280
+ 'overview',
281
+ 'module',
282
+ 'gaps',
283
+ 'health',
284
+ 'governance_cycle',
285
+ 'decay_report',
286
+ 'staging_check',
287
+ 'enhancement_suggestions',
288
+ ])
289
+ .default('overview')
290
+ .describe('overview=项目骨架+层级+模块角色 | module=单模块详情+邻居关系 | gaps=知识空白区 | health=全景健康度 | governance_cycle=新陈代谢完整周期 | decay_report=衰退报告 | staging_check=staging检查+自动发布 | enhancement_suggestions=增强建议'),
291
+ module: z.string().optional().describe('模块名称(operation=module 时必填)'),
347
292
  });
348
293
  // ══════════════════════════════════════════════════════
349
294
  // 工具名 → Schema 映射表(用于 wrapHandler 自动注入校验)
@@ -357,17 +302,12 @@ export const TOOL_SCHEMAS = {
357
302
  autosnippet_call_context: CallContextInput,
358
303
  autosnippet_guard: GuardInput,
359
304
  autosnippet_submit_knowledge: SubmitKnowledgeInput,
360
- autosnippet_submit_knowledge_batch: SubmitKnowledgeBatchInput,
361
- autosnippet_save_document: SaveDocumentInput,
362
305
  autosnippet_skill: SkillInput,
363
306
  autosnippet_bootstrap: BootstrapInput,
364
307
  autosnippet_dimension_complete: DimensionCompleteInput,
365
- autosnippet_wiki_plan: WikiPlanInput,
366
- autosnippet_wiki_finalize: WikiFinalizeInput,
367
- autosnippet_capabilities: CapabilitiesInput,
308
+ autosnippet_wiki: WikiInput,
368
309
  autosnippet_task: TaskInput,
369
310
  autosnippet_enrich_candidates: EnrichCandidatesInput,
370
311
  autosnippet_knowledge_lifecycle: KnowledgeLifecycleInput,
371
- autosnippet_validate_candidate: ValidateCandidateInput,
372
- autosnippet_check_duplicate: CheckDuplicateInput,
312
+ autosnippet_panorama: PanoramaInput,
373
313
  };
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * analyze-signals.ts — JSONL Signal Analyzer
4
+ *
5
+ * Reads intent chain records from .autosnippet/logs/signals/*.jsonl and produces
6
+ * summary analytics for evaluating the Intent Pipeline effectiveness.
7
+ *
8
+ * Usage: npx tsx scripts/analyze-signals.ts [project-root]
9
+ *
10
+ * Metrics:
11
+ * 1. Recipe coverage rate
12
+ * 2. Scenario distribution
13
+ * 3. Multi-query benefit (filtered count)
14
+ * 4. Language distribution
15
+ * 5. Drift → violation correlation
16
+ * 6. Task completion rate
17
+ * 7. Average intent duration
18
+ * 8. Search → drift correlation
19
+ */
20
+ export {};
@@ -0,0 +1,155 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * analyze-signals.ts — JSONL Signal Analyzer
4
+ *
5
+ * Reads intent chain records from .autosnippet/logs/signals/*.jsonl and produces
6
+ * summary analytics for evaluating the Intent Pipeline effectiveness.
7
+ *
8
+ * Usage: npx tsx scripts/analyze-signals.ts [project-root]
9
+ *
10
+ * Metrics:
11
+ * 1. Recipe coverage rate
12
+ * 2. Scenario distribution
13
+ * 3. Multi-query benefit (filtered count)
14
+ * 4. Language distribution
15
+ * 5. Drift → violation correlation
16
+ * 6. Task completion rate
17
+ * 7. Average intent duration
18
+ * 8. Search → drift correlation
19
+ */
20
+ import fs from 'node:fs';
21
+ import path from 'node:path';
22
+ // ── Load Records ────────────────────────────────────
23
+ function loadRecords(signalDir) {
24
+ if (!fs.existsSync(signalDir)) {
25
+ console.error(`Signal directory not found: ${signalDir}`);
26
+ return [];
27
+ }
28
+ const files = fs
29
+ .readdirSync(signalDir)
30
+ .filter((f) => f.endsWith('.jsonl'))
31
+ .sort();
32
+ const records = [];
33
+ for (const file of files) {
34
+ const content = fs.readFileSync(path.join(signalDir, file), 'utf8');
35
+ for (const line of content.split('\n')) {
36
+ if (!line.trim()) {
37
+ continue;
38
+ }
39
+ try {
40
+ records.push(JSON.parse(line));
41
+ }
42
+ catch {
43
+ // skip malformed lines
44
+ }
45
+ }
46
+ }
47
+ return records;
48
+ }
49
+ // ── Analyze ─────────────────────────────────────────
50
+ function analyze(records) {
51
+ if (records.length === 0) {
52
+ console.log('No records found.');
53
+ return;
54
+ }
55
+ console.log(`\n📊 Intent Signal Analysis — ${records.length} records\n`);
56
+ // 1. Recipe coverage rate
57
+ const withRecipes = records.filter((r) => r.primeRecipeIds.length > 0).length;
58
+ console.log(`1. Recipe coverage: ${withRecipes}/${records.length} (${pct(withRecipes, records.length)})`);
59
+ // 2. Scenario distribution
60
+ const scenarios = groupBy(records, (r) => r.primeScenario || 'unknown');
61
+ console.log('2. Scenario distribution:');
62
+ for (const [scenario, items] of Object.entries(scenarios)) {
63
+ console.log(` ${scenario}: ${items.length} (${pct(items.length, records.length)})`);
64
+ }
65
+ // 3. Multi-query benefit
66
+ const withMeta = records.filter((r) => r.searchMeta);
67
+ if (withMeta.length > 0) {
68
+ const avgFiltered = avg(withMeta.map((r) => r.searchMeta.filteredCount));
69
+ const avgResult = avg(withMeta.map((r) => r.searchMeta.resultCount));
70
+ const avgQueries = avg(withMeta.map((r) => r.searchMeta.queries.length));
71
+ console.log(`3. Multi-query: avg ${avgQueries.toFixed(1)} queries → ${avgResult.toFixed(1)} results → ${avgFiltered.toFixed(1)} filtered`);
72
+ }
73
+ else {
74
+ console.log('3. Multi-query: no searchMeta data');
75
+ }
76
+ // 4. Language distribution
77
+ const languages = groupBy(records, (r) => r.primeLanguage || 'unknown');
78
+ console.log('4. Language distribution:');
79
+ for (const [lang, items] of Object.entries(languages)) {
80
+ console.log(` ${lang}: ${items.length}`);
81
+ }
82
+ // 5. Drift → violation correlation
83
+ const withDrift = records.filter((r) => r.driftScore > 0);
84
+ const withViolations = records.filter((r) => (r.guardViolations ?? 0) > 0);
85
+ console.log(`5. Drift: ${withDrift.length} records with drift, ${withViolations.length} with violations`);
86
+ if (withDrift.length > 0) {
87
+ const avgDriftScore = avg(withDrift.map((r) => r.driftScore));
88
+ console.log(` avg drift score: ${avgDriftScore.toFixed(3)}`);
89
+ }
90
+ // 6. Task completion rate
91
+ const withTask = records.filter((r) => r.taskId);
92
+ const completed = records.filter((r) => r.outcome === 'completed');
93
+ const failed = records.filter((r) => r.outcome === 'failed');
94
+ const abandoned = records.filter((r) => r.outcome === 'abandoned');
95
+ console.log(`6. Outcomes: ${completed.length} completed, ${failed.length} failed, ${abandoned.length} abandoned`);
96
+ if (withTask.length > 0) {
97
+ console.log(` Task completion: ${completed.length}/${withTask.length} (${pct(completed.length, withTask.length)})`);
98
+ }
99
+ // 7. Average intent duration
100
+ const durations = records.filter((r) => r.duration > 0).map((r) => r.duration);
101
+ if (durations.length > 0) {
102
+ const avgDur = avg(durations);
103
+ const medDur = median(durations);
104
+ console.log(`7. Duration: avg ${formatMs(avgDur)}, median ${formatMs(medDur)}`);
105
+ }
106
+ // 8. High-drift intents
107
+ const highDrift = records.filter((r) => r.driftScore > 0.5);
108
+ const highDriftWithManySearches = highDrift.filter((r) => r.searchQueries.length > 2);
109
+ console.log(`8. High-drift (>0.5): ${highDrift.length}, of which ${highDriftWithManySearches.length} had >2 search queries`);
110
+ console.log('');
111
+ }
112
+ // ── Helpers ─────────────────────────────────────────
113
+ function groupBy(items, key) {
114
+ const groups = {};
115
+ for (const item of items) {
116
+ const k = key(item);
117
+ (groups[k] ??= []).push(item);
118
+ }
119
+ return groups;
120
+ }
121
+ function avg(nums) {
122
+ if (nums.length === 0) {
123
+ return 0;
124
+ }
125
+ return nums.reduce((a, b) => a + b, 0) / nums.length;
126
+ }
127
+ function median(nums) {
128
+ if (nums.length === 0) {
129
+ return 0;
130
+ }
131
+ const sorted = [...nums].sort((a, b) => a - b);
132
+ const mid = Math.floor(sorted.length / 2);
133
+ return sorted.length % 2 === 0 ? (sorted[mid - 1] + sorted[mid]) / 2 : sorted[mid];
134
+ }
135
+ function pct(n, total) {
136
+ if (total === 0) {
137
+ return '0%';
138
+ }
139
+ return `${Math.round((n / total) * 100)}%`;
140
+ }
141
+ function formatMs(ms) {
142
+ if (ms < 1000) {
143
+ return `${Math.round(ms)}ms`;
144
+ }
145
+ if (ms < 60000) {
146
+ return `${(ms / 1000).toFixed(1)}s`;
147
+ }
148
+ return `${(ms / 60000).toFixed(1)}min`;
149
+ }
150
+ // ── Main ────────────────────────────────────────────
151
+ const projectRoot = process.argv[2] || process.env.ASD_PROJECT_DIR || process.cwd();
152
+ const signalDir = path.join(projectRoot, '.autosnippet', 'logs', 'signals');
153
+ console.log(`Reading signals from: ${signalDir}`);
154
+ const records = loadRecords(signalDir);
155
+ analyze(records);
@@ -69,7 +69,7 @@ function request(method, urlStr) {
69
69
  env,
70
70
  },
71
71
  next: [
72
- '在 MCP 客户端调用 autosnippet_health / autosnippet_capabilities 进行能力自检',
72
+ '在 MCP 客户端调用 autosnippet_health 进行能力自检',
73
73
  '如需鉴权,请在 MCP 服务器环境设置 ASD_MCP_TOKEN',
74
74
  '提交候选时传入 clientId 以启用限流(避免短时间批量提交)',
75
75
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autosnippet",
3
- "version": "3.3.0",
3
+ "version": "3.3.3",
4
4
  "description": "Extract code patterns into a knowledge base for AI coding assistants",
5
5
  "type": "module",
6
6
  "main": "dist/lib/bootstrap.js",