autosnippet 3.0.1 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. package/README.md +231 -324
  2. package/bin/api-server.js +1 -1
  3. package/bin/cli.js +204 -244
  4. package/bin/mcp-server.js +17 -4
  5. package/config/knowledge-base.config.js +132 -132
  6. package/dashboard/dist/assets/{icons-CEfgGaZi.js → icons-Cdq22n2i.js} +95 -100
  7. package/dashboard/dist/assets/index-ClkyPkDX.js +133 -0
  8. package/dashboard/dist/assets/index-t4QrJwv1.css +1 -0
  9. package/dashboard/dist/index.html +3 -3
  10. package/lib/bootstrap.js +8 -8
  11. package/lib/cli/AiScanService.js +86 -40
  12. package/lib/cli/KnowledgeSyncService.js +113 -74
  13. package/lib/cli/SetupService.js +441 -282
  14. package/lib/cli/UpgradeService.js +68 -107
  15. package/lib/core/AstAnalyzer.js +276 -597
  16. package/lib/core/ast/ProjectGraph.js +101 -40
  17. package/lib/core/ast/ensure-grammars.js +232 -0
  18. package/lib/core/ast/index.js +115 -0
  19. package/lib/core/ast/lang-dart.js +661 -0
  20. package/lib/core/ast/lang-go.js +530 -0
  21. package/lib/core/ast/lang-java.js +435 -0
  22. package/lib/core/ast/lang-javascript.js +272 -0
  23. package/lib/core/ast/lang-kotlin.js +423 -0
  24. package/lib/core/ast/lang-objc.js +388 -0
  25. package/lib/core/ast/lang-python.js +371 -0
  26. package/lib/core/ast/lang-swift.js +337 -0
  27. package/lib/core/ast/lang-typescript.js +503 -0
  28. package/lib/core/capability/CapabilityProbe.js +18 -9
  29. package/lib/core/constitution/Constitution.js +2 -3
  30. package/lib/core/constitution/ConstitutionValidator.js +65 -24
  31. package/lib/core/discovery/DartDiscoverer.js +534 -0
  32. package/lib/core/discovery/DiscovererRegistry.js +83 -0
  33. package/lib/core/discovery/GenericDiscoverer.js +225 -0
  34. package/lib/core/discovery/GoDiscoverer.js +541 -0
  35. package/lib/core/discovery/JvmDiscoverer.js +506 -0
  36. package/lib/core/discovery/NodeDiscoverer.js +466 -0
  37. package/lib/core/discovery/ProjectDiscoverer.js +93 -0
  38. package/lib/core/discovery/PythonDiscoverer.js +338 -0
  39. package/lib/core/discovery/SpmDiscoverer.js +5 -0
  40. package/lib/core/discovery/index.js +53 -0
  41. package/lib/core/enhancement/EnhancementPack.js +71 -0
  42. package/lib/core/enhancement/EnhancementRegistry.js +47 -0
  43. package/lib/core/enhancement/android-enhancement.js +102 -0
  44. package/lib/core/enhancement/django-enhancement.js +70 -0
  45. package/lib/core/enhancement/fastapi-enhancement.js +63 -0
  46. package/lib/core/enhancement/go-grpc-enhancement.js +152 -0
  47. package/lib/core/enhancement/go-web-enhancement.js +201 -0
  48. package/lib/core/enhancement/index.js +65 -0
  49. package/lib/core/enhancement/node-server-enhancement.js +88 -0
  50. package/lib/core/enhancement/react-enhancement.js +86 -0
  51. package/lib/core/enhancement/spring-enhancement.js +112 -0
  52. package/lib/core/enhancement/vue-enhancement.js +96 -0
  53. package/lib/core/gateway/Gateway.js +8 -9
  54. package/lib/core/gateway/GatewayActionRegistry.js +1 -1
  55. package/lib/core/permission/PermissionManager.js +12 -8
  56. package/lib/domain/index.js +13 -9
  57. package/lib/domain/knowledge/KnowledgeEntry.js +111 -101
  58. package/lib/domain/knowledge/KnowledgeRepository.js +0 -1
  59. package/lib/domain/knowledge/Lifecycle.js +22 -22
  60. package/lib/domain/knowledge/index.js +9 -12
  61. package/lib/domain/knowledge/values/Constraints.js +31 -21
  62. package/lib/domain/knowledge/values/Content.js +21 -13
  63. package/lib/domain/knowledge/values/Quality.js +31 -18
  64. package/lib/domain/knowledge/values/Reasoning.js +20 -12
  65. package/lib/domain/knowledge/values/Relations.js +37 -25
  66. package/lib/domain/knowledge/values/Stats.js +18 -12
  67. package/lib/domain/knowledge/values/index.js +4 -3
  68. package/lib/domain/snippet/Snippet.js +35 -10
  69. package/lib/external/ai/AiFactory.js +48 -16
  70. package/lib/external/ai/AiProvider.js +184 -90
  71. package/lib/external/ai/providers/ClaudeProvider.js +25 -12
  72. package/lib/external/ai/providers/GoogleGeminiProvider.js +59 -30
  73. package/lib/external/ai/providers/MockProvider.js +9 -3
  74. package/lib/external/ai/providers/OpenAiProvider.js +51 -29
  75. package/lib/external/mcp/McpServer.js +66 -36
  76. package/lib/external/mcp/errorHandler.js +23 -11
  77. package/lib/external/mcp/handlers/LanguageExtensions.js +138 -53
  78. package/lib/external/mcp/handlers/TargetClassifier.js +52 -16
  79. package/lib/external/mcp/handlers/bootstrap/pipeline/BootstrapSnapshot.js +81 -20
  80. package/lib/external/mcp/handlers/bootstrap/pipeline/EpisodicMemory.js +71 -42
  81. package/lib/external/mcp/handlers/bootstrap/pipeline/IncrementalBootstrap.js +9 -17
  82. package/lib/external/mcp/handlers/bootstrap/pipeline/ToolResultCache.js +14 -9
  83. package/lib/external/mcp/handlers/bootstrap/pipeline/dimension-context.js +15 -7
  84. package/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +352 -153
  85. package/lib/external/mcp/handlers/bootstrap/pipeline/tier-scheduler.js +52 -12
  86. package/lib/external/mcp/handlers/bootstrap/skills.js +143 -39
  87. package/lib/external/mcp/handlers/bootstrap.js +691 -168
  88. package/lib/external/mcp/handlers/browse.js +66 -22
  89. package/lib/external/mcp/handlers/candidate.js +118 -35
  90. package/lib/external/mcp/handlers/consolidated.js +49 -17
  91. package/lib/external/mcp/handlers/guard.js +104 -39
  92. package/lib/external/mcp/handlers/knowledge.js +60 -36
  93. package/lib/external/mcp/handlers/search.js +43 -14
  94. package/lib/external/mcp/handlers/skill.js +120 -45
  95. package/lib/external/mcp/handlers/structure.js +240 -86
  96. package/lib/external/mcp/handlers/system.js +42 -12
  97. package/lib/external/mcp/handlers/wiki.js +58 -33
  98. package/lib/external/mcp/tools.js +306 -123
  99. package/lib/http/HttpServer.js +72 -47
  100. package/lib/http/middleware/RateLimiter.js +5 -3
  101. package/lib/http/middleware/errorHandler.js +6 -1
  102. package/lib/http/middleware/requestLogger.js +14 -3
  103. package/lib/http/middleware/roleResolver.js +30 -23
  104. package/lib/http/routes/ai.js +387 -265
  105. package/lib/http/routes/auth.js +81 -61
  106. package/lib/http/routes/candidates.js +430 -320
  107. package/lib/http/routes/commands.js +289 -189
  108. package/lib/http/routes/extract.js +158 -125
  109. package/lib/http/routes/guardRules.js +309 -217
  110. package/lib/http/routes/knowledge.js +213 -154
  111. package/lib/http/routes/modules.js +578 -0
  112. package/lib/http/routes/monitoring.js +6 -6
  113. package/lib/http/routes/recipes.js +104 -93
  114. package/lib/http/routes/search.js +361 -305
  115. package/lib/http/routes/skills.js +145 -98
  116. package/lib/http/routes/snippets.js +42 -30
  117. package/lib/http/routes/spm.js +3 -405
  118. package/lib/http/routes/violations.js +113 -93
  119. package/lib/http/routes/wiki.js +211 -170
  120. package/lib/http/utils/routeHelpers.js +3 -1
  121. package/lib/http/utils/sse-sessions.js +16 -6
  122. package/lib/http/utils/sse.js +15 -5
  123. package/lib/infrastructure/audit/AuditLogger.js +5 -2
  124. package/lib/infrastructure/audit/AuditStore.js +10 -7
  125. package/lib/infrastructure/cache/CacheService.js +3 -1
  126. package/lib/infrastructure/cache/GraphCache.js +8 -4
  127. package/lib/infrastructure/cache/UnifiedCacheAdapter.js +1 -1
  128. package/lib/infrastructure/config/ConfigLoader.js +9 -5
  129. package/lib/infrastructure/config/Defaults.js +30 -10
  130. package/lib/infrastructure/config/Paths.js +28 -8
  131. package/lib/infrastructure/config/TriggerSymbol.js +22 -10
  132. package/lib/infrastructure/database/DatabaseConnection.js +15 -10
  133. package/lib/infrastructure/database/migrations/001_initial_schema.js +0 -1
  134. package/lib/infrastructure/external/ClipboardManager.js +6 -2
  135. package/lib/infrastructure/external/NativeUi.js +50 -43
  136. package/lib/infrastructure/external/OpenBrowser.js +14 -17
  137. package/lib/infrastructure/external/XcodeAutomation.js +14 -258
  138. package/lib/infrastructure/logging/Logger.js +46 -30
  139. package/lib/infrastructure/monitoring/ErrorTracker.js +7 -5
  140. package/lib/infrastructure/monitoring/PerformanceMonitor.js +12 -4
  141. package/lib/infrastructure/paths/HeaderResolver.js +25 -9
  142. package/lib/infrastructure/paths/PathFinder.js +34 -12
  143. package/lib/infrastructure/plugin/PluginManager.js +26 -8
  144. package/lib/infrastructure/realtime/RealtimeService.js +2 -2
  145. package/lib/infrastructure/vector/Chunker.js +22 -7
  146. package/lib/infrastructure/vector/IndexingPipeline.js +46 -22
  147. package/lib/infrastructure/vector/JsonVectorAdapter.js +90 -53
  148. package/lib/infrastructure/vector/VectorStore.js +28 -10
  149. package/lib/injection/ServiceContainer.js +247 -93
  150. package/lib/platform/ios/index.js +63 -0
  151. package/lib/platform/ios/routes/spm.js +437 -0
  152. package/lib/platform/ios/snippet/PlaceholderConverter.js +55 -0
  153. package/lib/platform/ios/snippet/XcodeCodec.js +112 -0
  154. package/lib/{service → platform/ios}/spm/DependencyGraph.js +41 -17
  155. package/lib/{service → platform/ios}/spm/PackageSwiftParser.js +41 -14
  156. package/lib/{service → platform/ios}/spm/PolicyEngine.js +9 -4
  157. package/lib/platform/ios/spm/SpmDiscoverer.js +122 -0
  158. package/lib/{service → platform/ios}/spm/SpmService.js +385 -127
  159. package/lib/{service/automation → platform/ios/xcode}/SaveEventFilter.js +8 -7
  160. package/lib/platform/ios/xcode/XcodeAutomation.js +350 -0
  161. package/lib/{service/automation → platform/ios/xcode}/XcodeIntegration.js +325 -145
  162. package/lib/repository/base/BaseRepository.js +7 -9
  163. package/lib/repository/knowledge/KnowledgeRepository.impl.js +98 -75
  164. package/lib/repository/token/TokenUsageStore.js +4 -2
  165. package/lib/service/automation/ActionPipeline.js +1 -1
  166. package/lib/service/automation/AutomationOrchestrator.js +8 -4
  167. package/lib/service/automation/ContextCollector.js +7 -5
  168. package/lib/service/automation/DirectiveDetector.js +23 -16
  169. package/lib/service/automation/FileWatcher.js +112 -56
  170. package/lib/service/automation/TriggerResolver.js +6 -4
  171. package/lib/service/automation/handlers/AlinkHandler.js +24 -12
  172. package/lib/service/automation/handlers/CreateHandler.js +19 -20
  173. package/lib/service/automation/handlers/DraftHandler.js +14 -8
  174. package/lib/service/automation/handlers/GuardHandler.js +93 -63
  175. package/lib/service/automation/handlers/HeaderHandler.js +1 -6
  176. package/lib/service/automation/handlers/SearchHandler.js +155 -88
  177. package/lib/service/bootstrap/BootstrapTaskManager.js +77 -35
  178. package/lib/service/candidate/SimilarityService.js +25 -9
  179. package/lib/service/chat/AnalystAgent.js +50 -24
  180. package/lib/service/chat/CandidateGuardrail.js +143 -17
  181. package/lib/service/chat/ChatAgent.js +655 -260
  182. package/lib/service/chat/ContextWindow.js +116 -71
  183. package/lib/service/chat/ConversationStore.js +77 -36
  184. package/lib/service/chat/EpisodicConsolidator.js +47 -23
  185. package/lib/service/chat/HandoffProtocol.js +98 -22
  186. package/lib/service/chat/Memory.js +34 -14
  187. package/lib/service/chat/ProducerAgent.js +40 -20
  188. package/lib/service/chat/ProjectSemanticMemory.js +109 -78
  189. package/lib/service/chat/ReasoningLayer.js +148 -70
  190. package/lib/service/chat/ReasoningTrace.js +44 -32
  191. package/lib/service/chat/TaskPipeline.js +39 -19
  192. package/lib/service/chat/ToolRegistry.js +48 -29
  193. package/lib/service/chat/WorkingMemory.js +44 -18
  194. package/lib/service/chat/tools.js +1096 -494
  195. package/lib/service/context/RecipeExtractor.js +132 -51
  196. package/lib/service/cursor/CursorDeliveryPipeline.js +82 -37
  197. package/lib/service/cursor/KnowledgeCompressor.js +25 -22
  198. package/lib/service/cursor/RulesGenerator.js +13 -7
  199. package/lib/service/cursor/SkillsSyncer.js +77 -27
  200. package/lib/service/cursor/TokenBudget.js +2 -2
  201. package/lib/service/cursor/TopicClassifier.js +54 -20
  202. package/lib/service/guard/ComplianceReporter.js +55 -43
  203. package/lib/service/guard/ExclusionManager.js +67 -29
  204. package/lib/service/guard/GuardCheckEngine.js +381 -86
  205. package/lib/service/guard/GuardFeedbackLoop.js +22 -10
  206. package/lib/service/guard/GuardService.js +29 -19
  207. package/lib/service/guard/RuleLearner.js +55 -23
  208. package/lib/service/guard/SourceFileCollector.js +27 -20
  209. package/lib/service/guard/ViolationsStore.js +43 -38
  210. package/lib/service/knowledge/CodeEntityGraph.js +147 -82
  211. package/lib/service/knowledge/ConfidenceRouter.js +12 -10
  212. package/lib/service/knowledge/KnowledgeFileWriter.js +147 -56
  213. package/lib/service/knowledge/KnowledgeGraphService.js +81 -34
  214. package/lib/service/knowledge/KnowledgeService.js +222 -112
  215. package/lib/service/module/ModuleService.js +969 -0
  216. package/lib/service/quality/FeedbackCollector.js +27 -15
  217. package/lib/service/quality/QualityScorer.js +78 -24
  218. package/lib/service/recipe/RecipeCandidateValidator.js +110 -44
  219. package/lib/service/recipe/RecipeParser.js +78 -45
  220. package/lib/service/search/CoarseRanker.js +43 -28
  221. package/lib/service/search/CrossEncoderReranker.js +32 -21
  222. package/lib/service/search/InvertedIndex.js +21 -7
  223. package/lib/service/search/MultiSignalRanker.js +90 -28
  224. package/lib/service/search/RetrievalFunnel.js +45 -24
  225. package/lib/service/search/SearchEngine.js +255 -103
  226. package/lib/service/skills/EventAggregator.js +32 -15
  227. package/lib/service/skills/SignalCollector.js +140 -64
  228. package/lib/service/skills/SkillAdvisor.js +79 -42
  229. package/lib/service/skills/SkillHooks.js +16 -14
  230. package/lib/service/snippet/PlaceholderConverter.js +5 -0
  231. package/lib/service/snippet/SnippetFactory.js +116 -99
  232. package/lib/service/snippet/SnippetInstaller.js +234 -62
  233. package/lib/service/snippet/codecs/SnippetCodec.js +67 -0
  234. package/lib/service/snippet/codecs/VSCodeCodec.js +102 -0
  235. package/lib/service/snippet/codecs/XcodeCodec.js +5 -0
  236. package/lib/service/wiki/WikiGenerator.js +637 -263
  237. package/lib/shared/DimensionCopyRegistry.js +472 -0
  238. package/lib/shared/LanguageService.js +399 -0
  239. package/lib/shared/PathGuard.js +45 -28
  240. package/lib/shared/RecipeReadinessChecker.js +72 -12
  241. package/lib/shared/constants.js +41 -41
  242. package/lib/shared/errors/BaseError.js +2 -2
  243. package/lib/shared/errors/index.js +4 -4
  244. package/lib/shared/similarity.js +25 -8
  245. package/lib/shared/token-utils.js +6 -2
  246. package/lib/shared/utils/common.js +12 -4
  247. package/package.json +49 -13
  248. package/scripts/bench-real-projects.mjs +256 -0
  249. package/scripts/build-native-ui.js +30 -30
  250. package/scripts/clear-old-vector-index.js +5 -35
  251. package/scripts/clear-vector-cache.js +7 -37
  252. package/scripts/collect-test-project-stats.mjs +160 -0
  253. package/scripts/diagnose-mcp.js +41 -32
  254. package/scripts/ensure-parse-package.js +6 -9
  255. package/scripts/generate-recipe-drafts.js +116 -77
  256. package/scripts/init-db.js +3 -20
  257. package/scripts/init-snippets.js +305 -0
  258. package/scripts/init-vector-db.js +173 -170
  259. package/scripts/install-cursor-skill.js +148 -104
  260. package/scripts/install-full.js +8 -21
  261. package/scripts/install-vscode-copilot.js +106 -170
  262. package/scripts/migrate-md-to-knowledge.mjs +139 -151
  263. package/scripts/postinstall-safe.js +5 -17
  264. package/scripts/recipe-audit.js +106 -82
  265. package/scripts/release.js +283 -323
  266. package/scripts/setup-mcp-config.js +62 -72
  267. package/scripts/verify-context-api.js +20 -20
  268. package/skills/autosnippet-analysis/SKILL.md +10 -6
  269. package/skills/autosnippet-candidates/SKILL.md +27 -26
  270. package/skills/autosnippet-coldstart/SKILL.md +555 -38
  271. package/skills/autosnippet-concepts/SKILL.md +349 -337
  272. package/skills/autosnippet-create/SKILL.md +5 -5
  273. package/skills/autosnippet-reference-dart/SKILL.md +543 -0
  274. package/skills/autosnippet-reference-go/SKILL.md +539 -0
  275. package/skills/autosnippet-reference-java/SKILL.md +534 -0
  276. package/skills/autosnippet-reference-jsts/SKILL.md +41 -9
  277. package/skills/autosnippet-reference-kotlin/SKILL.md +526 -0
  278. package/skills/autosnippet-reference-objc/SKILL.md +29 -6
  279. package/skills/autosnippet-reference-python/SKILL.md +800 -0
  280. package/skills/autosnippet-reference-swift/SKILL.md +70 -14
  281. package/skills/autosnippet-structure/SKILL.md +4 -4
  282. package/templates/cursor-rules/autosnippet-conventions.mdc +2 -2
  283. package/templates/recipes-setup/README.md +2 -2
  284. package/templates/recipes-setup/_template.md +1 -1
  285. package/dashboard/dist/assets/index-Bun3ld_J.css +0 -1
  286. package/dashboard/dist/assets/index-_Sk_Dmg3.js +0 -143
  287. package/resources/asd-entry/main.swift +0 -159
  288. package/scripts/build-asd-entry.js +0 -51
  289. package/scripts/init-xcode-snippets.js +0 -311
  290. package/template.json +0 -39
@@ -2,7 +2,7 @@
2
2
 
3
3
  /**
4
4
  * AutoSnippet VSCode Copilot 安装脚本
5
- *
5
+ *
6
6
  * 功能:
7
7
  * 1. 自动配置 VSCode 全局和工作区 settings.json
8
8
  * 2. 创建推荐扩展配置 (.vscode/extensions.json)
@@ -22,22 +22,25 @@
22
22
  * --quiet 安静模式(无输出)
23
23
  */
24
24
 
25
- import { fileURLToPath } from 'node:url';
26
25
  import { dirname } from 'node:path';
26
+ import { fileURLToPath } from 'node:url';
27
+
27
28
  const __filename = fileURLToPath(import.meta.url);
28
29
  const __dirname = dirname(__filename);
29
30
 
30
31
  import fs from 'node:fs';
31
- import path from 'node:path';
32
- import os from 'node:os';
33
32
  import { createRequire } from 'node:module';
33
+ import os from 'node:os';
34
+ import path from 'node:path';
35
+
34
36
  const require = createRequire(import.meta.url);
35
37
 
36
38
  const args = require('minimist')(process.argv.slice(2));
37
39
  const projectPath = args.path || args.p || process.cwd();
38
40
 
39
41
  // 检测是否在 AutoSnippet 仓库内执行
40
- const isAutoSnippetRepo = fs.existsSync(path.join(projectPath, 'bin/mcp-server.js')) &&
42
+ const isAutoSnippetRepo =
43
+ fs.existsSync(path.join(projectPath, 'bin/mcp-server.js')) &&
41
44
  fs.existsSync(path.join(projectPath, 'bin/asd')) &&
42
45
  fs.existsSync(path.join(projectPath, 'package.json'));
43
46
 
@@ -54,12 +57,11 @@ const colors = {
54
57
  green: '\x1b[32m',
55
58
  yellow: '\x1b[33m',
56
59
  blue: '\x1b[34m',
57
- red: '\x1b[31m'
60
+ red: '\x1b[31m',
58
61
  };
59
62
 
60
63
  function log(msg, color = 'reset') {
61
64
  if (!isQuiet) {
62
- console.log(colors[color] + msg + colors.reset);
63
65
  }
64
66
  }
65
67
 
@@ -71,41 +73,41 @@ function error(msg) {
71
73
 
72
74
  function getVSCodeSettingsPath(isGlobal = true) {
73
75
  const platform = os.platform();
74
-
76
+
75
77
  if (isGlobal) {
76
- if (platform === 'darwin') {
77
- return path.join(os.homedir(), 'Library/Application Support/Code/User/settings.json');
78
- } else if (platform === 'win32') {
79
- return path.join(os.getenv('APPDATA') || os.homedir(), 'Code/User/settings.json');
80
- } else {
81
- return path.join(os.homedir(), '.config/Code/User/settings.json');
82
- }
78
+ if (platform === 'darwin') {
79
+ return path.join(os.homedir(), 'Library/Application Support/Code/User/settings.json');
80
+ } else if (platform === 'win32') {
81
+ return path.join(os.getenv('APPDATA') || os.homedir(), 'Code/User/settings.json');
82
+ } else {
83
+ return path.join(os.homedir(), '.config/Code/User/settings.json');
84
+ }
83
85
  } else {
84
- return path.join(projectPath, '.vscode/settings.json');
86
+ return path.join(projectPath, '.vscode/settings.json');
85
87
  }
86
88
  }
87
89
 
88
90
  function readJsonFile(filePath, defaultValue = {}) {
89
91
  if (!fs.existsSync(filePath)) {
90
- return defaultValue;
92
+ return defaultValue;
91
93
  }
92
94
  try {
93
- const content = fs.readFileSync(filePath, 'utf8');
94
- return JSON.parse(content);
95
+ const content = fs.readFileSync(filePath, 'utf8');
96
+ return JSON.parse(content);
95
97
  } catch (e) {
96
- log(`⚠️ 无法解析 ${filePath}: ${e.message}`, 'yellow');
97
- return defaultValue;
98
+ log(`⚠️ 无法解析 ${filePath}: ${e.message}`, 'yellow');
99
+ return defaultValue;
98
100
  }
99
101
  }
100
102
 
101
103
  function writeJsonFile(filePath, data) {
102
104
  try {
103
- fs.mkdirSync(path.dirname(filePath), { recursive: true });
104
- fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n', 'utf8');
105
- return true;
105
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
106
+ fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\n`, 'utf8');
107
+ return true;
106
108
  } catch (e) {
107
- error(`✗ 无法写入 ${filePath}: ${e.message}`);
108
- return false;
109
+ error(`✗ 无法写入 ${filePath}: ${e.message}`);
110
+ return false;
109
111
  }
110
112
  }
111
113
 
@@ -114,9 +116,9 @@ function writeJsonFile(filePath, data) {
114
116
  function getMcpServerPath() {
115
117
  const scriptPath = path.join(projectPath, 'bin/mcp-server.js');
116
118
  if (!fs.existsSync(scriptPath)) {
117
- error(`✗ MCP Server 不存在: ${scriptPath}`);
118
- error(` 请确保在 AutoSnippet 项目目录下运行此脚本`);
119
- process.exit(1);
119
+ error(`✗ MCP Server 不存在: ${scriptPath}`);
120
+ error(` 请确保在 AutoSnippet 项目目录下运行此脚本`);
121
+ process.exit(1);
120
122
  }
121
123
  return scriptPath;
122
124
  }
@@ -124,88 +126,49 @@ function getMcpServerPath() {
124
126
  // ============ 配置 VSCode settings.json ============
125
127
 
126
128
  function configureVSCodeSettings() {
127
- log('\n📝 配置 VSCode settings.json...', 'blue');
128
-
129
+ log('\n📝 配置 VSCode MCP 设置...', 'blue');
130
+
129
131
  if (isAutoSnippetRepo && !args.path) {
130
- log('ℹ️ 检测到在 AutoSnippet 仓库内执行,仅配置全局设置', 'yellow');
131
- log(' 如需为其他项目配置,请使用: --path /path/to/project', 'yellow');
132
+ log('ℹ️ 检测到在 AutoSnippet 仓库内执行,仅配置全局设置', 'yellow');
133
+ log(' 如需为其他项目配置,请使用: --path /path/to/project', 'yellow');
132
134
  }
133
-
135
+
134
136
  const mcpServerPath = getMcpServerPath();
135
- const mcpConfig = {
136
- name: 'autosnippet',
137
- command: 'node',
138
- args: [mcpServerPath],
139
- env: {
140
- ASD_UI_URL: 'http://localhost:3000'
141
- }
137
+ const mcpServerConfig = {
138
+ type: 'stdio',
139
+ command: 'node',
140
+ args: [mcpServerPath],
141
+ env: {
142
+ ASD_UI_URL: 'http://localhost:3000',
143
+ },
142
144
  };
143
145
 
144
- let globalConfigured = false;
145
- let workspaceConfigured = false;
146
-
147
- // 全局配置
148
- if (configGlobal) {
149
- const globalSettingsPath = getVSCodeSettingsPath(true);
150
- const globalSettings = readJsonFile(globalSettingsPath, {});
151
-
152
- if (!globalSettings['github.copilot.mcp']) {
153
- globalSettings['github.copilot.mcp'] = {};
154
- }
155
- if (!globalSettings['github.copilot.mcp'].servers) {
156
- globalSettings['github.copilot.mcp'].servers = [];
157
- }
158
-
159
- const existingIndex = globalSettings['github.copilot.mcp'].servers.findIndex(
160
- s => s.name === 'autosnippet'
161
- );
162
-
163
- if (existingIndex >= 0) {
164
- globalSettings['github.copilot.mcp'].servers[existingIndex] = mcpConfig;
165
- } else {
166
- globalSettings['github.copilot.mcp'].servers.push(mcpConfig);
167
- }
168
-
169
- // 添加推荐的全局设置
170
- globalSettings['github.copilot.enable'] = globalSettings['github.copilot.enable'] || {};
171
- globalSettings['github.copilot.enable']['*'] = true;
172
- globalSettings['github.copilot.chat.localeOverride'] = 'zh-CN';
146
+ let configured = false;
173
147
 
174
- if (writeJsonFile(globalSettingsPath, globalSettings)) {
175
- log(`✅ 全局配置完成: ${globalSettingsPath}`, 'green');
176
- globalConfigured = true;
177
- }
178
- }
179
-
180
- // 工作区配置
148
+ // 工作区配置 .vscode/mcp.json(新标准格式)
181
149
  if (configWorkspace) {
182
- const workspaceSettingsPath = getVSCodeSettingsPath(false);
183
- const workspaceSettings = readJsonFile(workspaceSettingsPath, {});
184
-
185
- if (!workspaceSettings['github.copilot.mcp']) {
186
- workspaceSettings['github.copilot.mcp'] = {};
187
- }
188
- if (!workspaceSettings['github.copilot.mcp'].servers) {
189
- workspaceSettings['github.copilot.mcp'].servers = [];
190
- }
191
-
192
- const existingIndex = workspaceSettings['github.copilot.mcp'].servers.findIndex(
193
- s => s.name === 'autosnippet'
194
- );
150
+ const vscodeDir = path.join(projectPath, '.vscode');
151
+ const mcpConfigPath = path.join(vscodeDir, 'mcp.json');
152
+
153
+ let config = {};
154
+ if (fs.existsSync(mcpConfigPath)) {
155
+ try {
156
+ config = JSON.parse(fs.readFileSync(mcpConfigPath, 'utf8'));
157
+ } catch { /* ignore */ }
158
+ }
195
159
 
196
- if (existingIndex >= 0) {
197
- workspaceSettings['github.copilot.mcp'].servers[existingIndex] = mcpConfig;
198
- } else {
199
- workspaceSettings['github.copilot.mcp'].servers.push(mcpConfig);
200
- }
160
+ if (!config.servers) {
161
+ config.servers = {};
162
+ }
163
+ config.servers.autosnippet = mcpServerConfig;
201
164
 
202
- if (writeJsonFile(workspaceSettingsPath, workspaceSettings)) {
203
- log(`✅ 工作区配置完成: ${workspaceSettingsPath}`, 'green');
204
- workspaceConfigured = true;
205
- }
165
+ if (writeJsonFile(mcpConfigPath, config)) {
166
+ log(`✅ 工作区 MCP 配置完成: ${mcpConfigPath}`, 'green');
167
+ configured = true;
168
+ }
206
169
  }
207
170
 
208
- return globalConfigured || workspaceConfigured;
171
+ return configured;
209
172
  }
210
173
 
211
174
  // ============ 创建推荐扩展配置 ============
@@ -215,16 +178,13 @@ function createExtensionsJson() {
215
178
 
216
179
  const extensionsPath = path.join(projectPath, '.vscode/extensions.json');
217
180
  const extensions = {
218
- recommendations: [
219
- 'GitHub.copilot',
220
- 'GitHub.copilot-chat'
221
- ],
222
- unwantedRecommendations: []
181
+ recommendations: ['GitHub.copilot', 'GitHub.copilot-chat'],
182
+ unwantedRecommendations: [],
223
183
  };
224
184
 
225
185
  if (writeJsonFile(extensionsPath, extensions)) {
226
- log(`✅ 扩展推荐配置完成: ${extensionsPath}`, 'green');
227
- return true;
186
+ log(`✅ 扩展推荐配置完成: ${extensionsPath}`, 'green');
187
+ return true;
228
188
  }
229
189
  return false;
230
190
  }
@@ -235,95 +195,74 @@ function createCopilotInstructions() {
235
195
  log('\n📖 生成项目指令 (.github/copilot-instructions.md)...', 'blue');
236
196
 
237
197
  const instructionsPath = path.join(projectPath, '.github/copilot-instructions.md');
238
-
198
+
239
199
  // 检查是否已存在
240
200
  if (fs.existsSync(instructionsPath)) {
241
- log(`✓ 项目指令已存在,跳过创建`, 'yellow');
242
- return true;
201
+ log(`✓ 项目指令已存在,跳过创建`, 'yellow');
202
+ return true;
243
203
  }
244
204
 
245
205
  // 从模板文件读取内容
246
206
  const templatePath = path.join(__dirname, '..', 'templates', 'copilot-instructions.md');
247
207
  if (!fs.existsSync(templatePath)) {
248
- error(`✗ 模板文件不存在: ${templatePath}`);
249
- return false;
208
+ error(`✗ 模板文件不存在: ${templatePath}`);
209
+ return false;
250
210
  }
251
211
 
252
212
  const instructions = fs.readFileSync(templatePath, 'utf8');
253
213
 
254
214
  try {
255
- fs.mkdirSync(path.dirname(instructionsPath), { recursive: true });
256
- fs.writeFileSync(instructionsPath, instructions, 'utf8');
257
- log(`✅ 项目指令生成完成: ${instructionsPath}`, 'green');
258
- return true;
215
+ fs.mkdirSync(path.dirname(instructionsPath), { recursive: true });
216
+ fs.writeFileSync(instructionsPath, instructions, 'utf8');
217
+ log(`✅ 项目指令生成完成: ${instructionsPath}`, 'green');
218
+ return true;
259
219
  } catch (e) {
260
- error(`✗ 生成项目指令失败: ${e.message}`);
261
- return false;
220
+ error(`✗ 生成项目指令失败: ${e.message}`);
221
+ return false;
262
222
  }
263
223
  }
264
224
 
265
225
  // ============ 验证配置 ============
266
226
 
267
227
  function verifyConfiguration() {
268
- if (skipVerify) return;
228
+ if (skipVerify) {
229
+ return;
230
+ }
269
231
 
270
232
  log('\n🔍 验证配置...', 'blue');
271
233
 
272
- // 检查全局设置
273
- if (configGlobal) {
274
- const globalSettingsPath = getVSCodeSettingsPath(true);
275
- if (fs.existsSync(globalSettingsPath)) {
276
- const settings = readJsonFile(globalSettingsPath, {});
277
- if (settings['github.copilot.mcp'] && settings['github.copilot.mcp'].servers) {
278
- const hasAutosnippet = settings['github.copilot.mcp'].servers.some(
279
- s => s.name === 'autosnippet'
280
- );
281
- if (hasAutosnippet) {
282
- log(`✅ VSCode 全局 MCP 配置验证成功`, 'green');
283
- } else {
284
- log(`⚠️ 未在全局设置中找到 autosnippet MCP 服务器`, 'yellow');
285
- }
286
- } else {
287
- log(`⚠️ 全局设置中未找到 MCP 配置`, 'yellow');
288
- }
289
- }
290
- }
291
-
292
- // 检查工作区设置
234
+ // 检查工作区 MCP 配置(.vscode/mcp.json)
293
235
  if (configWorkspace) {
294
- const workspaceSettingsPath = getVSCodeSettingsPath(false);
295
- if (fs.existsSync(workspaceSettingsPath)) {
296
- const settings = readJsonFile(workspaceSettingsPath, {});
297
- if (settings['github.copilot.mcp'] && settings['github.copilot.mcp'].servers) {
298
- const hasAutosnippet = settings['github.copilot.mcp'].servers.some(
299
- s => s.name === 'autosnippet'
300
- );
301
- if (hasAutosnippet) {
302
- log(`✅ VSCode 工作区 MCP 配置验证成功`, 'green');
236
+ const mcpConfigPath = path.join(projectPath, '.vscode/mcp.json');
237
+ if (fs.existsSync(mcpConfigPath)) {
238
+ const config = readJsonFile(mcpConfigPath, {});
239
+ if (config.servers?.autosnippet) {
240
+ log(`✅ VSCode 工作区 MCP 配置验证成功 (.vscode/mcp.json)`, 'green');
241
+ } else {
242
+ log(`⚠️ .vscode/mcp.json 中未找到 autosnippet 服务器`, 'yellow');
243
+ }
303
244
  } else {
304
- log(`⚠️ 未在工作区设置中找到 autosnippet MCP 服务器`, 'yellow');
305
- }
245
+ log(`⚠️ 未找到 .vscode/mcp.json`, 'yellow');
306
246
  }
307
247
  }
308
- }
309
248
 
310
249
  // 检查推荐扩展
311
250
  const extensionsPath = path.join(projectPath, '.vscode/extensions.json');
312
251
  if (fs.existsSync(extensionsPath)) {
313
- log(`✅ 推荐扩展配置存在`, 'green');
252
+ log(`✅ 推荐扩展配置存在`, 'green');
314
253
  }
315
254
 
316
255
  // 检查项目指令
317
256
  const instructionsPath = path.join(projectPath, '.github/copilot-instructions.md');
318
257
  if (fs.existsSync(instructionsPath)) {
319
- log(`✅ 项目指令存在`, 'green');
258
+ log(`✅ 项目指令存在`, 'green');
320
259
  }
321
260
  }
322
261
 
323
262
  // ============ 提供快速启动指导 ============
324
263
 
325
264
  function printQuickStart() {
326
- log('\n' + '='.repeat(60), 'blue');
265
+ log(`\n${'='.repeat(60)}`, 'blue');
327
266
  log('🎉 VSCode Copilot 配置完成!', 'green');
328
267
  log('='.repeat(60), 'blue');
329
268
 
@@ -352,20 +291,17 @@ function printQuickStart() {
352
291
  log(` ${path.join(projectPath, '.github/copilot-instructions.md')}`, 'yellow');
353
292
 
354
293
  log('\n📝 配置位置:');
355
- if (configGlobal) {
356
- log(` 全局: ${getVSCodeSettingsPath(true)}`, 'yellow');
357
- }
358
294
  if (configWorkspace) {
359
- log(` 工作区: ${getVSCodeSettingsPath(false)}`, 'yellow');
295
+ log(` MCP: ${path.join(projectPath, '.vscode/mcp.json')}`, 'yellow');
360
296
  }
361
297
 
362
298
  log('\n💡 提示:');
363
299
  log(' - 首次配置需要重启 VSCode');
364
300
  log(' - MCP 服务器需要 Node.js 18.0+');
365
301
  log(' - Dashboard 运行在 http://localhost:3000');
366
- log(' - 可在 VSCode 设置中搜索 "copilot.mcp" 查看配置\n');
302
+ log(' - MCP 配置位于 .vscode/mcp.json(可加入版本控制共享给团队)\n');
367
303
 
368
- log('='.repeat(60) + '\n', 'blue');
304
+ log(`${'='.repeat(60)}\n`, 'blue');
369
305
  }
370
306
 
371
307
  // ============ 主程序 ============
@@ -375,9 +311,9 @@ async function main() {
375
311
  log(`📍 项目路径: ${projectPath}\n`, 'blue');
376
312
 
377
313
  const results = {
378
- settings: false,
379
- extensions: false,
380
- instructions: false
314
+ settings: false,
315
+ extensions: false,
316
+ instructions: false,
381
317
  };
382
318
 
383
319
  // 配置 settings.json
@@ -396,18 +332,18 @@ async function main() {
396
332
  printQuickStart();
397
333
 
398
334
  // 返回状态
399
- const allSuccess = Object.values(results).every(v => v);
335
+ const allSuccess = Object.values(results).every((v) => v);
400
336
  if (allSuccess) {
401
- log('✅ 所有配置完成!', 'green');
402
- process.exit(0);
337
+ log('✅ 所有配置完成!', 'green');
338
+ process.exit(0);
403
339
  } else {
404
- log('⚠️ 部分配置可能未完成,请检查上述消息', 'yellow');
405
- process.exit(1);
340
+ log('⚠️ 部分配置可能未完成,请检查上述消息', 'yellow');
341
+ process.exit(1);
406
342
  }
407
343
  }
408
344
 
409
345
  // 运行
410
- main().catch(err => {
346
+ main().catch((err) => {
411
347
  error(`✗ 配置失败: ${err.message}`);
412
348
  process.exit(1);
413
349
  });