autosnippet 3.2.21 → 3.3.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 (311) hide show
  1. package/dashboard/dist/assets/icons-BJ2mUBi8.js +1 -0
  2. package/dashboard/dist/assets/index-B659K9t5.js +128 -0
  3. package/dashboard/dist/assets/index-NCm40PMD.css +1 -0
  4. package/dashboard/dist/index.html +3 -3
  5. package/dist/bin/cli.d.ts +1 -1
  6. package/dist/bin/cli.js +244 -261
  7. package/dist/lib/agent/context/ExplorationTracker.d.ts +2 -0
  8. package/dist/lib/agent/context/ExplorationTracker.js +21 -3
  9. package/dist/lib/agent/core/ToolExecutionPipeline.d.ts +3 -1
  10. package/dist/lib/agent/core/ToolExecutionPipeline.js +8 -1
  11. package/dist/lib/agent/forge/DynamicComposer.d.ts +58 -0
  12. package/dist/lib/agent/forge/DynamicComposer.js +99 -0
  13. package/dist/lib/agent/forge/SandboxRunner.d.ts +60 -0
  14. package/dist/lib/agent/forge/SandboxRunner.js +251 -0
  15. package/dist/lib/agent/forge/TemporaryToolRegistry.d.ts +76 -0
  16. package/dist/lib/agent/forge/TemporaryToolRegistry.js +154 -0
  17. package/dist/lib/agent/forge/ToolForge.d.ts +92 -0
  18. package/dist/lib/agent/forge/ToolForge.js +239 -0
  19. package/dist/lib/agent/forge/ToolRequirementAnalyzer.d.ts +44 -0
  20. package/dist/lib/agent/forge/ToolRequirementAnalyzer.js +119 -0
  21. package/dist/lib/agent/tools/ToolRegistry.d.ts +2 -0
  22. package/dist/lib/agent/tools/ToolRegistry.js +4 -0
  23. package/dist/lib/agent/tools/composite.js +0 -1
  24. package/dist/lib/agent/tools/index.d.ts +2 -50
  25. package/dist/lib/agent/tools/index.js +2 -3
  26. package/dist/lib/agent/tools/lifecycle.d.ts +1 -58
  27. package/dist/lib/agent/tools/lifecycle.js +2 -75
  28. package/dist/lib/cli/SetupService.d.ts +46 -2
  29. package/dist/lib/cli/SetupService.js +2 -27
  30. package/dist/lib/cli/deploy/FileManifest.d.ts +0 -21
  31. package/dist/lib/cli/deploy/FileManifest.js +0 -11
  32. package/dist/lib/{platform/ios/spm → core/discovery}/SpmDiscoverer.d.ts +2 -5
  33. package/dist/lib/{platform/ios/spm → core/discovery}/SpmDiscoverer.js +159 -44
  34. package/dist/lib/core/discovery/index.d.ts +1 -1
  35. package/dist/lib/core/discovery/index.js +2 -2
  36. package/dist/lib/domain/knowledge/KnowledgeEntry.d.ts +10 -0
  37. package/dist/lib/domain/knowledge/KnowledgeEntry.js +2 -0
  38. package/dist/lib/domain/knowledge/Lifecycle.d.ts +19 -2
  39. package/dist/lib/domain/knowledge/Lifecycle.js +32 -6
  40. package/dist/lib/domain/knowledge/UnifiedValidator.d.ts +1 -5
  41. package/dist/lib/domain/knowledge/UnifiedValidator.js +7 -44
  42. package/dist/lib/domain/knowledge/values/Stats.d.ts +29 -0
  43. package/dist/lib/domain/knowledge/values/Stats.js +41 -0
  44. package/dist/lib/external/mcp/McpServer.d.ts +19 -38
  45. package/dist/lib/external/mcp/McpServer.js +145 -117
  46. package/dist/lib/external/mcp/autoApproveInjector.js +0 -2
  47. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.d.ts +26 -1
  48. package/dist/lib/external/mcp/handlers/bootstrap/MissionBriefingBuilder.js +41 -0
  49. package/dist/lib/external/mcp/handlers/bootstrap/pipeline/orchestrator.js +49 -0
  50. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.d.ts +3 -0
  51. package/dist/lib/external/mcp/handlers/bootstrap/shared/bootstrap-phases.js +27 -0
  52. package/dist/lib/external/mcp/handlers/bootstrap/skills.js +1 -1
  53. package/dist/lib/external/mcp/handlers/bootstrap-external.js +1 -0
  54. package/dist/lib/external/mcp/handlers/bootstrap-internal.js +2 -0
  55. package/dist/lib/external/mcp/handlers/consolidated.d.ts +116 -6
  56. package/dist/lib/external/mcp/handlers/consolidated.js +251 -71
  57. package/dist/lib/external/mcp/handlers/guard.d.ts +150 -0
  58. package/dist/lib/external/mcp/handlers/guard.js +245 -8
  59. package/dist/lib/external/mcp/handlers/knowledge.d.ts +0 -29
  60. package/dist/lib/external/mcp/handlers/knowledge.js +1 -76
  61. package/dist/lib/external/mcp/handlers/panorama.d.ts +36 -0
  62. package/dist/lib/external/mcp/handlers/panorama.js +156 -0
  63. package/dist/lib/external/mcp/handlers/system.d.ts +2 -54
  64. package/dist/lib/external/mcp/handlers/system.js +3 -113
  65. package/dist/lib/external/mcp/handlers/task.d.ts +13 -24
  66. package/dist/lib/external/mcp/handlers/task.js +217 -557
  67. package/dist/lib/external/mcp/handlers/types.d.ts +91 -8
  68. package/dist/lib/external/mcp/handlers/types.js +18 -1
  69. package/dist/lib/external/mcp/handlers/wiki-external.d.ts +18 -1
  70. package/dist/lib/external/mcp/handlers/wiki-external.js +16 -1
  71. package/dist/lib/external/mcp/tools.d.ts +14 -20
  72. package/dist/lib/external/mcp/tools.js +62 -91
  73. package/dist/lib/http/HttpServer.js +52 -6
  74. package/dist/lib/http/routes/{snippets.d.ts → audit.d.ts} +4 -2
  75. package/dist/lib/http/routes/audit.js +51 -0
  76. package/dist/lib/http/routes/commands.d.ts +1 -1
  77. package/dist/lib/http/routes/commands.js +1 -66
  78. package/dist/lib/http/routes/guardReport.d.ts +10 -0
  79. package/dist/lib/http/routes/guardReport.js +143 -0
  80. package/dist/lib/http/routes/knowledge.js +32 -1
  81. package/dist/lib/http/routes/panorama.d.ts +11 -0
  82. package/dist/lib/http/routes/panorama.js +322 -0
  83. package/dist/lib/http/routes/remote.js +0 -5
  84. package/dist/lib/http/routes/signals.d.ts +10 -0
  85. package/dist/lib/http/routes/signals.js +104 -0
  86. package/dist/lib/http/routes/task.d.ts +2 -3
  87. package/dist/lib/http/routes/task.js +17 -347
  88. package/dist/lib/http/routes/violations.js +1 -1
  89. package/dist/lib/infrastructure/audit/AuditLogger.d.ts +6 -1
  90. package/dist/lib/infrastructure/audit/AuditLogger.js +14 -1
  91. package/dist/lib/infrastructure/database/drizzle/schema.d.ts +181 -583
  92. package/dist/lib/infrastructure/database/drizzle/schema.js +28 -69
  93. package/dist/lib/infrastructure/database/migrations/004_evolution_proposals.d.ts +8 -0
  94. package/dist/lib/infrastructure/database/migrations/004_evolution_proposals.js +43 -0
  95. package/dist/lib/infrastructure/logging/Logger.d.ts +2 -0
  96. package/dist/lib/infrastructure/logging/Logger.js +34 -7
  97. package/dist/lib/infrastructure/monitoring/ErrorTracker.js +3 -1
  98. package/dist/lib/infrastructure/monitoring/PerformanceMonitor.d.ts +2 -2
  99. package/dist/lib/infrastructure/monitoring/PerformanceMonitor.js +12 -10
  100. package/dist/lib/infrastructure/notification/LarkNotifier.d.ts +24 -0
  101. package/dist/lib/infrastructure/notification/LarkNotifier.js +97 -0
  102. package/dist/lib/infrastructure/report/ReportStore.d.ts +45 -0
  103. package/dist/lib/infrastructure/report/ReportStore.js +133 -0
  104. package/dist/lib/infrastructure/signal/SignalAggregator.d.ts +18 -0
  105. package/dist/lib/infrastructure/signal/SignalAggregator.js +84 -0
  106. package/dist/lib/infrastructure/signal/SignalBridge.d.ts +13 -0
  107. package/dist/lib/infrastructure/signal/SignalBridge.js +20 -0
  108. package/dist/lib/infrastructure/signal/SignalBus.d.ts +63 -0
  109. package/dist/lib/infrastructure/signal/SignalBus.js +106 -0
  110. package/dist/lib/infrastructure/signal/SignalTraceWriter.d.ts +36 -0
  111. package/dist/lib/infrastructure/signal/SignalTraceWriter.js +130 -0
  112. package/dist/lib/injection/ServiceContainer.js +6 -0
  113. package/dist/lib/injection/ServiceMap.d.ts +16 -19
  114. package/dist/lib/injection/modules/AgentModule.d.ts +1 -1
  115. package/dist/lib/injection/modules/AgentModule.js +7 -1
  116. package/dist/lib/injection/modules/AppModule.d.ts +3 -4
  117. package/dist/lib/injection/modules/AppModule.js +7 -43
  118. package/dist/lib/injection/modules/GuardModule.js +59 -2
  119. package/dist/lib/injection/modules/InfraModule.d.ts +0 -1
  120. package/dist/lib/injection/modules/InfraModule.js +9 -7
  121. package/dist/lib/injection/modules/KnowledgeModule.js +51 -0
  122. package/dist/lib/injection/modules/PanoramaModule.d.ts +18 -0
  123. package/dist/lib/injection/modules/PanoramaModule.js +76 -0
  124. package/dist/lib/injection/modules/SignalModule.d.ts +10 -0
  125. package/dist/lib/injection/modules/SignalModule.js +84 -0
  126. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.d.ts +1 -0
  127. package/dist/lib/repository/knowledge/KnowledgeRepository.impl.js +6 -0
  128. package/dist/lib/service/bootstrap/BootstrapTaskManager.d.ts +3 -1
  129. package/dist/lib/service/bootstrap/BootstrapTaskManager.js +20 -1
  130. package/dist/lib/service/delivery/AgentInstructionsGenerator.js +4 -5
  131. package/dist/lib/service/delivery/CursorDeliveryPipeline.d.ts +3 -1
  132. package/dist/lib/service/delivery/CursorDeliveryPipeline.js +13 -10
  133. package/dist/lib/service/delivery/RulesGenerator.js +3 -2
  134. package/dist/lib/service/evolution/ConsolidationAdvisor.d.ts +114 -0
  135. package/dist/lib/service/evolution/ConsolidationAdvisor.js +542 -0
  136. package/dist/lib/service/evolution/ContradictionDetector.d.ts +54 -0
  137. package/dist/lib/service/evolution/ContradictionDetector.js +253 -0
  138. package/dist/lib/service/evolution/DecayDetector.d.ts +71 -0
  139. package/dist/lib/service/evolution/DecayDetector.js +244 -0
  140. package/dist/lib/service/evolution/EnhancementSuggester.d.ts +38 -0
  141. package/dist/lib/service/evolution/EnhancementSuggester.js +220 -0
  142. package/dist/lib/service/evolution/KnowledgeMetabolism.d.ts +82 -0
  143. package/dist/lib/service/evolution/KnowledgeMetabolism.js +167 -0
  144. package/dist/lib/service/evolution/RedundancyAnalyzer.d.ts +53 -0
  145. package/dist/lib/service/evolution/RedundancyAnalyzer.js +210 -0
  146. package/dist/lib/service/evolution/StagingManager.d.ts +57 -0
  147. package/dist/lib/service/evolution/StagingManager.js +201 -0
  148. package/dist/lib/service/guard/ComplianceReporter.d.ts +42 -2
  149. package/dist/lib/service/guard/ComplianceReporter.js +43 -5
  150. package/dist/lib/service/guard/CoverageAnalyzer.d.ts +54 -0
  151. package/dist/lib/service/guard/CoverageAnalyzer.js +149 -0
  152. package/dist/lib/service/guard/GuardCheckEngine.d.ts +55 -1
  153. package/dist/lib/service/guard/GuardCheckEngine.js +508 -15
  154. package/dist/lib/service/guard/GuardFeedbackLoop.d.ts +3 -0
  155. package/dist/lib/service/guard/GuardFeedbackLoop.js +9 -0
  156. package/dist/lib/service/guard/ReverseGuard.d.ts +73 -0
  157. package/dist/lib/service/guard/ReverseGuard.js +256 -0
  158. package/dist/lib/service/guard/RuleLearner.d.ts +12 -0
  159. package/dist/lib/service/guard/RuleLearner.js +38 -0
  160. package/dist/lib/service/guard/UncertaintyCollector.d.ts +83 -0
  161. package/dist/lib/service/guard/UncertaintyCollector.js +149 -0
  162. package/dist/lib/service/guard/ViolationsStore.d.ts +1 -0
  163. package/dist/lib/service/guard/ViolationsStore.js +33 -3
  164. package/dist/lib/service/knowledge/ConfidenceRouter.d.ts +13 -0
  165. package/dist/lib/service/knowledge/ConfidenceRouter.js +14 -0
  166. package/dist/lib/service/knowledge/KnowledgeService.js +22 -4
  167. package/dist/lib/service/module/ModuleService.js +3 -13
  168. package/dist/lib/service/panorama/CouplingAnalyzer.d.ts +27 -0
  169. package/dist/lib/service/panorama/CouplingAnalyzer.js +192 -0
  170. package/dist/lib/service/panorama/DimensionAnalyzer.d.ts +28 -0
  171. package/dist/lib/service/panorama/DimensionAnalyzer.js +320 -0
  172. package/dist/lib/service/panorama/LayerInferrer.d.ts +19 -0
  173. package/dist/lib/service/panorama/LayerInferrer.js +182 -0
  174. package/dist/lib/service/panorama/ModuleDiscoverer.d.ts +24 -0
  175. package/dist/lib/service/panorama/ModuleDiscoverer.js +185 -0
  176. package/dist/lib/service/panorama/PanoramaAggregator.d.ts +29 -0
  177. package/dist/lib/service/panorama/PanoramaAggregator.js +228 -0
  178. package/dist/lib/service/panorama/PanoramaScanner.d.ts +52 -0
  179. package/dist/lib/service/panorama/PanoramaScanner.js +188 -0
  180. package/dist/lib/service/panorama/PanoramaService.d.ts +108 -0
  181. package/dist/lib/service/panorama/PanoramaService.js +220 -0
  182. package/dist/lib/service/panorama/PanoramaTypes.d.ts +134 -0
  183. package/dist/lib/service/panorama/PanoramaTypes.js +6 -0
  184. package/dist/lib/service/panorama/RoleRefiner.d.ts +48 -0
  185. package/dist/lib/service/panorama/RoleRefiner.js +535 -0
  186. package/dist/lib/service/search/MultiSignalRanker.d.ts +1 -0
  187. package/dist/lib/service/search/MultiSignalRanker.js +16 -0
  188. package/dist/lib/service/search/SearchEngine.d.ts +1 -0
  189. package/dist/lib/service/search/SearchEngine.js +9 -1
  190. package/dist/lib/service/search/SearchTypes.d.ts +2 -0
  191. package/dist/lib/service/signal/HitRecorder.d.ts +68 -0
  192. package/dist/lib/service/signal/HitRecorder.js +173 -0
  193. package/dist/lib/service/skills/SignalCollector.d.ts +3 -1
  194. package/dist/lib/service/skills/SignalCollector.js +31 -1
  195. package/dist/lib/service/task/IntentExtractor.d.ts +58 -0
  196. package/dist/lib/service/task/IntentExtractor.js +142 -0
  197. package/dist/lib/service/task/PrimeSearchPipeline.d.ts +54 -0
  198. package/dist/lib/service/task/PrimeSearchPipeline.js +98 -0
  199. package/dist/lib/shared/constants.d.ts +0 -15
  200. package/dist/lib/shared/constants.js +0 -10
  201. package/dist/lib/shared/schemas/config.d.ts +4 -1
  202. package/dist/lib/shared/schemas/config.js +8 -1
  203. package/dist/lib/shared/schemas/mcp-tools.d.ts +41 -96
  204. package/dist/lib/shared/schemas/mcp-tools.js +59 -119
  205. package/dist/scripts/analyze-signals.d.ts +20 -0
  206. package/dist/scripts/analyze-signals.js +155 -0
  207. package/dist/scripts/diagnose-mcp.js +1 -1
  208. package/dist/scripts/release.js +2 -10
  209. package/package.json +4 -19
  210. package/skills/autosnippet-devdocs/SKILL.md +11 -8
  211. package/templates/claude-code/hooks/autosnippet-session.sh +10 -15
  212. package/templates/cursor-hooks/hooks/session-start.sh +1 -1
  213. package/templates/instructions/agent-static.md +2 -1
  214. package/templates/instructions/conventions.md +5 -6
  215. package/templates/recipes-setup/README.md +1 -2
  216. package/dashboard/dist/assets/icons-C1dUryS-.js +0 -1
  217. package/dashboard/dist/assets/index-D0whuycy.css +0 -1
  218. package/dashboard/dist/assets/index-DdvZE4Yd.js +0 -128
  219. package/dist/lib/domain/task/Task.d.ts +0 -140
  220. package/dist/lib/domain/task/Task.js +0 -254
  221. package/dist/lib/domain/task/TaskDependency.d.ts +0 -23
  222. package/dist/lib/domain/task/TaskDependency.js +0 -34
  223. package/dist/lib/domain/task/TaskIdGenerator.d.ts +0 -40
  224. package/dist/lib/domain/task/TaskIdGenerator.js +0 -75
  225. package/dist/lib/domain/task/index.d.ts +0 -4
  226. package/dist/lib/domain/task/index.js +0 -4
  227. package/dist/lib/http/routes/snippets.js +0 -49
  228. package/dist/lib/infrastructure/database/migrations/002_add_tasks.d.ts +0 -11
  229. package/dist/lib/infrastructure/database/migrations/002_add_tasks.js +0 -86
  230. package/dist/lib/platform/ClipboardManager.d.ts +0 -24
  231. package/dist/lib/platform/ClipboardManager.js +0 -142
  232. package/dist/lib/platform/NativeUi.d.ts +0 -53
  233. package/dist/lib/platform/NativeUi.js +0 -284
  234. package/dist/lib/platform/ios/index.d.ts +0 -38
  235. package/dist/lib/platform/ios/index.js +0 -42
  236. package/dist/lib/platform/ios/routes/spm.d.ts +0 -9
  237. package/dist/lib/platform/ios/routes/spm.js +0 -371
  238. package/dist/lib/platform/ios/snippet/PlaceholderConverter.d.ts +0 -21
  239. package/dist/lib/platform/ios/snippet/PlaceholderConverter.js +0 -48
  240. package/dist/lib/platform/ios/snippet/XcodeCodec.d.ts +0 -23
  241. package/dist/lib/platform/ios/snippet/XcodeCodec.js +0 -96
  242. package/dist/lib/platform/ios/spm/DependencyGraph.d.ts +0 -56
  243. package/dist/lib/platform/ios/spm/DependencyGraph.js +0 -195
  244. package/dist/lib/platform/ios/spm/PackageSwiftParser.d.ts +0 -69
  245. package/dist/lib/platform/ios/spm/PackageSwiftParser.js +0 -231
  246. package/dist/lib/platform/ios/spm/PathFinder.d.ts +0 -28
  247. package/dist/lib/platform/ios/spm/PathFinder.js +0 -117
  248. package/dist/lib/platform/ios/spm/PolicyEngine.d.ts +0 -44
  249. package/dist/lib/platform/ios/spm/PolicyEngine.js +0 -79
  250. package/dist/lib/platform/ios/spm/SpmHelper.d.ts +0 -102
  251. package/dist/lib/platform/ios/spm/SpmHelper.js +0 -464
  252. package/dist/lib/platform/ios/xcode/HeaderResolver.d.ts +0 -33
  253. package/dist/lib/platform/ios/xcode/HeaderResolver.js +0 -90
  254. package/dist/lib/platform/ios/xcode/SaveEventFilter.d.ts +0 -66
  255. package/dist/lib/platform/ios/xcode/SaveEventFilter.js +0 -142
  256. package/dist/lib/platform/ios/xcode/XcodeAutomation.d.ts +0 -71
  257. package/dist/lib/platform/ios/xcode/XcodeAutomation.js +0 -327
  258. package/dist/lib/platform/ios/xcode/XcodeImportResolver.d.ts +0 -130
  259. package/dist/lib/platform/ios/xcode/XcodeImportResolver.js +0 -404
  260. package/dist/lib/platform/ios/xcode/XcodeIntegration.d.ts +0 -89
  261. package/dist/lib/platform/ios/xcode/XcodeIntegration.js +0 -588
  262. package/dist/lib/platform/ios/xcode/XcodeWriteUtils.d.ts +0 -99
  263. package/dist/lib/platform/ios/xcode/XcodeWriteUtils.js +0 -190
  264. package/dist/lib/repository/task/TaskRepository.impl.d.ts +0 -171
  265. package/dist/lib/repository/task/TaskRepository.impl.js +0 -347
  266. package/dist/lib/service/automation/ActionPipeline.d.ts +0 -34
  267. package/dist/lib/service/automation/ActionPipeline.js +0 -53
  268. package/dist/lib/service/automation/AutomationOrchestrator.d.ts +0 -86
  269. package/dist/lib/service/automation/AutomationOrchestrator.js +0 -57
  270. package/dist/lib/service/automation/ContextCollector.d.ts +0 -24
  271. package/dist/lib/service/automation/ContextCollector.js +0 -35
  272. package/dist/lib/service/automation/DirectiveDetector.d.ts +0 -51
  273. package/dist/lib/service/automation/DirectiveDetector.js +0 -112
  274. package/dist/lib/service/automation/FileWatcher.d.ts +0 -51
  275. package/dist/lib/service/automation/FileWatcher.js +0 -366
  276. package/dist/lib/service/automation/TriggerResolver.d.ts +0 -36
  277. package/dist/lib/service/automation/TriggerResolver.js +0 -62
  278. package/dist/lib/service/automation/handlers/AlinkHandler.d.ts +0 -7
  279. package/dist/lib/service/automation/handlers/AlinkHandler.js +0 -80
  280. package/dist/lib/service/automation/handlers/CreateHandler.d.ts +0 -11
  281. package/dist/lib/service/automation/handlers/CreateHandler.js +0 -170
  282. package/dist/lib/service/automation/handlers/GuardHandler.d.ts +0 -17
  283. package/dist/lib/service/automation/handlers/GuardHandler.js +0 -218
  284. package/dist/lib/service/automation/handlers/HeaderHandler.d.ts +0 -2
  285. package/dist/lib/service/automation/handlers/HeaderHandler.js +0 -32
  286. package/dist/lib/service/automation/handlers/SearchHandler.d.ts +0 -11
  287. package/dist/lib/service/automation/handlers/SearchHandler.js +0 -278
  288. package/dist/lib/service/snippet/SnippetFactory.d.ts +0 -101
  289. package/dist/lib/service/snippet/SnippetFactory.js +0 -145
  290. package/dist/lib/service/snippet/SnippetInstaller.d.ts +0 -91
  291. package/dist/lib/service/snippet/SnippetInstaller.js +0 -276
  292. package/dist/lib/service/snippet/codecs/SnippetCodec.d.ts +0 -44
  293. package/dist/lib/service/snippet/codecs/SnippetCodec.js +0 -35
  294. package/dist/lib/service/snippet/codecs/VSCodeCodec.d.ts +0 -27
  295. package/dist/lib/service/snippet/codecs/VSCodeCodec.js +0 -82
  296. package/dist/lib/service/task/TaskGraphService.d.ts +0 -222
  297. package/dist/lib/service/task/TaskGraphService.js +0 -597
  298. package/dist/lib/service/task/TaskKnowledgeBridge.d.ts +0 -95
  299. package/dist/lib/service/task/TaskKnowledgeBridge.js +0 -298
  300. package/dist/lib/service/task/TaskReadyEngine.d.ts +0 -84
  301. package/dist/lib/service/task/TaskReadyEngine.js +0 -115
  302. package/dist/scripts/build-native-ui.d.ts +0 -3
  303. package/dist/scripts/build-native-ui.js +0 -62
  304. package/dist/scripts/init-snippets.d.ts +0 -30
  305. package/dist/scripts/init-snippets.js +0 -298
  306. package/dist/scripts/install-full.d.ts +0 -7
  307. package/dist/scripts/install-full.js +0 -38
  308. package/resources/native-ui/README.md +0 -29
  309. package/resources/native-ui/combined-window.swift +0 -494
  310. package/resources/native-ui/main.swift +0 -598
  311. package/scripts/postinstall-safe.mjs +0 -89
@@ -1,598 +0,0 @@
1
- import AppKit
2
- import Foundation
3
- import Darwin
4
-
5
- /**
6
- * AutoSnippet Native UI Helper (macOS)
7
- * 提供高级原生列表和预览窗口,支持代码高亮。
8
- * 注意:SyntaxHighlighter 和 SearchItem 定义在 combined-window.swift 中,避免重复定义
9
- */
10
-
11
- // MARK: - List Selection Window
12
-
13
- class ListSelectionWindowController: NSObject, NSTableViewDataSource, NSTableViewDelegate {
14
- var items: [String] = []
15
- var selectedIndex: Int = -1
16
- private var tableView: NSTableView!
17
- private var panel: NSPanel!
18
-
19
- var filteredItems: [String] = []
20
- var searchField: NSSearchField!
21
-
22
- func show(items: [String], title: String, prompt: String) -> Int {
23
- self.items = items
24
- self.filteredItems = items
25
- self.selectedIndex = 0
26
-
27
- // 创建面板
28
- let panelWidth: CGFloat = 650
29
- let panelHeight: CGFloat = min(CGFloat(items.count * 32 + 200), 600)
30
-
31
- panel = NSPanel(
32
- contentRect: NSRect(x: 0, y: 0, width: panelWidth, height: panelHeight),
33
- styleMask: [.titled, .closable, .resizable, .fullSizeContentView],
34
- backing: .buffered,
35
- defer: false
36
- )
37
- panel.title = title
38
- panel.level = .floating
39
- panel.center()
40
- panel.titlebarAppearsTransparent = true
41
- panel.isMovableByWindowBackground = true
42
-
43
- // 模糊背景
44
- let visualEffect = NSVisualEffectView(frame: NSRect(x: 0, y: 0, width: panelWidth, height: panelHeight))
45
- visualEffect.material = .hudWindow
46
- visualEffect.blendingMode = .behindWindow
47
- visualEffect.state = .active
48
- visualEffect.autoresizingMask = [.width, .height]
49
- panel.contentView = visualEffect
50
-
51
- let contentView = NSView(frame: NSRect(x: 0, y: 0, width: panelWidth, height: panelHeight))
52
- contentView.autoresizingMask = [.width, .height]
53
- visualEffect.addSubview(contentView)
54
-
55
- // 提示文本 - 改为标题样式
56
- let promptLabel = NSTextField(labelWithString: prompt)
57
- promptLabel.font = NSFont.systemFont(ofSize: 13, weight: .medium)
58
- promptLabel.textColor = .secondaryLabelColor
59
- promptLabel.frame = NSRect(x: 20, y: panelHeight - 55, width: panelWidth - 40, height: 20)
60
- promptLabel.autoresizingMask = [.width, .minYMargin]
61
- contentView.addSubview(promptLabel)
62
-
63
- // 搜索框
64
- searchField = NSSearchField(frame: NSRect(x: 20, y: panelHeight - 95, width: panelWidth - 40, height: 28))
65
- searchField.placeholderString = "搜索..."
66
- searchField.autoresizingMask = [.width, .minYMargin]
67
- searchField.target = self
68
- searchField.action = #selector(searchFieldDidChange)
69
- searchField.font = NSFont.systemFont(ofSize: 13)
70
- contentView.addSubview(searchField)
71
-
72
- // 创建表格
73
- let scrollView = NSScrollView(frame: NSRect(x: 20, y: 60, width: panelWidth - 40, height: panelHeight - 175))
74
- scrollView.hasVerticalScroller = true
75
- scrollView.borderType = .noBorder
76
- scrollView.autoresizingMask = [.width, .height]
77
- scrollView.wantsLayer = true
78
- scrollView.layer?.cornerRadius = 8
79
- scrollView.layer?.masksToBounds = true
80
- // 使用 overlay 滚动条
81
- scrollView.scrollerStyle = .overlay
82
- scrollView.autohidesScrollers = true
83
- scrollView.scrollerKnobStyle = .light
84
-
85
- tableView = NSTableView()
86
- tableView.headerView = nil
87
- tableView.rowHeight = 52 // 增加行高以容纳两行标题
88
- tableView.intercellSpacing = NSSize(width: 0, height: 1)
89
- // Xcode 深色背景:#1F1F24
90
- tableView.backgroundColor = NSColor(calibratedRed: 0.12, green: 0.12, blue: 0.14, alpha: 1.0)
91
- tableView.usesAlternatingRowBackgroundColors = false
92
- tableView.selectionHighlightStyle = .regular
93
- tableView.doubleAction = #selector(doubleClicked)
94
- tableView.target = self
95
-
96
- let column = NSTableColumn(identifier: NSUserInterfaceItemIdentifier("item"))
97
- column.width = panelWidth - 60
98
- tableView.addTableColumn(column)
99
-
100
- tableView.dataSource = self
101
- tableView.delegate = self
102
-
103
- scrollView.documentView = tableView
104
- contentView.addSubview(scrollView)
105
-
106
- // 按钮
107
- let cancelButton = NSButton(title: "取消", target: self, action: #selector(cancelClicked))
108
- cancelButton.bezelStyle = .rounded
109
- cancelButton.frame = NSRect(x: panelWidth - 200, y: 15, width: 90, height: 32)
110
- cancelButton.keyEquivalent = "\u{1b}" // Escape
111
- cancelButton.wantsLayer = true
112
- cancelButton.layer?.cornerRadius = 6
113
- cancelButton.autoresizingMask = [.minXMargin, .maxYMargin]
114
- contentView.addSubview(cancelButton)
115
-
116
- let okButton = NSButton(title: "确定", target: self, action: #selector(okClicked))
117
- okButton.bezelStyle = .rounded
118
- okButton.frame = NSRect(x: panelWidth - 100, y: 15, width: 90, height: 32)
119
- okButton.keyEquivalent = "\r" // Enter
120
- okButton.wantsLayer = true
121
- okButton.layer?.cornerRadius = 6
122
- okButton.autoresizingMask = [.minXMargin, .maxYMargin]
123
- contentView.addSubview(okButton)
124
-
125
- // 显示并运行
126
- tableView.reloadData()
127
- if !filteredItems.isEmpty {
128
- tableView.selectRowIndexes(IndexSet(integer: 0), byExtendingSelection: false)
129
- }
130
-
131
- // 淡入动画
132
- panel.alphaValue = 0
133
- NSApp.activate(ignoringOtherApps: true)
134
- panel.makeKeyAndOrderFront(nil)
135
- panel.makeFirstResponder(searchField)
136
-
137
- NSAnimationContext.runAnimationGroup({ context in
138
- context.duration = 0.2
139
- panel.animator().alphaValue = 1.0
140
- })
141
-
142
- NSApp.runModal(for: panel)
143
-
144
- return selectedIndex
145
- }
146
-
147
- // MARK: - 搜索功能
148
-
149
- @objc func searchFieldDidChange() {
150
- let searchText = searchField.stringValue.lowercased()
151
- if searchText.isEmpty {
152
- filteredItems = items
153
- } else {
154
- filteredItems = items.filter { $0.lowercased().contains(searchText) }
155
- }
156
- tableView.reloadData()
157
- if !filteredItems.isEmpty {
158
- tableView.selectRowIndexes(IndexSet(integer: 0), byExtendingSelection: false)
159
- selectedIndex = 0
160
- }
161
- }
162
-
163
- // MARK: - NSTableViewDataSource
164
-
165
- func numberOfRows(in tableView: NSTableView) -> Int {
166
- return filteredItems.count
167
- }
168
-
169
- // MARK: - NSTableViewDelegate
170
-
171
- func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
172
- let cellIdentifier = NSUserInterfaceItemIdentifier("ItemCell")
173
-
174
- var cellView = tableView.makeView(withIdentifier: cellIdentifier, owner: nil) as? NSTableCellView
175
- if cellView == nil {
176
- cellView = NSTableCellView()
177
- cellView?.identifier = cellIdentifier
178
-
179
- let textField = NSTextField(labelWithString: "")
180
- textField.font = NSFont.systemFont(ofSize: 13)
181
- textField.lineBreakMode = .byWordWrapping // 改为自动换行
182
- textField.maximumNumberOfLines = 2 // 最多显示两行
183
- textField.translatesAutoresizingMaskIntoConstraints = false
184
- cellView?.addSubview(textField)
185
- cellView?.textField = textField
186
-
187
- NSLayoutConstraint.activate([
188
- textField.leadingAnchor.constraint(equalTo: cellView!.leadingAnchor, constant: 12),
189
- textField.trailingAnchor.constraint(equalTo: cellView!.trailingAnchor, constant: -12),
190
- textField.topAnchor.constraint(equalTo: cellView!.topAnchor, constant: 8),
191
- textField.bottomAnchor.constraint(lessThanOrEqualTo: cellView!.bottomAnchor, constant: -8)
192
- ])
193
- }
194
-
195
- cellView?.textField?.stringValue = filteredItems[row]
196
- return cellView
197
- }
198
-
199
- func tableViewSelectionDidChange(_ notification: Notification) {
200
- selectedIndex = tableView.selectedRow
201
- }
202
-
203
- @objc func doubleClicked() {
204
- if tableView.clickedRow >= 0 {
205
- selectedIndex = tableView.clickedRow
206
- panel.close()
207
- NSApp.stopModal()
208
- }
209
- }
210
-
211
- @objc func okClicked() {
212
- selectedIndex = tableView.selectedRow
213
- panel.close()
214
- NSApp.stopModal()
215
- }
216
-
217
- @objc func cancelClicked() {
218
- selectedIndex = -1
219
- panel.close()
220
- NSApp.stopModal()
221
- }
222
- }
223
-
224
- // MARK: - Code Preview Window
225
-
226
- class CodePreviewWindowController {
227
- enum PreviewResult {
228
- case confirmed // 用户点击了“立即插入”
229
- case cancelled // 用户点击了“取消”
230
- case returnToList // 用户点击了“返回”
231
- }
232
-
233
- func show(title: String, code: String) -> PreviewResult {
234
- let panelWidth: CGFloat = 900
235
- let panelHeight: CGFloat = 520
236
-
237
- let panel = NSPanel(
238
- contentRect: NSRect(x: 0, y: 0, width: panelWidth, height: panelHeight),
239
- styleMask: [.titled, .closable, .resizable, .fullSizeContentView],
240
- backing: .buffered,
241
- defer: false
242
- )
243
- panel.title = "代码预览"
244
- panel.level = .floating
245
- panel.center()
246
- panel.minSize = NSSize(width: 400, height: 300)
247
- panel.titlebarAppearsTransparent = true
248
- panel.isMovableByWindowBackground = true
249
-
250
- // 模糊背景
251
- let visualEffect = NSVisualEffectView(frame: NSRect(x: 0, y: 0, width: panelWidth, height: panelHeight))
252
- visualEffect.material = .hudWindow
253
- visualEffect.blendingMode = .behindWindow
254
- visualEffect.state = .active
255
- visualEffect.autoresizingMask = [.width, .height]
256
- panel.contentView = visualEffect
257
-
258
- let contentView = NSView(frame: NSRect(x: 0, y: 0, width: panelWidth, height: panelHeight))
259
- contentView.autoresizingMask = [.width, .height]
260
- visualEffect.addSubview(contentView)
261
-
262
- // 标题 - 相似度百分比前置
263
- let titleText: String
264
- // 使用正则提取相似度百分比,例如 "xxx.md (47%)" -> "(47%) xxx.md"
265
- if let regex = try? NSRegularExpression(pattern: "^(.+?)\\s*\\((\\d+%)\\)$", options: []),
266
- let match = regex.firstMatch(in: title, options: [], range: NSRange(title.startIndex..., in: title)),
267
- let nameRange = Range(match.range(at: 1), in: title),
268
- let percentRange = Range(match.range(at: 2), in: title) {
269
- let name = String(title[nameRange])
270
- let percent = String(title[percentRange])
271
- titleText = "即将插入: (\(percent)) \(name)"
272
- } else {
273
- titleText = "即将插入: \(title)"
274
- }
275
-
276
- let titleLabel = NSTextField(labelWithString: titleText)
277
- titleLabel.font = NSFont.systemFont(ofSize: 14, weight: .semibold)
278
- titleLabel.textColor = .labelColor
279
- titleLabel.frame = NSRect(x: 20, y: panelHeight - 65, width: panelWidth - 40, height: 40) // 增加高度到40,调整y位置
280
- titleLabel.autoresizingMask = [.width, .minYMargin]
281
- titleLabel.lineBreakMode = .byWordWrapping // 改为自动换行
282
- titleLabel.maximumNumberOfLines = 2 // 最多显示两行
283
- contentView.addSubview(titleLabel)
284
-
285
- // 代码区域(带语法高亮)
286
- let scrollView = NSScrollView(frame: NSRect(x: 20, y: 60, width: panelWidth - 40, height: panelHeight - 135))
287
- scrollView.hasVerticalScroller = true
288
- scrollView.hasHorizontalScroller = true
289
- scrollView.borderType = .noBorder
290
- scrollView.autoresizingMask = [.width, .height]
291
- scrollView.wantsLayer = true
292
- scrollView.layer?.cornerRadius = 8
293
- scrollView.layer?.masksToBounds = true
294
- // 设置 scrollView 背景色为 Xcode 深色
295
- scrollView.backgroundColor = NSColor(calibratedRed: 0.12, green: 0.12, blue: 0.14, alpha: 1.0)
296
- // 使用 overlay 滚动条
297
- scrollView.scrollerStyle = .overlay
298
- scrollView.autohidesScrollers = true
299
- scrollView.scrollerKnobStyle = .light
300
- scrollView.horizontalScrollElasticity = .automatic
301
- scrollView.verticalScrollElasticity = .automatic
302
-
303
- let textView = NSTextView(frame: scrollView.bounds)
304
- textView.isEditable = false
305
- textView.isSelectable = true
306
- // Xcode 深色背景:#1F1F24
307
- textView.backgroundColor = NSColor(calibratedRed: 0.12, green: 0.12, blue: 0.14, alpha: 1.0)
308
- textView.textContainerInset = NSSize(width: 16, height: 16)
309
- textView.isHorizontallyResizable = true
310
- textView.isVerticallyResizable = true
311
- textView.textContainer?.widthTracksTextView = false
312
- textView.textContainer?.heightTracksTextView = false
313
- textView.textContainer?.containerSize = NSSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude)
314
- textView.autoresizingMask = []
315
-
316
- // 增加右侧边距,避免滚动条遮挡代码
317
- textView.textContainer?.lineFragmentPadding = 10 // 左右各 10px
318
- if let textContainer = textView.textContainer {
319
- // 设置右侧额外边距
320
- textContainer.size = NSSize(width: scrollView.bounds.width - 40, height: CGFloat.greatestFiniteMagnitude)
321
- }
322
-
323
- // 应用语法高亮
324
- let processedCode = code.replacingOccurrences(of: "\\n", with: "\n")
325
- let highlightedCode = SyntaxHighlighter.highlight(processedCode)
326
- textView.textStorage?.setAttributedString(highlightedCode)
327
-
328
- scrollView.documentView = textView
329
- contentView.addSubview(scrollView)
330
-
331
- // 按钮
332
- let backButton = NSButton(title: "← 返回", target: nil, action: nil)
333
- backButton.bezelStyle = .rounded
334
- backButton.frame = NSRect(x: 20, y: 15, width: 90, height: 32)
335
- backButton.autoresizingMask = [.maxXMargin, .maxYMargin]
336
- backButton.wantsLayer = true
337
- backButton.layer?.cornerRadius = 6
338
- contentView.addSubview(backButton)
339
-
340
- let cancelButton = NSButton(title: "取消", target: nil, action: nil)
341
- cancelButton.bezelStyle = .rounded
342
- cancelButton.frame = NSRect(x: panelWidth - 310, y: 15, width: 90, height: 32)
343
- cancelButton.keyEquivalent = "\u{1b}"
344
- cancelButton.autoresizingMask = [.minXMargin, .maxYMargin]
345
- cancelButton.wantsLayer = true
346
- cancelButton.layer?.cornerRadius = 6
347
- contentView.addSubview(cancelButton)
348
-
349
- let copyButton = NSButton(title: "复制代码", target: nil, action: nil)
350
- copyButton.bezelStyle = .rounded
351
- copyButton.frame = NSRect(x: panelWidth - 210, y: 15, width: 90, height: 32)
352
- copyButton.autoresizingMask = [.minXMargin, .maxYMargin]
353
- copyButton.wantsLayer = true
354
- copyButton.layer?.cornerRadius = 6
355
- contentView.addSubview(copyButton)
356
-
357
- let okButton = NSButton(title: "立即插入", target: nil, action: nil)
358
- okButton.bezelStyle = .rounded
359
- okButton.frame = NSRect(x: panelWidth - 110, y: 15, width: 90, height: 32)
360
- okButton.keyEquivalent = "\r"
361
- okButton.autoresizingMask = [.minXMargin, .maxYMargin]
362
- okButton.wantsLayer = true
363
- okButton.layer?.cornerRadius = 6
364
- contentView.addSubview(okButton)
365
-
366
- class ButtonHandler {
367
- var result = false
368
- var shouldReturnToList = false // 新增:标记是否需要返回列表
369
- var panel: NSPanel
370
- var codeText: String
371
-
372
- init(panel: NSPanel, codeText: String) {
373
- self.panel = panel
374
- self.codeText = codeText
375
- }
376
-
377
- @objc func okClicked() {
378
- // 插入时也只使用纯代码
379
- let pureCode = extractPureCode(codeText)
380
- let pasteboard = NSPasteboard.general
381
- pasteboard.clearContents()
382
- pasteboard.setString(pureCode, forType: .string)
383
- result = true
384
- panel.close()
385
- NSApp.stopModal()
386
- }
387
-
388
- @objc func cancelClicked() {
389
- result = false
390
- panel.close()
391
- NSApp.stopModal()
392
- }
393
-
394
- @objc func backClicked() {
395
- // 返回功能:设置标志并关闭窗口
396
- result = false
397
- shouldReturnToList = true
398
- panel.close()
399
- NSApp.stopModal()
400
- }
401
-
402
- @objc func copyClicked() {
403
- let pasteboard = NSPasteboard.general
404
- pasteboard.clearContents()
405
- // 只复制纯代码,去掉 markdown 代码块标记
406
- let pureCode = extractPureCode(codeText)
407
- pasteboard.setString(pureCode, forType: .string)
408
- print("✅ 代码已复制到剪贴板")
409
- // 复制后关闭窗口
410
- panel.close()
411
- NSApp.stopModal()
412
- }
413
-
414
- private func extractPureCode(_ code: String) -> String {
415
- var lines = code.split(separator: "\n", omittingEmptySubsequences: false).map(String.init)
416
-
417
- // 移除首尾的代码块标记(```swift、```等)
418
- while !lines.isEmpty && (lines.first?.trimmingCharacters(in: .whitespaces).starts(with: "```") ?? false) {
419
- lines.removeFirst()
420
- }
421
- while !lines.isEmpty && (lines.last?.trimmingCharacters(in: .whitespaces).starts(with: "```") ?? false) {
422
- lines.removeLast()
423
- }
424
-
425
- return lines.joined(separator: "\n")
426
- }
427
- }
428
-
429
- let handler = ButtonHandler(panel: panel, codeText: processedCode)
430
- backButton.target = handler
431
- backButton.action = #selector(ButtonHandler.backClicked)
432
- cancelButton.target = handler
433
- cancelButton.action = #selector(ButtonHandler.cancelClicked)
434
- copyButton.target = handler
435
- copyButton.action = #selector(ButtonHandler.copyClicked)
436
- okButton.target = handler
437
- okButton.action = #selector(ButtonHandler.okClicked)
438
-
439
- // 淡入动画
440
- panel.alphaValue = 0
441
- NSApp.activate(ignoringOtherApps: true)
442
- panel.makeKeyAndOrderFront(nil)
443
-
444
- NSAnimationContext.runAnimationGroup({ context in
445
- context.duration = 0.2
446
- panel.animator().alphaValue = 1.0
447
- })
448
-
449
- NSApp.runModal(for: panel)
450
-
451
- // 根据状态返回不同的结果
452
- if handler.shouldReturnToList {
453
- return .returnToList
454
- } else if handler.result {
455
- return .confirmed
456
- } else {
457
- return .cancelled
458
- }
459
- }
460
- }
461
-
462
- // MARK: - Main
463
-
464
- func printUsage() {
465
- print("Usage:")
466
- print(" native-ui list \"Title 1\" \"Title 2\" ...")
467
- print(" native-ui preview \"Title\" \"Code Content\"")
468
- print(" native-ui combined <keyword> <json_data> # 新:组合窗口")
469
- fflush(stdout)
470
- }
471
-
472
- // MARK: - Combined Handler
473
- // 注意:SearchItem 结构体定义在 combined-window.swift 中
474
-
475
- func handleCombined(_ args: [String]) {
476
- guard args.count >= 2 else {
477
- fputs("native-ui combined: 需要 keyword 和 json_data 两个参数\n", stderr)
478
- fflush(stderr)
479
- exit(1)
480
- }
481
-
482
- let keyword = args[0]
483
- let jsonData = args[1]
484
-
485
- // 解析 JSON 数据
486
- guard let data = jsonData.data(using: .utf8),
487
- let json = try? JSONSerialization.jsonObject(with: data) as? [[String: Any]] else {
488
- fputs("native-ui combined: JSON 解析失败\n", stderr)
489
- fflush(stderr)
490
- exit(1)
491
- }
492
-
493
- var items: [SearchItem] = []
494
- for item in json {
495
- if let title = item["title"] as? String, let code = item["code"] as? String {
496
- let explanation = item["explanation"] as? String ?? ""
497
- let groupSize = (item["groupSize"] as? NSNumber)?.intValue ?? 0
498
- items.append(SearchItem(title: title, code: code, explanation: explanation, groupSize: groupSize))
499
- }
500
- }
501
-
502
- if items.isEmpty {
503
- fputs("native-ui combined: 无有效数据\n", stderr)
504
- fflush(stderr)
505
- exit(1)
506
- }
507
-
508
- let app = NSApplication.shared
509
- app.setActivationPolicy(.accessory)
510
-
511
- let controller = CombinedSearchWindowController()
512
- let result = controller.show(items: items, keyword: keyword)
513
-
514
- switch result {
515
- case .confirmed(let index):
516
- print(index)
517
- exit(0)
518
- case .cancelled:
519
- exit(1)
520
- }
521
- }
522
-
523
- func handleList(_ items: [String]) {
524
- if items.isEmpty {
525
- fputs("native-ui list: 至少需要一个选项\n", stderr)
526
- fflush(stderr)
527
- exit(1)
528
- }
529
-
530
- let app = NSApplication.shared
531
- app.setActivationPolicy(.accessory)
532
-
533
- let controller = ListSelectionWindowController()
534
- let selectedIndex = controller.show(
535
- items: items,
536
- title: "AutoSnippet 搜索结果",
537
- prompt: "找到以下匹配项,请选择一个进行插入:"
538
- )
539
-
540
- if selectedIndex >= 0 {
541
- print(selectedIndex)
542
- exit(0)
543
- } else {
544
- exit(1)
545
- }
546
- }
547
-
548
- func handlePreview(_ args: [String]) {
549
- guard args.count >= 2 else {
550
- fputs("native-ui preview: 需要 title 和 code 两个参数\n", stderr)
551
- fflush(stderr)
552
- exit(1)
553
- }
554
-
555
- let title = args[0]
556
- let code = args[1]
557
-
558
- let app = NSApplication.shared
559
- app.setActivationPolicy(.accessory)
560
-
561
- let controller = CodePreviewWindowController()
562
- let result = controller.show(title: title, code: code)
563
-
564
- switch result {
565
- case .confirmed:
566
- exit(0) // 用户确认插入
567
- case .returnToList:
568
- exit(2) // 用户要求返回列表
569
- case .cancelled:
570
- exit(1) // 用户取消
571
- }
572
- }
573
-
574
- // Main logic
575
- let args = CommandLine.arguments
576
- guard args.count > 1 else {
577
- printUsage()
578
- exit(1)
579
- }
580
-
581
- let command = args[1]
582
- if command == "--help" || command == "-h" {
583
- printUsage()
584
- exit(0)
585
- }
586
-
587
- switch command {
588
- case "list":
589
- handleList(Array(args.dropFirst(2)))
590
- case "preview":
591
- handlePreview(Array(args.dropFirst(2)))
592
- case "combined":
593
- handleCombined(Array(args.dropFirst(2)))
594
- default:
595
- fputs("未知子命令: \(command)\n", stderr)
596
- printUsage()
597
- exit(1)
598
- }
@@ -1,89 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * 安全的 postinstall 脚本
5
- *
6
- * 在 macOS 上如果 native-ui 二进制缺失但 Swift 源码存在,
7
- * 尝试自动编译(需要 Xcode Command Line Tools)。
8
- * 编译失败不阻塞安装流程。
9
- */
10
-
11
- import { execSync } from 'node:child_process';
12
-
13
- const __dirname = import.meta.dirname;
14
-
15
- import fs from 'node:fs';
16
- import path from 'node:path';
17
-
18
- const root = path.resolve(__dirname, '..');
19
-
20
- const NATIVE_UI_BIN = path.join(root, 'resources', 'native-ui', 'native-ui');
21
- const NATIVE_UI_SRC = path.join(root, 'resources', 'native-ui', 'main.swift');
22
- const NATIVE_UI_COMBINED = path.join(root, 'resources', 'native-ui', 'combined-window.swift');
23
-
24
- /**
25
- * 在 macOS 上尝试编译 native-ui(如果二进制缺失)
26
- */
27
- function tryBuildNativeUi() {
28
- // 非 macOS 跳过
29
- if (process.platform !== 'darwin') {
30
- return;
31
- }
32
-
33
- // 已有二进制,跳过
34
- if (fs.existsSync(NATIVE_UI_BIN)) {
35
- return;
36
- }
37
-
38
- // 检查源码是否存在
39
- if (!fs.existsSync(NATIVE_UI_SRC) || !fs.existsSync(NATIVE_UI_COMBINED)) {
40
- return;
41
- }
42
-
43
- // 检查 swiftc 是否可用
44
- try {
45
- execSync('which swiftc', { stdio: 'pipe' });
46
- } catch {
47
- return;
48
- }
49
-
50
- // 尝试编译
51
- try {
52
- execSync(
53
- `swiftc "${NATIVE_UI_SRC}" "${NATIVE_UI_COMBINED}" -o "${NATIVE_UI_BIN}" -framework AppKit`,
54
- { cwd: root, stdio: 'pipe', timeout: 120_000 }
55
- );
56
- if (fs.existsSync(NATIVE_UI_BIN)) {
57
- }
58
- } catch {}
59
- }
60
-
61
- // 检查预构建的二进制文件
62
- function checkBinaries() {
63
- const checks = [
64
- {
65
- name: 'Native UI',
66
- path: NATIVE_UI_BIN,
67
- optional: true,
68
- platform: 'darwin',
69
- },
70
- ];
71
-
72
- checks.forEach(({ name, path: binPath, optional, platform }) => {
73
- // 跳过非目标平台
74
- if (platform && process.platform !== platform) {
75
- return;
76
- }
77
-
78
- if (fs.existsSync(binPath)) {
79
- const stat = fs.statSync(binPath);
80
- const _sizeKB = (stat.size / 1024).toFixed(1);
81
- } else if (optional) {
82
- } else {
83
- console.warn(`⚠️ ${name}: 未找到`);
84
- }
85
- });
86
- }
87
-
88
- tryBuildNativeUi();
89
- checkBinaries();