autosnippet 3.2.18 → 3.2.21

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 (189) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +73 -104
  3. package/config/default.json +1 -1
  4. package/dashboard/dist/assets/{index-CKMy5LY6.js → index-DdvZE4Yd.js} +1 -1
  5. package/dashboard/dist/index.html +1 -1
  6. package/dist/bin/cli.js +45 -10
  7. package/dist/lib/agent/AgentEventBus.js +3 -3
  8. package/dist/lib/agent/AgentFactory.d.ts +3 -3
  9. package/dist/lib/agent/AgentFactory.js +4 -4
  10. package/dist/lib/agent/AgentMessage.d.ts +8 -8
  11. package/dist/lib/agent/AgentMessage.js +8 -8
  12. package/dist/lib/agent/AgentRuntime.js +2 -2
  13. package/dist/lib/agent/AgentState.js +4 -4
  14. package/dist/lib/agent/ConversationStore.d.ts +1 -1
  15. package/dist/lib/agent/ConversationStore.js +1 -1
  16. package/dist/lib/agent/PipelineStrategy.js +1 -1
  17. package/dist/lib/agent/context/ContextWindow.d.ts +2 -2
  18. package/dist/lib/agent/context/ContextWindow.js +7 -7
  19. package/dist/lib/agent/context/ExplorationTracker.js +9 -9
  20. package/dist/lib/agent/context/exploration/PlanTracker.js +2 -2
  21. package/dist/lib/agent/context/exploration/SignalDetector.d.ts +1 -1
  22. package/dist/lib/agent/context/exploration/SignalDetector.js +1 -1
  23. package/dist/lib/agent/core/LoopContext.d.ts +21 -21
  24. package/dist/lib/agent/core/LoopContext.js +21 -21
  25. package/dist/lib/agent/core/SystemPromptBuilder.js +4 -4
  26. package/dist/lib/agent/domain/EvidenceCollector.js +5 -5
  27. package/dist/lib/agent/memory/ActiveContext.js +1 -1
  28. package/dist/lib/agent/memory/MemoryRetriever.js +1 -1
  29. package/dist/lib/agent/memory/MemoryStore.js +2 -2
  30. package/dist/lib/agent/memory/SessionStore.js +3 -3
  31. package/dist/lib/agent/policies.d.ts +1 -1
  32. package/dist/lib/agent/policies.js +1 -1
  33. package/dist/lib/agent/strategies.d.ts +1 -1
  34. package/dist/lib/agent/strategies.js +4 -4
  35. package/dist/lib/agent/tools/_shared.d.ts +1 -1
  36. package/dist/lib/agent/tools/_shared.js +1 -1
  37. package/dist/lib/agent/tools/infrastructure.js +2 -2
  38. package/dist/lib/cli/SetupService.d.ts +25 -25
  39. package/dist/lib/cli/SetupService.js +28 -15
  40. package/dist/lib/cli/deploy/FileDeployer.d.ts +9 -2
  41. package/dist/lib/cli/deploy/FileDeployer.js +139 -46
  42. package/dist/lib/cli/deploy/FileManifest.d.ts +23 -39
  43. package/dist/lib/cli/deploy/FileManifest.js +22 -33
  44. package/dist/lib/core/AstAnalyzer.d.ts +2 -2
  45. package/dist/lib/core/AstAnalyzer.js +2 -2
  46. package/dist/lib/core/analysis/CallEdgeResolver.d.ts +7 -7
  47. package/dist/lib/core/analysis/CallEdgeResolver.js +9 -9
  48. package/dist/lib/core/analysis/CallGraphAnalyzer.d.ts +4 -4
  49. package/dist/lib/core/analysis/CallGraphAnalyzer.js +2 -2
  50. package/dist/lib/core/analysis/ImportPathResolver.d.ts +0 -2
  51. package/dist/lib/core/analysis/ImportPathResolver.js +2 -4
  52. package/dist/lib/core/ast/ProjectGraph.js +7 -7
  53. package/dist/lib/core/capability/CapabilityProbe.js +6 -14
  54. package/dist/lib/domain/knowledge/UnifiedValidator.js +2 -2
  55. package/dist/lib/domain/knowledge/values/Constraints.js +4 -4
  56. package/dist/lib/domain/knowledge/values/Content.js +6 -6
  57. package/dist/lib/domain/knowledge/values/Quality.js +5 -5
  58. package/dist/lib/domain/knowledge/values/Reasoning.js +5 -5
  59. package/dist/lib/domain/knowledge/values/Relations.js +1 -1
  60. package/dist/lib/domain/knowledge/values/Stats.js +6 -6
  61. package/dist/lib/domain/task/TaskIdGenerator.d.ts +4 -4
  62. package/dist/lib/domain/task/TaskIdGenerator.js +2 -2
  63. package/dist/lib/external/lark/LarkTransport.js +4 -4
  64. package/dist/lib/external/mcp/McpServer.d.ts +3 -7
  65. package/dist/lib/external/mcp/McpServer.js +9 -13
  66. package/dist/lib/external/mcp/handlers/bootstrap/ExternalSubmissionTracker.js +5 -5
  67. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.js +4 -3
  68. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/BootstrapSnapshot.d.ts +3 -3
  69. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/BootstrapSnapshot.js +3 -3
  70. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/IncrementalBootstrap.d.ts +1 -1
  71. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/IncrementalBootstrap.js +1 -1
  72. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/dimension-context.js +3 -3
  73. package/dist/lib/external/mcp/handlers/bootstrap/shared/dimension-sop.js +27 -14
  74. package/dist/lib/external/mcp/handlers/bootstrap-external.js +6 -0
  75. package/dist/lib/external/mcp/handlers/dimension-complete-external.js +55 -1
  76. package/dist/lib/external/mcp/handlers/skill.js +9 -31
  77. package/dist/lib/external/mcp/handlers/system.js +6 -4
  78. package/dist/lib/external/mcp/handlers/task.js +16 -1
  79. package/dist/lib/external/mcp/tools.d.ts +12 -10
  80. package/dist/lib/external/mcp/tools.js +97 -69
  81. package/dist/lib/http/utils/routeHelpers.d.ts +1 -1
  82. package/dist/lib/http/utils/routeHelpers.js +1 -1
  83. package/dist/lib/http/utils/sse-sessions.d.ts +1 -1
  84. package/dist/lib/http/utils/sse-sessions.js +1 -1
  85. package/dist/lib/infrastructure/cache/CacheService.js +1 -1
  86. package/dist/lib/infrastructure/logging/Logger.js +1 -1
  87. package/dist/lib/infrastructure/monitoring/ErrorTracker.js +1 -1
  88. package/dist/lib/infrastructure/vector/AsyncPersistence.js +8 -8
  89. package/dist/lib/infrastructure/vector/BatchEmbedder.d.ts +1 -1
  90. package/dist/lib/infrastructure/vector/BatchEmbedder.js +2 -2
  91. package/dist/lib/infrastructure/vector/HnswIndex.d.ts +4 -4
  92. package/dist/lib/infrastructure/vector/HnswIndex.js +5 -5
  93. package/dist/lib/infrastructure/vector/HnswVectorAdapter.js +8 -8
  94. package/dist/lib/infrastructure/vector/ScalarQuantizer.d.ts +1 -1
  95. package/dist/lib/infrastructure/vector/ScalarQuantizer.js +4 -4
  96. package/dist/lib/infrastructure/vector/VectorStore.d.ts +1 -1
  97. package/dist/lib/infrastructure/vector/VectorStore.js +1 -1
  98. package/dist/lib/injection/ServiceContainer.d.ts +1 -1
  99. package/dist/lib/injection/ServiceContainer.js +1 -1
  100. package/dist/lib/injection/modules/KnowledgeModule.js +4 -5
  101. package/dist/lib/platform/NativeUi.d.ts +1 -1
  102. package/dist/lib/platform/NativeUi.js +1 -1
  103. package/dist/lib/platform/ios/spm/DependencyGraph.d.ts +1 -1
  104. package/dist/lib/platform/ios/spm/DependencyGraph.js +1 -1
  105. package/dist/lib/platform/ios/spm/PolicyEngine.d.ts +1 -1
  106. package/dist/lib/platform/ios/spm/PolicyEngine.js +1 -1
  107. package/dist/lib/platform/ios/spm/SpmDiscoverer.js +1 -1
  108. package/dist/lib/platform/ios/spm/SpmHelper.js +3 -3
  109. package/dist/lib/platform/ios/xcode/SaveEventFilter.js +2 -2
  110. package/dist/lib/platform/ios/xcode/XcodeIntegration.js +1 -1
  111. package/dist/lib/repository/base/BaseRepository.js +1 -1
  112. package/dist/lib/repository/task/TaskRepository.impl.d.ts +2 -2
  113. package/dist/lib/repository/task/TaskRepository.impl.js +1 -1
  114. package/dist/lib/repository/token/TokenUsageStore.js +1 -1
  115. package/dist/lib/service/automation/ActionPipeline.d.ts +1 -1
  116. package/dist/lib/service/automation/ActionPipeline.js +1 -1
  117. package/dist/lib/service/bootstrap/BootstrapEventEmitter.js +2 -2
  118. package/dist/lib/service/bootstrap/BootstrapTaskManager.d.ts +1 -1
  119. package/dist/lib/service/bootstrap/BootstrapTaskManager.js +2 -2
  120. package/dist/lib/service/bootstrap/DimensionCopyRegistry.d.ts +2 -2
  121. package/dist/lib/service/bootstrap/DimensionCopyRegistry.js +2 -2
  122. package/dist/lib/service/delivery/AgentInstructionsGenerator.d.ts +6 -15
  123. package/dist/lib/service/delivery/AgentInstructionsGenerator.js +53 -189
  124. package/dist/lib/service/delivery/CursorDeliveryPipeline.d.ts +6 -16
  125. package/dist/lib/service/delivery/CursorDeliveryPipeline.js +14 -19
  126. package/dist/lib/service/delivery/KnowledgeCompressor.d.ts +1 -1
  127. package/dist/lib/service/delivery/KnowledgeCompressor.js +1 -1
  128. package/dist/lib/service/delivery/RulesGenerator.d.ts +10 -3
  129. package/dist/lib/service/delivery/RulesGenerator.js +43 -3
  130. package/dist/lib/service/delivery/SkillsSyncer.d.ts +21 -7
  131. package/dist/lib/service/delivery/SkillsSyncer.js +46 -10
  132. package/dist/lib/service/delivery/TopicClassifier.d.ts +3 -6
  133. package/dist/lib/service/delivery/TopicClassifier.js +0 -3
  134. package/dist/lib/service/guard/ExclusionManager.d.ts +1 -1
  135. package/dist/lib/service/guard/ExclusionManager.js +1 -1
  136. package/dist/lib/service/guard/GuardCheckEngine.d.ts +3 -3
  137. package/dist/lib/service/guard/GuardCheckEngine.js +5 -5
  138. package/dist/lib/service/guard/GuardCrossFileChecks.d.ts +1 -1
  139. package/dist/lib/service/guard/GuardFeedbackLoop.d.ts +3 -3
  140. package/dist/lib/service/guard/GuardFeedbackLoop.js +3 -3
  141. package/dist/lib/service/guard/GuardPatternUtils.js +1 -1
  142. package/dist/lib/service/guard/GuardService.d.ts +1 -15
  143. package/dist/lib/service/guard/GuardService.js +0 -1
  144. package/dist/lib/service/guard/RuleLearner.d.ts +1 -1
  145. package/dist/lib/service/guard/RuleLearner.js +1 -1
  146. package/dist/lib/service/knowledge/CodeEntityGraph.d.ts +3 -3
  147. package/dist/lib/service/knowledge/CodeEntityGraph.js +3 -3
  148. package/dist/lib/service/knowledge/KnowledgeService.d.ts +0 -1
  149. package/dist/lib/service/knowledge/KnowledgeService.js +0 -1
  150. package/dist/lib/service/module/ModuleService.d.ts +1 -1
  151. package/dist/lib/service/module/ModuleService.js +2 -2
  152. package/dist/lib/service/search/HybridRetriever.d.ts +2 -2
  153. package/dist/lib/service/search/HybridRetriever.js +2 -2
  154. package/dist/lib/service/search/SearchEngine.d.ts +1 -3
  155. package/dist/lib/service/search/SearchEngine.js +1 -3
  156. package/dist/lib/service/search/contextBoost.d.ts +1 -1
  157. package/dist/lib/service/skills/EventAggregator.js +2 -2
  158. package/dist/lib/service/skills/SignalCollector.js +1 -1
  159. package/dist/lib/service/snippet/codecs/VSCodeCodec.js +1 -1
  160. package/dist/lib/service/task/TaskGraphService.d.ts +0 -3
  161. package/dist/lib/service/task/TaskGraphService.js +0 -3
  162. package/dist/lib/service/task/TaskKnowledgeBridge.d.ts +8 -27
  163. package/dist/lib/service/task/TaskKnowledgeBridge.js +0 -8
  164. package/dist/lib/service/task/TaskReadyEngine.d.ts +1 -2
  165. package/dist/lib/service/task/TaskReadyEngine.js +0 -1
  166. package/dist/lib/service/wiki/WikiRenderers.js +0 -1
  167. package/dist/lib/service/wiki/WikiUtils.js +2 -7
  168. package/dist/lib/shared/PathGuard.js +6 -6
  169. package/dist/lib/shared/schemas/config.js +1 -1
  170. package/dist/lib/shared/schemas/mcp-tools.js +84 -43
  171. package/dist/scripts/install-vscode-copilot.js +14 -4
  172. package/package.json +1 -1
  173. package/skills/autosnippet-create/SKILL.md +131 -131
  174. package/skills/autosnippet-devdocs/SKILL.md +1 -2
  175. package/skills/autosnippet-guard/SKILL.md +20 -89
  176. package/skills/autosnippet-recipes/SKILL.md +35 -117
  177. package/skills/autosnippet-structure/SKILL.md +23 -55
  178. package/templates/cursor-rules/autosnippet-skills.mdc +17 -33
  179. package/templates/instructions/agent-static.md +24 -0
  180. package/templates/instructions/conventions.md +42 -0
  181. package/skills/autosnippet-analysis/SKILL.md +0 -169
  182. package/skills/autosnippet-candidates/SKILL.md +0 -367
  183. package/skills/autosnippet-coldstart/SKILL.md +0 -988
  184. package/skills/autosnippet-concepts/SKILL.md +0 -630
  185. package/skills/autosnippet-intent/SKILL.md +0 -55
  186. package/skills/autosnippet-lifecycle/SKILL.md +0 -100
  187. package/templates/copilot-instructions.md +0 -66
  188. package/templates/cursor-rules/autosnippet-conventions.mdc +0 -172
  189. package/templates/cursor-rules/autosnippet-workflow.mdc +0 -76
@@ -77,8 +77,9 @@ function enrichDimensionTask(dim, tier) {
77
77
  },
78
78
  {
79
79
  phase: '4. 提交',
80
- action: '按项目特写格式提交 3-5 个知识候选',
80
+ action: '按项目特写格式提交知识候选(**最少 3 条,目标 5 条**,将不同关注点拆为独立候选)',
81
81
  qualityChecklist: [
82
+ '候选数量 ≥3(1-2 条是不合格的,不同关注点必须拆分为独立候选)',
82
83
  '每个 content ≥200 字符',
83
84
  '每个候选引用 ≥3 个文件路径',
84
85
  'coreCode 提供可复制的完整代码骨架',
@@ -95,7 +96,7 @@ function enrichDimensionTask(dim, tier) {
95
96
  // ── submissionSpec: 嵌入 Quality Checklist ──
96
97
  const submissionSpec = {
97
98
  knowledgeTypes: dim.knowledgeTypes || [],
98
- targetCandidateCount: '3-5',
99
+ targetCandidateCount: '每维度最少 3 条,目标 5 条(1-2 条不合格)。将不同关注点(如命名规范 vs 文件组织 vs 注释风格)拆分为独立候选,不要合并到一条中。',
99
100
  contentStyle: PROJECT_SNAPSHOT_STYLE_GUIDE.split('\n')
100
101
  .filter((l) => !l.startsWith('#') || l.startsWith('##'))
101
102
  .filter((l) => l.trim())
@@ -645,7 +646,7 @@ function buildExecutionPlan(activeDimensions) {
645
646
  return {
646
647
  tiers: plan,
647
648
  totalDimensions: activeDimensions.length,
648
- workflow: '对每个维度: (1) 用你的原生能力阅读代码分析 → (2) 调用 autosnippet_submit_knowledge_batch 批量提交 3-5 条候选 → (3) 调用 autosnippet_dimension_complete 完成维度(必须传 referencedFiles=[分析过的文件路径] 和 keyFindings=[3-5条关键发现])',
649
+ workflow: '对每个维度: (1) 用你的原生能力阅读代码分析 → (2) 调用 autosnippet_submit_knowledge_batch 批量提交候选(**每维度最少 3 条,目标 5 条**,将不同关注点拆分为独立候选,1-2 条视为不合格) → (3) 调用 autosnippet_dimension_complete 完成维度(必须传 referencedFiles=[分析过的文件路径] 和 keyFindings=[3-5条关键发现])',
649
650
  };
650
651
  }
651
652
  // ── Mission Briefing 主构建函数 ──────────────────────────────
@@ -99,7 +99,7 @@ export declare class BootstrapSnapshot {
99
99
  *
100
100
  * @param params.sessionId Bootstrap 会话 ID
101
101
  * @param params.projectRoot 项目根目录
102
- * @param {Array<{path: string, relativePath: string}>} params.allFiles 扫描到的文件列表
102
+ * @param params.allFiles 扫描到的文件列表
103
103
  * @param params.dimensionStats { dimId: { referencedFiles: string[] } }
104
104
  * @param [params.episodicData] EpisodicMemory.toJSON()
105
105
  * @param [params.meta] { durationMs, candidateCount, primaryLang }
@@ -126,7 +126,7 @@ export declare class BootstrapSnapshot {
126
126
  * 计算当前文件与快照的 diff
127
127
  *
128
128
  * @param snapshot getLatest() 返回的快照
129
- * @param {Array<{path: string, relativePath: string, content: string}>} currentFiles 当前文件列表
129
+ * @param currentFiles 当前文件列表
130
130
  * @returns }
131
131
  */
132
132
  computeDiff(snapshot: SnapshotData, currentFiles: SnapshotFile[], projectRoot: string): DiffResult;
@@ -139,7 +139,7 @@ export declare class BootstrapSnapshot {
139
139
  * 3. 如果变更比例超过阈值 → 建议全量
140
140
  *
141
141
  * @param snapshot 上次快照
142
- * @param {{ added: string[], modified: string[], deleted: string[] }} diff
142
+ * @param diff
143
143
  * @param allDimIds 所有可用维度 ID
144
144
  * @returns }
145
145
  */
@@ -47,7 +47,7 @@ export class BootstrapSnapshot {
47
47
  *
48
48
  * @param params.sessionId Bootstrap 会话 ID
49
49
  * @param params.projectRoot 项目根目录
50
- * @param {Array<{path: string, relativePath: string}>} params.allFiles 扫描到的文件列表
50
+ * @param params.allFiles 扫描到的文件列表
51
51
  * @param params.dimensionStats { dimId: { referencedFiles: string[] } }
52
52
  * @param [params.episodicData] EpisodicMemory.toJSON()
53
53
  * @param [params.meta] { durationMs, candidateCount, primaryLang }
@@ -169,7 +169,7 @@ export class BootstrapSnapshot {
169
169
  * 计算当前文件与快照的 diff
170
170
  *
171
171
  * @param snapshot getLatest() 返回的快照
172
- * @param {Array<{path: string, relativePath: string, content: string}>} currentFiles 当前文件列表
172
+ * @param currentFiles 当前文件列表
173
173
  * @returns }
174
174
  */
175
175
  computeDiff(snapshot, currentFiles, projectRoot) {
@@ -212,7 +212,7 @@ export class BootstrapSnapshot {
212
212
  * 3. 如果变更比例超过阈值 → 建议全量
213
213
  *
214
214
  * @param snapshot 上次快照
215
- * @param {{ added: string[], modified: string[], deleted: string[] }} diff
215
+ * @param diff
216
216
  * @param allDimIds 所有可用维度 ID
217
217
  * @returns }
218
218
  */
@@ -25,7 +25,7 @@ export declare class IncrementalBootstrap {
25
25
  /**
26
26
  * 评估增量可行性 — 在 bootstrap 流程最开始调用
27
27
  *
28
- * @param {Array<{path: string, relativePath: string, content: string}>} currentFiles 当前扫描到的文件
28
+ * @param currentFiles 当前扫描到的文件
29
29
  * @param allDimIds 所有可用维度 ID
30
30
  */
31
31
  evaluate(currentFiles: BootstrapFile[], allDimIds: string[]): {
@@ -31,7 +31,7 @@ export class IncrementalBootstrap {
31
31
  /**
32
32
  * 评估增量可行性 — 在 bootstrap 流程最开始调用
33
33
  *
34
- * @param {Array<{path: string, relativePath: string, content: string}>} currentFiles 当前扫描到的文件
34
+ * @param currentFiles 当前扫描到的文件
35
35
  * @param allDimIds 所有可用维度 ID
36
36
  */
37
37
  evaluate(currentFiles, allDimIds) {
@@ -25,11 +25,11 @@ export class DimensionContext {
25
25
  submittedCandidates;
26
26
  /** @param projectContext 项目基础信息 (全程不变) */
27
27
  constructor(projectContext) {
28
- /** @type {object} 项目基础信息 */
28
+ /** 项目基础信息 */
29
29
  this.projectContext = projectContext;
30
- /** @type {Map<string, DimensionDigest>} 已完成维度的摘要 */
30
+ /** 已完成维度的摘要 */
31
31
  this.completedDimensions = new Map();
32
- /** @type {Array<CandidateSummary>} 已提交候选的摘要 */
32
+ /** 已提交候选的摘要 */
33
33
  this.submittedCandidates = [];
34
34
  }
35
35
  /**
@@ -53,7 +53,7 @@ export const DIMENSION_SOP = {
53
53
  },
54
54
  {
55
55
  phase: '4. 提交',
56
- action: '按项目特写格式提交 3-5 个知识候选,每个候选聚焦一种具体代码规范',
56
+ action: '按项目特写格式提交知识候选(**最少 3 条,目标 5 条**),每个候选聚焦一种具体代码规范(如命名约定、注释风格、文件组织分别独立提交)',
57
57
  qualityChecklist: [
58
58
  '每个 content ≥200 字符',
59
59
  '每个候选引用 ≥3 个文件路径',
@@ -106,8 +106,9 @@ export const DIMENSION_SOP = {
106
106
  },
107
107
  {
108
108
  phase: '4. 提交',
109
- action: '每种设计模式单独提交一个候选,包含标准实现代码和使用约束',
109
+ action: '每种设计模式单独提交候选(**整体最少 3 条,目标 5 条**),包含标准实现代码和使用约束',
110
110
  qualityChecklist: [
111
+ '候选数量 ≥3(将不同模式拆分为独立候选,如 Singleton 一条、Factory 一条、Delegate 一条)',
111
112
  '每个候选只聚焦一种设计模式',
112
113
  'content 包含 ✅ 正确写法 和 ❌ 禁止写法',
113
114
  'coreCode 是可复制的模式骨架代码',
@@ -143,8 +144,9 @@ export const DIMENSION_SOP = {
143
144
  },
144
145
  {
145
146
  phase: '4. 提交',
146
- action: '分别提交分层架构、模块通信、依赖管理等知识候选',
147
+ action: '分别提交分层架构、模块通信、依赖管理等知识候选(**最少 3 条,目标 5 条**)',
147
148
  qualityChecklist: [
149
+ '候选数量 ≥3(分层结构、通信方式、依赖管理应分别提交)',
148
150
  'content 包含架构层次图或文字描述',
149
151
  '引用具体目录路径和核心文件',
150
152
  'doClause 表达架构约束规则',
@@ -191,8 +193,9 @@ export const DIMENSION_SOP = {
191
193
  },
192
194
  {
193
195
  phase: '4. 提交',
194
- action: '每种最佳实践独立提交,包含正反面代码示例',
196
+ action: '每种最佳实践独立提交(**整体最少 3 条,目标 5 条**),包含正反面代码示例',
195
197
  qualityChecklist: [
198
+ '候选数量 ≥3(错误处理、并发安全、日志规范等应分别提交)',
196
199
  '每个候选聚焦一种实践(如"错误处理"或"并发安全")',
197
200
  'content 包含 ✅ 推荐写法 和 ❌ 反模式',
198
201
  '提供具体的统计数据(如"项目中 80% 的错误处理使用 Result 类型")',
@@ -242,8 +245,9 @@ export const DIMENSION_SOP = {
242
245
  },
243
246
  {
244
247
  phase: '4. 提交',
245
- action: '事件传播和数据流分别提交候选',
248
+ action: '事件传播和数据流分别提交候选(**最少 3 条,目标 5 条**,将不同机制拆为独立候选)',
246
249
  qualityChecklist: [
250
+ '候选数量 ≥3(Delegate、Notification、Callback 等每种机制独立提交)',
247
251
  '每个候选聚焦一种事件/数据流模式',
248
252
  'content 描述具体的事件传播链路(从触发到响应)',
249
253
  'whenClause 描述何时使用此事件/数据模式',
@@ -293,8 +297,9 @@ export const DIMENSION_SOP = {
293
297
  },
294
298
  {
295
299
  phase: '4. 提交',
296
- action: '分模块提交项目特征候选(技术栈、依赖、入口点、基础设施等)',
300
+ action: '分模块提交项目特征候选(**最少 3 条,目标 5 条**:技术栈、依赖、入口点、基础设施等分别提交)',
297
301
  qualityChecklist: [
302
+ '候选数量 ≥3(技术栈、三方依赖、启动流程等应独立成条)',
298
303
  'content 包含具体的技术栈版本和依赖列表',
299
304
  '引用配置文件和入口文件路径',
300
305
  '每个候选只关注一个方面(如"三方依赖"或"启动流程")',
@@ -340,8 +345,9 @@ export const DIMENSION_SOP = {
340
345
  },
341
346
  {
342
347
  phase: '4. 提交',
343
- action: '每条开发约束单独提交,确保 doClause 表达清晰的强制规则',
348
+ action: '每条开发约束单独提交(**最少 3 条,目标 5 条**),确保 doClause 表达清晰的强制规则',
344
349
  qualityChecklist: [
350
+ '候选数量 ≥3(命名约束、线程约束、废弃 API 等应分别提交)',
345
351
  '每个候选是一条明确的项目开发规则',
346
352
  'doClause 以动词开头,表达强制性要求',
347
353
  'dontClause 明确禁止的做法',
@@ -395,8 +401,9 @@ export const DIMENSION_SOP = {
395
401
  },
396
402
  {
397
403
  phase: '4. 提交',
398
- action: '宏定义、常量、Hook 分别提交候选,确保包含完整实现代码',
404
+ action: '宏定义、常量、Hook 分别提交候选(**最少 3 条,目标 5 条**),确保包含完整实现代码',
399
405
  qualityChecklist: [
406
+ '候选数量 ≥3(宏定义、常量定义、Method Swizzling 等应分别提交)',
400
407
  'coreCode 包含完整的宏/常量/Hook 实现',
401
408
  'content 包含使用频率和场景说明',
402
409
  'Hook 候选必须说明原方法和替换方法的对应关系',
@@ -446,8 +453,9 @@ export const DIMENSION_SOP = {
446
453
  },
447
454
  {
448
455
  phase: '4. 提交',
449
- action: '按基类分组提交候选(NSString Category 一条、UIView Category 一条等)',
456
+ action: '按基类分组提交候选(**最少 3 条,目标 5 条**:NSString Category 一条、UIView Category 一条等)',
450
457
  qualityChecklist: [
458
+ '候选数量 ≥3(不同基类的 Category 独立提交)',
451
459
  'content 包含完整的方法签名列表',
452
460
  'coreCode 包含最常用方法的实现代码',
453
461
  'doClause 强制要求使用已有 Category 方法',
@@ -492,8 +500,9 @@ export const DIMENSION_SOP = {
492
500
  },
493
501
  {
494
502
  phase: '4. 提交',
495
- action: '分别提交 barrel export 结构、导出约定、依赖约束等候选',
503
+ action: '分别提交 barrel export 结构、导出约定、依赖约束等候选(**最少 3 条,目标 5 条**)',
496
504
  qualityChecklist: [
505
+ '候选数量 ≥3(barrel export、命名导出约定、依赖方向约束等独立提交)',
497
506
  'content 包含具体的 import/export 代码示例',
498
507
  '引用 index.ts 和核心模块文件路径',
499
508
  'doClause 表达导出约定规则',
@@ -541,8 +550,9 @@ export const DIMENSION_SOP = {
541
550
  },
542
551
  {
543
552
  phase: '4. 提交',
544
- action: '组件约定、状态管理、路由模式分别提交候选',
553
+ action: '组件约定、状态管理、路由模式分别提交候选(**最少 3 条,目标 5 条**)',
545
554
  qualityChecklist: [
555
+ '候选数量 ≥3(组件结构、状态管理、路由配置等独立提交)',
546
556
  'content 包含组件/状态/路由的代码示例',
547
557
  '引用具体框架版本和配置文件',
548
558
  'coreCode 是可复制的标准写法模板',
@@ -588,8 +598,9 @@ export const DIMENSION_SOP = {
588
598
  },
589
599
  {
590
600
  phase: '4. 提交',
591
- action: '包结构、导入约定、类型标注分别提交候选',
601
+ action: '包结构、导入约定、类型标注分别提交候选(**最少 3 条,目标 5 条**)',
592
602
  qualityChecklist: [
603
+ '候选数量 ≥3(包结构、导入风格、类型标注约定独立提交)',
593
604
  'content 包含具体的 import/type hint 代码示例',
594
605
  '引用 __init__.py 和核心模块路径',
595
606
  'coreCode 展示标准的导入和类型标注写法',
@@ -637,8 +648,9 @@ export const DIMENSION_SOP = {
637
648
  },
638
649
  {
639
650
  phase: '4. 提交',
640
- action: 'DI、ORM、API、自定义注解分别提交候选',
651
+ action: 'DI、ORM、API、自定义注解分别提交候选(**最少 3 条,目标 5 条**)',
641
652
  qualityChecklist: [
653
+ '候选数量 ≥3(DI 注解、ORM 注解、API 注解等独立提交)',
642
654
  'content 包含注解的完整使用示例',
643
655
  '引用具体的类文件和配置',
644
656
  'coreCode 展示标准的注解使用骨架',
@@ -676,8 +688,9 @@ export const DIMENSION_SOP = {
676
688
  },
677
689
  {
678
690
  phase: '4. 提交',
679
- action: '模块结构、接口约定、初始化模式分别提交候选',
691
+ action: '模块结构、接口约定、初始化模式分别提交候选(**最少 3 条,目标 5 条**)',
680
692
  qualityChecklist: [
693
+ '候选数量 ≥3(模块结构、接口约定、初始化模式独立提交)',
681
694
  'content 包含模块依赖关系和接口设计',
682
695
  '引用 go.mod 和核心包路径',
683
696
  'coreCode 展示标准的接口定义和使用',
@@ -147,6 +147,12 @@ export async function bootstrapExternal(ctx) {
147
147
  return envelope({
148
148
  success: true,
149
149
  data: briefing,
150
+ message: `⚠️ Bootstrap 仅完成第一步(项目扫描),你必须继续完成全部 ${dimensions.length} 个维度的分析。` +
151
+ `请立即按 executionPlan.tiers 的顺序,对每个维度执行:` +
152
+ `(1) 用你的代码阅读能力分析该维度相关文件 → ` +
153
+ `(2) 调用 autosnippet_submit_knowledge_batch 提交候选知识(**每维度最少 3 条,目标 5 条**,不同关注点拆为独立候选) → ` +
154
+ `(3) 调用 autosnippet_dimension_complete 标记维度完成。` +
155
+ `不要停下来等待用户确认,直接开始第一个维度。`,
150
156
  meta: { tool: 'autosnippet_bootstrap', responseTimeMs: Date.now() - t0 },
151
157
  });
152
158
  }
@@ -176,10 +176,64 @@ export async function dimensionComplete(ctx, args) {
176
176
  }
177
177
  // ═══════════════════════════════════════════════════════════
178
178
  // 2. Skill 生成 (skillWorthy 维度) — 使用共享 skill-generator
179
+ // 如果 analysisText 太短,自动从已提交的候选知识中合成结构化内容
179
180
  // ═══════════════════════════════════════════════════════════
180
181
  let skillCreated = false;
181
182
  if (dim.skillWorthy) {
182
- const skillResult = await generateSkill(ctx, dim, analysisText, referencedFiles, keyFindings, 'external-agent-bootstrap');
183
+ let effectiveAnalysis = analysisText;
184
+ // 当 analysisText 不足以通过质量门控时,从候选知识中合成
185
+ if (analysisText.length < 500 && submittedRecipeIds.length > 0) {
186
+ try {
187
+ const knowledgeService = ctx.container.get('knowledgeService');
188
+ if (knowledgeService) {
189
+ const parts = [`## ${dim.label || dimensionId} — 分析报告\n`];
190
+ if (analysisText.trim().length > 0) {
191
+ parts.push(analysisText.trim(), '');
192
+ }
193
+ for (const recipeId of submittedRecipeIds) {
194
+ const entry = await knowledgeService.get(recipeId);
195
+ if (!entry) {
196
+ continue;
197
+ }
198
+ parts.push(`### ${entry.title || 'Untitled'}`);
199
+ if (entry.description) {
200
+ parts.push(entry.description);
201
+ }
202
+ if (entry.whenClause || entry.doClause || entry.dontClause) {
203
+ parts.push('');
204
+ if (entry.whenClause) {
205
+ parts.push(`- **When**: ${entry.whenClause}`);
206
+ }
207
+ if (entry.doClause) {
208
+ parts.push(`- **Do**: ${entry.doClause}`);
209
+ }
210
+ if (entry.dontClause) {
211
+ parts.push(`- **Don't**: ${entry.dontClause}`);
212
+ }
213
+ }
214
+ if (entry.coreCode) {
215
+ parts.push('', '```', entry.coreCode.substring(0, 500), '```');
216
+ }
217
+ parts.push('');
218
+ }
219
+ if (keyFindings.length > 0) {
220
+ parts.push('## Key Findings', '');
221
+ for (const f of keyFindings) {
222
+ parts.push(`- ${f}`);
223
+ }
224
+ }
225
+ const synthesized = parts.join('\n');
226
+ if (synthesized.length > effectiveAnalysis.length) {
227
+ effectiveAnalysis = synthesized;
228
+ logger.info(`[DimensionComplete] Synthesized analysisText for "${dimensionId}" from ${submittedRecipeIds.length} candidates (${analysisText.length} → ${synthesized.length} chars)`);
229
+ }
230
+ }
231
+ }
232
+ catch (e) {
233
+ logger.debug(`[DimensionComplete] Failed to synthesize analysisText: ${e instanceof Error ? e.message : String(e)}`);
234
+ }
235
+ }
236
+ const skillResult = await generateSkill(ctx, dim, effectiveAnalysis, referencedFiles, keyFindings, 'external-agent-bootstrap');
183
237
  skillCreated = skillResult.success;
184
238
  if (!skillCreated) {
185
239
  logger.warn(`[DimensionComplete] Skill skipped for "${dimensionId}": ${skillResult.error}`);
@@ -63,16 +63,11 @@ function _parseSkillMeta(skillName, baseDir = SKILLS_DIR) {
63
63
  }
64
64
  /** Skill 适用场景映射 — 帮助 Agent 判断何时该加载哪个 Skill */
65
65
  const SKILL_USE_CASES = {
66
- 'autosnippet-intent': '不确定该用哪个能力时,先加载此 Skill 做意图路由',
67
- 'autosnippet-coldstart': '冷启动/初始化知识库时的完整 9 维度分析指南',
68
- 'autosnippet-analysis': '深度项目分析 — 扫描 + 语义补齐 + 缺口填充',
69
- 'autosnippet-candidates': '生成/提交高质量候选(V2 全字段结构化)',
70
- 'autosnippet-create': '将代码提交到知识库(Dashboard 入口)',
66
+ 'autosnippet-create': '将代码模式/规则/事实提交到知识库',
71
67
  'autosnippet-guard': '代码规范审计(Guard 规则检查)',
72
68
  'autosnippet-recipes': '查询/使用项目标准(Recipe 上下文检索)',
73
- 'autosnippet-structure': '了解项目结构(SPM Target / 依赖图谱 / 知识图谱)',
74
- 'autosnippet-concepts': '学习 AutoSnippet 核心概念(知识库/Recipe/Snippet/向量库)',
75
- 'autosnippet-lifecycle': '了解 Recipe 生命周期与 Agent 权限边界',
69
+ 'autosnippet-structure': '了解项目结构(Target / 依赖图谱 / 知识图谱)',
70
+ 'autosnippet-devdocs': '保存开发文档(架构决策、调试报告、设计文档)',
76
71
  };
77
72
  // ═══════════════════════════════════════════════════════════
78
73
  // Handler: listSkills
@@ -141,7 +136,7 @@ export function listSkills(ctx) {
141
136
  data: {
142
137
  skills,
143
138
  total: skills.length,
144
- hint: '根据当前任务选择合适的 Skill 加载(load_skill)。不确定时先加载 autosnippet-intent 做意图路由。',
139
+ hint: '根据当前任务选择合适的 Skill 加载(load_skill)。',
145
140
  _meta: { signalSuggestions: suggestionCount },
146
141
  },
147
142
  });
@@ -689,28 +684,11 @@ function _listExistingProjectSkillNames(ctx) {
689
684
  /** 推荐相关 Skills(基于静态映射) */
690
685
  function _getRelatedSkills(skillName) {
691
686
  const relations = {
692
- 'autosnippet-coldstart': [
693
- 'autosnippet-analysis',
694
- 'autosnippet-candidates',
695
- 'autosnippet-structure',
696
- ],
697
- 'autosnippet-analysis': [
698
- 'autosnippet-candidates',
699
- 'autosnippet-coldstart',
700
- 'autosnippet-structure',
701
- ],
702
- 'autosnippet-candidates': [
703
- 'autosnippet-analysis',
704
- 'autosnippet-create',
705
- 'autosnippet-lifecycle',
706
- ],
707
- 'autosnippet-create': ['autosnippet-candidates', 'autosnippet-lifecycle'],
708
- 'autosnippet-guard': ['autosnippet-recipes', 'autosnippet-analysis'],
709
- 'autosnippet-recipes': ['autosnippet-guard', 'autosnippet-structure', 'autosnippet-concepts'],
710
- 'autosnippet-structure': ['autosnippet-analysis', 'autosnippet-coldstart'],
711
- 'autosnippet-concepts': ['autosnippet-recipes', 'autosnippet-lifecycle'],
712
- 'autosnippet-lifecycle': ['autosnippet-candidates', 'autosnippet-concepts'],
713
- 'autosnippet-intent': [],
687
+ 'autosnippet-create': ['autosnippet-recipes'],
688
+ 'autosnippet-guard': ['autosnippet-recipes'],
689
+ 'autosnippet-recipes': ['autosnippet-guard', 'autosnippet-structure', 'autosnippet-create'],
690
+ 'autosnippet-structure': ['autosnippet-recipes', 'autosnippet-create'],
691
+ 'autosnippet-devdocs': ['autosnippet-recipes', 'autosnippet-create'],
714
692
  };
715
693
  return relations[skillName] || [];
716
694
  }
@@ -23,8 +23,10 @@ export async function health(ctx) {
23
23
  }
24
24
  // 2) Database 连通性 + 知识库统计
25
25
  try {
26
- const db = ctx.container.get('database');
27
- if (db) {
26
+ const dbConn = ctx.container.get('database');
27
+ if (dbConn) {
28
+ // DatabaseConnection 包装器 → 解包获取原始 better-sqlite3 实例
29
+ const db = typeof dbConn.getDb === 'function' ? dbConn.getDb() : dbConn;
28
30
  db.prepare('SELECT 1').get();
29
31
  checks.database = true;
30
32
  // 知识库统计(轻量聚合查询)
@@ -116,7 +118,7 @@ export async function health(ctx) {
116
118
  }
117
119
  if (!knowledgeBase || knowledgeBase.recipes.total === 0) {
118
120
  actionHints.push('知识库为空,建议执行冷启动:(1) 调用 autosnippet_bootstrap 获取 Mission Briefing → (2) 按维度分析代码并提交知识 → (3) 调用 autosnippet_dimension_complete 完成每个维度。');
119
- actionHints.push('💡 冷启动前建议先加载 Skill 获取详细指引:autosnippet_skill({ operation: "load", name: "autosnippet-coldstart" })');
121
+ actionHints.push('💡 冷启动指引:调用 autosnippet_bootstrap 获取 Mission Briefing 按维度分析代码 → 调用 autosnippet_dimension_complete 完成每个维度');
120
122
  }
121
123
  return envelope({
122
124
  success: true,
@@ -243,7 +245,7 @@ export function capabilities() {
243
245
  {
244
246
  name: '冷启动(外部 Agent)',
245
247
  steps: [
246
- '⚠️ 先加载 Skill 获取详细指引: autosnippet_skill({ operation: "load", name: "autosnippet-coldstart" })',
248
+ '⚠️ 调用 autosnippet_bootstrap 获取 Mission Briefing(无参数直接调用)',
247
249
  'bootstrap(获取 Mission Briefing,无参数直接调用)',
248
250
  '按 Briefing 中的 submissionSchema.example 格式提交知识(注意: content 和 reasoning 都是 JSON 对象)',
249
251
  'Agent 分析代码 + submit_knowledge / submit_knowledge_batch × N',
@@ -154,13 +154,28 @@ async function _close(ctx, svc, args) {
154
154
  });
155
155
  }
156
156
  const { task, newlyReady } = await svc.close(args.id, args.reason || 'Completed');
157
+ const lines = [`✅ Closed: ${args.id} — ${task.title}`];
158
+ if (args.reason && args.reason !== 'Completed') {
159
+ lines.push(`Reason: ${args.reason}`);
160
+ }
161
+ if (newlyReady.length > 0) {
162
+ lines.push(`→ ${newlyReady.length} task(s) newly ready`);
163
+ }
164
+ lines.push('');
165
+ lines.push('⚠️ REQUIRED: You MUST call autosnippet_guard (no args) NOW to review changed files for compliance violations. Do NOT proceed to the next task until guard review passes.');
157
166
  return envelope({
158
167
  success: true,
159
168
  data: {
160
169
  closed: task.toJSON(),
161
170
  newlyReady,
171
+ nextAction: {
172
+ tool: 'autosnippet_guard',
173
+ args: {},
174
+ required: true,
175
+ reason: 'Post-close compliance review — check diff for violations before moving on.',
176
+ },
162
177
  },
163
- message: `Closed ${args.id}. ${newlyReady.length} task(s) newly ready.`,
178
+ message: lines.join('\n'),
164
179
  meta: { tool: 'autosnippet_task' },
165
180
  });
166
181
  }
@@ -1,18 +1,20 @@
1
1
  /**
2
2
  * MCP 工具定义 — V3 整合版 (18 agent + 4 admin = 22 工具)
3
3
  *
4
- * 39 22 工具(参数路由合并同类工具 + 外部 Agent 冷启动新架构 + TaskGraph 统一入口)。
5
- * TaskGraph: autosnippet_task (统一入口,含 prime/decision/task CRUD)
6
- * 每个工具声明增加 tier 字段(agent / admin)。
4
+ * 每个工具声明包含 name、tier(agent/admin)、description inputSchema。
5
+ * description Agent 选择工具的关键 — 使用 bullet list 列出所有 operation 及其用途。
6
+ * inputSchema Zod Schema 自动生成(zodToMcpSchema),参数的 .describe() 会转为 JSON Schema description。
7
7
  *
8
- * inputSchema Zod Schema 自动生成(zodToMcpSchema),消除手写 JSON Schema 双重维护。
9
- * Zod Schema → 运行时校验(wrapHandler)+ JSON Schema 声明(ListTools)。
8
+ * Agent 工具 (18):
9
+ * 1-7: 查询工具 (health/search/knowledge/structure/graph/call_context/guard)
10
+ * 8-10: 写入工具 (submit_knowledge/submit_knowledge_batch/save_document)
11
+ * 11: Skill 管理 (skill)
12
+ * 12-15: 冷启动 (bootstrap/dimension_complete/wiki_plan/wiki_finalize)
13
+ * 16: 自发现 (capabilities)
14
+ * 17: 任务管理 (task)
10
15
  *
11
- * 外部 Agent 冷启动新工具 (v3.1):
12
- * - autosnippet_bootstrap: 参数化 → 无参数化 Mission Briefing
13
- * - autosnippet_dimension_complete: 维度分析完成通知
14
- * - autosnippet_wiki_plan: Wiki 主题规划
15
- * - autosnippet_wiki_finalize: Wiki 元数据 + 去重
16
+ * Admin 工具 (4):
17
+ * 18-21: enrich_candidates/knowledge_lifecycle/validate_candidate/check_duplicate
16
18
  */
17
19
  export declare const TIER_ORDER: {
18
20
  agent: number;