autosnippet 3.3.4 → 3.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/README.md +174 -83
  2. package/config/constitution.yaml +2 -0
  3. package/dashboard/dist/assets/icons-D1aVZYFW.js +1 -0
  4. package/dashboard/dist/assets/index-CxHOu8Hd.css +1 -0
  5. package/dashboard/dist/assets/index-DDdAOpYT.js +128 -0
  6. package/dashboard/dist/index.html +3 -3
  7. package/dist/bin/api-server.js +1 -0
  8. package/dist/bin/cli.d.ts +1 -0
  9. package/dist/bin/cli.js +136 -9
  10. package/dist/lib/agent/AgentFactory.d.ts +0 -17
  11. package/dist/lib/agent/AgentFactory.js +1 -25
  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/insight-analyst.d.ts +47 -3
  18. package/dist/lib/agent/domain/insight-analyst.js +111 -11
  19. package/dist/lib/agent/domain/insight-evolver.d.ts +69 -0
  20. package/dist/lib/agent/domain/insight-evolver.js +230 -0
  21. package/dist/lib/agent/domain/insight-gate.d.ts +42 -0
  22. package/dist/lib/agent/domain/insight-gate.js +41 -0
  23. package/dist/lib/agent/domain/insight-producer.d.ts +27 -2
  24. package/dist/lib/agent/domain/insight-producer.js +60 -5
  25. package/dist/lib/agent/domain/scan-prompts.js +10 -7
  26. package/dist/lib/agent/memory/ActiveContext.d.ts +2 -28
  27. package/dist/lib/agent/memory/MemoryCoordinator.d.ts +2 -2
  28. package/dist/lib/agent/memory/SessionStore.d.ts +6 -12
  29. package/dist/lib/agent/memory/SessionStore.js +9 -15
  30. package/dist/lib/agent/memory/memory-flush-contract.d.ts +49 -0
  31. package/dist/lib/agent/memory/memory-flush-contract.js +16 -0
  32. package/dist/lib/agent/memory/session-store-schema.d.ts +20 -0
  33. package/dist/lib/agent/memory/session-store-schema.js +41 -0
  34. package/dist/lib/agent/presets.d.ts +89 -1
  35. package/dist/lib/agent/presets.js +53 -5
  36. package/dist/lib/agent/tools/_shared.d.ts +7 -15
  37. package/dist/lib/agent/tools/_shared.js +20 -21
  38. package/dist/lib/agent/tools/composite.d.ts +25 -22
  39. package/dist/lib/agent/tools/composite.js +108 -109
  40. package/dist/lib/agent/tools/evolution-tools.d.ts +145 -0
  41. package/dist/lib/agent/tools/evolution-tools.js +161 -0
  42. package/dist/lib/agent/tools/index.d.ts +163 -92
  43. package/dist/lib/agent/tools/index.js +9 -1
  44. package/dist/lib/agent/tools/lifecycle.d.ts +7 -1
  45. package/dist/lib/agent/tools/lifecycle.js +59 -75
  46. package/dist/lib/cli/AiScanService.js +1 -1
  47. package/dist/lib/cli/KnowledgeSyncService.d.ts +5 -1
  48. package/dist/lib/cli/KnowledgeSyncService.js +6 -3
  49. package/dist/lib/core/AstAnalyzer.d.ts +1 -0
  50. package/dist/lib/{service/bootstrap/DimensionCopyRegistry.d.ts → domain/dimension/DimensionCopy.d.ts} +2 -2
  51. package/dist/lib/{service/bootstrap/DimensionCopyRegistry.js → domain/dimension/DimensionCopy.js} +22 -72
  52. package/dist/lib/domain/dimension/DimensionRegistry.d.ts +54 -0
  53. package/dist/lib/domain/dimension/DimensionRegistry.js +620 -0
  54. package/dist/lib/domain/dimension/DimensionSop.d.ts +55 -0
  55. package/dist/lib/domain/dimension/DimensionSop.js +1604 -0
  56. package/dist/lib/domain/dimension/UnifiedDimension.d.ts +61 -0
  57. package/dist/lib/domain/dimension/UnifiedDimension.js +53 -0
  58. package/dist/lib/domain/dimension/index.d.ts +10 -0
  59. package/dist/lib/domain/dimension/index.js +9 -0
  60. package/dist/lib/domain/knowledge/FieldSpec.d.ts +1 -1
  61. package/dist/lib/domain/knowledge/FieldSpec.js +29 -16
  62. package/dist/lib/domain/knowledge/KnowledgeEntry.d.ts +33 -111
  63. package/dist/lib/domain/knowledge/KnowledgeEntry.js +27 -6
  64. package/dist/lib/domain/knowledge/KnowledgeRepository.d.ts +1 -0
  65. package/dist/lib/domain/knowledge/KnowledgeRepository.js +3 -0
  66. package/dist/lib/domain/knowledge/Lifecycle.js +1 -1
  67. package/dist/lib/domain/knowledge/StyleGuide.d.ts +1 -1
  68. package/dist/lib/domain/knowledge/StyleGuide.js +1 -1
  69. package/dist/lib/domain/knowledge/UnifiedValidator.js +15 -0
  70. package/dist/lib/domain/knowledge/values/Stats.d.ts +1 -1
  71. package/dist/lib/domain/knowledge/values/Stats.js +2 -2
  72. package/dist/lib/external/mcp/McpServer.js +4 -0
  73. package/dist/lib/external/mcp/handlers/TargetClassifier.d.ts +1 -1
  74. package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.d.ts +8 -16
  75. package/dist/lib/external/mcp/handlers/bootstrap/BootstrapSession.js +10 -10
  76. package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.d.ts +7 -0
  77. package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.js +20 -0
  78. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.d.ts +52 -132
  79. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.js +204 -17
  80. package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.d.ts +11 -75
  81. package/dist/lib/external/mcp/handlers/bootstrap/base-dimensions.js +40 -191
  82. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.d.ts +13 -78
  83. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-configs.js +30 -52
  84. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-context.d.ts +0 -1
  85. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.d.ts +99 -12
  86. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +172 -161
  87. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/tier-scheduler.js +7 -17
  88. package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.d.ts +46 -0
  89. package/dist/lib/external/mcp/handlers/bootstrap/shared/async-fill-helpers.js +58 -0
  90. package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.d.ts +25 -0
  91. package/dist/lib/external/mcp/handlers/bootstrap/shared/audit-helpers.js +47 -0
  92. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.d.ts +50 -12
  93. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.js +30 -10
  94. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-text.js +1 -1
  95. package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.d.ts +24 -0
  96. package/dist/lib/external/mcp/handlers/bootstrap/shared/handler-types.js +14 -0
  97. package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.d.ts +14 -0
  98. package/dist/lib/external/mcp/handlers/bootstrap/shared/panorama-utils.js +48 -0
  99. package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.d.ts +21 -0
  100. package/dist/lib/external/mcp/handlers/bootstrap/shared/session-helpers.js +45 -0
  101. package/dist/lib/external/mcp/handlers/bootstrap/shared/skill-generator.d.ts +1 -1
  102. package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.d.ts +27 -0
  103. package/dist/lib/external/mcp/handlers/bootstrap/shared/target-file-map.js +44 -0
  104. package/dist/lib/external/mcp/handlers/bootstrap-external.d.ts +14 -10
  105. package/dist/lib/external/mcp/handlers/bootstrap-external.js +39 -51
  106. package/dist/lib/external/mcp/handlers/bootstrap-internal.d.ts +2 -0
  107. package/dist/lib/external/mcp/handlers/bootstrap-internal.js +115 -82
  108. package/dist/lib/external/mcp/handlers/consolidated.d.ts +4 -4
  109. package/dist/lib/external/mcp/handlers/consolidated.js +115 -162
  110. package/dist/lib/external/mcp/handlers/dimension-complete-external.js +69 -1
  111. package/dist/lib/external/mcp/handlers/evolve-external.d.ts +54 -0
  112. package/dist/lib/external/mcp/handlers/evolve-external.js +226 -0
  113. package/dist/lib/external/mcp/handlers/knowledge.js +26 -2
  114. package/dist/lib/external/mcp/handlers/rescan-external.d.ts +76 -0
  115. package/dist/lib/external/mcp/handlers/rescan-external.js +335 -0
  116. package/dist/lib/external/mcp/handlers/rescan-internal.d.ts +120 -0
  117. package/dist/lib/external/mcp/handlers/rescan-internal.js +359 -0
  118. package/dist/lib/external/mcp/handlers/search.d.ts +6 -5
  119. package/dist/lib/external/mcp/handlers/search.js +6 -5
  120. package/dist/lib/external/mcp/handlers/types.d.ts +2 -1
  121. package/dist/lib/external/mcp/handlers/wiki-external.js +2 -2
  122. package/dist/lib/external/mcp/tools.d.ts +8 -18
  123. package/dist/lib/external/mcp/tools.js +60 -3
  124. package/dist/lib/http/routes/knowledge.js +122 -1
  125. package/dist/lib/http/routes/modules.js +25 -3
  126. package/dist/lib/http/routes/panorama.js +16 -4
  127. package/dist/lib/infrastructure/cache/CacheCoordinator.d.ts +41 -0
  128. package/dist/lib/infrastructure/cache/CacheCoordinator.js +105 -0
  129. package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.d.ts +7 -0
  130. package/dist/lib/infrastructure/database/migrations/006_lifecycle_transition_events.js +28 -0
  131. package/dist/lib/infrastructure/vector/HnswVectorAdapter.js +1 -1
  132. package/dist/lib/injection/ServiceContainer.js +55 -0
  133. package/dist/lib/injection/ServiceMap.d.ts +8 -1
  134. package/dist/lib/injection/modules/InfraModule.js +4 -1
  135. package/dist/lib/injection/modules/KnowledgeModule.js +38 -1
  136. package/dist/lib/repository/evolution/ProposalRepository.d.ts +99 -0
  137. package/dist/lib/repository/evolution/ProposalRepository.js +255 -0
  138. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.d.ts +4 -0
  139. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.js +16 -1
  140. package/dist/lib/service/bootstrap/BootstrapEventEmitter.d.ts +3 -2
  141. package/dist/lib/service/bootstrap/BootstrapEventEmitter.js +1 -1
  142. package/dist/lib/service/bootstrap/DeliveryVerifier.d.ts +51 -0
  143. package/dist/lib/service/bootstrap/DeliveryVerifier.js +163 -0
  144. package/dist/lib/service/bootstrap/UiStartupTasks.d.ts +22 -4
  145. package/dist/lib/service/bootstrap/UiStartupTasks.js +73 -5
  146. package/dist/lib/service/bootstrap/bootstrap-event-types.d.ts +54 -0
  147. package/dist/lib/service/bootstrap/bootstrap-event-types.js +10 -0
  148. package/dist/lib/service/cleanup/CleanupService.d.ts +85 -0
  149. package/dist/lib/service/cleanup/CleanupService.js +324 -0
  150. package/dist/lib/service/delivery/AgentInstructionsGenerator.js +39 -43
  151. package/dist/lib/service/delivery/FileProtection.d.ts +20 -0
  152. package/dist/lib/service/delivery/FileProtection.js +54 -0
  153. package/dist/lib/service/delivery/SkillsSyncer.js +16 -21
  154. package/dist/lib/service/evolution/ContentPatcher.d.ts +44 -0
  155. package/dist/lib/service/evolution/ContentPatcher.js +310 -0
  156. package/dist/lib/service/evolution/DecayDetector.d.ts +4 -3
  157. package/dist/lib/service/evolution/DecayDetector.js +97 -22
  158. package/dist/lib/service/evolution/KnowledgeMetabolism.d.ts +4 -2
  159. package/dist/lib/service/evolution/KnowledgeMetabolism.js +29 -2
  160. package/dist/lib/service/evolution/ProposalExecutor.d.ts +66 -0
  161. package/dist/lib/service/evolution/ProposalExecutor.js +424 -0
  162. package/dist/lib/service/evolution/RecipeLifecycleSupervisor.d.ts +64 -0
  163. package/dist/lib/service/evolution/RecipeLifecycleSupervisor.js +458 -0
  164. package/dist/lib/service/evolution/RecipeRelevanceAuditor.d.ts +89 -0
  165. package/dist/lib/service/evolution/RecipeRelevanceAuditor.js +492 -0
  166. package/dist/lib/service/evolution/StagingManager.js +5 -3
  167. package/dist/lib/service/evolution/createSupersedeProposal.d.ts +44 -0
  168. package/dist/lib/service/evolution/createSupersedeProposal.js +81 -0
  169. package/dist/lib/service/guard/ComplianceReporter.d.ts +4 -0
  170. package/dist/lib/service/guard/ComplianceReporter.js +51 -0
  171. package/dist/lib/service/guard/GuardCheckEngine.js +5 -4
  172. package/dist/lib/service/guard/GuardCrossFileChecks.js +2 -0
  173. package/dist/lib/service/guard/ReverseGuard.d.ts +1 -1
  174. package/dist/lib/service/guard/ReverseGuard.js +32 -2
  175. package/dist/lib/service/knowledge/ConfidenceRouter.js +1 -1
  176. package/dist/lib/service/knowledge/KnowledgeService.d.ts +11 -1
  177. package/dist/lib/service/knowledge/KnowledgeService.js +44 -4
  178. package/dist/lib/service/knowledge/RecipeProductionGateway.d.ts +225 -0
  179. package/dist/lib/service/knowledge/RecipeProductionGateway.js +384 -0
  180. package/dist/lib/service/knowledge/SourceRefReconciler.d.ts +2 -0
  181. package/dist/lib/service/knowledge/SourceRefReconciler.js +48 -0
  182. package/dist/lib/service/panorama/DimensionAnalyzer.d.ts +3 -2
  183. package/dist/lib/service/panorama/DimensionAnalyzer.js +15 -140
  184. package/dist/lib/service/search/BM25Scorer.d.ts +2 -2
  185. package/dist/lib/service/search/SearchEngine.d.ts +11 -10
  186. package/dist/lib/service/search/SearchEngine.js +38 -36
  187. package/dist/lib/service/search/SearchTypes.d.ts +14 -8
  188. package/dist/lib/service/search/SearchTypes.js +1 -1
  189. package/dist/lib/service/search/tokenizer.d.ts +1 -1
  190. package/dist/lib/service/search/tokenizer.js +2 -2
  191. package/dist/lib/shared/schemas/common.d.ts +4 -4
  192. package/dist/lib/shared/schemas/http-requests.d.ts +12 -1
  193. package/dist/lib/shared/schemas/http-requests.js +8 -0
  194. package/dist/lib/shared/schemas/mcp-tools.d.ts +33 -2
  195. package/dist/lib/shared/schemas/mcp-tools.js +42 -0
  196. package/dist/lib/types/evolution.d.ts +135 -0
  197. package/dist/lib/types/evolution.js +6 -0
  198. package/dist/lib/types/graph-shared.d.ts +25 -0
  199. package/dist/lib/types/graph-shared.js +7 -0
  200. package/dist/lib/types/knowledge-wire.d.ts +131 -0
  201. package/dist/lib/types/knowledge-wire.js +7 -0
  202. package/dist/lib/types/project-snapshot-builder.d.ts +19 -0
  203. package/dist/lib/types/project-snapshot-builder.js +189 -0
  204. package/dist/lib/types/project-snapshot.d.ts +399 -0
  205. package/dist/lib/types/project-snapshot.js +17 -0
  206. package/dist/lib/types/search-wire.d.ts +46 -0
  207. package/dist/lib/types/search-wire.js +7 -0
  208. package/dist/lib/types/snapshot-views.d.ts +58 -0
  209. package/dist/lib/types/snapshot-views.js +103 -0
  210. package/package.json +1 -1
  211. package/skills/autosnippet-recipes/SKILL.md +1 -1
  212. package/templates/instructions/agent-static.md +2 -0
  213. package/templates/instructions/conventions.md +3 -1
  214. package/templates/recipes-setup/README.md +2 -2
  215. package/dashboard/dist/assets/icons-BJ2mUBi8.js +0 -1
  216. package/dashboard/dist/assets/index-B659K9t5.js +0 -128
  217. package/dashboard/dist/assets/index-NCm40PMD.css +0 -1
  218. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.d.ts +0 -169
  219. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/noAiFallback.js +0 -727
  220. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.d.ts +0 -370
  221. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.js +0 -821
@@ -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
+ }
@@ -2,10 +2,13 @@
2
2
  * UiStartupTasks — asd ui 启动后异步后台刷新任务
3
3
  *
4
4
  * 在 Dashboard 启动后异步执行,不阻塞 UI:
5
- * 1. syncAll: .md → DB 全量同步 + sourceRefs 对账
6
- * 2. staging promote: 到期 staging → active 晋升
7
- * 3. vector reconcile: 向量对账(best-effort)
8
- * 4. refreshIndex: BM25 增量刷新
5
+ * 1. syncAll: .md → DB 全量同步 + sourceRefs 对账
6
+ * 2. staging promote: 到期 staging → active 晋升
7
+ * 3. vector reconcile: 向量对账(best-effort)
8
+ * 4. refreshIndex: BM25 增量刷新
9
+ * 5. proposalCheck: 到期 Proposal 检查 + 自动执行/拒绝
10
+ * 6. metabolismCycle: 知识新陈代谢(矛盾/冗余/衰退扫描 → 新 Proposal)
11
+ * 7. timeoutCheck: 中间态超时兜底(evolving/decaying 超时自动恢复)
9
12
  */
10
13
  interface UiStartupContext {
11
14
  projectRoot: string;
@@ -34,6 +37,21 @@ export interface UiStartupReport {
34
37
  missing: number;
35
38
  };
36
39
  indexRefresh?: boolean;
40
+ proposalCheck?: {
41
+ executed: number;
42
+ rejected: number;
43
+ expired: number;
44
+ };
45
+ metabolismCycle?: {
46
+ proposalCount: number;
47
+ contradictions: number;
48
+ redundancies: number;
49
+ decaying: number;
50
+ };
51
+ timeoutCheck?: {
52
+ timedOut: number;
53
+ checked: number;
54
+ };
37
55
  durationMs: number;
38
56
  errors: string[];
39
57
  }
@@ -2,10 +2,13 @@
2
2
  * UiStartupTasks — asd ui 启动后异步后台刷新任务
3
3
  *
4
4
  * 在 Dashboard 启动后异步执行,不阻塞 UI:
5
- * 1. syncAll: .md → DB 全量同步 + sourceRefs 对账
6
- * 2. staging promote: 到期 staging → active 晋升
7
- * 3. vector reconcile: 向量对账(best-effort)
8
- * 4. refreshIndex: BM25 增量刷新
5
+ * 1. syncAll: .md → DB 全量同步 + sourceRefs 对账
6
+ * 2. staging promote: 到期 staging → active 晋升
7
+ * 3. vector reconcile: 向量对账(best-effort)
8
+ * 4. refreshIndex: BM25 增量刷新
9
+ * 5. proposalCheck: 到期 Proposal 检查 + 自动执行/拒绝
10
+ * 6. metabolismCycle: 知识新陈代谢(矛盾/冗余/衰退扫描 → 新 Proposal)
11
+ * 7. timeoutCheck: 中间态超时兜底(evolving/decaying 超时自动恢复)
9
12
  */
10
13
  import Logger from '../../infrastructure/logging/Logger.js';
11
14
  const logger = Logger.getInstance();
@@ -20,7 +23,11 @@ export async function runUiStartupTasks(ctx) {
20
23
  // ── Stage 1: syncAll (.md → DB + sourceRefs reconcile) ──
21
24
  try {
22
25
  const { KnowledgeSyncService } = await import('../../cli/KnowledgeSyncService.js');
23
- const syncService = new KnowledgeSyncService(ctx.projectRoot);
26
+ const { SourceRefReconciler } = await import('../../service/knowledge/SourceRefReconciler.js');
27
+ const sourceRefReconciler = ctx.container.singletons.sourceRefReconciler;
28
+ const syncService = new KnowledgeSyncService(ctx.projectRoot, {
29
+ sourceRefReconciler: sourceRefReconciler || undefined,
30
+ });
24
31
  const db = ctx.container.get('database');
25
32
  const rawDb = db.getDb();
26
33
  const syncReport = await syncService.syncAll(rawDb, { skipViolations: true });
@@ -93,6 +100,67 @@ export async function runUiStartupTasks(ctx) {
93
100
  report.errors.push(msg);
94
101
  logger.warn(`[UiStartupTasks] ${msg}`);
95
102
  }
103
+ // ── Stage 5: ProposalExecutor — 到期 Proposal 检查 + 自动执行 ──
104
+ try {
105
+ if (ctx.container.services.proposalExecutor) {
106
+ const executor = ctx.container.get('proposalExecutor');
107
+ const result = executor.checkAndExecute();
108
+ report.proposalCheck = {
109
+ executed: result.executed.length,
110
+ rejected: result.rejected.length,
111
+ expired: result.expired.length,
112
+ };
113
+ const total = result.executed.length + result.rejected.length + result.expired.length;
114
+ if (total > 0) {
115
+ logger.info(`[UiStartupTasks] Stage 5: proposal check — executed=${result.executed.length}, rejected=${result.rejected.length}, expired=${result.expired.length}`);
116
+ }
117
+ }
118
+ }
119
+ catch (err) {
120
+ const msg = `proposal check failed: ${err.message}`;
121
+ report.errors.push(msg);
122
+ logger.warn(`[UiStartupTasks] ${msg}`);
123
+ }
124
+ // ── Stage 6: KnowledgeMetabolism — 知识新陈代谢扫描 ──
125
+ try {
126
+ if (ctx.container.services.knowledgeMetabolism) {
127
+ const metabolism = ctx.container.get('knowledgeMetabolism');
128
+ const result = metabolism.runFullCycle();
129
+ report.metabolismCycle = {
130
+ proposalCount: result.summary.proposalCount,
131
+ contradictions: result.summary.contradictionCount,
132
+ redundancies: result.summary.redundancyCount,
133
+ decaying: result.summary.decayingCount,
134
+ };
135
+ if (result.summary.proposalCount > 0) {
136
+ logger.info(`[UiStartupTasks] Stage 6: metabolism cycle — ${result.summary.proposalCount} proposals generated`);
137
+ }
138
+ }
139
+ }
140
+ catch (err) {
141
+ const msg = `metabolism cycle failed: ${err.message}`;
142
+ report.errors.push(msg);
143
+ logger.warn(`[UiStartupTasks] ${msg}`);
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
+ }
96
164
  report.durationMs = Date.now() - start;
97
165
  logger.info(`[UiStartupTasks] All tasks completed in ${report.durationMs}ms`, {
98
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,85 @@
1
+ /**
2
+ * CleanupService — 统一数据清理策略
3
+ *
4
+ * 提供两种清理模式:
5
+ * - fullReset(): 全量清理(删除一切知识/缓存/衍生数据),用于 bootstrap 冷启动
6
+ * - rescanClean(): Rescan 清理(保留 Recipe,清除衍生缓存),用于增量知识更新
7
+ * - snapshotRecipes(): 快照当前活跃 Recipe 信息
8
+ *
9
+ * 设计原则:
10
+ * - 配置数据 (config.json, constitution.yaml, boxspec.json) 永不清理
11
+ * - IDE 集成配置 (.vscode/, .cursor/, .github/) 永不清理
12
+ * - 交付物 (.cursor/rules/autosnippet-*) 由 R4 重建,不在此清理
13
+ *
14
+ * @module service/cleanup/CleanupService
15
+ */
16
+ /** Logger 接口 */
17
+ interface CleanupLogger {
18
+ info(msg: string, meta?: Record<string, unknown>): void;
19
+ warn(msg: string, meta?: Record<string, unknown>): void;
20
+ }
21
+ /** 清理结果 */
22
+ export interface CleanupResult {
23
+ deletedFiles: number;
24
+ clearedTables: string[];
25
+ preservedRecipes: number;
26
+ errors: string[];
27
+ }
28
+ /** Recipe 快照条目 */
29
+ export interface RecipeSnapshotEntry {
30
+ id: string;
31
+ title: string;
32
+ trigger: string;
33
+ category: string;
34
+ knowledgeType: string;
35
+ doClause: string;
36
+ sourceFile?: string;
37
+ lifecycle: string;
38
+ /** Recipe 完整内容 (JSON parsed) — Evolution Agent 需要 */
39
+ content?: {
40
+ markdown?: string;
41
+ rationale?: string;
42
+ coreCode?: string;
43
+ };
44
+ /** 源文件引用列表 (JSON parsed) — Evolution Agent 需要 */
45
+ sourceRefs?: string[];
46
+ }
47
+ /** Recipe 快照 */
48
+ export interface RecipeSnapshot {
49
+ count: number;
50
+ entries: RecipeSnapshotEntry[];
51
+ coverageByDimension: Record<string, number>;
52
+ }
53
+ export declare class CleanupService {
54
+ #private;
55
+ constructor(opts: {
56
+ projectRoot: string;
57
+ db?: unknown;
58
+ logger?: CleanupLogger;
59
+ });
60
+ /** 更新 DB 引用(fullReset 后重连时调用) */
61
+ setDb(db: unknown): void;
62
+ /**
63
+ * 全量清理 — 用于 bootstrap 冷启动
64
+ *
65
+ * 清除: DB 所有数据表、candidates/、recipes/、skills/、wiki/、
66
+ * 向量索引、bootstrap-report.json、logs/signals/
67
+ * 保留: config.json、constitution.yaml、boxspec.json、IDE 配置
68
+ */
69
+ fullReset(): Promise<CleanupResult>;
70
+ /**
71
+ * Rescan 清理 — 保留 Recipe,清除衍生缓存
72
+ *
73
+ * 清除: 衍生 DB 表、pending/rejected/deprecated 知识条目、
74
+ * candidates/、skills/、wiki/、向量索引、bootstrap-report
75
+ * 保留: recipes/、active/published/staging/evolving 知识条目、
76
+ * knowledge_edges、evolution_proposals
77
+ */
78
+ rescanClean(): Promise<CleanupResult>;
79
+ /**
80
+ * 快照当前活跃 Recipe 信息
81
+ * 用于 rescan 前记录保留的知识条目
82
+ */
83
+ snapshotRecipes(): Promise<RecipeSnapshot>;
84
+ }
85
+ export {};