autosnippet 3.0.0 → 3.0.2

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 +230 -324
  2. package/bin/api-server.js +1 -1
  3. package/bin/cli.js +204 -244
  4. package/bin/mcp-server.js +5 -3
  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 +439 -277
  14. package/lib/cli/UpgradeService.js +63 -100
  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 +759 -243
  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 +146 -145
  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 +60 -52
  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
  }
@@ -125,20 +127,20 @@ function getMcpServerPath() {
125
127
 
126
128
  function configureVSCodeSettings() {
127
129
  log('\n📝 配置 VSCode settings.json...', 'blue');
128
-
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
137
  const mcpConfig = {
136
- name: 'autosnippet',
137
- command: 'node',
138
- args: [mcpServerPath],
139
- env: {
140
- ASD_UI_URL: 'http://localhost:3000'
141
- }
138
+ name: 'autosnippet',
139
+ command: 'node',
140
+ args: [mcpServerPath],
141
+ env: {
142
+ ASD_UI_URL: 'http://localhost:3000',
143
+ },
142
144
  };
143
145
 
144
146
  let globalConfigured = false;
@@ -146,63 +148,63 @@ function configureVSCodeSettings() {
146
148
 
147
149
  // 全局配置
148
150
  if (configGlobal) {
149
- const globalSettingsPath = getVSCodeSettingsPath(true);
150
- const globalSettings = readJsonFile(globalSettingsPath, {});
151
+ const globalSettingsPath = getVSCodeSettingsPath(true);
152
+ const globalSettings = readJsonFile(globalSettingsPath, {});
151
153
 
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
- }
154
+ if (!globalSettings['github.copilot.mcp']) {
155
+ globalSettings['github.copilot.mcp'] = {};
156
+ }
157
+ if (!globalSettings['github.copilot.mcp'].servers) {
158
+ globalSettings['github.copilot.mcp'].servers = [];
159
+ }
158
160
 
159
- const existingIndex = globalSettings['github.copilot.mcp'].servers.findIndex(
160
- s => s.name === 'autosnippet'
161
- );
161
+ const existingIndex = globalSettings['github.copilot.mcp'].servers.findIndex(
162
+ (s) => s.name === 'autosnippet'
163
+ );
162
164
 
163
- if (existingIndex >= 0) {
164
- globalSettings['github.copilot.mcp'].servers[existingIndex] = mcpConfig;
165
- } else {
166
- globalSettings['github.copilot.mcp'].servers.push(mcpConfig);
167
- }
165
+ if (existingIndex >= 0) {
166
+ globalSettings['github.copilot.mcp'].servers[existingIndex] = mcpConfig;
167
+ } else {
168
+ globalSettings['github.copilot.mcp'].servers.push(mcpConfig);
169
+ }
168
170
 
169
- // 添加推荐的全局设置
170
- globalSettings['github.copilot.enable'] = globalSettings['github.copilot.enable'] || {};
171
- globalSettings['github.copilot.enable']['*'] = true;
172
- globalSettings['github.copilot.chat.localeOverride'] = 'zh-CN';
171
+ // 添加推荐的全局设置
172
+ globalSettings['github.copilot.enable'] = globalSettings['github.copilot.enable'] || {};
173
+ globalSettings['github.copilot.enable']['*'] = true;
174
+ globalSettings['github.copilot.chat.localeOverride'] = 'zh-CN';
173
175
 
174
- if (writeJsonFile(globalSettingsPath, globalSettings)) {
175
- log(`✅ 全局配置完成: ${globalSettingsPath}`, 'green');
176
- globalConfigured = true;
177
- }
176
+ if (writeJsonFile(globalSettingsPath, globalSettings)) {
177
+ log(`✅ 全局配置完成: ${globalSettingsPath}`, 'green');
178
+ globalConfigured = true;
179
+ }
178
180
  }
179
181
 
180
182
  // 工作区配置
181
183
  if (configWorkspace) {
182
- const workspaceSettingsPath = getVSCodeSettingsPath(false);
183
- const workspaceSettings = readJsonFile(workspaceSettingsPath, {});
184
+ const workspaceSettingsPath = getVSCodeSettingsPath(false);
185
+ const workspaceSettings = readJsonFile(workspaceSettingsPath, {});
184
186
 
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
- }
187
+ if (!workspaceSettings['github.copilot.mcp']) {
188
+ workspaceSettings['github.copilot.mcp'] = {};
189
+ }
190
+ if (!workspaceSettings['github.copilot.mcp'].servers) {
191
+ workspaceSettings['github.copilot.mcp'].servers = [];
192
+ }
191
193
 
192
- const existingIndex = workspaceSettings['github.copilot.mcp'].servers.findIndex(
193
- s => s.name === 'autosnippet'
194
- );
194
+ const existingIndex = workspaceSettings['github.copilot.mcp'].servers.findIndex(
195
+ (s) => s.name === 'autosnippet'
196
+ );
195
197
 
196
- if (existingIndex >= 0) {
197
- workspaceSettings['github.copilot.mcp'].servers[existingIndex] = mcpConfig;
198
- } else {
199
- workspaceSettings['github.copilot.mcp'].servers.push(mcpConfig);
200
- }
198
+ if (existingIndex >= 0) {
199
+ workspaceSettings['github.copilot.mcp'].servers[existingIndex] = mcpConfig;
200
+ } else {
201
+ workspaceSettings['github.copilot.mcp'].servers.push(mcpConfig);
202
+ }
201
203
 
202
- if (writeJsonFile(workspaceSettingsPath, workspaceSettings)) {
203
- log(`✅ 工作区配置完成: ${workspaceSettingsPath}`, 'green');
204
- workspaceConfigured = true;
205
- }
204
+ if (writeJsonFile(workspaceSettingsPath, workspaceSettings)) {
205
+ log(`✅ 工作区配置完成: ${workspaceSettingsPath}`, 'green');
206
+ workspaceConfigured = true;
207
+ }
206
208
  }
207
209
 
208
210
  return globalConfigured || workspaceConfigured;
@@ -215,16 +217,13 @@ function createExtensionsJson() {
215
217
 
216
218
  const extensionsPath = path.join(projectPath, '.vscode/extensions.json');
217
219
  const extensions = {
218
- recommendations: [
219
- 'GitHub.copilot',
220
- 'GitHub.copilot-chat'
221
- ],
222
- unwantedRecommendations: []
220
+ recommendations: ['GitHub.copilot', 'GitHub.copilot-chat'],
221
+ unwantedRecommendations: [],
223
222
  };
224
223
 
225
224
  if (writeJsonFile(extensionsPath, extensions)) {
226
- log(`✅ 扩展推荐配置完成: ${extensionsPath}`, 'green');
227
- return true;
225
+ log(`✅ 扩展推荐配置完成: ${extensionsPath}`, 'green');
226
+ return true;
228
227
  }
229
228
  return false;
230
229
  }
@@ -235,95 +234,97 @@ function createCopilotInstructions() {
235
234
  log('\n📖 生成项目指令 (.github/copilot-instructions.md)...', 'blue');
236
235
 
237
236
  const instructionsPath = path.join(projectPath, '.github/copilot-instructions.md');
238
-
237
+
239
238
  // 检查是否已存在
240
239
  if (fs.existsSync(instructionsPath)) {
241
- log(`✓ 项目指令已存在,跳过创建`, 'yellow');
242
- return true;
240
+ log(`✓ 项目指令已存在,跳过创建`, 'yellow');
241
+ return true;
243
242
  }
244
243
 
245
244
  // 从模板文件读取内容
246
245
  const templatePath = path.join(__dirname, '..', 'templates', 'copilot-instructions.md');
247
246
  if (!fs.existsSync(templatePath)) {
248
- error(`✗ 模板文件不存在: ${templatePath}`);
249
- return false;
247
+ error(`✗ 模板文件不存在: ${templatePath}`);
248
+ return false;
250
249
  }
251
250
 
252
251
  const instructions = fs.readFileSync(templatePath, 'utf8');
253
252
 
254
253
  try {
255
- fs.mkdirSync(path.dirname(instructionsPath), { recursive: true });
256
- fs.writeFileSync(instructionsPath, instructions, 'utf8');
257
- log(`✅ 项目指令生成完成: ${instructionsPath}`, 'green');
258
- return true;
254
+ fs.mkdirSync(path.dirname(instructionsPath), { recursive: true });
255
+ fs.writeFileSync(instructionsPath, instructions, 'utf8');
256
+ log(`✅ 项目指令生成完成: ${instructionsPath}`, 'green');
257
+ return true;
259
258
  } catch (e) {
260
- error(`✗ 生成项目指令失败: ${e.message}`);
261
- return false;
259
+ error(`✗ 生成项目指令失败: ${e.message}`);
260
+ return false;
262
261
  }
263
262
  }
264
263
 
265
264
  // ============ 验证配置 ============
266
265
 
267
266
  function verifyConfiguration() {
268
- if (skipVerify) return;
267
+ if (skipVerify) {
268
+ return;
269
+ }
269
270
 
270
271
  log('\n🔍 验证配置...', 'blue');
271
272
 
272
273
  // 检查全局设置
273
274
  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');
275
+ const globalSettingsPath = getVSCodeSettingsPath(true);
276
+ if (fs.existsSync(globalSettingsPath)) {
277
+ const settings = readJsonFile(globalSettingsPath, {});
278
+ if (settings['github.copilot.mcp']?.servers) {
279
+ const hasAutosnippet = settings['github.copilot.mcp'].servers.some(
280
+ (s) => s.name === 'autosnippet'
281
+ );
282
+ if (hasAutosnippet) {
283
+ log(`✅ VSCode 全局 MCP 配置验证成功`, 'green');
284
+ } else {
285
+ log(`⚠️ 未在全局设置中找到 autosnippet MCP 服务器`, 'yellow');
286
+ }
287
+ } else {
288
+ log(`⚠️ 全局设置中未找到 MCP 配置`, 'yellow');
289
+ }
288
290
  }
289
291
  }
290
- }
291
292
 
292
293
  // 检查工作区设置
293
294
  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');
303
- } else {
304
- log(`⚠️ 未在工作区设置中找到 autosnippet MCP 服务器`, 'yellow');
295
+ const workspaceSettingsPath = getVSCodeSettingsPath(false);
296
+ if (fs.existsSync(workspaceSettingsPath)) {
297
+ const settings = readJsonFile(workspaceSettingsPath, {});
298
+ if (settings['github.copilot.mcp']?.servers) {
299
+ const hasAutosnippet = settings['github.copilot.mcp'].servers.some(
300
+ (s) => s.name === 'autosnippet'
301
+ );
302
+ if (hasAutosnippet) {
303
+ log(`✅ VSCode 工作区 MCP 配置验证成功`, 'green');
304
+ } else {
305
+ log(`⚠️ 未在工作区设置中找到 autosnippet MCP 服务器`, 'yellow');
306
+ }
307
+ }
305
308
  }
306
- }
307
- }
308
309
  }
309
310
 
310
311
  // 检查推荐扩展
311
312
  const extensionsPath = path.join(projectPath, '.vscode/extensions.json');
312
313
  if (fs.existsSync(extensionsPath)) {
313
- log(`✅ 推荐扩展配置存在`, 'green');
314
+ log(`✅ 推荐扩展配置存在`, 'green');
314
315
  }
315
316
 
316
317
  // 检查项目指令
317
318
  const instructionsPath = path.join(projectPath, '.github/copilot-instructions.md');
318
319
  if (fs.existsSync(instructionsPath)) {
319
- log(`✅ 项目指令存在`, 'green');
320
+ log(`✅ 项目指令存在`, 'green');
320
321
  }
321
322
  }
322
323
 
323
324
  // ============ 提供快速启动指导 ============
324
325
 
325
326
  function printQuickStart() {
326
- log('\n' + '='.repeat(60), 'blue');
327
+ log(`\n${'='.repeat(60)}`, 'blue');
327
328
  log('🎉 VSCode Copilot 配置完成!', 'green');
328
329
  log('='.repeat(60), 'blue');
329
330
 
@@ -353,10 +354,10 @@ function printQuickStart() {
353
354
 
354
355
  log('\n📝 配置位置:');
355
356
  if (configGlobal) {
356
- log(` 全局: ${getVSCodeSettingsPath(true)}`, 'yellow');
357
+ log(` 全局: ${getVSCodeSettingsPath(true)}`, 'yellow');
357
358
  }
358
359
  if (configWorkspace) {
359
- log(` 工作区: ${getVSCodeSettingsPath(false)}`, 'yellow');
360
+ log(` 工作区: ${getVSCodeSettingsPath(false)}`, 'yellow');
360
361
  }
361
362
 
362
363
  log('\n💡 提示:');
@@ -365,7 +366,7 @@ function printQuickStart() {
365
366
  log(' - Dashboard 运行在 http://localhost:3000');
366
367
  log(' - 可在 VSCode 设置中搜索 "copilot.mcp" 查看配置\n');
367
368
 
368
- log('='.repeat(60) + '\n', 'blue');
369
+ log(`${'='.repeat(60)}\n`, 'blue');
369
370
  }
370
371
 
371
372
  // ============ 主程序 ============
@@ -375,9 +376,9 @@ async function main() {
375
376
  log(`📍 项目路径: ${projectPath}\n`, 'blue');
376
377
 
377
378
  const results = {
378
- settings: false,
379
- extensions: false,
380
- instructions: false
379
+ settings: false,
380
+ extensions: false,
381
+ instructions: false,
381
382
  };
382
383
 
383
384
  // 配置 settings.json
@@ -396,18 +397,18 @@ async function main() {
396
397
  printQuickStart();
397
398
 
398
399
  // 返回状态
399
- const allSuccess = Object.values(results).every(v => v);
400
+ const allSuccess = Object.values(results).every((v) => v);
400
401
  if (allSuccess) {
401
- log('✅ 所有配置完成!', 'green');
402
- process.exit(0);
402
+ log('✅ 所有配置完成!', 'green');
403
+ process.exit(0);
403
404
  } else {
404
- log('⚠️ 部分配置可能未完成,请检查上述消息', 'yellow');
405
- process.exit(1);
405
+ log('⚠️ 部分配置可能未完成,请检查上述消息', 'yellow');
406
+ process.exit(1);
406
407
  }
407
408
  }
408
409
 
409
410
  // 运行
410
- main().catch(err => {
411
+ main().catch((err) => {
411
412
  error(`✗ 配置失败: ${err.message}`);
412
413
  process.exit(1);
413
414
  });