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
@@ -1,73 +1,69 @@
1
- import DatabaseConnection from '../infrastructure/database/DatabaseConnection.js';
2
- import Logger from '../infrastructure/logging/Logger.js';
3
- import AuditStore from '../infrastructure/audit/AuditStore.js';
4
- import AuditLogger from '../infrastructure/audit/AuditLogger.js';
5
- import Gateway from '../core/gateway/Gateway.js';
6
1
  import { readdirSync, statSync } from 'node:fs';
7
- import { join as pathJoin, relative as pathRelative, extname as pathExtname } from 'node:path';
8
-
9
- import { KnowledgeRepositoryImpl } from '../repository/knowledge/KnowledgeRepository.impl.js';
10
- import { KnowledgeFileWriter } from '../service/knowledge/KnowledgeFileWriter.js';
2
+ import { extname as pathExtname, join as pathJoin, relative as pathRelative } from 'node:path';
11
3
  import { KnowledgeSyncService } from '../cli/KnowledgeSyncService.js';
12
- import { KnowledgeService } from '../service/knowledge/KnowledgeService.js';
13
- import { ConfidenceRouter } from '../service/knowledge/ConfidenceRouter.js';
14
- import { SnippetFactory } from '../service/snippet/SnippetFactory.js';
15
- import { GuardService } from '../service/guard/GuardService.js';
16
- import { KnowledgeGraphService } from '../service/knowledge/KnowledgeGraphService.js';
17
- import { CodeEntityGraph } from '../service/knowledge/CodeEntityGraph.js';
18
- import { SearchEngine } from '../service/search/SearchEngine.js';
19
- import { GuardCheckEngine } from '../service/guard/GuardCheckEngine.js';
20
-
21
- // ─── P0: Advanced Search ──────────────────────────────
22
- import { RetrievalFunnel } from '../service/search/RetrievalFunnel.js';
23
-
4
+ // ─── v3.0: AST ProjectGraph ──────────────────────────
5
+ import ProjectGraph from '../core/ast/ProjectGraph.js';
6
+ // ─── v3.1: Multi-Language Discovery + Enhancement ────────
7
+ import { getDiscovererRegistry } from '../core/discovery/index.js';
8
+ import { getEnhancementRegistry, initEnhancementRegistry } from '../core/enhancement/index.js';
9
+ import Gateway from '../core/gateway/Gateway.js';
10
+ import AuditLogger from '../infrastructure/audit/AuditLogger.js';
11
+ import AuditStore from '../infrastructure/audit/AuditStore.js';
12
+ import { GraphCache } from '../infrastructure/cache/GraphCache.js';
13
+ // ─── P3: Infrastructure ──────────────────────────────
14
+ import { EventBus } from '../infrastructure/event/EventBus.js';
15
+ import Logger from '../infrastructure/logging/Logger.js';
16
+ import { getRealtimeService as _getRealtimeService } from '../infrastructure/realtime/RealtimeService.js';
17
+ import { IndexingPipeline } from '../infrastructure/vector/IndexingPipeline.js';
24
18
  // ─── P0: Vector Storage ──────────────────────────────
25
19
  import { JsonVectorAdapter } from '../infrastructure/vector/JsonVectorAdapter.js';
26
- import { IndexingPipeline } from '../infrastructure/vector/IndexingPipeline.js';
27
-
28
- // ─── P1: Injection / Snippet ─────────────────
29
- import { RecipeParser } from '../service/recipe/RecipeParser.js';
30
- import { RecipeCandidateValidator } from '../service/recipe/RecipeCandidateValidator.js';
31
- import { SnippetInstaller } from '../service/snippet/SnippetInstaller.js';
32
-
33
- // ─── P1: Guard Advanced ──────────────────────────────
34
- import { ExclusionManager } from '../service/guard/ExclusionManager.js';
35
- import { RuleLearner } from '../service/guard/RuleLearner.js';
36
- import { ViolationsStore } from '../service/guard/ViolationsStore.js';
37
- import { ComplianceReporter } from '../service/guard/ComplianceReporter.js';
38
- import { GuardFeedbackLoop } from '../service/guard/GuardFeedbackLoop.js';
39
-
20
+ import { KnowledgeRepositoryImpl } from '../repository/knowledge/KnowledgeRepository.impl.js';
40
21
  // ─── P1: Token Usage Tracking ─────────────────────────
41
22
  import { TokenUsageStore } from '../repository/token/TokenUsageStore.js';
42
-
43
- // ─── P2: Quality ──────────────────────────────────────
44
- import { QualityScorer } from '../service/quality/QualityScorer.js';
45
- import { FeedbackCollector } from '../service/quality/FeedbackCollector.js';
46
-
47
- // ─── P2: SPM ──────────────────────────────────────────
48
- import { SpmService } from '../service/spm/SpmService.js';
49
- // ─── P2: Content Extraction ─────────────────────────────────────
50
- import { RecipeExtractor } from '../service/context/RecipeExtractor.js';
51
23
  // ─── P2: Automation ───────────────────────────────────
52
24
  import { AutomationOrchestrator } from '../service/automation/AutomationOrchestrator.js';
53
-
25
+ import { BootstrapTaskManager } from '../service/bootstrap/BootstrapTaskManager.js';
26
+ import { ChatAgent } from '../service/chat/ChatAgent.js';
54
27
  // ─── P2: ChatAgent (统一 AI Agent) ────────────────────
55
28
  import { ToolRegistry } from '../service/chat/ToolRegistry.js';
56
- import { ChatAgent } from '../service/chat/ChatAgent.js';
57
29
  import { ALL_TOOLS } from '../service/chat/tools.js';
58
- import { SkillHooks } from '../service/skills/SkillHooks.js';
59
-
60
- // ─── v3.0: AST ProjectGraph ──────────────────────────
61
- import ProjectGraph from '../core/ast/ProjectGraph.js';
62
- import { GraphCache } from '../infrastructure/cache/GraphCache.js';
63
-
64
- // ─── P3: Infrastructure ──────────────────────────────
65
- import { EventBus } from '../infrastructure/event/EventBus.js';
66
- import { BootstrapTaskManager } from '../service/bootstrap/BootstrapTaskManager.js';
67
- import { getRealtimeService as _getRealtimeService } from '../infrastructure/realtime/RealtimeService.js';
68
-
30
+ // ─── P2: Content Extraction ─────────────────────────────────────
31
+ import { RecipeExtractor } from '../service/context/RecipeExtractor.js';
69
32
  // ─── P3: Cursor Delivery Pipeline ──────────────────────
70
33
  import { CursorDeliveryPipeline } from '../service/cursor/CursorDeliveryPipeline.js';
34
+ import { ComplianceReporter } from '../service/guard/ComplianceReporter.js';
35
+ // ─── P1: Guard Advanced ──────────────────────────────
36
+ import { ExclusionManager } from '../service/guard/ExclusionManager.js';
37
+ import { GuardCheckEngine } from '../service/guard/GuardCheckEngine.js';
38
+ import { GuardFeedbackLoop } from '../service/guard/GuardFeedbackLoop.js';
39
+ import { GuardService } from '../service/guard/GuardService.js';
40
+ import { RuleLearner } from '../service/guard/RuleLearner.js';
41
+ import { ViolationsStore } from '../service/guard/ViolationsStore.js';
42
+ import { CodeEntityGraph } from '../service/knowledge/CodeEntityGraph.js';
43
+ import { ConfidenceRouter } from '../service/knowledge/ConfidenceRouter.js';
44
+ import { KnowledgeFileWriter } from '../service/knowledge/KnowledgeFileWriter.js';
45
+ import { KnowledgeGraphService } from '../service/knowledge/KnowledgeGraphService.js';
46
+ import { KnowledgeService } from '../service/knowledge/KnowledgeService.js';
47
+ import { FeedbackCollector } from '../service/quality/FeedbackCollector.js';
48
+ // ─── P2: Quality ──────────────────────────────────────
49
+ import { QualityScorer } from '../service/quality/QualityScorer.js';
50
+ import { RecipeCandidateValidator } from '../service/recipe/RecipeCandidateValidator.js';
51
+ // ─── P1: Injection / Snippet ─────────────────
52
+ import { RecipeParser } from '../service/recipe/RecipeParser.js';
53
+ // ─── P0: Advanced Search ──────────────────────────────
54
+ import { RetrievalFunnel } from '../service/search/RetrievalFunnel.js';
55
+ import { SearchEngine } from '../service/search/SearchEngine.js';
56
+ import { SkillHooks } from '../service/skills/SkillHooks.js';
57
+ import { SnippetFactory } from '../service/snippet/SnippetFactory.js';
58
+ import { SnippetInstaller } from '../service/snippet/SnippetInstaller.js';
59
+ import { XcodeCodec } from '../service/snippet/codecs/XcodeCodec.js';
60
+ import { VSCodeCodec } from '../service/snippet/codecs/VSCodeCodec.js';
61
+ // ─── P2: SPM ──────────────────────────────────────────
62
+ import { SpmService } from '../platform/ios/spm/SpmService.js';
63
+ // ─── v3.2: ModuleService (统一多语言模块扫描) ──────────
64
+ import { ModuleService } from '../service/module/ModuleService.js';
65
+ import { DimensionCopy } from '../shared/DimensionCopyRegistry.js';
66
+ import { LanguageService } from '../shared/LanguageService.js';
71
67
 
72
68
  /**
73
69
  * DependencyInjection 容器
@@ -139,8 +135,8 @@ export class ServiceContainer {
139
135
  try {
140
136
  const { getAvailableFallbacks, createProvider } = this.singletons._aiFactory;
141
137
  const providerName = this.singletons.aiProvider.name?.replace('-', '') || '';
142
- const fbCandidates = typeof getAvailableFallbacks === 'function'
143
- ? getAvailableFallbacks(providerName) : [];
138
+ const fbCandidates =
139
+ typeof getAvailableFallbacks === 'function' ? getAvailableFallbacks(providerName) : [];
144
140
  for (const fb of fbCandidates) {
145
141
  try {
146
142
  const fbProvider = createProvider({ provider: fb });
@@ -149,9 +145,13 @@ export class ServiceContainer {
149
145
  this.logger.info('Embedding fallback provider created', { provider: fb });
150
146
  break;
151
147
  }
152
- } catch { /* skip */ }
148
+ } catch {
149
+ /* skip */
150
+ }
153
151
  }
154
- } catch { /* no embed fallback available */ }
152
+ } catch {
153
+ /* no embed fallback available */
154
+ }
155
155
  }
156
156
 
157
157
  // RecipeExtractor 实例(用于工具增强)
@@ -160,12 +160,28 @@ export class ServiceContainer {
160
160
  // 注册基础设施依赖
161
161
  this._registerInfrastructure();
162
162
 
163
+ // ═══ AI Provider 热重载标记 ═══
164
+ // 记录哪些 singleton key 持有 aiProvider 引用,在 reloadAiProvider() 时需要清除
165
+ this._aiDependentSingletons = [
166
+ 'chatAgent',
167
+ 'searchEngine',
168
+ 'retrievalFunnel',
169
+ 'indexingPipeline',
170
+ ];
171
+
163
172
  // 注册仓储
164
173
  this._registerRepositories();
165
174
 
166
175
  // 注册服务
167
176
  this._registerServices();
168
177
 
178
+ // v3.1: 初始化 Enhancement Pack 注册表(异步加载所有框架增强包)
179
+ try {
180
+ await initEnhancementRegistry();
181
+ } catch (e) {
182
+ this.logger.warn('Enhancement registry init failed (non-blocking)', { error: e.message });
183
+ }
184
+
169
185
  this.logger.info('Service container initialized successfully');
170
186
  } catch (error) {
171
187
  this.logger.error('Error initializing service container', {
@@ -175,6 +191,60 @@ export class ServiceContainer {
175
191
  }
176
192
  }
177
193
 
194
+ /**
195
+ * 热重载 AI Provider(API Key 变更后调用,无需重启进程)
196
+ *
197
+ * 流程:
198
+ * 1. 替换 singletons.aiProvider
199
+ * 2. 重新创建 _embedProvider(如果主 provider 不支持 embedding)
200
+ * 3. 清除已缓存的依赖 AI 的 singleton(ChatAgent / SearchEngine 等),
201
+ * 下次 get() 时会用新 provider 重新创建
202
+ *
203
+ * @param {import('../external/ai/AiProvider.js').AiProvider} newProvider
204
+ */
205
+ reloadAiProvider(newProvider) {
206
+ const old = this.singletons.aiProvider;
207
+ this.singletons.aiProvider = newProvider;
208
+
209
+ // 重新创建 embedding fallback provider
210
+ this.singletons._embedProvider = null;
211
+ if (newProvider && !newProvider.supportsEmbedding?.()) {
212
+ try {
213
+ const { getAvailableFallbacks, createProvider } = this.singletons._aiFactory || {};
214
+ if (typeof getAvailableFallbacks === 'function') {
215
+ const providerName = newProvider.name?.replace('-', '') || '';
216
+ const fbCandidates = getAvailableFallbacks(providerName);
217
+ for (const fb of fbCandidates) {
218
+ try {
219
+ const fbProvider = createProvider({ provider: fb });
220
+ if (fbProvider.supportsEmbedding?.()) {
221
+ this.singletons._embedProvider = fbProvider;
222
+ this.logger.info('Embedding fallback provider re-created', { provider: fb });
223
+ break;
224
+ }
225
+ } catch { /* skip */ }
226
+ }
227
+ }
228
+ } catch { /* no embed fallback available */ }
229
+ }
230
+
231
+ // 清除持有旧 aiProvider 引用的 singleton 缓存
232
+ // 下次调用 container.get() 时会使用新 provider 重建
233
+ const cleared = [];
234
+ for (const key of this._aiDependentSingletons || []) {
235
+ if (this.singletons[key]) {
236
+ this.singletons[key] = null;
237
+ cleared.push(key);
238
+ }
239
+ }
240
+
241
+ this.logger.info('AI provider hot-reloaded', {
242
+ old: old?.constructor?.name || 'none',
243
+ new: newProvider?.constructor?.name || 'none',
244
+ clearedSingletons: cleared,
245
+ });
246
+ }
247
+
178
248
  /**
179
249
  * 注册基础设施依赖
180
250
  */
@@ -182,7 +252,9 @@ export class ServiceContainer {
182
252
  // Database(使用 Bootstrap 注入的实例,或延迟报错)
183
253
  this.register('database', () => {
184
254
  if (!this.singletons.database) {
185
- throw new Error('Database not initialized. Ensure Bootstrap.initialize() is called before using ServiceContainer.');
255
+ throw new Error(
256
+ 'Database not initialized. Ensure Bootstrap.initialize() is called before using ServiceContainer.'
257
+ );
186
258
  }
187
259
  return this.singletons.database;
188
260
  });
@@ -230,9 +302,16 @@ export class ServiceContainer {
230
302
  const eventBus = this.get('eventBus');
231
303
  // 延迟 getter: RealtimeService 在 HTTP server 启动后才可用,CLI 模式下不可用
232
304
  const getRS = () => {
233
- try { return _getRealtimeService(); } catch { return null; }
305
+ try {
306
+ return _getRealtimeService();
307
+ } catch {
308
+ return null;
309
+ }
234
310
  };
235
- this.singletons.bootstrapTaskManager = new BootstrapTaskManager({ eventBus, getRealtimeService: getRS });
311
+ this.singletons.bootstrapTaskManager = new BootstrapTaskManager({
312
+ eventBus,
313
+ getRealtimeService: getRS,
314
+ });
236
315
  }
237
316
  return this.singletons.bootstrapTaskManager;
238
317
  });
@@ -311,11 +390,7 @@ export class ServiceContainer {
311
390
  const knowledgeRepository = this.get('knowledgeRepository');
312
391
  const auditLogger = this.get('auditLogger');
313
392
  const gateway = this.get('gateway');
314
- this.singletons.guardService = new GuardService(
315
- knowledgeRepository,
316
- auditLogger,
317
- gateway
318
- );
393
+ this.singletons.guardService = new GuardService(knowledgeRepository, auditLogger, gateway);
319
394
  }
320
395
  return this.singletons.guardService;
321
396
  });
@@ -333,7 +408,8 @@ export class ServiceContainer {
333
408
  this.register('codeEntityGraph', () => {
334
409
  if (!this.singletons.codeEntityGraph) {
335
410
  const database = this.get('database');
336
- const projectRoot = this.singletons._projectRoot || process.env.ASD_PROJECT_DIR || process.cwd();
411
+ const projectRoot =
412
+ this.singletons._projectRoot || process.env.ASD_PROJECT_DIR || process.cwd();
337
413
  this.singletons.codeEntityGraph = new CodeEntityGraph(database, { projectRoot });
338
414
  }
339
415
  return this.singletons.codeEntityGraph;
@@ -346,7 +422,10 @@ export class ServiceContainer {
346
422
  const aiProvider = this.singletons.aiProvider || null;
347
423
  const embedProvider = this.singletons._embedProvider || aiProvider;
348
424
  const vectorStore = this.get('vectorStore');
349
- this.singletons.searchEngine = new SearchEngine(database, { aiProvider: embedProvider, vectorStore });
425
+ this.singletons.searchEngine = new SearchEngine(database, {
426
+ aiProvider: embedProvider,
427
+ vectorStore,
428
+ });
350
429
  }
351
430
  return this.singletons.searchEngine;
352
431
  });
@@ -373,7 +452,10 @@ export class ServiceContainer {
373
452
  const vectorStore = this.get('vectorStore');
374
453
  const aiProvider = this.singletons.aiProvider || null;
375
454
  const embedProvider = this.singletons._embedProvider || aiProvider;
376
- this.singletons.retrievalFunnel = new RetrievalFunnel({ vectorStore, aiProvider: embedProvider });
455
+ this.singletons.retrievalFunnel = new RetrievalFunnel({
456
+ vectorStore,
457
+ aiProvider: embedProvider,
458
+ });
377
459
  }
378
460
  return this.singletons.retrievalFunnel;
379
461
  });
@@ -383,7 +465,7 @@ export class ServiceContainer {
383
465
  if (!this.singletons.vectorStore) {
384
466
  const projectRoot = this.singletons._projectRoot || process.cwd();
385
467
  const store = new JsonVectorAdapter(projectRoot);
386
- store.initSync(); // 从磁盘加载已有 vector_index.json
468
+ store.initSync(); // 从磁盘加载已有 vector_index.json
387
469
  this.singletons.vectorStore = store;
388
470
  }
389
471
  return this.singletons.vectorStore;
@@ -395,7 +477,10 @@ export class ServiceContainer {
395
477
  const vectorStore = this.get('vectorStore');
396
478
  const aiProvider = this.singletons.aiProvider || null;
397
479
  const embedProvider = this.singletons._embedProvider || aiProvider;
398
- this.singletons.indexingPipeline = new IndexingPipeline({ vectorStore, aiProvider: embedProvider });
480
+ this.singletons.indexingPipeline = new IndexingPipeline({
481
+ vectorStore,
482
+ aiProvider: embedProvider,
483
+ });
399
484
  }
400
485
  return this.singletons.indexingPipeline;
401
486
  });
@@ -416,24 +501,39 @@ export class ServiceContainer {
416
501
  return this.singletons.recipeCandidateValidator;
417
502
  });
418
503
 
419
- // SnippetFactory (V3: uses knowledgeRepository)
504
+ // SnippetFactory (V4: codec-driven, IDE-agnostic)
420
505
  this.register('snippetFactory', () => {
421
506
  if (!this.singletons.snippetFactory) {
422
507
  const knowledgeRepo = this.get('knowledgeRepository');
423
- this.singletons.snippetFactory = new SnippetFactory(knowledgeRepo);
508
+ const factory = new SnippetFactory(knowledgeRepo);
509
+ // 注册 IDE codecs
510
+ factory.registerCodec(new XcodeCodec());
511
+ factory.registerCodec(new VSCodeCodec());
512
+ this.singletons.snippetFactory = factory;
424
513
  }
425
514
  return this.singletons.snippetFactory;
426
515
  });
427
516
 
428
- // SnippetInstaller
517
+ // SnippetInstaller (Xcode — 默认 codec)
429
518
  this.register('snippetInstaller', () => {
430
519
  if (!this.singletons.snippetInstaller) {
431
520
  const factory = this.get('snippetFactory');
432
- this.singletons.snippetInstaller = new SnippetInstaller({ snippetFactory: factory });
521
+ const codec = factory.getCodec('xcode');
522
+ this.singletons.snippetInstaller = new SnippetInstaller({ codec, snippetFactory: factory });
433
523
  }
434
524
  return this.singletons.snippetInstaller;
435
525
  });
436
526
 
527
+ // SnippetInstaller (VSCode)
528
+ this.register('vscodeSnippetInstaller', () => {
529
+ if (!this.singletons.vscodeSnippetInstaller) {
530
+ const factory = this.get('snippetFactory');
531
+ const codec = factory.getCodec('vscode');
532
+ this.singletons.vscodeSnippetInstaller = new SnippetInstaller({ codec, snippetFactory: factory });
533
+ }
534
+ return this.singletons.vscodeSnippetInstaller;
535
+ });
536
+
437
537
  // Guard: ExclusionManager
438
538
  this.register('exclusionManager', () => {
439
539
  if (!this.singletons.exclusionManager) {
@@ -470,7 +570,7 @@ export class ServiceContainer {
470
570
  this.get('violationsStore'),
471
571
  this.get('ruleLearner'),
472
572
  this.get('exclusionManager'),
473
- config.qualityGate || {},
573
+ config.qualityGate || {}
474
574
  );
475
575
  }
476
576
  return this.singletons.complianceReporter;
@@ -482,7 +582,7 @@ export class ServiceContainer {
482
582
  this.singletons.guardFeedbackLoop = new GuardFeedbackLoop(
483
583
  this.get('violationsStore'),
484
584
  this.get('feedbackCollector'),
485
- { guardCheckEngine: this.get('guardCheckEngine') },
585
+ { guardCheckEngine: this.get('guardCheckEngine') }
486
586
  );
487
587
  }
488
588
  return this.singletons.guardFeedbackLoop;
@@ -541,6 +641,38 @@ export class ServiceContainer {
541
641
  return this.singletons.automationOrchestrator;
542
642
  });
543
643
 
644
+ // ModuleService (统一多语言模块扫描,语言无关)
645
+ this.register('moduleService', () => {
646
+ if (!this.singletons.moduleService) {
647
+ const projectRoot = this.singletons._projectRoot || process.cwd();
648
+ this.singletons.moduleService = new ModuleService(projectRoot, {
649
+ aiFactory: this.singletons._aiFactory || null,
650
+ chatAgent: this.singletons.chatAgent || null,
651
+ qualityScorer: this.get('qualityScorer'),
652
+ recipeExtractor: this.singletons._recipeExtractor || null,
653
+ guardCheckEngine: this.get('guardCheckEngine'),
654
+ violationsStore: this.get('violationsStore'),
655
+ });
656
+ }
657
+ return this.singletons.moduleService;
658
+ });
659
+
660
+ // DiscovererRegistry (v3.1 多语言项目发现)
661
+ this.register('discovererRegistry', () => {
662
+ return getDiscovererRegistry();
663
+ });
664
+
665
+ // LanguageService (v3.1 统一语言映射服务 — 静态类,直接返回)
666
+ this.register('languageService', () => LanguageService);
667
+
668
+ // DimensionCopy (v3.1 维度文案注册表 — 静态类,直接返回)
669
+ this.register('dimensionCopy', () => DimensionCopy);
670
+
671
+ // EnhancementRegistry (v3.1 框架增强包)
672
+ this.register('enhancementRegistry', () => {
673
+ return getEnhancementRegistry();
674
+ });
675
+
544
676
  // ToolRegistry (ChatAgent 的工具注册表)
545
677
  this.register('toolRegistry', () => {
546
678
  if (!this.singletons.toolRegistry) {
@@ -662,14 +794,14 @@ export class ServiceContainer {
662
794
  changedPaths.push(fp);
663
795
  }
664
796
  }
665
- const deletedPaths = Object.keys(oldHashes).filter(rel => !newHashes[rel]);
797
+ const deletedPaths = Object.keys(oldHashes).filter((rel) => !newHashes[rel]);
666
798
 
667
799
  if (changedPaths.length === 0 && deletedPaths.length === 0) {
668
800
  // 完全命中
669
801
  this.singletons.projectGraph = graph;
670
802
  this.logger.info(
671
803
  `[ServiceContainer] ProjectGraph ⚡ 缓存命中 (${graph.getOverview().totalClasses} classes, ` +
672
- `${Date.now() - startTime}ms)`
804
+ `${Date.now() - startTime}ms)`
673
805
  );
674
806
  return graph;
675
807
  }
@@ -684,7 +816,7 @@ export class ServiceContainer {
684
816
  const overview = graph.getOverview();
685
817
  this.logger.info(
686
818
  `[ServiceContainer] ProjectGraph 增量更新: +${diff.added} ~${diff.updated} -${diff.deleted} ` +
687
- `(${overview.totalClasses} classes, ${Date.now() - startTime}ms)`
819
+ `(${overview.totalClasses} classes, ${Date.now() - startTime}ms)`
688
820
  );
689
821
  return graph;
690
822
  }
@@ -701,8 +833,8 @@ export class ServiceContainer {
701
833
 
702
834
  this.logger.info(
703
835
  `[ServiceContainer] ProjectGraph built: ${overview.totalClasses} classes, ` +
704
- `${overview.totalProtocols} protocols, ${overview.totalCategories} categories ` +
705
- `(${overview.buildTimeMs}ms) — 缓存已写入`
836
+ `${overview.totalProtocols} protocols, ${overview.totalCategories} categories ` +
837
+ `(${overview.buildTimeMs}ms) — 缓存已写入`
706
838
  );
707
839
  return graph;
708
840
  } catch (err) {
@@ -721,29 +853,51 @@ export class ServiceContainer {
721
853
  const DEFAULTS_EXT = { '.m': true, '.h': true, '.swift': true };
722
854
  const extSet = new Set(options.extensions || Object.keys(DEFAULTS_EXT));
723
855
  const excludePatterns = options.excludePatterns || [
724
- 'Pods/', 'Carthage/', 'node_modules/', '.build/', 'build/',
725
- 'DerivedData/', 'vendor/', '.git/', '__tests__/', 'Tests/',
856
+ 'Pods/',
857
+ 'Carthage/',
858
+ 'node_modules/',
859
+ '.build/',
860
+ 'build/',
861
+ 'DerivedData/',
862
+ 'vendor/',
863
+ '.git/',
864
+ '__tests__/',
865
+ 'Tests/',
726
866
  ];
727
867
  const maxFiles = options.maxFiles || 500;
728
868
  const maxFileSizeBytes = options.maxFileSizeBytes || 500_000;
729
869
  const results = [];
730
870
 
731
871
  function walk(dir) {
732
- if (results.length >= maxFiles) return;
872
+ if (results.length >= maxFiles) {
873
+ return;
874
+ }
733
875
  let entries;
734
- try { entries = readdirSync(dir, { withFileTypes: true }); } catch { return; }
876
+ try {
877
+ entries = readdirSync(dir, { withFileTypes: true });
878
+ } catch {
879
+ return;
880
+ }
735
881
  for (const entry of entries) {
736
- if (results.length >= maxFiles) return;
882
+ if (results.length >= maxFiles) {
883
+ return;
884
+ }
737
885
  const fullPath = pathJoin(dir, entry.name);
738
886
  const relativePath = pathRelative(projectRoot, fullPath);
739
- if (excludePatterns.some(p => relativePath.includes(p))) continue;
887
+ if (excludePatterns.some((p) => relativePath.includes(p))) {
888
+ continue;
889
+ }
740
890
  if (entry.isDirectory()) {
741
891
  walk(fullPath);
742
892
  } else if (entry.isFile() && extSet.has(pathExtname(entry.name))) {
743
893
  try {
744
894
  const stat = statSync(fullPath);
745
- if (stat.size <= maxFileSizeBytes) results.push(fullPath);
746
- } catch { /* skip */ }
895
+ if (stat.size <= maxFileSizeBytes) {
896
+ results.push(fullPath);
897
+ }
898
+ } catch {
899
+ /* skip */
900
+ }
747
901
  }
748
902
  }
749
903
  }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @module platform/ios
3
+ * @description iOS + Xcode 平台支持模块
4
+ *
5
+ * 将所有 iOS/Xcode 特有功能集中到 lib/platform/ios/ 下:
6
+ *
7
+ * xcode/
8
+ * XcodeAutomation.js — AppleScript/osascript Xcode IDE 自动化
9
+ * XcodeIntegration.js — Xcode 代码自动插入 + Header 管理 + 依赖检查
10
+ * SaveEventFilter.js — 保存事件过滤(Xcode 焦点检测 + 内容哈希去重)
11
+ *
12
+ * snippet/
13
+ * XcodeCodec.js — Xcode .codesnippet (plist XML) 编解码
14
+ * PlaceholderConverter.js — Xcode <#…#> ↔ VSCode ${N:…} 占位符转换
15
+ *
16
+ * spm/
17
+ * SpmService.js — Swift Package Manager 服务(Target / 依赖 / 策略)
18
+ * SpmDiscoverer.js — SPM 项目自动发现(ProjectDiscoverer 接口)
19
+ * PackageSwiftParser.js — Package.swift 解析器
20
+ * DependencyGraph.js — SPM Target 依赖图
21
+ * PolicyEngine.js — 依赖策略引擎(层级检查 / 循环检测)
22
+ *
23
+ * routes/
24
+ * spm.js — /api/v1/spm/* REST 路由(向后兼容遗留端点)
25
+ *
26
+ * 旧路径保留了 re-export shim 确保向后兼容。
27
+ */
28
+
29
+ // ── Xcode IDE 自动化 ──
30
+ export {
31
+ isXcodeRunning,
32
+ isXcodeFrontmost,
33
+ jumpToLineInXcode,
34
+ cutLineInXcode,
35
+ deleteLineContentInXcode,
36
+ pasteInXcode,
37
+ selectAndPasteInXcode,
38
+ insertAtLineStartInXcode,
39
+ saveActiveDocumentInXcode,
40
+ } from './xcode/XcodeAutomation.js';
41
+
42
+ export {
43
+ insertHeaders,
44
+ insertCodeToXcode,
45
+ findTriggerLineNumber,
46
+ findImportInsertLine,
47
+ } from './xcode/XcodeIntegration.js';
48
+
49
+ export { saveEventFilter } from './xcode/SaveEventFilter.js';
50
+
51
+ // ── Xcode Snippet 编解码 ──
52
+ export { XcodeCodec } from './snippet/XcodeCodec.js';
53
+ export { PlaceholderConverter } from './snippet/PlaceholderConverter.js';
54
+
55
+ // ── Swift Package Manager ──
56
+ export { SpmService } from './spm/SpmService.js';
57
+ export { SpmDiscoverer } from './spm/SpmDiscoverer.js';
58
+ export { PackageSwiftParser } from './spm/PackageSwiftParser.js';
59
+ export { DependencyGraph } from './spm/DependencyGraph.js';
60
+ export { PolicyEngine } from './spm/PolicyEngine.js';
61
+
62
+ // ── SPM Legacy Routes ──
63
+ export { default as spmRouter } from './routes/spm.js';