opkg 0.6.1 → 0.7.0

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 (487) hide show
  1. package/README.md +109 -186
  2. package/assets/openpackage_ascii_dark.png +0 -0
  3. package/assets/openpackage_ascii_light.png +0 -0
  4. package/dist/commands/add.js +34 -10
  5. package/dist/commands/add.js.map +1 -1
  6. package/dist/commands/apply.js +16 -0
  7. package/dist/commands/apply.js.map +1 -0
  8. package/dist/commands/delete.js +1 -1
  9. package/dist/commands/delete.js.map +1 -1
  10. package/dist/commands/install.js +177 -8
  11. package/dist/commands/install.js.map +1 -1
  12. package/dist/commands/list.js +2 -2
  13. package/dist/commands/list.js.map +1 -1
  14. package/dist/commands/login.js +1 -1
  15. package/dist/commands/login.js.map +1 -1
  16. package/dist/commands/logout.js +1 -1
  17. package/dist/commands/logout.js.map +1 -1
  18. package/dist/commands/new.js +125 -0
  19. package/dist/commands/new.js.map +1 -0
  20. package/dist/commands/pack.js +7 -13
  21. package/dist/commands/pack.js.map +1 -1
  22. package/dist/commands/pull.js +1 -1
  23. package/dist/commands/pull.js.map +1 -1
  24. package/dist/commands/push.js +1 -1
  25. package/dist/commands/push.js.map +1 -1
  26. package/dist/commands/remove.js +63 -0
  27. package/dist/commands/remove.js.map +1 -0
  28. package/dist/commands/save.js +11 -17
  29. package/dist/commands/save.js.map +1 -1
  30. package/dist/commands/set.js +33 -0
  31. package/dist/commands/set.js.map +1 -0
  32. package/dist/commands/show.js +16 -94
  33. package/dist/commands/show.js.map +1 -1
  34. package/dist/commands/status.js +26 -701
  35. package/dist/commands/status.js.map +1 -1
  36. package/dist/commands/uninstall.js +14 -427
  37. package/dist/commands/uninstall.js.map +1 -1
  38. package/dist/constants/index.js +72 -16
  39. package/dist/constants/index.js.map +1 -1
  40. package/dist/core/add/add-conflict-handler.js +1 -8
  41. package/dist/core/add/add-conflict-handler.js.map +1 -1
  42. package/dist/core/add/add-pipeline.js +12 -10
  43. package/dist/core/add/add-pipeline.js.map +1 -1
  44. package/dist/core/add/add-to-source-pipeline.js +123 -0
  45. package/dist/core/add/add-to-source-pipeline.js.map +1 -0
  46. package/dist/core/add/package-index-updater.js +77 -78
  47. package/dist/core/add/package-index-updater.js.map +1 -1
  48. package/dist/core/add/platform-path-transformer.js +6 -4
  49. package/dist/core/add/platform-path-transformer.js.map +1 -1
  50. package/dist/core/add/source-collector.js +2 -3
  51. package/dist/core/add/source-collector.js.map +1 -1
  52. package/dist/core/apply/apply-pipeline.js +110 -0
  53. package/dist/core/apply/apply-pipeline.js.map +1 -0
  54. package/dist/core/dependency-resolver.js +263 -21
  55. package/dist/core/dependency-resolver.js.map +1 -1
  56. package/dist/core/discovery/file-discovery.js +1 -2
  57. package/dist/core/discovery/file-discovery.js.map +1 -1
  58. package/dist/core/discovery/platform-files-discovery.js +33 -18
  59. package/dist/core/discovery/platform-files-discovery.js.map +1 -1
  60. package/dist/core/flows/flow-executor.js +974 -0
  61. package/dist/core/flows/flow-executor.js.map +1 -0
  62. package/dist/core/flows/flow-inverter.js +442 -0
  63. package/dist/core/flows/flow-inverter.js.map +1 -0
  64. package/dist/core/flows/flow-key-extractor.js +101 -0
  65. package/dist/core/flows/flow-key-extractor.js.map +1 -0
  66. package/dist/core/flows/flow-key-mapper.js +382 -0
  67. package/dist/core/flows/flow-key-mapper.js.map +1 -0
  68. package/dist/core/flows/flow-transforms.js +632 -0
  69. package/dist/core/flows/flow-transforms.js.map +1 -0
  70. package/dist/core/flows/map-pipeline/context.js +73 -0
  71. package/dist/core/flows/map-pipeline/context.js.map +1 -0
  72. package/dist/core/flows/map-pipeline/index.js +156 -0
  73. package/dist/core/flows/map-pipeline/index.js.map +1 -0
  74. package/dist/core/flows/map-pipeline/operations/copy.js +104 -0
  75. package/dist/core/flows/map-pipeline/operations/copy.js.map +1 -0
  76. package/dist/core/flows/map-pipeline/operations/pipe.js +70 -0
  77. package/dist/core/flows/map-pipeline/operations/pipe.js.map +1 -0
  78. package/dist/core/flows/map-pipeline/operations/rename.js +102 -0
  79. package/dist/core/flows/map-pipeline/operations/rename.js.map +1 -0
  80. package/dist/core/flows/map-pipeline/operations/set.js +50 -0
  81. package/dist/core/flows/map-pipeline/operations/set.js.map +1 -0
  82. package/dist/core/flows/map-pipeline/operations/switch.js +79 -0
  83. package/dist/core/flows/map-pipeline/operations/switch.js.map +1 -0
  84. package/dist/core/flows/map-pipeline/operations/transform.js +543 -0
  85. package/dist/core/flows/map-pipeline/operations/transform.js.map +1 -0
  86. package/dist/core/flows/map-pipeline/operations/unset.js +65 -0
  87. package/dist/core/flows/map-pipeline/operations/unset.js.map +1 -0
  88. package/dist/core/flows/map-pipeline/types.js +8 -0
  89. package/dist/core/flows/map-pipeline/types.js.map +1 -0
  90. package/dist/core/flows/map-pipeline/utils.js +278 -0
  91. package/dist/core/flows/map-pipeline/utils.js.map +1 -0
  92. package/dist/core/flows/platform-converter.js +328 -0
  93. package/dist/core/flows/platform-converter.js.map +1 -0
  94. package/dist/core/flows/source-resolver.js +192 -0
  95. package/dist/core/flows/source-resolver.js.map +1 -0
  96. package/dist/core/flows/toml-domain-transforms.js +23 -0
  97. package/dist/core/flows/toml-domain-transforms.js.map +1 -0
  98. package/dist/core/install/bulk-install-pipeline.js +68 -7
  99. package/dist/core/install/bulk-install-pipeline.js.map +1 -1
  100. package/dist/core/install/canonical-plan.js +3 -3
  101. package/dist/core/install/canonical-plan.js.map +1 -1
  102. package/dist/core/install/dry-run.js +3 -3
  103. package/dist/core/install/dry-run.js.map +1 -1
  104. package/dist/core/install/flow-based-installer.js +1158 -0
  105. package/dist/core/install/flow-based-installer.js.map +1 -0
  106. package/dist/core/install/flow-workspace-tracker.js +111 -0
  107. package/dist/core/install/flow-workspace-tracker.js.map +1 -0
  108. package/dist/core/install/format-detector.js +228 -0
  109. package/dist/core/install/format-detector.js.map +1 -0
  110. package/dist/core/install/git-package-loader.js +20 -0
  111. package/dist/core/install/git-package-loader.js.map +1 -0
  112. package/dist/core/install/install-errors.js +1 -1
  113. package/dist/core/install/install-errors.js.map +1 -1
  114. package/dist/core/install/install-flow.js +34 -14
  115. package/dist/core/install/install-flow.js.map +1 -1
  116. package/dist/core/install/install-pipeline.js +52 -17
  117. package/dist/core/install/install-pipeline.js.map +1 -1
  118. package/dist/core/install/install-reporting.js +26 -8
  119. package/dist/core/install/install-reporting.js.map +1 -1
  120. package/dist/core/install/local-source-resolution.js +103 -0
  121. package/dist/core/install/local-source-resolution.js.map +1 -0
  122. package/dist/core/install/marketplace-handler.js +221 -0
  123. package/dist/core/install/marketplace-handler.js.map +1 -0
  124. package/dist/core/install/path-install-pipeline.js +241 -0
  125. package/dist/core/install/path-install-pipeline.js.map +1 -0
  126. package/dist/core/install/path-package-loader.js +116 -0
  127. package/dist/core/install/path-package-loader.js.map +1 -0
  128. package/dist/core/install/plugin-detector.js +72 -0
  129. package/dist/core/install/plugin-detector.js.map +1 -0
  130. package/dist/core/install/plugin-to-universal-converter.js +218 -0
  131. package/dist/core/install/plugin-to-universal-converter.js.map +1 -0
  132. package/dist/core/install/plugin-transformer.js +191 -0
  133. package/dist/core/install/plugin-transformer.js.map +1 -0
  134. package/dist/core/install/version-selection.js +1 -1
  135. package/dist/core/install/version-selection.js.map +1 -1
  136. package/dist/core/openpackage.js +40 -22
  137. package/dist/core/openpackage.js.map +1 -1
  138. package/dist/core/pack/pack-output.js +62 -0
  139. package/dist/core/pack/pack-output.js.map +1 -0
  140. package/dist/core/pack/pack-pipeline.js +186 -0
  141. package/dist/core/pack/pack-pipeline.js.map +1 -0
  142. package/dist/core/package-context.js +45 -70
  143. package/dist/core/package-context.js.map +1 -1
  144. package/dist/core/package-creation.js +203 -0
  145. package/dist/core/package-creation.js.map +1 -0
  146. package/dist/core/package.js +20 -6
  147. package/dist/core/package.js.map +1 -1
  148. package/dist/core/platforms.js +665 -209
  149. package/dist/core/platforms.js.map +1 -1
  150. package/dist/core/push/push-context.js +1 -1
  151. package/dist/core/push/push-context.js.map +1 -1
  152. package/dist/core/push/push-upload.js +2 -2
  153. package/dist/core/push/push-upload.js.map +1 -1
  154. package/dist/core/registry.js +6 -6
  155. package/dist/core/registry.js.map +1 -1
  156. package/dist/core/remote-pull.js +2 -2
  157. package/dist/core/remote-pull.js.map +1 -1
  158. package/dist/core/remove/removal-collector.js +52 -0
  159. package/dist/core/remove/removal-collector.js.map +1 -0
  160. package/dist/core/remove/removal-confirmation.js +39 -0
  161. package/dist/core/remove/removal-confirmation.js.map +1 -0
  162. package/dist/core/remove/remove-from-source-pipeline.js +173 -0
  163. package/dist/core/remove/remove-from-source-pipeline.js.map +1 -0
  164. package/dist/core/save/constants.js +3 -3
  165. package/dist/core/save/constants.js.map +1 -1
  166. package/dist/core/save/flow-based-saver.js +270 -0
  167. package/dist/core/save/flow-based-saver.js.map +1 -0
  168. package/dist/core/save/name-resolution.js +1 -1
  169. package/dist/core/save/name-resolution.js.map +1 -1
  170. package/dist/core/save/package-yml-generator.js +4 -5
  171. package/dist/core/save/package-yml-generator.js.map +1 -1
  172. package/dist/core/save/save-candidate-builder.js +215 -0
  173. package/dist/core/save/save-candidate-builder.js.map +1 -0
  174. package/dist/core/save/save-candidate-loader.js +12 -11
  175. package/dist/core/save/save-candidate-loader.js.map +1 -1
  176. package/dist/core/save/save-conflict-analyzer.js +150 -0
  177. package/dist/core/save/save-conflict-analyzer.js.map +1 -0
  178. package/dist/core/save/save-conflict-resolution.js +28 -14
  179. package/dist/core/save/save-conflict-resolution.js.map +1 -1
  180. package/dist/core/save/save-conflict-resolver.js +31 -275
  181. package/dist/core/save/save-conflict-resolver.js.map +1 -1
  182. package/dist/core/save/save-group-builder.js +52 -0
  183. package/dist/core/save/save-group-builder.js.map +1 -0
  184. package/dist/core/save/save-interactive-resolver.js +190 -0
  185. package/dist/core/save/save-interactive-resolver.js.map +1 -0
  186. package/dist/core/save/save-pipeline.js +58 -34
  187. package/dist/core/save/save-pipeline.js.map +1 -1
  188. package/dist/core/save/save-platform-handler.js +53 -0
  189. package/dist/core/save/save-platform-handler.js.map +1 -0
  190. package/dist/core/save/save-resolution-executor.js +145 -0
  191. package/dist/core/save/save-resolution-executor.js.map +1 -0
  192. package/dist/core/save/save-result-reporter.js +167 -0
  193. package/dist/core/save/save-result-reporter.js.map +1 -0
  194. package/dist/core/save/save-to-source-pipeline.js +154 -0
  195. package/dist/core/save/save-to-source-pipeline.js.map +1 -0
  196. package/dist/core/save/save-versioning.js +4 -4
  197. package/dist/core/save/save-versioning.js.map +1 -1
  198. package/dist/core/save/save-write-coordinator.js +204 -0
  199. package/dist/core/save/save-write-coordinator.js.map +1 -0
  200. package/dist/core/save/save-yml-resolution.js +28 -216
  201. package/dist/core/save/save-yml-resolution.js.map +1 -1
  202. package/dist/core/save/workspace-rename.js +7 -8
  203. package/dist/core/save/workspace-rename.js.map +1 -1
  204. package/dist/core/set/set-output.js +72 -0
  205. package/dist/core/set/set-output.js.map +1 -0
  206. package/dist/core/set/set-pipeline.js +361 -0
  207. package/dist/core/set/set-pipeline.js.map +1 -0
  208. package/dist/core/set/set-types.js +5 -0
  209. package/dist/core/set/set-types.js.map +1 -0
  210. package/dist/core/show/package-resolver.js +257 -0
  211. package/dist/core/show/package-resolver.js.map +1 -0
  212. package/dist/core/show/scope-discovery.js +165 -0
  213. package/dist/core/show/scope-discovery.js.map +1 -0
  214. package/dist/core/show/show-output.js +168 -0
  215. package/dist/core/show/show-output.js.map +1 -0
  216. package/dist/core/show/show-pipeline.js +113 -0
  217. package/dist/core/show/show-pipeline.js.map +1 -0
  218. package/dist/core/show/show-types.js +5 -0
  219. package/dist/core/show/show-types.js.map +1 -0
  220. package/dist/core/source-resolution/dependency-graph.js +104 -0
  221. package/dist/core/source-resolution/dependency-graph.js.map +1 -0
  222. package/dist/core/source-resolution/resolve-mutable-source.js +109 -0
  223. package/dist/core/source-resolution/resolve-mutable-source.js.map +1 -0
  224. package/dist/core/source-resolution/resolve-package-source.js +29 -0
  225. package/dist/core/source-resolution/resolve-package-source.js.map +1 -0
  226. package/dist/core/source-resolution/resolve-registry-version.js +35 -0
  227. package/dist/core/source-resolution/resolve-registry-version.js.map +1 -0
  228. package/dist/core/source-resolution/types.js.map +1 -0
  229. package/dist/core/status/status-file-discovery.js +23 -12
  230. package/dist/core/status/status-file-discovery.js.map +1 -1
  231. package/dist/core/status/status-pipeline.js +134 -0
  232. package/dist/core/status/status-pipeline.js.map +1 -0
  233. package/dist/core/sync/platform-sync-summary.js +27 -0
  234. package/dist/core/sync/platform-sync-summary.js.map +1 -0
  235. package/dist/core/uninstall/flow-aware-uninstaller.js +189 -0
  236. package/dist/core/uninstall/flow-aware-uninstaller.js.map +1 -0
  237. package/dist/core/uninstall/uninstall-file-discovery.js +11 -6
  238. package/dist/core/uninstall/uninstall-file-discovery.js.map +1 -1
  239. package/dist/core/uninstall/uninstall-pipeline.js +141 -0
  240. package/dist/core/uninstall/uninstall-pipeline.js.map +1 -0
  241. package/dist/core/universal-patterns.js +64 -0
  242. package/dist/core/universal-patterns.js.map +1 -0
  243. package/dist/index.js +99 -6
  244. package/dist/index.js.map +1 -1
  245. package/dist/types/flows.js +8 -0
  246. package/dist/types/flows.js.map +1 -0
  247. package/dist/types/index.js +3 -0
  248. package/dist/types/index.js.map +1 -1
  249. package/dist/types/platform-flows.js +8 -0
  250. package/dist/types/platform-flows.js.map +1 -0
  251. package/dist/types/workspace-index.js +6 -0
  252. package/dist/types/workspace-index.js.map +1 -0
  253. package/dist/utils/custom-path-resolution.js +160 -0
  254. package/dist/utils/custom-path-resolution.js.map +1 -0
  255. package/dist/utils/dependency-coverage.js +1 -1
  256. package/dist/utils/dependency-coverage.js.map +1 -1
  257. package/dist/utils/file-processing.js +1 -1
  258. package/dist/utils/flow-index-installer.js +209 -0
  259. package/dist/utils/flow-index-installer.js.map +1 -0
  260. package/dist/utils/formatters.js +47 -1
  261. package/dist/utils/formatters.js.map +1 -1
  262. package/dist/utils/fs.js +17 -0
  263. package/dist/utils/fs.js.map +1 -1
  264. package/dist/utils/git-clone-registry.js +88 -0
  265. package/dist/utils/git-clone-registry.js.map +1 -0
  266. package/dist/utils/git-clone.js +69 -0
  267. package/dist/utils/git-clone.js.map +1 -0
  268. package/dist/utils/git-spec.js +96 -0
  269. package/dist/utils/git-spec.js.map +1 -0
  270. package/dist/utils/http-client.js +7 -0
  271. package/dist/utils/http-client.js.map +1 -1
  272. package/dist/utils/index-based-installer.js +356 -163
  273. package/dist/utils/index-based-installer.js.map +1 -1
  274. package/dist/utils/install-conflict-handler.js +2 -2
  275. package/dist/utils/install-conflict-handler.js.map +1 -1
  276. package/dist/utils/install-file-discovery.js +18 -13
  277. package/dist/utils/install-file-discovery.js.map +1 -1
  278. package/dist/utils/install-helpers.js +43 -20
  279. package/dist/utils/install-helpers.js.map +1 -1
  280. package/dist/utils/jsonc.js +23 -1
  281. package/dist/utils/jsonc.js.map +1 -1
  282. package/dist/utils/manifest-paths.js +1 -1
  283. package/dist/utils/manifest-paths.js.map +1 -1
  284. package/dist/utils/markdown-frontmatter.js +46 -0
  285. package/dist/utils/markdown-frontmatter.js.map +1 -1
  286. package/dist/utils/package-copy.js +5 -103
  287. package/dist/utils/package-copy.js.map +1 -1
  288. package/dist/utils/package-filters.js +9 -105
  289. package/dist/utils/package-filters.js.map +1 -1
  290. package/dist/utils/package-index-yml.js +27 -6
  291. package/dist/utils/package-index-yml.js.map +1 -1
  292. package/dist/utils/package-input.js +98 -0
  293. package/dist/utils/package-input.js.map +1 -0
  294. package/dist/utils/package-management.js +80 -28
  295. package/dist/utils/package-management.js.map +1 -1
  296. package/dist/utils/package-name-resolution.js +327 -0
  297. package/dist/utils/package-name-resolution.js.map +1 -0
  298. package/dist/utils/package-name.js +18 -16
  299. package/dist/utils/package-name.js.map +1 -1
  300. package/dist/utils/package-versioning.js +2 -33
  301. package/dist/utils/package-versioning.js.map +1 -1
  302. package/dist/utils/package-yml.js +19 -28
  303. package/dist/utils/package-yml.js.map +1 -1
  304. package/dist/utils/path-resolution.js +102 -0
  305. package/dist/utils/path-resolution.js.map +1 -0
  306. package/dist/utils/paths.js +6 -6
  307. package/dist/utils/paths.js.map +1 -1
  308. package/dist/utils/platform-file.js +36 -24
  309. package/dist/utils/platform-file.js.map +1 -1
  310. package/dist/utils/platform-mapper.js +222 -68
  311. package/dist/utils/platform-mapper.js.map +1 -1
  312. package/dist/utils/platform-root-files.js +44 -0
  313. package/dist/utils/platform-root-files.js.map +1 -0
  314. package/dist/utils/platform-utils.js +35 -54
  315. package/dist/utils/platform-utils.js.map +1 -1
  316. package/dist/utils/platform-yaml-merge.js +20 -140
  317. package/dist/utils/platform-yaml-merge.js.map +1 -1
  318. package/dist/utils/prompts.js +92 -7
  319. package/dist/utils/prompts.js.map +1 -1
  320. package/dist/utils/registry-entry-filter.js +50 -27
  321. package/dist/utils/registry-entry-filter.js.map +1 -1
  322. package/dist/utils/registry-paths.js +5 -4
  323. package/dist/utils/registry-paths.js.map +1 -1
  324. package/dist/utils/scope-resolution.js +156 -0
  325. package/dist/utils/scope-resolution.js.map +1 -0
  326. package/dist/utils/source-mutability.js +15 -0
  327. package/dist/utils/source-mutability.js.map +1 -0
  328. package/dist/utils/tarball.js +29 -4
  329. package/dist/utils/tarball.js.map +1 -1
  330. package/dist/utils/version-ranges.js +1 -32
  331. package/dist/utils/version-ranges.js.map +1 -1
  332. package/dist/utils/workspace-index-helpers.js +28 -0
  333. package/dist/utils/workspace-index-helpers.js.map +1 -0
  334. package/dist/utils/workspace-index-ownership.js +100 -0
  335. package/dist/utils/workspace-index-ownership.js.map +1 -0
  336. package/dist/utils/workspace-index-yml.js +173 -0
  337. package/dist/utils/workspace-index-yml.js.map +1 -0
  338. package/examples/custom-subdirs-platform.jsonc +157 -0
  339. package/package.json +7 -2
  340. package/platforms.jsonc +531 -84
  341. package/schemas/map-pipeline-v1.json +256 -0
  342. package/schemas/platforms-v1.json +400 -0
  343. package/specs/README.md +88 -0
  344. package/specs/add/README.md +166 -0
  345. package/specs/agents-claude.md +570 -0
  346. package/specs/agents-opencode.md +622 -0
  347. package/specs/apply/README.md +21 -0
  348. package/specs/apply/apply-behavior.md +58 -0
  349. package/specs/apply/apply-command.md +51 -0
  350. package/specs/apply/conflicts.md +41 -0
  351. package/specs/apply/index-effects.md +81 -0
  352. package/specs/architecture.md +107 -0
  353. package/specs/auth/README.md +17 -0
  354. package/specs/auth/auth-http-contract.md +25 -0
  355. package/specs/auth/cli/credentials.md +39 -0
  356. package/specs/auth/cli/login.md +32 -0
  357. package/specs/auth/cli/logout.md +16 -0
  358. package/specs/claude-mcp.md +1065 -0
  359. package/specs/claude-plugins-marketplace.md +363 -0
  360. package/specs/claude-plugins.md +413 -0
  361. package/specs/cli-options.md +52 -0
  362. package/specs/codex-mcp.md +114 -0
  363. package/specs/commands-overview.md +175 -0
  364. package/specs/directory-layout.md +95 -0
  365. package/specs/install/README.md +12 -4
  366. package/specs/install/git-sources.md +230 -0
  367. package/specs/install/install-behavior.md +483 -73
  368. package/specs/install/package-yml-canonical.md +67 -35
  369. package/specs/install/version-resolution.md +69 -115
  370. package/specs/new/README.md +769 -0
  371. package/specs/new/SUMMARY.md +310 -0
  372. package/specs/new/scope-behavior.md +793 -0
  373. package/specs/pack/README.md +77 -0
  374. package/specs/pack/package-name-resolution.md +330 -0
  375. package/specs/package/README.md +18 -17
  376. package/specs/package/nested-packages-and-parent-packages.md +32 -31
  377. package/specs/package/package-index-yml.md +95 -101
  378. package/specs/package/package-root-layout.md +64 -46
  379. package/specs/package/registry-payload-and-copy.md +50 -44
  380. package/specs/package/universal-content.md +33 -56
  381. package/specs/package-sources.md +248 -0
  382. package/specs/platforms/README.md +52 -0
  383. package/specs/platforms/configuration.md +571 -0
  384. package/specs/platforms/detection.md +552 -0
  385. package/specs/platforms/directory-layout.md +599 -0
  386. package/specs/platforms/examples.md +1146 -0
  387. package/specs/platforms/flow-reference.md +1240 -0
  388. package/specs/platforms/flows.md +1488 -0
  389. package/specs/platforms/map-pipeline.md +801 -0
  390. package/specs/platforms/overview.md +349 -0
  391. package/specs/platforms/specification.md +700 -0
  392. package/specs/platforms/troubleshooting.md +697 -0
  393. package/specs/platforms/universal-converter.md +520 -0
  394. package/specs/push/README.md +1 -0
  395. package/specs/push/push-behavior.md +11 -3
  396. package/specs/push/push-remote-upload.md +1 -1
  397. package/specs/push/push-scoping.md +1 -1
  398. package/specs/push/push-version-selection.md +1 -1
  399. package/specs/registry.md +111 -0
  400. package/specs/remove/README.md +257 -0
  401. package/specs/save/README.md +21 -17
  402. package/specs/save/save-conflict-resolution.md +205 -83
  403. package/specs/save/save-file-discovery.md +6 -4
  404. package/specs/save/save-frontmatter-overrides.md +11 -15
  405. package/specs/save/save-modes-inputs.md +9 -39
  406. package/specs/save/save-naming-scoping.md +4 -4
  407. package/specs/save/save-package-detection.md +13 -13
  408. package/specs/save/save-registry-sync.md +16 -106
  409. package/specs/save/save-versioning.md +80 -0
  410. package/specs/scope-management.md +92 -0
  411. package/specs/set/README.md +520 -0
  412. package/specs/set/set-behavior.md +563 -0
  413. package/specs/show/README.md +483 -0
  414. package/specs/show/show-remote.md +494 -0
  415. package/specs/status/README.md +38 -0
  416. package/specs/uninstall/README.md +231 -0
  417. package/dist/commands/duplicate.js +0 -69
  418. package/dist/commands/duplicate.js.map +0 -1
  419. package/dist/commands/init.js +0 -117
  420. package/dist/commands/init.js.map +0 -1
  421. package/dist/commands/prune.js +0 -357
  422. package/dist/commands/prune.js.map +0 -1
  423. package/dist/commands/tui.js +0 -61
  424. package/dist/commands/tui.js.map +0 -1
  425. package/dist/core/install/index.js +0 -3
  426. package/dist/core/install/index.js.map +0 -1
  427. package/dist/core/push/push-single-file.js +0 -56
  428. package/dist/core/push/push-single-file.js.map +0 -1
  429. package/dist/core/save/package-detection.js +0 -147
  430. package/dist/core/save/package-detection.js.map +0 -1
  431. package/dist/core/save/save-single-file.js +0 -124
  432. package/dist/core/save/save-single-file.js.map +0 -1
  433. package/dist/core/token-store.js +0 -73
  434. package/dist/core/token-store.js.map +0 -1
  435. package/dist/tui/app.js +0 -95
  436. package/dist/tui/app.js.map +0 -1
  437. package/dist/tui/components/package-list.js +0 -73
  438. package/dist/tui/components/package-list.js.map +0 -1
  439. package/dist/tui/controller.js +0 -365
  440. package/dist/tui/controller.js.map +0 -1
  441. package/dist/tui/index.js +0 -12
  442. package/dist/tui/index.js.map +0 -1
  443. package/dist/tui/services/file-index.js +0 -64
  444. package/dist/tui/services/file-index.js.map +0 -1
  445. package/dist/tui/services/packages.js +0 -18
  446. package/dist/tui/services/packages.js.map +0 -1
  447. package/dist/tui/services/save.js +0 -21
  448. package/dist/tui/services/save.js.map +0 -1
  449. package/dist/tui/state/app-state.js +0 -15
  450. package/dist/tui/state/app-state.js.map +0 -1
  451. package/dist/tui/state.js +0 -17
  452. package/dist/tui/state.js.map +0 -1
  453. package/dist/tui/types.js.map +0 -1
  454. package/dist/tui/views/add-file-modal.js +0 -129
  455. package/dist/tui/views/add-file-modal.js.map +0 -1
  456. package/dist/tui/views/file-preview.js +0 -44
  457. package/dist/tui/views/file-preview.js.map +0 -1
  458. package/dist/tui/views/list-packages.js +0 -73
  459. package/dist/tui/views/list-packages.js.map +0 -1
  460. package/dist/tui/views/main-menu.js +0 -29
  461. package/dist/tui/views/main-menu.js.map +0 -1
  462. package/dist/tui/views/manage-view.js +0 -81
  463. package/dist/tui/views/manage-view.js.map +0 -1
  464. package/dist/tui/views/package-hub.js +0 -120
  465. package/dist/tui/views/package-hub.js.map +0 -1
  466. package/dist/tui/views/placeholder.js +0 -24
  467. package/dist/tui/views/placeholder.js.map +0 -1
  468. package/dist/utils/bun-bootstrap.js +0 -72
  469. package/dist/utils/bun-bootstrap.js.map +0 -1
  470. package/dist/utils/entity-id.js +0 -19
  471. package/dist/utils/entity-id.js.map +0 -1
  472. package/dist/utils/package-local-files.js +0 -5
  473. package/dist/utils/package-local-files.js.map +0 -1
  474. package/dist/utils/path-matching.js +0 -74
  475. package/dist/utils/path-matching.js.map +0 -1
  476. package/dist/utils/root-file-operations.js +0 -39
  477. package/dist/utils/root-file-operations.js.map +0 -1
  478. package/dist/utils/root-file-transformer.js +0 -27
  479. package/dist/utils/root-file-transformer.js.map +0 -1
  480. package/dist/utils/yaml-frontmatter.js +0 -25
  481. package/dist/utils/yaml-frontmatter.js.map +0 -1
  482. package/specs/auth/auth-device-flow.md +0 -70
  483. package/specs/login/login-device-flow.md +0 -70
  484. package/specs/platforms.md +0 -193
  485. package/specs/save-pack-versioning.md +0 -224
  486. package/specs/save-pack.md +0 -68
  487. /package/dist/{tui → core/source-resolution}/types.js +0 -0
@@ -0,0 +1,221 @@
1
+ import { join } from 'path';
2
+ import { readTextFile, exists } from '../../utils/fs.js';
3
+ import { logger } from '../../utils/logger.js';
4
+ import { ValidationError } from '../../utils/errors.js';
5
+ import { runPathInstallPipeline } from './path-install-pipeline.js';
6
+ import { detectPluginType, validatePluginManifest } from './plugin-detector.js';
7
+ import prompts from 'prompts';
8
+ /**
9
+ * Parse and validate a marketplace manifest.
10
+ *
11
+ * @param manifestPath - Path to marketplace.json file
12
+ * @returns Parsed marketplace manifest
13
+ */
14
+ export async function parseMarketplace(manifestPath) {
15
+ logger.debug('Parsing marketplace manifest', { manifestPath });
16
+ try {
17
+ const content = await readTextFile(manifestPath);
18
+ const manifest = JSON.parse(content);
19
+ // Validate required fields
20
+ if (!manifest.name) {
21
+ throw new ValidationError('Marketplace manifest missing required field: name');
22
+ }
23
+ if (!manifest.plugins || !Array.isArray(manifest.plugins)) {
24
+ throw new ValidationError('Marketplace manifest missing or invalid plugins array');
25
+ }
26
+ if (manifest.plugins.length === 0) {
27
+ throw new ValidationError('Marketplace contains no plugins');
28
+ }
29
+ // Validate each plugin entry
30
+ for (const plugin of manifest.plugins) {
31
+ if (!plugin.name) {
32
+ throw new ValidationError('Marketplace plugin entry missing required field: name');
33
+ }
34
+ // Accept either subdirectory (opkg) or source (Claude Code) field
35
+ if (!plugin.subdirectory && !plugin.source) {
36
+ throw new ValidationError(`Plugin '${plugin.name}' missing required field: subdirectory or source`);
37
+ }
38
+ // Normalize: if source is provided but not subdirectory, use source as subdirectory
39
+ if (!plugin.subdirectory && plugin.source) {
40
+ plugin.subdirectory = plugin.source;
41
+ }
42
+ }
43
+ logger.info('Parsed marketplace manifest', {
44
+ name: manifest.name,
45
+ pluginCount: manifest.plugins.length
46
+ });
47
+ return manifest;
48
+ }
49
+ catch (error) {
50
+ if (error instanceof ValidationError) {
51
+ throw error;
52
+ }
53
+ throw new ValidationError(`Failed to parse marketplace manifest at ${manifestPath}: ${error}`);
54
+ }
55
+ }
56
+ /**
57
+ * Display interactive plugin selection prompt.
58
+ *
59
+ * @param marketplace - Parsed marketplace manifest
60
+ * @returns Array of selected plugin names (empty if user cancelled)
61
+ */
62
+ export async function promptPluginSelection(marketplace) {
63
+ console.log(`\n📦 Marketplace: ${marketplace.name}`);
64
+ if (marketplace.description) {
65
+ console.log(` ${marketplace.description}`);
66
+ }
67
+ console.log(`\n${marketplace.plugins.length} plugin${marketplace.plugins.length === 1 ? '' : 's'} available:\n`);
68
+ const choices = marketplace.plugins.map(plugin => ({
69
+ title: plugin.name,
70
+ value: plugin.name,
71
+ description: plugin.description || '',
72
+ selected: false
73
+ }));
74
+ const response = await prompts({
75
+ type: 'multiselect',
76
+ name: 'plugins',
77
+ message: 'Select plugins to install (space to select, enter to confirm):',
78
+ choices,
79
+ min: 1,
80
+ hint: '- Use arrow keys to navigate, space to select/deselect, enter to confirm'
81
+ });
82
+ if (!response.plugins || response.plugins.length === 0) {
83
+ logger.info('User cancelled plugin selection');
84
+ return [];
85
+ }
86
+ logger.info('User selected plugins', { selected: response.plugins });
87
+ return response.plugins;
88
+ }
89
+ /**
90
+ * Install selected plugins from a marketplace.
91
+ *
92
+ * @param marketplaceDir - Absolute path to cloned marketplace repository root
93
+ * @param marketplace - Parsed marketplace manifest
94
+ * @param selectedNames - Names of plugins to install
95
+ * @param gitUrl - Git URL of the marketplace repository
96
+ * @param gitRef - Git ref (branch/tag/sha) if specified
97
+ * @param options - Install options
98
+ */
99
+ export async function installMarketplacePlugins(marketplaceDir, marketplace, selectedNames, gitUrl, gitRef, options) {
100
+ logger.info('Installing marketplace plugins', {
101
+ marketplace: marketplace.name,
102
+ plugins: selectedNames
103
+ });
104
+ const results = [];
105
+ for (const pluginName of selectedNames) {
106
+ const pluginEntry = marketplace.plugins.find(p => p.name === pluginName);
107
+ if (!pluginEntry) {
108
+ logger.error(`Plugin '${pluginName}' not found in marketplace`, { marketplace: marketplace.name });
109
+ results.push({
110
+ name: pluginName,
111
+ success: false,
112
+ error: `Plugin not found in marketplace`
113
+ });
114
+ continue;
115
+ }
116
+ const pluginSubdir = pluginEntry.subdirectory || pluginEntry.source;
117
+ if (!pluginSubdir) {
118
+ logger.error(`Plugin entry missing both subdirectory and source fields`, { plugin: pluginName });
119
+ results.push({
120
+ name: pluginName,
121
+ success: false,
122
+ error: `Plugin entry missing subdirectory/source field`
123
+ });
124
+ continue;
125
+ }
126
+ const pluginDir = join(marketplaceDir, pluginSubdir);
127
+ // Validate plugin subdirectory exists
128
+ if (!(await exists(pluginDir))) {
129
+ logger.error(`Plugin subdirectory does not exist`, {
130
+ plugin: pluginName,
131
+ subdirectory: pluginSubdir,
132
+ fullPath: pluginDir
133
+ });
134
+ results.push({
135
+ name: pluginName,
136
+ success: false,
137
+ error: `Subdirectory '${pluginSubdir}' does not exist`
138
+ });
139
+ continue;
140
+ }
141
+ // Validate plugin structure
142
+ const detection = await detectPluginType(pluginDir);
143
+ if (!detection.isPlugin || detection.type !== 'individual') {
144
+ logger.error(`Subdirectory is not a valid plugin`, {
145
+ plugin: pluginName,
146
+ subdirectory: pluginSubdir
147
+ });
148
+ results.push({
149
+ name: pluginName,
150
+ success: false,
151
+ error: `Subdirectory does not contain a valid plugin (missing .claude-plugin/plugin.json)`
152
+ });
153
+ continue;
154
+ }
155
+ // Validate plugin manifest is parseable
156
+ if (!(await validatePluginManifest(detection.manifestPath))) {
157
+ results.push({
158
+ name: pluginName,
159
+ success: false,
160
+ error: `Invalid plugin manifest (cannot parse JSON)`
161
+ });
162
+ continue;
163
+ }
164
+ // Install the plugin
165
+ console.log(`\n📦 Installing plugin: ${pluginName}...`);
166
+ try {
167
+ await runPathInstallPipeline({
168
+ ...options,
169
+ sourcePath: pluginDir,
170
+ sourceType: 'directory',
171
+ targetDir: '.',
172
+ gitUrl,
173
+ gitRef,
174
+ gitSubdirectory: pluginSubdir
175
+ });
176
+ results.push({ name: pluginName, success: true });
177
+ console.log(`✓ Successfully installed ${pluginName}`);
178
+ }
179
+ catch (error) {
180
+ logger.error(`Failed to install plugin`, { plugin: pluginName, error });
181
+ results.push({
182
+ name: pluginName,
183
+ success: false,
184
+ error: error instanceof Error ? error.message : String(error)
185
+ });
186
+ console.error(`✗ Failed to install ${pluginName}: ${error}`);
187
+ }
188
+ }
189
+ // Display summary
190
+ console.log('\n' + '='.repeat(60));
191
+ console.log('Installation Summary:');
192
+ console.log('='.repeat(60));
193
+ const successful = results.filter(r => r.success);
194
+ const failed = results.filter(r => !r.success);
195
+ if (successful.length > 0) {
196
+ console.log(`\n✓ Successfully installed (${successful.length}):`);
197
+ for (const result of successful) {
198
+ console.log(` • ${result.name}`);
199
+ }
200
+ }
201
+ if (failed.length > 0) {
202
+ console.log(`\n✗ Failed to install (${failed.length}):`);
203
+ for (const result of failed) {
204
+ console.log(` • ${result.name}: ${result.error}`);
205
+ }
206
+ }
207
+ console.log('');
208
+ // Return success if at least one plugin was installed
209
+ if (successful.length > 0) {
210
+ return {
211
+ success: true
212
+ };
213
+ }
214
+ else {
215
+ return {
216
+ success: false,
217
+ error: 'Failed to install any plugins from marketplace'
218
+ };
219
+ }
220
+ }
221
+ //# sourceMappingURL=marketplace-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-handler.js","sourceRoot":"","sources":["../../../src/core/install/marketplace-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,241 @@
1
+ import { displayDependencyTree } from '../dependency-resolver.js';
2
+ import { ensureRegistryDirectories } from '../directory.js';
3
+ import { prepareInstallEnvironment, processConflictResolution, performIndexBasedInstallationPhases, VersionResolutionAbortError } from './install-flow.js';
4
+ import { handleDryRunMode } from './dry-run.js';
5
+ import { displayInstallationResults, formatSelectionSummary } from './install-reporting.js';
6
+ import { resolvePlatforms } from './platform-resolution.js';
7
+ import { getLocalPackageYmlPath, getInstallRootDir, isRootPackage } from '../../utils/paths.js';
8
+ import { exists } from '../../utils/fs.js';
9
+ import { logger } from '../../utils/logger.js';
10
+ import { PackageNotFoundError } from '../../utils/errors.js';
11
+ import { normalizePathForProcessing } from '../../utils/path-normalization.js';
12
+ import { loadPackageFromPath } from './path-package-loader.js';
13
+ import { createWorkspacePackageYml, addPackageToYml, } from '../../utils/package-management.js';
14
+ import { determineResolutionMode } from './install-pipeline.js';
15
+ /**
16
+ * Install a package from a local directory or tarball path.
17
+ *
18
+ * Flow:
19
+ * 1. Load package from path
20
+ * 2. Resolve dependencies recursively (handles path-based deps)
21
+ * 3. Copy to workspace .openpackage/packages/ for consistency
22
+ * 4. Install to workspace platforms
23
+ * 5. Update workspace openpackage.yml with path field
24
+ */
25
+ export async function runPathInstallPipeline(options) {
26
+ const cwd = process.cwd();
27
+ const resolutionMode = determineResolutionMode(options);
28
+ const dryRun = Boolean(options.dryRun);
29
+ const warnings = [];
30
+ const warnedPackages = new Set();
31
+ // Load package from path
32
+ logger.debug(`Loading package from ${options.sourceType}: ${options.sourcePath}`);
33
+ let sourcePackage;
34
+ let isPlugin = false;
35
+ try {
36
+ // Check if this is a Claude Code plugin
37
+ const { detectPluginType } = await import('./plugin-detector.js');
38
+ const pluginDetection = await detectPluginType(options.sourcePath);
39
+ if (pluginDetection.isPlugin && pluginDetection.type === 'individual') {
40
+ isPlugin = true;
41
+ console.log(`\n🔌 Detected Claude Code plugin`);
42
+ }
43
+ sourcePackage = await loadPackageFromPath(options.sourcePath);
44
+ }
45
+ catch (error) {
46
+ return {
47
+ success: false,
48
+ error: `Failed to load package from ${options.sourceType} '${options.sourcePath}': ${error}`
49
+ };
50
+ }
51
+ const packageName = sourcePackage.metadata.name;
52
+ const packageVersion = sourcePackage.metadata.version || '0.0.0';
53
+ if (isPlugin) {
54
+ console.log(`📦 Installing plugin: ${packageName}@${packageVersion}`);
55
+ }
56
+ // Check for root package conflict
57
+ if (await isRootPackage(cwd, packageName)) {
58
+ console.log(`⚠️ Cannot install ${packageName} - it matches your project's root package name`);
59
+ console.log(` This would create a circular dependency.`);
60
+ return {
61
+ success: true,
62
+ data: {
63
+ packageName,
64
+ targetDir: getInstallRootDir(cwd),
65
+ resolvedPackages: [],
66
+ totalPackages: 0,
67
+ installed: 0,
68
+ skipped: 1,
69
+ totalOpenPackageFiles: 0,
70
+ sourcePath: options.sourcePath,
71
+ sourceType: options.sourceType
72
+ }
73
+ };
74
+ }
75
+ await ensureRegistryDirectories();
76
+ await createWorkspacePackageYml(cwd);
77
+ // Resolve dependencies (this will handle path-based dependencies recursively)
78
+ const resolveDependenciesOutcome = async () => {
79
+ try {
80
+ // First, add the source package to resolved packages
81
+ const resolvedPackages = new Map();
82
+ resolvedPackages.set(packageName, {
83
+ name: packageName,
84
+ version: packageVersion,
85
+ pkg: sourcePackage,
86
+ isRoot: true,
87
+ source: 'path',
88
+ contentRoot: options.sourcePath // Store the source path for installation phase
89
+ });
90
+ // Resolve dependencies from the source package
91
+ // We need to manually resolve dependencies since resolveDependenciesForInstall expects a registry package
92
+ const { resolveDependencies } = await import('../dependency-resolver.js');
93
+ const { gatherGlobalVersionConstraints, gatherRootVersionConstraints } = await import('../openpackage.js');
94
+ const globalConstraints = await gatherGlobalVersionConstraints(cwd);
95
+ const rootConstraints = await gatherRootVersionConstraints(cwd);
96
+ const rootOverrides = new Map(rootConstraints);
97
+ const resolverOptions = {
98
+ mode: resolutionMode,
99
+ profile: options.profile,
100
+ apiKey: options.apiKey,
101
+ onWarning: (message) => {
102
+ warnings.push(message);
103
+ console.log(`⚠️ ${message}`);
104
+ }
105
+ };
106
+ // Resolve dependencies, passing the source path for relative resolution
107
+ const depResult = await resolveDependencies(packageName, cwd, true, new Set(), // Empty visitedStack - resolveDependencies manages this internally
108
+ resolvedPackages, packageVersion, new Map(), globalConstraints, rootOverrides, resolverOptions, new Map(), options.sourcePath // Pass source path for relative dependency resolution
109
+ );
110
+ return {
111
+ success: true,
112
+ data: {
113
+ resolvedPackages: Array.from(resolvedPackages.values()),
114
+ missingPackages: Array.from(depResult.missingPackages),
115
+ remoteOutcomes: depResult.remoteOutcomes,
116
+ warnings: warnings.length > 0 ? warnings : undefined
117
+ }
118
+ };
119
+ }
120
+ catch (error) {
121
+ if (error instanceof VersionResolutionAbortError) {
122
+ return {
123
+ success: false,
124
+ commandResult: { success: false, error: error.message }
125
+ };
126
+ }
127
+ if (error instanceof PackageNotFoundError ||
128
+ (error instanceof Error &&
129
+ (error.message.includes('not available in local registry') ||
130
+ (error.message.includes('Package') && error.message.includes('not found'))))) {
131
+ console.log('❌ Package not found');
132
+ return { success: false, commandResult: { success: false, error: 'Package not found' } };
133
+ }
134
+ throw error;
135
+ }
136
+ };
137
+ const initialResolution = await resolveDependenciesOutcome();
138
+ if (!initialResolution.success) {
139
+ return initialResolution.commandResult;
140
+ }
141
+ let resolvedPackages = initialResolution.data.resolvedPackages;
142
+ let missingPackages = initialResolution.data.missingPackages;
143
+ const remoteOutcomes = initialResolution.data.remoteOutcomes || {};
144
+ if (missingPackages.length > 0) {
145
+ const missingSummary = `Missing packages: ${Array.from(new Set(missingPackages)).join(', ')}`;
146
+ console.log(`⚠️ ${missingSummary}`);
147
+ warnings.push(missingSummary);
148
+ }
149
+ // Display selection summary
150
+ console.log(formatSelectionSummary('path', packageName, packageVersion));
151
+ const { specifiedPlatforms } = await prepareInstallEnvironment(cwd, options);
152
+ const conflictProcessing = await processConflictResolution(resolvedPackages, options);
153
+ if ('cancelled' in conflictProcessing) {
154
+ console.log(`Installation cancelled by user`);
155
+ return {
156
+ success: true,
157
+ data: {
158
+ packageName,
159
+ targetDir: getInstallRootDir(cwd),
160
+ resolvedPackages: [],
161
+ totalPackages: 0,
162
+ installed: 0,
163
+ skipped: 1,
164
+ totalOpenPackageFiles: 0,
165
+ sourcePath: options.sourcePath,
166
+ sourceType: options.sourceType
167
+ }
168
+ };
169
+ }
170
+ const { finalResolvedPackages, conflictResult } = conflictProcessing;
171
+ displayDependencyTree(finalResolvedPackages, true);
172
+ const packageYmlPath = getLocalPackageYmlPath(cwd);
173
+ const packageYmlExists = await exists(packageYmlPath);
174
+ if (dryRun) {
175
+ // For dry run, we still need to write the package to workspace for consistency
176
+ // but we'll use the standard dry run handler
177
+ return await handleDryRunMode(finalResolvedPackages, packageName, options.targetDir, options, packageYmlExists);
178
+ }
179
+ const canPromptForPlatforms = Boolean(process.stdin.isTTY && process.stdout.isTTY);
180
+ const finalPlatforms = options.resolvedPlatforms && options.resolvedPlatforms.length > 0
181
+ ? options.resolvedPlatforms
182
+ : await resolvePlatforms(cwd, specifiedPlatforms, { interactive: canPromptForPlatforms });
183
+ // TODO: Removed manual source copy to .openpackage/packages/ as redundant with index-based install
184
+ // Source files handled via installPackageByIndex; index tracks mappings
185
+ // If local cache needed for path sources, register to registry minimally instead
186
+ const { getLocalPackageDir } = await import('../../utils/paths.js'); // Keep import if needed elsewhere
187
+ logger.debug('Skipped manual source package copy to local packages dir', { packageName, sourcePath: options.sourcePath });
188
+ // Install to workspace platforms
189
+ const installationOutcome = await performIndexBasedInstallationPhases({
190
+ cwd,
191
+ packages: finalResolvedPackages,
192
+ platforms: finalPlatforms,
193
+ conflictResult,
194
+ options,
195
+ targetDir: options.targetDir,
196
+ fileFilters: undefined // Full install for path-based packages
197
+ });
198
+ // Update workspace openpackage.yml with path-based dependency
199
+ const mainPackage = finalResolvedPackages.find(pkg => pkg.isRoot);
200
+ if (packageYmlExists && mainPackage) {
201
+ // Store relative path if possible, otherwise absolute
202
+ const relativePath = normalizePathForProcessing(options.sourcePath);
203
+ const pathToStore = relativePath.startsWith('..') || relativePath.startsWith('/')
204
+ ? relativePath
205
+ : `./${relativePath}`;
206
+ await addPackageToYml(cwd, packageName, packageVersion, options.dev ?? false, undefined, // No range for path-based packages
207
+ true, undefined, // No include filter
208
+ options.gitUrl ? undefined : pathToStore, // Store the path when not git
209
+ options.gitUrl, options.gitRef, options.gitSubdirectory);
210
+ }
211
+ displayInstallationResults(packageName, finalResolvedPackages, { platforms: finalPlatforms, created: [] }, options, mainPackage, installationOutcome.allAddedFiles, installationOutcome.allUpdatedFiles, installationOutcome.rootFileResults, missingPackages, remoteOutcomes, installationOutcome.errorCount, installationOutcome.errors);
212
+ // Check if installation actually failed
213
+ const hadErrors = installationOutcome.errorCount > 0;
214
+ const installedAnyFiles = installationOutcome.allAddedFiles.length > 0 ||
215
+ installationOutcome.allUpdatedFiles.length > 0 ||
216
+ installationOutcome.rootFileResults.installed.length > 0 ||
217
+ installationOutcome.rootFileResults.updated.length > 0;
218
+ if (hadErrors && !installedAnyFiles) {
219
+ // Complete failure - return error
220
+ return {
221
+ success: false,
222
+ error: `Failed to install ${packageName}: ${installationOutcome.errors?.join('; ')}`,
223
+ };
224
+ }
225
+ return {
226
+ success: true,
227
+ data: {
228
+ packageName,
229
+ targetDir: getInstallRootDir(cwd),
230
+ resolvedPackages: finalResolvedPackages,
231
+ totalPackages: finalResolvedPackages.length,
232
+ installed: installationOutcome.installedCount,
233
+ skipped: installationOutcome.skippedCount,
234
+ totalOpenPackageFiles: installationOutcome.totalOpenPackageFiles,
235
+ sourcePath: options.sourcePath,
236
+ sourceType: options.sourceType
237
+ },
238
+ warnings: warnings.length > 0 ? Array.from(new Set(warnings)) : undefined
239
+ };
240
+ }
241
+ //# sourceMappingURL=path-install-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-install-pipeline.js","sourceRoot":"","sources":["../../../src/core/install/path-install-pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ import { relative, basename } from 'path';
2
+ import { readFile } from 'fs/promises';
3
+ import { loadPackageConfig } from '../package-context.js';
4
+ import { extractPackageFromTarball } from '../../utils/tarball.js';
5
+ import { walkFiles, readTextFile } from '../../utils/fs.js';
6
+ import { isJunk } from 'junk';
7
+ import { logger } from '../../utils/logger.js';
8
+ import { ValidationError } from '../../utils/errors.js';
9
+ import { FILE_PATTERNS, PACKAGE_PATHS } from '../../constants/index.js';
10
+ import { detectPluginType } from './plugin-detector.js';
11
+ import { transformPluginToPackage } from './plugin-transformer.js';
12
+ /**
13
+ * Infer the source type from a path string.
14
+ */
15
+ export function inferSourceType(path) {
16
+ return path.endsWith('.tgz') || path.endsWith('.tar.gz') ? 'tarball' : 'directory';
17
+ }
18
+ /**
19
+ * Load a package from a local directory.
20
+ * Reads all files from the directory and loads openpackage.yml.
21
+ *
22
+ * If the directory is a Claude Code plugin, transforms it to OpenPackage format.
23
+ */
24
+ export async function loadPackageFromDirectory(dirPath) {
25
+ logger.debug(`Loading package from directory: ${dirPath}`);
26
+ // Check if this is a Claude Code plugin
27
+ const pluginDetection = await detectPluginType(dirPath);
28
+ if (pluginDetection.isPlugin && pluginDetection.type === 'individual') {
29
+ logger.info('Detected Claude Code plugin, transforming to OpenPackage format', { dirPath });
30
+ return await transformPluginToPackage(dirPath);
31
+ }
32
+ // If it's a marketplace, we need to handle plugin selection (done upstream in install command)
33
+ if (pluginDetection.isPlugin && pluginDetection.type === 'marketplace') {
34
+ throw new ValidationError(`Directory '${dirPath}' is a Claude Code plugin marketplace. ` +
35
+ `Marketplace installation requires plugin selection and should be handled by the install command.`);
36
+ }
37
+ // Load openpackage.yml for regular packages
38
+ const config = await loadPackageConfig(dirPath);
39
+ if (!config) {
40
+ throw new ValidationError(`Directory '${dirPath}' is not a valid OpenPackage directory or Claude Code plugin. ` +
41
+ `Missing ${FILE_PATTERNS.OPENPACKAGE_YML} or .claude-plugin/plugin.json`);
42
+ }
43
+ // Discover all files in the directory
44
+ const files = [];
45
+ try {
46
+ for await (const fullPath of walkFiles(dirPath)) {
47
+ const relativePath = relative(dirPath, fullPath);
48
+ // Filter out junk files
49
+ if (isJunk(basename(relativePath))) {
50
+ continue;
51
+ }
52
+ const content = await readTextFile(fullPath);
53
+ files.push({
54
+ path: relativePath,
55
+ content,
56
+ encoding: 'utf8'
57
+ });
58
+ }
59
+ logger.debug(`Loaded ${files.length} files from directory: ${dirPath}`);
60
+ return {
61
+ metadata: config,
62
+ files
63
+ };
64
+ }
65
+ catch (error) {
66
+ logger.error(`Failed to load package from directory: ${dirPath}`, { error });
67
+ throw new ValidationError(`Failed to load package from directory: ${error}`);
68
+ }
69
+ }
70
+ /**
71
+ * Load a package from a tarball file.
72
+ * Extracts to a temporary location, reads files, then cleans up.
73
+ */
74
+ export async function loadPackageFromTarball(tarballPath) {
75
+ logger.debug(`Loading package from tarball: ${tarballPath}`);
76
+ // Read tarball file
77
+ let tarballBuffer;
78
+ try {
79
+ tarballBuffer = await readFile(tarballPath);
80
+ }
81
+ catch (error) {
82
+ throw new ValidationError(`Failed to read tarball file '${tarballPath}': ${error}`);
83
+ }
84
+ // Extract tarball
85
+ const extracted = await extractPackageFromTarball(tarballBuffer);
86
+ // Find openpackage.yml in extracted files
87
+ const packageYmlFile = extracted.files.find(f => f.path === PACKAGE_PATHS.MANIFEST_RELATIVE || f.path === 'openpackage.yml');
88
+ if (!packageYmlFile) {
89
+ throw new ValidationError(`Tarball '${tarballPath}' does not contain a valid ${FILE_PATTERNS.OPENPACKAGE_YML} file`);
90
+ }
91
+ // Parse openpackage.yml content
92
+ const yaml = await import('js-yaml');
93
+ const config = yaml.load(packageYmlFile.content);
94
+ if (!config.name) {
95
+ throw new ValidationError(`Tarball '${tarballPath}' contains invalid ${FILE_PATTERNS.OPENPACKAGE_YML}: missing name field`);
96
+ }
97
+ logger.debug(`Loaded package ${config.name}@${config.version} from tarball: ${tarballPath}`);
98
+ return {
99
+ metadata: config,
100
+ files: extracted.files
101
+ };
102
+ }
103
+ /**
104
+ * Load a package from either a directory or tarball path.
105
+ * Automatically detects the source type.
106
+ */
107
+ export async function loadPackageFromPath(path) {
108
+ const sourceType = inferSourceType(path);
109
+ if (sourceType === 'tarball') {
110
+ return await loadPackageFromTarball(path);
111
+ }
112
+ else {
113
+ return await loadPackageFromDirectory(path);
114
+ }
115
+ }
116
+ //# sourceMappingURL=path-package-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-package-loader.js","sourceRoot":"","sources":["../../../src/core/install/path-package-loader.ts"],"names":[],"mappings":"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"}