autosnippet 3.3.5 → 3.3.7

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 (279) hide show
  1. package/dashboard/dist/assets/icons-FHns2ypa.js +1 -0
  2. package/dashboard/dist/assets/index-BRJv5Y3r.js +135 -0
  3. package/dashboard/dist/assets/index-DzoB7kxK.css +1 -0
  4. package/dashboard/dist/index.html +3 -3
  5. package/dist/bin/api-server.js +1 -0
  6. package/dist/bin/cli.d.ts +1 -0
  7. package/dist/bin/cli.js +137 -9
  8. package/dist/lib/agent/AgentFactory.d.ts +0 -17
  9. package/dist/lib/agent/AgentFactory.js +1 -25
  10. package/dist/lib/agent/AgentRuntime.d.ts +2 -2
  11. package/dist/lib/agent/AgentRuntime.js +26 -18
  12. package/dist/lib/agent/capabilities.d.ts +11 -0
  13. package/dist/lib/agent/capabilities.js +29 -5
  14. package/dist/lib/agent/context/ExplorationTracker.js +10 -1
  15. package/dist/lib/agent/context/exploration/ExplorationStrategies.d.ts +2 -0
  16. package/dist/lib/agent/context/exploration/ExplorationStrategies.js +2 -2
  17. package/dist/lib/agent/domain/ChatAgentTasks.js +4 -0
  18. package/dist/lib/agent/domain/insight-analyst.d.ts +47 -3
  19. package/dist/lib/agent/domain/insight-analyst.js +111 -11
  20. package/dist/lib/agent/domain/insight-evolver.d.ts +69 -0
  21. package/dist/lib/agent/domain/insight-evolver.js +230 -0
  22. package/dist/lib/agent/domain/insight-gate.d.ts +42 -0
  23. package/dist/lib/agent/domain/insight-gate.js +41 -0
  24. package/dist/lib/agent/domain/insight-producer.d.ts +27 -2
  25. package/dist/lib/agent/domain/insight-producer.js +60 -5
  26. package/dist/lib/agent/domain/scan-prompts.js +10 -7
  27. package/dist/lib/agent/forced-summary.js +7 -2
  28. package/dist/lib/agent/memory/ActiveContext.d.ts +2 -28
  29. package/dist/lib/agent/memory/MemoryCoordinator.d.ts +2 -2
  30. package/dist/lib/agent/memory/SessionStore.d.ts +6 -12
  31. package/dist/lib/agent/memory/SessionStore.js +9 -15
  32. package/dist/lib/agent/memory/memory-flush-contract.d.ts +49 -0
  33. package/dist/lib/agent/memory/memory-flush-contract.js +16 -0
  34. package/dist/lib/agent/memory/session-store-schema.d.ts +20 -0
  35. package/dist/lib/agent/memory/session-store-schema.js +41 -0
  36. package/dist/lib/agent/presets.d.ts +89 -1
  37. package/dist/lib/agent/presets.js +53 -5
  38. package/dist/lib/agent/tools/_shared.d.ts +7 -15
  39. package/dist/lib/agent/tools/_shared.js +20 -21
  40. package/dist/lib/agent/tools/composite.d.ts +25 -22
  41. package/dist/lib/agent/tools/composite.js +108 -109
  42. package/dist/lib/agent/tools/evolution-tools.d.ts +145 -0
  43. package/dist/lib/agent/tools/evolution-tools.js +161 -0
  44. package/dist/lib/agent/tools/index.d.ts +163 -92
  45. package/dist/lib/agent/tools/index.js +9 -1
  46. package/dist/lib/agent/tools/lifecycle.d.ts +7 -1
  47. package/dist/lib/agent/tools/lifecycle.js +59 -75
  48. package/dist/lib/cli/AiScanService.js +5 -5
  49. package/dist/lib/cli/KnowledgeSyncService.js +1 -1
  50. package/dist/lib/core/AstAnalyzer.d.ts +1 -0
  51. package/dist/lib/core/discovery/ConfigWatcher.d.ts +64 -0
  52. package/dist/lib/core/discovery/ConfigWatcher.js +336 -0
  53. package/dist/lib/core/discovery/CustomConfigDiscoverer.d.ts +30 -0
  54. package/dist/lib/core/discovery/CustomConfigDiscoverer.js +1305 -0
  55. package/dist/lib/core/discovery/DiscovererPreference.d.ts +44 -0
  56. package/dist/lib/core/discovery/DiscovererPreference.js +141 -0
  57. package/dist/lib/core/discovery/DiscovererRegistry.d.ts +10 -1
  58. package/dist/lib/core/discovery/DiscovererRegistry.js +42 -2
  59. package/dist/lib/core/discovery/ProjectDiscoverer.d.ts +19 -0
  60. package/dist/lib/core/discovery/index.d.ts +2 -0
  61. package/dist/lib/core/discovery/index.js +4 -0
  62. package/dist/lib/core/discovery/parsers/CMakeParser.d.ts +32 -0
  63. package/dist/lib/core/discovery/parsers/CMakeParser.js +148 -0
  64. package/dist/lib/core/discovery/parsers/GradleDslParser.d.ts +43 -0
  65. package/dist/lib/core/discovery/parsers/GradleDslParser.js +171 -0
  66. package/dist/lib/core/discovery/parsers/JsonConfigParser.d.ts +45 -0
  67. package/dist/lib/core/discovery/parsers/JsonConfigParser.js +122 -0
  68. package/dist/lib/core/discovery/parsers/RubyDslParser.d.ts +49 -0
  69. package/dist/lib/core/discovery/parsers/RubyDslParser.js +282 -0
  70. package/dist/lib/core/discovery/parsers/StarlarkParser.d.ts +33 -0
  71. package/dist/lib/core/discovery/parsers/StarlarkParser.js +229 -0
  72. package/dist/lib/core/discovery/parsers/YamlConfigParser.d.ts +37 -0
  73. package/dist/lib/core/discovery/parsers/YamlConfigParser.js +212 -0
  74. package/dist/lib/{service/bootstrap/DimensionCopyRegistry.d.ts → domain/dimension/DimensionCopy.d.ts} +2 -2
  75. package/dist/lib/{service/bootstrap/DimensionCopyRegistry.js → domain/dimension/DimensionCopy.js} +22 -72
  76. package/dist/lib/domain/dimension/DimensionRegistry.d.ts +54 -0
  77. package/dist/lib/domain/dimension/DimensionRegistry.js +620 -0
  78. package/dist/lib/domain/dimension/DimensionSop.d.ts +55 -0
  79. package/dist/lib/domain/dimension/DimensionSop.js +1604 -0
  80. package/dist/lib/domain/dimension/UnifiedDimension.d.ts +61 -0
  81. package/dist/lib/domain/dimension/UnifiedDimension.js +53 -0
  82. package/dist/lib/domain/dimension/index.d.ts +10 -0
  83. package/dist/lib/domain/dimension/index.js +9 -0
  84. package/dist/lib/domain/knowledge/FieldSpec.d.ts +1 -1
  85. package/dist/lib/domain/knowledge/FieldSpec.js +29 -16
  86. package/dist/lib/domain/knowledge/KnowledgeEntry.d.ts +40 -112
  87. package/dist/lib/domain/knowledge/KnowledgeEntry.js +44 -9
  88. package/dist/lib/domain/knowledge/KnowledgeRepository.d.ts +1 -0
  89. package/dist/lib/domain/knowledge/KnowledgeRepository.js +3 -0
  90. package/dist/lib/domain/knowledge/Lifecycle.js +1 -1
  91. package/dist/lib/domain/knowledge/StyleGuide.d.ts +1 -1
  92. package/dist/lib/domain/knowledge/StyleGuide.js +1 -1
  93. package/dist/lib/domain/knowledge/UnifiedValidator.js +15 -0
  94. package/dist/lib/external/ai/AiProvider.d.ts +12 -0
  95. package/dist/lib/external/ai/AiProvider.js +24 -0
  96. package/dist/lib/external/ai/AiProviderManager.d.ts +101 -0
  97. package/dist/lib/external/ai/AiProviderManager.js +193 -0
  98. package/dist/lib/external/ai/providers/ClaudeProvider.js +11 -0
  99. package/dist/lib/external/ai/providers/GoogleGeminiProvider.js +18 -0
  100. package/dist/lib/external/ai/providers/MockProvider.d.ts +21 -3
  101. package/dist/lib/external/ai/providers/MockProvider.js +290 -14
  102. package/dist/lib/external/ai/providers/OpenAiProvider.js +16 -0
  103. package/dist/lib/external/lark/LarkTransport.d.ts +5 -1
  104. package/dist/lib/external/lark/LarkTransport.js +10 -2
  105. package/dist/lib/external/mcp/McpServer.js +4 -0
  106. package/dist/lib/external/mcp/handlers/TargetClassifier.d.ts +1 -1
  107. package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.d.ts +8 -16
  108. package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.js +10 -10
  109. package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.d.ts +7 -0
  110. package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.js +20 -0
  111. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.d.ts +52 -132
  112. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.js +204 -17
  113. package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.d.ts +11 -75
  114. package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.js +40 -191
  115. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.d.ts +13 -78
  116. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.js +30 -52
  117. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-context.d.ts +0 -1
  118. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/mock-pipeline.d.ts +20 -0
  119. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/mock-pipeline.js +432 -0
  120. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.d.ts +99 -12
  121. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +188 -169
  122. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/tier-scheduler.js +7 -17
  123. package/dist/lib/external/mcp/handlers/bootstrap/refine.js +8 -0
  124. package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.d.ts +46 -0
  125. package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.js +58 -0
  126. package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.d.ts +25 -0
  127. package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.js +47 -0
  128. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.d.ts +50 -12
  129. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.js +30 -10
  130. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-text.js +1 -1
  131. package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.d.ts +24 -0
  132. package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.js +14 -0
  133. package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.d.ts +14 -0
  134. package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.js +48 -0
  135. package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.d.ts +21 -0
  136. package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.js +45 -0
  137. package/dist/lib/external/mcp/handlers/bootstrap/shared/skill-generator.d.ts +1 -1
  138. package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.d.ts +27 -0
  139. package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.js +44 -0
  140. package/dist/lib/external/mcp/handlers/bootstrap-external.d.ts +23 -10
  141. package/dist/lib/external/mcp/handlers/bootstrap-external.js +41 -51
  142. package/dist/lib/external/mcp/handlers/bootstrap-internal.d.ts +2 -0
  143. package/dist/lib/external/mcp/handlers/bootstrap-internal.js +117 -82
  144. package/dist/lib/external/mcp/handlers/consolidated.d.ts +4 -4
  145. package/dist/lib/external/mcp/handlers/consolidated.js +108 -332
  146. package/dist/lib/external/mcp/handlers/dimension-complete-external.js +71 -2
  147. package/dist/lib/external/mcp/handlers/evolve-external.d.ts +54 -0
  148. package/dist/lib/external/mcp/handlers/evolve-external.js +229 -0
  149. package/dist/lib/external/mcp/handlers/knowledge.js +30 -5
  150. package/dist/lib/external/mcp/handlers/rescan-external.d.ts +76 -0
  151. package/dist/lib/external/mcp/handlers/rescan-external.js +335 -0
  152. package/dist/lib/external/mcp/handlers/rescan-internal.d.ts +120 -0
  153. package/dist/lib/external/mcp/handlers/rescan-internal.js +359 -0
  154. package/dist/lib/external/mcp/handlers/search.d.ts +6 -5
  155. package/dist/lib/external/mcp/handlers/search.js +6 -5
  156. package/dist/lib/external/mcp/handlers/types.d.ts +2 -1
  157. package/dist/lib/external/mcp/handlers/wiki-external.js +2 -2
  158. package/dist/lib/external/mcp/tools.d.ts +8 -18
  159. package/dist/lib/external/mcp/tools.js +58 -2
  160. package/dist/lib/http/routes/ai.js +111 -30
  161. package/dist/lib/http/routes/candidates.js +11 -4
  162. package/dist/lib/http/routes/commands.js +10 -1
  163. package/dist/lib/http/routes/health.js +11 -0
  164. package/dist/lib/http/routes/knowledge.js +122 -1
  165. package/dist/lib/http/routes/modules.js +52 -3
  166. package/dist/lib/http/routes/panorama.js +16 -4
  167. package/dist/lib/http/routes/recipes.js +7 -0
  168. package/dist/lib/http/utils/routeHelpers.js +2 -1
  169. package/dist/lib/infrastructure/cache/CacheCoordinator.d.ts +41 -0
  170. package/dist/lib/infrastructure/cache/CacheCoordinator.js +105 -0
  171. package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.d.ts +7 -0
  172. package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.js +28 -0
  173. package/dist/lib/infrastructure/vector/HnswVectorAdapter.js +1 -1
  174. package/dist/lib/injection/ServiceContainer.d.ts +6 -5
  175. package/dist/lib/injection/ServiceContainer.js +64 -25
  176. package/dist/lib/injection/ServiceMap.d.ts +10 -1
  177. package/dist/lib/injection/modules/AiModule.d.ts +6 -9
  178. package/dist/lib/injection/modules/AiModule.js +82 -39
  179. package/dist/lib/injection/modules/KnowledgeModule.js +15 -1
  180. package/dist/lib/injection/modules/PanoramaModule.js +1 -1
  181. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.d.ts +4 -0
  182. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.js +16 -1
  183. package/dist/lib/service/bootstrap/BootstrapEventEmitter.d.ts +3 -2
  184. package/dist/lib/service/bootstrap/BootstrapEventEmitter.js +1 -1
  185. package/dist/lib/service/bootstrap/DeliveryVerifier.d.ts +51 -0
  186. package/dist/lib/service/bootstrap/DeliveryVerifier.js +163 -0
  187. package/dist/lib/service/bootstrap/UiStartupTasks.d.ts +5 -0
  188. package/dist/lib/service/bootstrap/UiStartupTasks.js +20 -0
  189. package/dist/lib/service/bootstrap/bootstrap-event-types.d.ts +54 -0
  190. package/dist/lib/service/bootstrap/bootstrap-event-types.js +10 -0
  191. package/dist/lib/service/cleanup/CleanupService.d.ts +132 -0
  192. package/dist/lib/service/cleanup/CleanupService.js +571 -0
  193. package/dist/lib/service/delivery/AgentInstructionsGenerator.js +39 -43
  194. package/dist/lib/service/delivery/FileProtection.d.ts +20 -0
  195. package/dist/lib/service/delivery/FileProtection.js +54 -0
  196. package/dist/lib/service/delivery/SkillsSyncer.js +16 -21
  197. package/dist/lib/service/evolution/ContentPatcher.d.ts +44 -0
  198. package/dist/lib/service/evolution/ContentPatcher.js +310 -0
  199. package/dist/lib/service/evolution/ProposalExecutor.d.ts +4 -0
  200. package/dist/lib/service/evolution/ProposalExecutor.js +77 -13
  201. package/dist/lib/service/evolution/RecipeLifecycleSupervisor.d.ts +64 -0
  202. package/dist/lib/service/evolution/RecipeLifecycleSupervisor.js +458 -0
  203. package/dist/lib/service/evolution/RecipeRelevanceAuditor.d.ts +89 -0
  204. package/dist/lib/service/evolution/RecipeRelevanceAuditor.js +492 -0
  205. package/dist/lib/service/evolution/createSupersedeProposal.d.ts +44 -0
  206. package/dist/lib/service/evolution/createSupersedeProposal.js +81 -0
  207. package/dist/lib/service/guard/ComplianceReporter.d.ts +4 -0
  208. package/dist/lib/service/guard/ComplianceReporter.js +51 -0
  209. package/dist/lib/service/guard/GuardCheckEngine.js +5 -4
  210. package/dist/lib/service/knowledge/CodeEntityGraph.d.ts +6 -0
  211. package/dist/lib/service/knowledge/CodeEntityGraph.js +16 -0
  212. package/dist/lib/service/knowledge/ConfidenceRouter.js +1 -1
  213. package/dist/lib/service/knowledge/KnowledgeService.d.ts +11 -1
  214. package/dist/lib/service/knowledge/KnowledgeService.js +67 -14
  215. package/dist/lib/service/knowledge/RecipeProductionGateway.d.ts +225 -0
  216. package/dist/lib/service/knowledge/RecipeProductionGateway.js +384 -0
  217. package/dist/lib/service/module/ModuleService.js +10 -19
  218. package/dist/lib/service/panorama/CouplingAnalyzer.d.ts +10 -1
  219. package/dist/lib/service/panorama/CouplingAnalyzer.js +44 -2
  220. package/dist/lib/service/panorama/DimensionAnalyzer.d.ts +4 -3
  221. package/dist/lib/service/panorama/DimensionAnalyzer.js +40 -151
  222. package/dist/lib/service/panorama/LayerInferrer.d.ts +16 -1
  223. package/dist/lib/service/panorama/LayerInferrer.js +118 -1
  224. package/dist/lib/service/panorama/ModuleDiscoverer.d.ts +9 -0
  225. package/dist/lib/service/panorama/ModuleDiscoverer.js +58 -2
  226. package/dist/lib/service/panorama/PanoramaAggregator.d.ts +6 -2
  227. package/dist/lib/service/panorama/PanoramaAggregator.js +84 -6
  228. package/dist/lib/service/panorama/PanoramaScanner.js +28 -0
  229. package/dist/lib/service/panorama/PanoramaService.js +10 -5
  230. package/dist/lib/service/panorama/PanoramaTypes.d.ts +38 -0
  231. package/dist/lib/service/panorama/RoleRefiner.d.ts +2 -0
  232. package/dist/lib/service/panorama/RoleRefiner.js +41 -0
  233. package/dist/lib/service/panorama/TechStackProfiler.d.ts +13 -0
  234. package/dist/lib/service/panorama/TechStackProfiler.js +191 -0
  235. package/dist/lib/service/search/BM25Scorer.d.ts +2 -2
  236. package/dist/lib/service/search/SearchEngine.d.ts +11 -10
  237. package/dist/lib/service/search/SearchEngine.js +38 -36
  238. package/dist/lib/service/search/SearchTypes.d.ts +14 -8
  239. package/dist/lib/service/search/SearchTypes.js +1 -1
  240. package/dist/lib/service/search/tokenizer.d.ts +1 -1
  241. package/dist/lib/service/search/tokenizer.js +2 -2
  242. package/dist/lib/service/skills/SignalCollector.d.ts +1 -0
  243. package/dist/lib/service/skills/SignalCollector.js +6 -5
  244. package/dist/lib/service/vector/ContextualEnricher.d.ts +1 -0
  245. package/dist/lib/service/vector/ContextualEnricher.js +4 -0
  246. package/dist/lib/shared/LanguageService.js +3 -0
  247. package/dist/lib/shared/developer-identity.d.ts +18 -0
  248. package/dist/lib/shared/developer-identity.js +62 -0
  249. package/dist/lib/shared/schemas/common.d.ts +4 -4
  250. package/dist/lib/shared/schemas/http-requests.d.ts +20 -18
  251. package/dist/lib/shared/schemas/http-requests.js +17 -6
  252. package/dist/lib/shared/schemas/mcp-tools.d.ts +32 -2
  253. package/dist/lib/shared/schemas/mcp-tools.js +38 -0
  254. package/dist/lib/types/evolution.d.ts +135 -0
  255. package/dist/lib/types/evolution.js +6 -0
  256. package/dist/lib/types/graph-shared.d.ts +25 -0
  257. package/dist/lib/types/graph-shared.js +7 -0
  258. package/dist/lib/types/knowledge-wire.d.ts +132 -0
  259. package/dist/lib/types/knowledge-wire.js +7 -0
  260. package/dist/lib/types/project-snapshot-builder.d.ts +19 -0
  261. package/dist/lib/types/project-snapshot-builder.js +189 -0
  262. package/dist/lib/types/project-snapshot.d.ts +399 -0
  263. package/dist/lib/types/project-snapshot.js +17 -0
  264. package/dist/lib/types/search-wire.d.ts +46 -0
  265. package/dist/lib/types/search-wire.js +7 -0
  266. package/dist/lib/types/snapshot-views.d.ts +58 -0
  267. package/dist/lib/types/snapshot-views.js +103 -0
  268. package/package.json +1 -1
  269. package/skills/autosnippet-recipes/SKILL.md +1 -1
  270. package/templates/instructions/agent-static.md +2 -0
  271. package/templates/instructions/conventions.md +3 -1
  272. package/templates/recipes-setup/README.md +2 -2
  273. package/dashboard/dist/assets/icons-BJ2mUBi8.js +0 -1
  274. package/dashboard/dist/assets/index-B659K9t5.js +0 -128
  275. package/dashboard/dist/assets/index-NCm40PMD.css +0 -1
  276. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.d.ts +0 -169
  277. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.js +0 -727
  278. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.d.ts +0 -370
  279. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.js +0 -821
@@ -1,4 +1,4 @@
1
- import { and, eq } from 'drizzle-orm';
1
+ import { and, eq, sql } from 'drizzle-orm';
2
2
  import { inferKind, KnowledgeEntry } from '../../domain/knowledge/index.js';
3
3
  import { getDrizzle } from '../../infrastructure/database/drizzle/index.js';
4
4
  import { knowledgeEntries } from '../../infrastructure/database/drizzle/schema.js';
@@ -45,6 +45,21 @@ export class KnowledgeRepositoryImpl extends BaseRepository {
45
45
  throw error;
46
46
  }
47
47
  }
48
+ /**
49
+ * 按标题精确查找(大小写不敏感)
50
+ */
51
+ async findByTitle(title) {
52
+ const rows = this.#drizzle
53
+ .select()
54
+ .from(knowledgeEntries)
55
+ .where(sql `lower(${knowledgeEntries.title}) = lower(${title})`)
56
+ .limit(1)
57
+ .all();
58
+ if (rows.length === 0) {
59
+ return null;
60
+ }
61
+ return this._rowToEntity(rows[0]);
62
+ }
48
63
  /**
49
64
  * 更新 KnowledgeEntry(接受完整实体或部分数据)
50
65
  * ★ Drizzle 类型安全 UPDATE
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @module shared/BootstrapEventEmitter
8
8
  */
9
+ import type { DimensionCompletePayload, ProgressPayload } from './bootstrap-event-types.js';
9
10
  export declare class BootstrapEventEmitter {
10
11
  #private;
11
12
  /** @param container DI Container */
@@ -23,7 +24,7 @@ export declare class BootstrapEventEmitter {
23
24
  * @param [data.skillCreated] 是否生成了 Skill
24
25
  * @param [data.recipesBound] 关联的 recipe 数量
25
26
  */
26
- emitDimensionComplete(dimId: string, data?: Record<string, unknown>): void;
27
+ emitDimensionComplete(dimId: string, data: DimensionCompletePayload): void;
27
28
  /**
28
29
  * 推送全部维度完成事件
29
30
  *
@@ -51,6 +52,6 @@ export declare class BootstrapEventEmitter {
51
52
  * @param event 事件名
52
53
  * @param data 事件数据
53
54
  */
54
- emitProgress(event: string, data?: Record<string, unknown>): void;
55
+ emitProgress(event: string, data?: ProgressPayload): void;
55
56
  }
56
57
  export default BootstrapEventEmitter;
@@ -39,7 +39,7 @@ export class BootstrapEventEmitter {
39
39
  * @param [data.skillCreated] 是否生成了 Skill
40
40
  * @param [data.recipesBound] 关联的 recipe 数量
41
41
  */
42
- emitDimensionComplete(dimId, data = {}) {
42
+ emitDimensionComplete(dimId, data) {
43
43
  // TaskManager 标记
44
44
  try {
45
45
  this.#taskManager?.markTaskCompleted?.(dimId, data);
@@ -0,0 +1,51 @@
1
+ /**
2
+ * DeliveryVerifier — Bootstrap/Rescan 完成后交付完整性检查
3
+ *
4
+ * 验证以下交付物是否正确生成:
5
+ * - Channel A: autosnippet-project-rules.mdc
6
+ * - Channel B: autosnippet-patterns 系列文件
7
+ * - Channel C: .cursor/skills/ 目录
8
+ * - Channel F: AGENTS.md, CLAUDE.md, copilot-instructions.md
9
+ * - Wiki: meta.json
10
+ * - Skills: project 级 Skill 目录
11
+ * - 向量索引: asvec 文件
12
+ *
13
+ * @module service/bootstrap/DeliveryVerifier
14
+ */
15
+ /** §10.5 交付通道标识 */
16
+ export type DeliveryChannel = 'channelA' | 'channelB' | 'channelC' | 'channelF' | 'wiki' | 'skills' | 'vectorIndex';
17
+ /** 单通道验证结果 */
18
+ export interface ChannelVerification {
19
+ generated: boolean;
20
+ file?: string;
21
+ files?: string[];
22
+ count?: number;
23
+ size?: number;
24
+ skillCount?: number;
25
+ pageCount?: number;
26
+ documentCount?: number;
27
+ agentsMd?: boolean;
28
+ claudeMd?: boolean;
29
+ copilotInstructions?: boolean;
30
+ rebuilt?: boolean;
31
+ }
32
+ /** 完整验证结果 */
33
+ export interface DeliveryVerification {
34
+ channelA: ChannelVerification;
35
+ channelB: ChannelVerification;
36
+ channelC: ChannelVerification;
37
+ channelF: ChannelVerification;
38
+ wiki: ChannelVerification;
39
+ skills: ChannelVerification;
40
+ vectorIndex: ChannelVerification;
41
+ allPassed: boolean;
42
+ failures: string[];
43
+ }
44
+ export declare class DeliveryVerifier {
45
+ #private;
46
+ constructor(projectRoot: string);
47
+ /**
48
+ * 验证所有交付物是否正确生成
49
+ */
50
+ verify(): DeliveryVerification;
51
+ }
@@ -0,0 +1,163 @@
1
+ /**
2
+ * DeliveryVerifier — Bootstrap/Rescan 完成后交付完整性检查
3
+ *
4
+ * 验证以下交付物是否正确生成:
5
+ * - Channel A: autosnippet-project-rules.mdc
6
+ * - Channel B: autosnippet-patterns 系列文件
7
+ * - Channel C: .cursor/skills/ 目录
8
+ * - Channel F: AGENTS.md, CLAUDE.md, copilot-instructions.md
9
+ * - Wiki: meta.json
10
+ * - Skills: project 级 Skill 目录
11
+ * - 向量索引: asvec 文件
12
+ *
13
+ * @module service/bootstrap/DeliveryVerifier
14
+ */
15
+ import fs from 'node:fs';
16
+ import path from 'node:path';
17
+ import { getContextIndexPath, getProjectKnowledgePath, getProjectSkillsPath, } from '#infra/config/Paths.js';
18
+ // ── DeliveryVerifier ────────────────────────────────────────
19
+ export class DeliveryVerifier {
20
+ #projectRoot;
21
+ constructor(projectRoot) {
22
+ this.#projectRoot = projectRoot;
23
+ }
24
+ /**
25
+ * 验证所有交付物是否正确生成
26
+ */
27
+ verify() {
28
+ const failures = [];
29
+ // Channel A: .cursor/rules/autosnippet-project-rules.mdc
30
+ const channelA = this.#verifyChannelA();
31
+ if (!channelA.generated) {
32
+ failures.push('Channel A: autosnippet-project-rules.mdc missing or empty');
33
+ }
34
+ // Channel B: .cursor/rules/autosnippet-patterns-*.mdc
35
+ const channelB = this.#verifyChannelB();
36
+ if (!channelB.generated) {
37
+ failures.push('Channel B: no autosnippet-patterns-*.mdc files found');
38
+ }
39
+ // Channel C: .cursor/skills/
40
+ const channelC = this.#verifyChannelC();
41
+ if (!channelC.generated) {
42
+ failures.push('Channel C: .cursor/skills/ directory missing');
43
+ }
44
+ // Channel F: AGENTS.md, CLAUDE.md, copilot-instructions.md
45
+ const channelF = this.#verifyChannelF();
46
+ if (!channelF.generated) {
47
+ failures.push('Channel F: agent instruction files incomplete');
48
+ }
49
+ // Wiki
50
+ const wiki = this.#verifyWiki();
51
+ // Skills
52
+ const skills = this.#verifySkills();
53
+ // Vector Index
54
+ const vectorIndex = this.#verifyVectorIndex();
55
+ return {
56
+ channelA,
57
+ channelB,
58
+ channelC,
59
+ channelF,
60
+ wiki,
61
+ skills,
62
+ vectorIndex,
63
+ allPassed: failures.length === 0,
64
+ failures,
65
+ };
66
+ }
67
+ // ─── 各通道验证 ───────────────────────────────────────
68
+ #verifyChannelA() {
69
+ const filePath = path.join(this.#projectRoot, '.cursor', 'rules', 'autosnippet-project-rules.mdc');
70
+ if (fs.existsSync(filePath)) {
71
+ const size = fs.statSync(filePath).size;
72
+ return { generated: size > 0, file: 'autosnippet-project-rules.mdc', size };
73
+ }
74
+ return { generated: false };
75
+ }
76
+ #verifyChannelB() {
77
+ const rulesDir = path.join(this.#projectRoot, '.cursor', 'rules');
78
+ if (!fs.existsSync(rulesDir)) {
79
+ return { generated: false, files: [], count: 0 };
80
+ }
81
+ const files = fs
82
+ .readdirSync(rulesDir)
83
+ .filter((f) => f.startsWith('autosnippet-patterns-') && f.endsWith('.mdc'));
84
+ return {
85
+ generated: files.length > 0,
86
+ files,
87
+ count: files.length,
88
+ };
89
+ }
90
+ #verifyChannelC() {
91
+ const skillsDir = path.join(this.#projectRoot, '.cursor', 'skills');
92
+ if (!fs.existsSync(skillsDir)) {
93
+ return { generated: false, skillCount: 0 };
94
+ }
95
+ const count = fs.readdirSync(skillsDir).length;
96
+ return { generated: true, skillCount: count };
97
+ }
98
+ #verifyChannelF() {
99
+ const agentsMd = this.#hasAutoSnippetSection(path.join(this.#projectRoot, 'AGENTS.md'));
100
+ const claudeMd = this.#hasAutoSnippetSection(path.join(this.#projectRoot, 'CLAUDE.md'));
101
+ const copilotInstructions = this.#hasAutoSnippetSection(path.join(this.#projectRoot, '.github', 'copilot-instructions.md'));
102
+ return {
103
+ generated: agentsMd || claudeMd || copilotInstructions,
104
+ agentsMd,
105
+ claudeMd,
106
+ copilotInstructions,
107
+ };
108
+ }
109
+ #verifyWiki() {
110
+ const kbPath = getProjectKnowledgePath(this.#projectRoot);
111
+ const metaPath = path.join(kbPath, 'wiki', 'meta.json');
112
+ if (fs.existsSync(metaPath)) {
113
+ try {
114
+ const meta = JSON.parse(fs.readFileSync(metaPath, 'utf8'));
115
+ return {
116
+ generated: true,
117
+ pageCount: meta.pages?.length || 0,
118
+ };
119
+ }
120
+ catch {
121
+ return { generated: false };
122
+ }
123
+ }
124
+ return { generated: false };
125
+ }
126
+ #verifySkills() {
127
+ const skillsDir = getProjectSkillsPath(this.#projectRoot);
128
+ if (!fs.existsSync(skillsDir)) {
129
+ return { generated: false, skillCount: 0 };
130
+ }
131
+ const dirs = fs
132
+ .readdirSync(skillsDir)
133
+ .filter((d) => d.startsWith('project-') && fs.statSync(path.join(skillsDir, d)).isDirectory());
134
+ return { generated: dirs.length > 0, skillCount: dirs.length };
135
+ }
136
+ #verifyVectorIndex() {
137
+ const indexDir = getContextIndexPath(this.#projectRoot);
138
+ if (!fs.existsSync(indexDir)) {
139
+ return { generated: false, rebuilt: false, documentCount: 0 };
140
+ }
141
+ const asvecFiles = fs
142
+ .readdirSync(indexDir)
143
+ .filter((f) => f.endsWith('.asvec') || f.endsWith('.json'));
144
+ return {
145
+ generated: asvecFiles.length > 0,
146
+ rebuilt: true,
147
+ documentCount: asvecFiles.length,
148
+ };
149
+ }
150
+ // ─── 辅助 ───────────────────────────────────────────
151
+ #hasAutoSnippetSection(filePath) {
152
+ try {
153
+ if (!fs.existsSync(filePath)) {
154
+ return false;
155
+ }
156
+ const content = fs.readFileSync(filePath, 'utf8');
157
+ return content.includes('autosnippet:begin');
158
+ }
159
+ catch {
160
+ return false;
161
+ }
162
+ }
163
+ }
@@ -8,6 +8,7 @@
8
8
  * 4. refreshIndex: BM25 增量刷新
9
9
  * 5. proposalCheck: 到期 Proposal 检查 + 自动执行/拒绝
10
10
  * 6. metabolismCycle: 知识新陈代谢(矛盾/冗余/衰退扫描 → 新 Proposal)
11
+ * 7. timeoutCheck: 中间态超时兜底(evolving/decaying 超时自动恢复)
11
12
  */
12
13
  interface UiStartupContext {
13
14
  projectRoot: string;
@@ -47,6 +48,10 @@ export interface UiStartupReport {
47
48
  redundancies: number;
48
49
  decaying: number;
49
50
  };
51
+ timeoutCheck?: {
52
+ timedOut: number;
53
+ checked: number;
54
+ };
50
55
  durationMs: number;
51
56
  errors: string[];
52
57
  }
@@ -8,6 +8,7 @@
8
8
  * 4. refreshIndex: BM25 增量刷新
9
9
  * 5. proposalCheck: 到期 Proposal 检查 + 自动执行/拒绝
10
10
  * 6. metabolismCycle: 知识新陈代谢(矛盾/冗余/衰退扫描 → 新 Proposal)
11
+ * 7. timeoutCheck: 中间态超时兜底(evolving/decaying 超时自动恢复)
11
12
  */
12
13
  import Logger from '../../infrastructure/logging/Logger.js';
13
14
  const logger = Logger.getInstance();
@@ -141,6 +142,25 @@ export async function runUiStartupTasks(ctx) {
141
142
  report.errors.push(msg);
142
143
  logger.warn(`[UiStartupTasks] ${msg}`);
143
144
  }
145
+ // ── Stage 7: Supervisor — 中间态超时兜底 ──
146
+ try {
147
+ if (ctx.container.services.lifecycleSupervisor) {
148
+ const supervisor = ctx.container.get('lifecycleSupervisor');
149
+ const result = supervisor.checkTimeouts();
150
+ report.timeoutCheck = {
151
+ timedOut: result.timedOut.length,
152
+ checked: result.checked,
153
+ };
154
+ if (result.timedOut.length > 0) {
155
+ logger.info(`[UiStartupTasks] Stage 7: timeout check — ${result.timedOut.length} recipes timed out (checked: ${result.checked})`);
156
+ }
157
+ }
158
+ }
159
+ catch (err) {
160
+ const msg = `timeout check failed: ${err.message}`;
161
+ report.errors.push(msg);
162
+ logger.warn(`[UiStartupTasks] ${msg}`);
163
+ }
144
164
  report.durationMs = Date.now() - start;
145
165
  logger.info(`[UiStartupTasks] All tasks completed in ${report.durationMs}ms`, {
146
166
  errors: report.errors.length,
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Bootstrap Event Types — 事件 payload 类型化
3
+ *
4
+ * 替代 BootstrapEventEmitter 中所有 `Record<string, unknown>` payload,
5
+ * 通过 discriminated union(`type` 字段)实现编译期事件校验。
6
+ *
7
+ * @module service/bootstrap/bootstrap-event-types
8
+ * @see docs/copilot/unified-project-snapshot-design.md §11.3 H6
9
+ */
10
+ export interface DimensionSkippedPayload {
11
+ type: 'skipped';
12
+ reason: string;
13
+ }
14
+ export interface DimensionRestoredPayload {
15
+ type: 'incremental-restored';
16
+ reason: string;
17
+ }
18
+ export interface DimensionCheckpointRestoredPayload {
19
+ type: 'checkpoint-restored';
20
+ [key: string]: unknown;
21
+ }
22
+ export interface DimensionErrorPayload {
23
+ type: 'error';
24
+ reason: string;
25
+ }
26
+ export interface DimensionPipelineCompletePayload {
27
+ type: 'candidate' | 'skill';
28
+ extracted: number;
29
+ created: number;
30
+ status: string;
31
+ degraded: boolean;
32
+ durationMs: number;
33
+ toolCallCount: number;
34
+ source: string;
35
+ }
36
+ export interface DimensionSkillPayload {
37
+ type: 'skill';
38
+ skillName: string;
39
+ sourceCount: number;
40
+ }
41
+ export interface DimensionExternalCompletePayload {
42
+ type: 'skill' | 'candidate';
43
+ extracted: number;
44
+ skillCreated: boolean;
45
+ recipesBound: number;
46
+ progress: string;
47
+ isBootstrapComplete: boolean;
48
+ source: string;
49
+ }
50
+ /** Discriminated union — 通过 `type` 字段区分 */
51
+ export type DimensionCompletePayload = DimensionSkippedPayload | DimensionRestoredPayload | DimensionCheckpointRestoredPayload | DimensionErrorPayload | DimensionPipelineCompletePayload | DimensionSkillPayload | DimensionExternalCompletePayload;
52
+ export interface ProgressPayload {
53
+ [key: string]: unknown;
54
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Bootstrap Event Types — 事件 payload 类型化
3
+ *
4
+ * 替代 BootstrapEventEmitter 中所有 `Record<string, unknown>` payload,
5
+ * 通过 discriminated union(`type` 字段)实现编译期事件校验。
6
+ *
7
+ * @module service/bootstrap/bootstrap-event-types
8
+ * @see docs/copilot/unified-project-snapshot-design.md §11.3 H6
9
+ */
10
+ export {};
@@ -0,0 +1,132 @@
1
+ /**
2
+ * CleanupService — 统一数据清理策略(垃圾桶模式)
3
+ *
4
+ * 提供两种清理模式:
5
+ * - fullReset(): 全量清理 — 将旧数据打包到时间戳垃圾桶文件夹,DB 表清空
6
+ * - rescanClean(): Rescan 清理 — 保留 Recipe,清除衍生缓存
7
+ * - snapshotRecipes(): 快照当前活跃 Recipe 信息
8
+ * - purgeExpiredTrash(): 清除超时限的垃圾桶文件夹
9
+ *
10
+ * 垃圾桶设计:
11
+ * - 位于 .autosnippet/.trash/<ISO-timestamp>/ 下
12
+ * - fullReset 时先将 candidates/ recipes/ skills/ wiki/ 移入垃圾桶,再清 DB
13
+ * - DB 数据导出为 db-snapshot.jsonl 保存在垃圾桶内
14
+ * - 超过保留天数(默认 7 天)的垃圾桶在下次 fullReset 或服务启动时自动清除
15
+ * - 暂不提供恢复功能(需要 merge 处理过于复杂)
16
+ *
17
+ * 保留原则:
18
+ * - 配置数据 (config.json, constitution.yaml, boxspec.json) 永不清理
19
+ * - IDE 集成配置 (.vscode/, .cursor/, .github/) 永不清理
20
+ * - 交付物 (.cursor/rules/autosnippet-*) 由 R4 重建,不在此清理
21
+ *
22
+ * @module service/cleanup/CleanupService
23
+ */
24
+ /** Logger 接口 */
25
+ interface CleanupLogger {
26
+ info(msg: string, meta?: Record<string, unknown>): void;
27
+ warn(msg: string, meta?: Record<string, unknown>): void;
28
+ }
29
+ /** 清理结果 */
30
+ export interface CleanupResult {
31
+ deletedFiles: number;
32
+ clearedTables: string[];
33
+ preservedRecipes: number;
34
+ errors: string[];
35
+ /** 垃圾桶信息(fullReset 时填充) */
36
+ trash?: {
37
+ /** 垃圾桶文件夹路径 */
38
+ folder: string;
39
+ /** 移入垃圾桶的文件/目录数 */
40
+ movedItems: number;
41
+ /** DB 快照行数 */
42
+ dbSnapshotRows: number;
43
+ };
44
+ /** 本次清除的过期垃圾桶 */
45
+ purgedTrash?: {
46
+ /** 清除的垃圾桶数 */
47
+ count: number;
48
+ /** 释放的磁盘空间估算 (bytes) */
49
+ freedBytes: number;
50
+ };
51
+ }
52
+ /** Recipe 快照条目 */
53
+ export interface RecipeSnapshotEntry {
54
+ id: string;
55
+ title: string;
56
+ trigger: string;
57
+ category: string;
58
+ knowledgeType: string;
59
+ doClause: string;
60
+ sourceFile?: string;
61
+ lifecycle: string;
62
+ /** Recipe 完整内容 (JSON parsed) — Evolution Agent 需要 */
63
+ content?: {
64
+ markdown?: string;
65
+ rationale?: string;
66
+ coreCode?: string;
67
+ };
68
+ /** 源文件引用列表 (JSON parsed) — Evolution Agent 需要 */
69
+ sourceRefs?: string[];
70
+ }
71
+ /** Recipe 快照 */
72
+ export interface RecipeSnapshot {
73
+ count: number;
74
+ entries: RecipeSnapshotEntry[];
75
+ coverageByDimension: Record<string, number>;
76
+ }
77
+ export declare class CleanupService {
78
+ #private;
79
+ constructor(opts: {
80
+ projectRoot: string;
81
+ db?: unknown;
82
+ logger?: CleanupLogger;
83
+ });
84
+ /** 更新 DB 引用(fullReset 后重连时调用) */
85
+ setDb(db: unknown): void;
86
+ /**
87
+ * 全量清理 — 用于 bootstrap 冷启动(垃圾桶模式)
88
+ *
89
+ * 流程:
90
+ * 1. 先清除过期垃圾桶(超过 TRASH_RETENTION_DAYS)
91
+ * 2. 创建时间戳垃圾桶文件夹
92
+ * 3. 将 candidates/ recipes/ skills/ wiki/ 移入垃圾桶
93
+ * 4. 导出 DB 关键表数据到 db-snapshot.jsonl
94
+ * 5. 清空 DB 所有数据表
95
+ * 6. 清除向量索引、bootstrap-report、logs 等缓存
96
+ *
97
+ * 保留: config.json、constitution.yaml、boxspec.json、IDE 配置
98
+ */
99
+ fullReset(): Promise<CleanupResult>;
100
+ /**
101
+ * Rescan 清理 — 保留 Recipe,清除衍生缓存
102
+ *
103
+ * 清除: 衍生 DB 表、pending/rejected/deprecated 知识条目、
104
+ * candidates/、skills/、wiki/、向量索引、bootstrap-report
105
+ * 保留: recipes/、active/published/staging/evolving 知识条目、
106
+ * knowledge_edges、evolution_proposals
107
+ */
108
+ rescanClean(): Promise<CleanupResult>;
109
+ /**
110
+ * 快照当前活跃 Recipe 信息
111
+ * 用于 rescan 前记录保留的知识条目
112
+ */
113
+ snapshotRecipes(): Promise<RecipeSnapshot>;
114
+ /**
115
+ * 清除超过保留期限的垃圾桶文件夹
116
+ * 可在服务启动时或 fullReset 前调用
117
+ */
118
+ purgeExpiredTrash(): {
119
+ count: number;
120
+ freedBytes: number;
121
+ folders: string[];
122
+ };
123
+ /**
124
+ * 列出当前所有垃圾桶(供 Dashboard 展示)
125
+ */
126
+ listTrashFolders(): Array<{
127
+ name: string;
128
+ createdAt: Date;
129
+ sizeMB: number;
130
+ }>;
131
+ }
132
+ export {};