opkg 0.9.2 → 0.9.4

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 (404) hide show
  1. package/.claude/agents/code-reviewer.md +171 -0
  2. package/.claude/commands/commit-push-pr.md +20 -0
  3. package/.claude/commands/{specs/read.md → read-specs.md} +1 -1
  4. package/.claude/commands/{specs/update.md → update-specs.md} +4 -0
  5. package/.claude/skills/code-review-excellence/SKILL.md +538 -0
  6. package/README.md +2 -2
  7. package/package.json +3 -1
  8. package/packages/cli/dist/add-IJAPFHIX.js +624 -0
  9. package/packages/cli/dist/add-IJAPFHIX.js.map +7 -0
  10. package/packages/cli/dist/add-LLUNFLJI.js +624 -0
  11. package/packages/cli/dist/add-LLUNFLJI.js.map +7 -0
  12. package/packages/cli/dist/add-U44SL3OR.js +624 -0
  13. package/packages/cli/dist/add-U44SL3OR.js.map +7 -0
  14. package/packages/cli/dist/chunk-23VBP5L6.js +371 -0
  15. package/packages/cli/dist/chunk-23VBP5L6.js.map +7 -0
  16. package/packages/cli/dist/chunk-2SVHLF5C.js +1419 -0
  17. package/packages/cli/dist/chunk-2SVHLF5C.js.map +7 -0
  18. package/packages/cli/dist/chunk-37256POU.js +99 -0
  19. package/packages/cli/dist/chunk-37256POU.js.map +7 -0
  20. package/packages/cli/dist/chunk-3PZRVA6O.js +196 -0
  21. package/packages/cli/dist/chunk-3PZRVA6O.js.map +7 -0
  22. package/packages/cli/dist/chunk-427DCURL.js +155 -0
  23. package/packages/cli/dist/chunk-427DCURL.js.map +7 -0
  24. package/packages/cli/dist/chunk-4B5HJLP2.js +48 -0
  25. package/packages/cli/dist/chunk-4B5HJLP2.js.map +7 -0
  26. package/packages/cli/dist/chunk-4OWT3YEG.js +413 -0
  27. package/packages/cli/dist/chunk-4OWT3YEG.js.map +7 -0
  28. package/packages/cli/dist/chunk-4RIBTBXI.js +568 -0
  29. package/packages/cli/dist/chunk-4RIBTBXI.js.map +7 -0
  30. package/packages/cli/dist/chunk-4X2EJHJN.js +63 -0
  31. package/packages/cli/dist/chunk-4X2EJHJN.js.map +7 -0
  32. package/packages/cli/dist/chunk-6CYW66HD.js +1136 -0
  33. package/packages/cli/dist/chunk-6CYW66HD.js.map +7 -0
  34. package/packages/cli/dist/chunk-6DITYAFA.js +172 -0
  35. package/packages/cli/dist/chunk-6DITYAFA.js.map +7 -0
  36. package/packages/cli/dist/chunk-7KEAKEVZ.js +568 -0
  37. package/packages/cli/dist/chunk-7KEAKEVZ.js.map +7 -0
  38. package/packages/cli/dist/chunk-ABFUD25D.js +61 -0
  39. package/packages/cli/dist/chunk-ABFUD25D.js.map +7 -0
  40. package/packages/cli/dist/chunk-AR7GJCG6.js +274 -0
  41. package/packages/cli/dist/chunk-AR7GJCG6.js.map +7 -0
  42. package/packages/cli/dist/chunk-AYTGQCXH.js +86 -0
  43. package/packages/cli/dist/chunk-AYTGQCXH.js.map +7 -0
  44. package/packages/cli/dist/chunk-BROJ6OUT.js +631 -0
  45. package/packages/cli/dist/chunk-BROJ6OUT.js.map +7 -0
  46. package/packages/cli/dist/chunk-BVVSU7QD.js +23 -0
  47. package/packages/cli/dist/chunk-BVVSU7QD.js.map +7 -0
  48. package/packages/cli/dist/chunk-C6FY55UP.js +108 -0
  49. package/packages/cli/dist/chunk-C6FY55UP.js.map +7 -0
  50. package/packages/cli/dist/chunk-CVA64SXK.js +1136 -0
  51. package/packages/cli/dist/chunk-CVA64SXK.js.map +7 -0
  52. package/packages/cli/dist/chunk-D3O7LY2Q.js +1151 -0
  53. package/packages/cli/dist/chunk-D3O7LY2Q.js.map +7 -0
  54. package/packages/cli/dist/chunk-D6LEPODL.js +413 -0
  55. package/packages/cli/dist/chunk-D6LEPODL.js.map +7 -0
  56. package/packages/cli/dist/chunk-DEC24S7E.js +186 -0
  57. package/packages/cli/dist/chunk-DEC24S7E.js.map +7 -0
  58. package/packages/cli/dist/chunk-FMVVJH5M.js +371 -0
  59. package/packages/cli/dist/chunk-FMVVJH5M.js.map +7 -0
  60. package/packages/cli/dist/chunk-GDVFS3YP.js +130 -0
  61. package/packages/cli/dist/chunk-GDVFS3YP.js.map +7 -0
  62. package/packages/cli/dist/chunk-GEP2G5HF.js +31 -0
  63. package/packages/cli/dist/chunk-GEP2G5HF.js.map +7 -0
  64. package/packages/cli/dist/chunk-GSWHZBT2.js +62 -0
  65. package/packages/cli/dist/chunk-GSWHZBT2.js.map +7 -0
  66. package/packages/cli/dist/chunk-HTYHJA3B.js +61 -0
  67. package/packages/cli/dist/chunk-HTYHJA3B.js.map +7 -0
  68. package/packages/cli/dist/chunk-HYKYECAE.js +222 -0
  69. package/packages/cli/dist/chunk-HYKYECAE.js.map +7 -0
  70. package/packages/cli/dist/chunk-I7FEAHB4.js +100 -0
  71. package/packages/cli/dist/chunk-I7FEAHB4.js.map +7 -0
  72. package/packages/cli/dist/chunk-IHVZ5AUJ.js +107 -0
  73. package/packages/cli/dist/chunk-IHVZ5AUJ.js.map +7 -0
  74. package/packages/cli/dist/chunk-KI7FDU3H.js +99 -0
  75. package/packages/cli/dist/chunk-KI7FDU3H.js.map +7 -0
  76. package/packages/cli/dist/chunk-L5GRJQBS.js +32 -0
  77. package/packages/cli/dist/chunk-L5GRJQBS.js.map +7 -0
  78. package/packages/cli/dist/chunk-LHEAUDJL.js +302 -0
  79. package/packages/cli/dist/chunk-LHEAUDJL.js.map +7 -0
  80. package/packages/cli/dist/chunk-MIURCESJ.js +48 -0
  81. package/packages/cli/dist/chunk-MIURCESJ.js.map +7 -0
  82. package/packages/cli/dist/chunk-N43IXOND.js +732 -0
  83. package/packages/cli/dist/chunk-N43IXOND.js.map +7 -0
  84. package/packages/cli/dist/chunk-OUZRMGPV.js +274 -0
  85. package/packages/cli/dist/chunk-OUZRMGPV.js.map +7 -0
  86. package/packages/cli/dist/chunk-PSQXKAL4.js +371 -0
  87. package/packages/cli/dist/chunk-PSQXKAL4.js.map +7 -0
  88. package/packages/cli/dist/chunk-PUDRKDVZ.js +1419 -0
  89. package/packages/cli/dist/chunk-PUDRKDVZ.js.map +7 -0
  90. package/packages/cli/dist/chunk-RAKMX654.js +631 -0
  91. package/packages/cli/dist/chunk-RAKMX654.js.map +7 -0
  92. package/packages/cli/dist/chunk-RSFLK2TP.js +195 -0
  93. package/packages/cli/dist/chunk-RSFLK2TP.js.map +7 -0
  94. package/packages/cli/dist/chunk-S26PR2BS.js +99 -0
  95. package/packages/cli/dist/chunk-S26PR2BS.js.map +7 -0
  96. package/packages/cli/dist/chunk-U7FW7SXX.js +568 -0
  97. package/packages/cli/dist/chunk-U7FW7SXX.js.map +7 -0
  98. package/packages/cli/dist/chunk-VKM6K5TN.js +413 -0
  99. package/packages/cli/dist/chunk-VKM6K5TN.js.map +7 -0
  100. package/packages/cli/dist/chunk-VKNJG4JN.js +253 -0
  101. package/packages/cli/dist/chunk-VKNJG4JN.js.map +7 -0
  102. package/packages/cli/dist/chunk-VQ2KY6CK.js +113 -0
  103. package/packages/cli/dist/chunk-VQ2KY6CK.js.map +7 -0
  104. package/packages/cli/dist/chunk-VQDTXLOX.js +1312 -0
  105. package/packages/cli/dist/chunk-VQDTXLOX.js.map +7 -0
  106. package/packages/cli/dist/chunk-VXNS3X5O.js +60 -0
  107. package/packages/cli/dist/chunk-VXNS3X5O.js.map +7 -0
  108. package/packages/cli/dist/chunk-WF7H2YDU.js +376 -0
  109. package/packages/cli/dist/chunk-WF7H2YDU.js.map +7 -0
  110. package/packages/cli/dist/chunk-WNRXZLWW.js +266 -0
  111. package/packages/cli/dist/chunk-WNRXZLWW.js.map +7 -0
  112. package/packages/cli/dist/chunk-WT4VVCXM.js +1121 -0
  113. package/packages/cli/dist/chunk-WT4VVCXM.js.map +7 -0
  114. package/packages/cli/dist/configure-3AZUMDJZ.js +107 -0
  115. package/packages/cli/dist/configure-3AZUMDJZ.js.map +7 -0
  116. package/packages/cli/dist/configure-D722JQOD.js +107 -0
  117. package/packages/cli/dist/configure-D722JQOD.js.map +7 -0
  118. package/packages/cli/dist/configure-IU5H7XD6.js +107 -0
  119. package/packages/cli/dist/configure-IU5H7XD6.js.map +7 -0
  120. package/packages/cli/dist/file-format-detector-PXCIAKTK.js +22 -0
  121. package/packages/cli/dist/file-format-detector-PXCIAKTK.js.map +7 -0
  122. package/packages/cli/dist/index.js +17 -17
  123. package/packages/cli/dist/install-EZNWMLJR.js +7581 -0
  124. package/packages/cli/dist/install-EZNWMLJR.js.map +7 -0
  125. package/packages/cli/dist/install-F5ANFUBX.js +7577 -0
  126. package/packages/cli/dist/install-F5ANFUBX.js.map +7 -0
  127. package/packages/cli/dist/install-JSXEPPC2.js +7104 -0
  128. package/packages/cli/dist/install-JSXEPPC2.js.map +7 -0
  129. package/packages/cli/dist/install-QHEBX7JH.js +7101 -0
  130. package/packages/cli/dist/install-QHEBX7JH.js.map +7 -0
  131. package/packages/cli/dist/list-DMOUATYI.js +327 -0
  132. package/packages/cli/dist/list-DMOUATYI.js.map +7 -0
  133. package/packages/cli/dist/list-UESSCB7Y.js +327 -0
  134. package/packages/cli/dist/list-UESSCB7Y.js.map +7 -0
  135. package/packages/cli/dist/list-XR7RSJFS.js +327 -0
  136. package/packages/cli/dist/list-XR7RSJFS.js.map +7 -0
  137. package/packages/cli/dist/login-EYZ2SOYZ.js +150 -0
  138. package/packages/cli/dist/login-EYZ2SOYZ.js.map +7 -0
  139. package/packages/cli/dist/login-JWCSTAEU.js +150 -0
  140. package/packages/cli/dist/login-JWCSTAEU.js.map +7 -0
  141. package/packages/cli/dist/login-NRKHXZKM.js +150 -0
  142. package/packages/cli/dist/login-NRKHXZKM.js.map +7 -0
  143. package/packages/cli/dist/logout-HDMYRXIE.js +40 -0
  144. package/packages/cli/dist/logout-HDMYRXIE.js.map +7 -0
  145. package/packages/cli/dist/logout-SYHXCVCQ.js +40 -0
  146. package/packages/cli/dist/logout-SYHXCVCQ.js.map +7 -0
  147. package/packages/cli/dist/logout-X3XUUOH5.js +40 -0
  148. package/packages/cli/dist/logout-X3XUUOH5.js.map +7 -0
  149. package/packages/cli/dist/new-3LTFKDTQ.js +277 -0
  150. package/packages/cli/dist/new-3LTFKDTQ.js.map +7 -0
  151. package/packages/cli/dist/new-F46OSD72.js +277 -0
  152. package/packages/cli/dist/new-F46OSD72.js.map +7 -0
  153. package/packages/cli/dist/new-OPCCLNL2.js +277 -0
  154. package/packages/cli/dist/new-OPCCLNL2.js.map +7 -0
  155. package/packages/cli/dist/package-marker-detector-T5O5YD2E.js +80 -0
  156. package/packages/cli/dist/package-marker-detector-T5O5YD2E.js.map +7 -0
  157. package/packages/cli/dist/package-yml-QWZIJDYU.js +16 -0
  158. package/packages/cli/dist/package-yml-QWZIJDYU.js.map +7 -0
  159. package/packages/cli/dist/plugin-naming-YP2I4NPA.js +29 -0
  160. package/packages/cli/dist/plugin-naming-YP2I4NPA.js.map +7 -0
  161. package/packages/cli/dist/publish-4H43PCSG.js +619 -0
  162. package/packages/cli/dist/publish-4H43PCSG.js.map +7 -0
  163. package/packages/cli/dist/publish-RULKLNUX.js +619 -0
  164. package/packages/cli/dist/publish-RULKLNUX.js.map +7 -0
  165. package/packages/cli/dist/publish-URWY2P3E.js +619 -0
  166. package/packages/cli/dist/publish-URWY2P3E.js.map +7 -0
  167. package/packages/cli/dist/remove-BD52BHR2.js +542 -0
  168. package/packages/cli/dist/remove-BD52BHR2.js.map +7 -0
  169. package/packages/cli/dist/remove-G5NRC7LD.js +542 -0
  170. package/packages/cli/dist/remove-G5NRC7LD.js.map +7 -0
  171. package/packages/cli/dist/remove-TC3FQUYQ.js +542 -0
  172. package/packages/cli/dist/remove-TC3FQUYQ.js.map +7 -0
  173. package/packages/cli/dist/resource-discoverer-4X4RY43E.js +17 -0
  174. package/packages/cli/dist/resource-discoverer-4X4RY43E.js.map +7 -0
  175. package/packages/cli/dist/save-24TESYKI.js +1728 -0
  176. package/packages/cli/dist/save-24TESYKI.js.map +7 -0
  177. package/packages/cli/dist/save-N3QWF2WN.js +1728 -0
  178. package/packages/cli/dist/save-N3QWF2WN.js.map +7 -0
  179. package/packages/cli/dist/save-P2U67DTV.js +1728 -0
  180. package/packages/cli/dist/save-P2U67DTV.js.map +7 -0
  181. package/packages/cli/dist/search-ABROK3UO.js +157 -0
  182. package/packages/cli/dist/search-ABROK3UO.js.map +7 -0
  183. package/packages/cli/dist/search-WVFXFNAV.js +157 -0
  184. package/packages/cli/dist/search-WVFXFNAV.js.map +7 -0
  185. package/packages/cli/dist/search-YQN2Q2SO.js +157 -0
  186. package/packages/cli/dist/search-YQN2Q2SO.js.map +7 -0
  187. package/packages/cli/dist/set-DCWF73F6.js +251 -0
  188. package/packages/cli/dist/set-DCWF73F6.js.map +7 -0
  189. package/packages/cli/dist/set-GJEG2F6Y.js +251 -0
  190. package/packages/cli/dist/set-GJEG2F6Y.js.map +7 -0
  191. package/packages/cli/dist/set-NGM2FIKF.js +251 -0
  192. package/packages/cli/dist/set-NGM2FIKF.js.map +7 -0
  193. package/packages/cli/dist/uninstall-3CJQMTYH.js +539 -0
  194. package/packages/cli/dist/uninstall-3CJQMTYH.js.map +7 -0
  195. package/packages/cli/dist/uninstall-Q3CP4UN5.js +539 -0
  196. package/packages/cli/dist/uninstall-Q3CP4UN5.js.map +7 -0
  197. package/packages/cli/dist/uninstall-QU5OMEEC.js +539 -0
  198. package/packages/cli/dist/uninstall-QU5OMEEC.js.map +7 -0
  199. package/packages/cli/dist/unpublish-GHJQYC4S.js +245 -0
  200. package/packages/cli/dist/unpublish-GHJQYC4S.js.map +7 -0
  201. package/packages/cli/dist/unpublish-L2CYMK4B.js +245 -0
  202. package/packages/cli/dist/unpublish-L2CYMK4B.js.map +7 -0
  203. package/packages/cli/dist/unpublish-VBTNTMS5.js +245 -0
  204. package/packages/cli/dist/unpublish-VBTNTMS5.js.map +7 -0
  205. package/packages/cli/dist/view-MXRBMXOG.js +488 -0
  206. package/packages/cli/dist/view-MXRBMXOG.js.map +7 -0
  207. package/packages/cli/dist/view-NMND7SAW.js +488 -0
  208. package/packages/cli/dist/view-NMND7SAW.js.map +7 -0
  209. package/packages/cli/dist/view-RPQRDSYB.js +488 -0
  210. package/packages/cli/dist/view-RPQRDSYB.js.map +7 -0
  211. package/packages/cli/package.json +2 -0
  212. package/packages/core/dist/constants/index.d.ts +9 -0
  213. package/packages/core/dist/constants/index.d.ts.map +1 -1
  214. package/packages/core/dist/constants/index.js +12 -0
  215. package/packages/core/dist/constants/index.js.map +1 -1
  216. package/packages/core/dist/core/dependency-resolver/index.d.ts +2 -10
  217. package/packages/core/dist/core/dependency-resolver/index.d.ts.map +1 -1
  218. package/packages/core/dist/core/dependency-resolver/index.js +3 -14
  219. package/packages/core/dist/core/dependency-resolver/index.js.map +1 -1
  220. package/packages/core/dist/core/install/base-detector.d.ts +2 -1
  221. package/packages/core/dist/core/install/base-detector.d.ts.map +1 -1
  222. package/packages/core/dist/core/install/base-detector.js +54 -1
  223. package/packages/core/dist/core/install/base-detector.js.map +1 -1
  224. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.d.ts +7 -5
  225. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.d.ts.map +1 -1
  226. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.js +25 -9
  227. package/packages/core/dist/core/install/conflicts/file-conflict-resolver.js.map +1 -1
  228. package/packages/core/dist/core/install/flow-index-installer.d.ts +2 -1
  229. package/packages/core/dist/core/install/flow-index-installer.d.ts.map +1 -1
  230. package/packages/core/dist/core/install/flow-index-installer.js +19 -4
  231. package/packages/core/dist/core/install/flow-index-installer.js.map +1 -1
  232. package/packages/core/dist/core/install/input-classifier-base.js +3 -3
  233. package/packages/core/dist/core/install/input-classifier-base.js.map +1 -1
  234. package/packages/core/dist/core/install/install-reporting.d.ts.map +1 -1
  235. package/packages/core/dist/core/install/install-reporting.js +7 -9
  236. package/packages/core/dist/core/install/install-reporting.js.map +1 -1
  237. package/packages/core/dist/core/install/list-handler.d.ts.map +1 -1
  238. package/packages/core/dist/core/install/list-handler.js +3 -0
  239. package/packages/core/dist/core/install/list-handler.js.map +1 -1
  240. package/packages/core/dist/core/install/marketplace-handler.d.ts.map +1 -1
  241. package/packages/core/dist/core/install/marketplace-handler.js.map +1 -1
  242. package/packages/core/dist/core/install/operations/conflict-handler.d.ts +2 -1
  243. package/packages/core/dist/core/install/operations/conflict-handler.d.ts.map +1 -1
  244. package/packages/core/dist/core/install/operations/conflict-handler.js +2 -2
  245. package/packages/core/dist/core/install/operations/conflict-handler.js.map +1 -1
  246. package/packages/core/dist/core/install/operations/installation-executor.d.ts +3 -0
  247. package/packages/core/dist/core/install/operations/installation-executor.d.ts.map +1 -1
  248. package/packages/core/dist/core/install/operations/installation-executor.js +39 -22
  249. package/packages/core/dist/core/install/operations/installation-executor.js.map +1 -1
  250. package/packages/core/dist/core/install/orchestrator/orchestrator.d.ts +7 -3
  251. package/packages/core/dist/core/install/orchestrator/orchestrator.d.ts.map +1 -1
  252. package/packages/core/dist/core/install/orchestrator/orchestrator.js +193 -93
  253. package/packages/core/dist/core/install/orchestrator/orchestrator.js.map +1 -1
  254. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.d.ts +1 -0
  255. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.d.ts.map +1 -1
  256. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.js +11 -24
  257. package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.js.map +1 -1
  258. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.d.ts +2 -0
  259. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.d.ts.map +1 -1
  260. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.js +14 -14
  261. package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.js.map +1 -1
  262. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.d.ts +7 -0
  263. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.d.ts.map +1 -1
  264. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.js +28 -0
  265. package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.js.map +1 -1
  266. package/packages/core/dist/core/install/orchestrator/types.d.ts +2 -0
  267. package/packages/core/dist/core/install/orchestrator/types.d.ts.map +1 -1
  268. package/packages/core/dist/core/install/path-package-loader.d.ts.map +1 -1
  269. package/packages/core/dist/core/install/path-package-loader.js +20 -1
  270. package/packages/core/dist/core/install/path-package-loader.js.map +1 -1
  271. package/packages/core/dist/core/install/platform-resolution.d.ts +3 -0
  272. package/packages/core/dist/core/install/platform-resolution.d.ts.map +1 -1
  273. package/packages/core/dist/core/install/platform-resolution.js +5 -2
  274. package/packages/core/dist/core/install/platform-resolution.js.map +1 -1
  275. package/packages/core/dist/core/install/preprocessing/context-population.d.ts +18 -0
  276. package/packages/core/dist/core/install/preprocessing/context-population.d.ts.map +1 -0
  277. package/packages/core/dist/core/install/preprocessing/context-population.js +36 -0
  278. package/packages/core/dist/core/install/preprocessing/context-population.js.map +1 -0
  279. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.d.ts +23 -0
  280. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.d.ts.map +1 -1
  281. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.js +44 -0
  282. package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.js.map +1 -1
  283. package/packages/core/dist/core/install/sources/git-source.d.ts.map +1 -1
  284. package/packages/core/dist/core/install/sources/git-source.js +67 -4
  285. package/packages/core/dist/core/install/sources/git-source.js.map +1 -1
  286. package/packages/core/dist/core/install/sources/path-source.d.ts.map +1 -1
  287. package/packages/core/dist/core/install/sources/path-source.js +8 -0
  288. package/packages/core/dist/core/install/sources/path-source.js.map +1 -1
  289. package/packages/core/dist/core/install/strategies/flow-based-strategy.d.ts.map +1 -1
  290. package/packages/core/dist/core/install/strategies/flow-based-strategy.js +12 -5
  291. package/packages/core/dist/core/install/strategies/flow-based-strategy.js.map +1 -1
  292. package/packages/core/dist/core/install/strategies/types.d.ts +11 -1
  293. package/packages/core/dist/core/install/strategies/types.d.ts.map +1 -1
  294. package/packages/core/dist/core/install/unified/context-builders.d.ts +5 -0
  295. package/packages/core/dist/core/install/unified/context-builders.d.ts.map +1 -1
  296. package/packages/core/dist/core/install/unified/context-builders.js +12 -0
  297. package/packages/core/dist/core/install/unified/context-builders.js.map +1 -1
  298. package/packages/core/dist/core/install/unified/context-helpers.d.ts +0 -4
  299. package/packages/core/dist/core/install/unified/context-helpers.d.ts.map +1 -1
  300. package/packages/core/dist/core/install/unified/context-helpers.js +0 -24
  301. package/packages/core/dist/core/install/unified/context-helpers.js.map +1 -1
  302. package/packages/core/dist/core/install/unified/index.d.ts +1 -1
  303. package/packages/core/dist/core/install/unified/index.d.ts.map +1 -1
  304. package/packages/core/dist/core/install/unified/index.js +1 -1
  305. package/packages/core/dist/core/install/unified/index.js.map +1 -1
  306. package/packages/core/dist/core/install/unified/multi-context-pipeline.d.ts +6 -0
  307. package/packages/core/dist/core/install/unified/multi-context-pipeline.d.ts.map +1 -1
  308. package/packages/core/dist/core/install/unified/multi-context-pipeline.js +11 -4
  309. package/packages/core/dist/core/install/unified/multi-context-pipeline.js.map +1 -1
  310. package/packages/core/dist/core/install/unified/phases/conflicts.d.ts.map +1 -1
  311. package/packages/core/dist/core/install/unified/phases/conflicts.js +1 -1
  312. package/packages/core/dist/core/install/unified/phases/conflicts.js.map +1 -1
  313. package/packages/core/dist/core/install/unified/phases/execute.d.ts.map +1 -1
  314. package/packages/core/dist/core/install/unified/phases/execute.js +5 -5
  315. package/packages/core/dist/core/install/unified/phases/execute.js.map +1 -1
  316. package/packages/core/dist/core/install/unified/phases/load-package.js +3 -3
  317. package/packages/core/dist/core/install/unified/phases/load-package.js.map +1 -1
  318. package/packages/core/dist/core/install/unified/phases/report.js +1 -1
  319. package/packages/core/dist/core/install/unified/phases/report.js.map +1 -1
  320. package/packages/core/dist/core/install/unified/pipeline.d.ts.map +1 -1
  321. package/packages/core/dist/core/install/unified/pipeline.js +7 -10
  322. package/packages/core/dist/core/install/unified/pipeline.js.map +1 -1
  323. package/packages/core/dist/core/install/wave-resolver/content-root-cache.d.ts +24 -0
  324. package/packages/core/dist/core/install/wave-resolver/content-root-cache.d.ts.map +1 -0
  325. package/packages/core/dist/core/install/wave-resolver/content-root-cache.js +71 -0
  326. package/packages/core/dist/core/install/wave-resolver/content-root-cache.js.map +1 -0
  327. package/packages/core/dist/core/install/wave-resolver/context-builder.d.ts +39 -0
  328. package/packages/core/dist/core/install/wave-resolver/context-builder.d.ts.map +1 -0
  329. package/packages/core/dist/core/install/wave-resolver/context-builder.js +148 -0
  330. package/packages/core/dist/core/install/wave-resolver/context-builder.js.map +1 -0
  331. package/packages/core/dist/core/install/wave-resolver/fetcher.d.ts +49 -0
  332. package/packages/core/dist/core/install/wave-resolver/fetcher.d.ts.map +1 -0
  333. package/packages/core/dist/core/install/wave-resolver/fetcher.js +221 -0
  334. package/packages/core/dist/core/install/wave-resolver/fetcher.js.map +1 -0
  335. package/packages/core/dist/core/install/wave-resolver/index-updater.d.ts +23 -0
  336. package/packages/core/dist/core/install/wave-resolver/index-updater.d.ts.map +1 -0
  337. package/packages/core/dist/core/install/wave-resolver/index-updater.js +87 -0
  338. package/packages/core/dist/core/install/wave-resolver/index-updater.js.map +1 -0
  339. package/packages/core/dist/core/install/wave-resolver/index-write-collector.d.ts +101 -0
  340. package/packages/core/dist/core/install/wave-resolver/index-write-collector.d.ts.map +1 -0
  341. package/packages/core/dist/core/install/wave-resolver/index-write-collector.js +194 -0
  342. package/packages/core/dist/core/install/wave-resolver/index-write-collector.js.map +1 -0
  343. package/packages/core/dist/core/install/wave-resolver/index.d.ts +17 -0
  344. package/packages/core/dist/core/install/wave-resolver/index.d.ts.map +1 -0
  345. package/packages/core/dist/core/install/wave-resolver/index.js +16 -0
  346. package/packages/core/dist/core/install/wave-resolver/index.js.map +1 -0
  347. package/packages/core/dist/core/install/wave-resolver/manifest-reader.d.ts +34 -0
  348. package/packages/core/dist/core/install/wave-resolver/manifest-reader.d.ts.map +1 -0
  349. package/packages/core/dist/core/install/wave-resolver/manifest-reader.js +112 -0
  350. package/packages/core/dist/core/install/wave-resolver/manifest-reader.js.map +1 -0
  351. package/packages/core/dist/core/install/wave-resolver/types.d.ts +210 -0
  352. package/packages/core/dist/core/install/wave-resolver/types.d.ts.map +1 -0
  353. package/packages/core/dist/core/install/wave-resolver/types.js +6 -0
  354. package/packages/core/dist/core/install/wave-resolver/types.js.map +1 -0
  355. package/packages/core/dist/core/install/wave-resolver/version-solver.d.ts +65 -0
  356. package/packages/core/dist/core/install/wave-resolver/version-solver.d.ts.map +1 -0
  357. package/packages/core/dist/core/install/wave-resolver/version-solver.js +166 -0
  358. package/packages/core/dist/core/install/wave-resolver/version-solver.js.map +1 -0
  359. package/packages/core/dist/core/install/wave-resolver/wave-engine.d.ts +16 -0
  360. package/packages/core/dist/core/install/wave-resolver/wave-engine.d.ts.map +1 -0
  361. package/packages/core/dist/core/install/wave-resolver/wave-engine.js +337 -0
  362. package/packages/core/dist/core/install/wave-resolver/wave-engine.js.map +1 -0
  363. package/packages/core/dist/core/install/wave-resolver/wave-installer.d.ts +50 -0
  364. package/packages/core/dist/core/install/wave-resolver/wave-installer.d.ts.map +1 -0
  365. package/packages/core/dist/core/install/wave-resolver/wave-installer.js +246 -0
  366. package/packages/core/dist/core/install/wave-resolver/wave-installer.js.map +1 -0
  367. package/packages/core/dist/core/ports/buffered-output.d.ts +36 -0
  368. package/packages/core/dist/core/ports/buffered-output.d.ts.map +1 -0
  369. package/packages/core/dist/core/ports/buffered-output.js +89 -0
  370. package/packages/core/dist/core/ports/buffered-output.js.map +1 -0
  371. package/packages/core/dist/core/ports/resolve.d.ts +0 -13
  372. package/packages/core/dist/core/ports/resolve.d.ts.map +1 -1
  373. package/packages/core/dist/core/ports/resolve.js +0 -28
  374. package/packages/core/dist/core/ports/resolve.js.map +1 -1
  375. package/packages/core/dist/core/remove/removal-confirmation.d.ts +4 -1
  376. package/packages/core/dist/core/remove/removal-confirmation.d.ts.map +1 -1
  377. package/packages/core/dist/core/remove/removal-confirmation.js +5 -4
  378. package/packages/core/dist/core/remove/removal-confirmation.js.map +1 -1
  379. package/packages/core/dist/core/remove/remove-from-source-pipeline.d.ts.map +1 -1
  380. package/packages/core/dist/core/remove/remove-from-source-pipeline.js +1 -10
  381. package/packages/core/dist/core/remove/remove-from-source-pipeline.js.map +1 -1
  382. package/packages/core/dist/core/uninstall/uninstall-executor.js +1 -1
  383. package/packages/core/dist/core/uninstall/uninstall-executor.js.map +1 -1
  384. package/packages/core/dist/core/uninstall/uninstall-reporter.d.ts +2 -2
  385. package/packages/core/dist/core/uninstall/uninstall-reporter.d.ts.map +1 -1
  386. package/packages/core/dist/core/uninstall/uninstall-reporter.js +4 -4
  387. package/packages/core/dist/core/uninstall/uninstall-reporter.js.map +1 -1
  388. package/packages/core/dist/index.d.ts +1 -1
  389. package/packages/core/dist/index.d.ts.map +1 -1
  390. package/packages/core/dist/types/execution-context.d.ts +40 -10
  391. package/packages/core/dist/types/execution-context.d.ts.map +1 -1
  392. package/packages/core/dist/utils/concurrency-pool.d.ts +34 -0
  393. package/packages/core/dist/utils/concurrency-pool.d.ts.map +1 -0
  394. package/packages/core/dist/utils/concurrency-pool.js +58 -0
  395. package/packages/core/dist/utils/concurrency-pool.js.map +1 -0
  396. package/packages/core/dist/utils/plugin-naming.d.ts +11 -3
  397. package/packages/core/dist/utils/plugin-naming.d.ts.map +1 -1
  398. package/packages/core/dist/utils/plugin-naming.js +27 -7
  399. package/packages/core/dist/utils/plugin-naming.js.map +1 -1
  400. package/plans/wave-resolver.md +254 -0
  401. package/.claude/agents/essentials/code-simplifier.md +0 -52
  402. package/.claude/commands/essentials/cleanup.md +0 -1
  403. package/.claude/commands/essentials/review.md +0 -8
  404. package/.claude/commands/git/commit.md +0 -5
@@ -0,0 +1,245 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ formatFileCount,
4
+ formatFileSize,
5
+ formatPathForDisplay
6
+ } from "./chunk-MIURCESJ.js";
7
+ import {
8
+ createCliExecutionContext,
9
+ resolveOutput,
10
+ resolvePrompt
11
+ } from "./chunk-RAKMX654.js";
12
+ import {
13
+ cleanupEmptyPackageDirectory,
14
+ findPackageByName,
15
+ getPackagePath,
16
+ getPackageVersionPath,
17
+ hasPackageVersion,
18
+ listAllPackages,
19
+ listPackageVersions
20
+ } from "./chunk-GDVFS3YP.js";
21
+ import {
22
+ normalizePackageName,
23
+ parsePackageInput
24
+ } from "./chunk-VN22A7NW.js";
25
+ import "./chunk-IHVZ5AUJ.js";
26
+ import {
27
+ countFilesInDirectory,
28
+ getDirectorySize,
29
+ remove
30
+ } from "./chunk-S47F4OG4.js";
31
+ import {
32
+ PackageNotFoundError,
33
+ UserCancellationError,
34
+ ValidationError
35
+ } from "./chunk-ID4SVDQZ.js";
36
+ import {
37
+ logger
38
+ } from "./chunk-5EFWGD33.js";
39
+
40
+ // ../core/src/core/unpublish/unpublish-output.ts
41
+ function displayUnpublishSuccess(data, cwd, output) {
42
+ let out = output ?? resolveOutput(), displayPath = formatPathForDisplay(data.path, cwd);
43
+ out.info(""), data.versionsRemoved === 1 && data.version ? out.success(`Unpublished ${data.packageName}@${data.version}`) : out.success(`Unpublished ${data.packageName} (${data.versionsRemoved} versions)`), out.success(`Removed: ${formatFileCount(data.fileCount)}`), out.success(`From: ${displayPath}`), data.remainingVersions.length > 0 && (out.info(""), out.info(`Remaining versions: ${data.remainingVersions.join(", ")}`)), out.info("");
44
+ }
45
+
46
+ // ../core/src/core/unpublish/local-unpublish-pipeline.ts
47
+ async function runLocalUnpublishPipeline(packageSpec, options, output, prompt) {
48
+ let out = output ?? resolveOutput(), prm = prompt ?? resolvePrompt();
49
+ try {
50
+ let { name, version } = parsePackageInput(packageSpec), normalizedName = normalizePackageName(name);
51
+ if (logger.info("Unpublishing package", { packageName: normalizedName, version, options }), !await findPackageByName(normalizedName))
52
+ throw new PackageNotFoundError(
53
+ `Package '${normalizedName}' not found in local registry`
54
+ );
55
+ let availableVersions = await listPackageVersions(normalizedName);
56
+ if (availableVersions.length === 0)
57
+ throw new ValidationError(
58
+ `Package '${normalizedName}' has no published versions to unpublish`
59
+ );
60
+ let targetVersion = version, unpublishAll = !1;
61
+ if (!targetVersion)
62
+ availableVersions.length === 1 ? (targetVersion = availableVersions[0], out.info(`Only one version exists: ${targetVersion}`)) : unpublishAll = !0;
63
+ else if (!await hasPackageVersion(normalizedName, targetVersion))
64
+ throw new ValidationError(
65
+ `Version ${targetVersion} of package '${normalizedName}' not found in local registry`
66
+ );
67
+ return unpublishAll ? await unpublishAllVersions(normalizedName, availableVersions, options, out, prm) : await unpublishSpecificVersion(normalizedName, targetVersion, options, out, prm);
68
+ } catch (error) {
69
+ let message = error instanceof Error ? error.message : String(error);
70
+ return logger.error("Local unpublish failed", { error: message }), {
71
+ success: !1,
72
+ error: message
73
+ };
74
+ }
75
+ }
76
+ async function unpublishSpecificVersion(packageName, version, options, out, prm) {
77
+ let versionPath = getPackageVersionPath(packageName, version), displayPath = formatPathForDisplay(versionPath), fileCount = await countFilesInDirectory(versionPath);
78
+ if (!options.force && (out.info(""), out.warn(`About to unpublish (delete) ${packageName}@${version} from local registry`), out.info(` Location: ${displayPath}`), out.info(` Files: ${formatFileCount(fileCount)}`), out.info(""), !await prm.confirm(
79
+ `Are you sure you want to delete package '${packageName}'? This action cannot be undone.`,
80
+ !1
81
+ )))
82
+ return {
83
+ success: !1,
84
+ error: "Unpublish cancelled by user"
85
+ };
86
+ let spinner = out.spinner();
87
+ spinner.start(`Removing ${packageName}@${version}...`), await remove(versionPath), spinner.stop();
88
+ let remainingVersions = await listPackageVersions(packageName);
89
+ remainingVersions.length === 0 && await cleanupEmptyPackageDirectory(packageName);
90
+ let data = {
91
+ packageName,
92
+ version,
93
+ path: versionPath,
94
+ versionsRemoved: 1,
95
+ fileCount,
96
+ remainingVersions
97
+ };
98
+ return displayUnpublishSuccess(data, process.cwd()), logger.info("Package version unpublished successfully", {
99
+ packageName,
100
+ version,
101
+ remainingVersions: remainingVersions.length
102
+ }), {
103
+ success: !0,
104
+ data
105
+ };
106
+ }
107
+ async function unpublishAllVersions(packageName, versions, options, out, prm) {
108
+ let packagePath = getPackagePath(packageName), displayPath = formatPathForDisplay(packagePath), totalFileCount = 0;
109
+ for (let version of versions) {
110
+ let versionPath = getPackageVersionPath(packageName, version);
111
+ totalFileCount += await countFilesInDirectory(versionPath);
112
+ }
113
+ if (!options.force && (out.info(""), out.warn(`About to unpublish (delete) ALL ${versions.length} versions of ${packageName}`), out.info(` Location: ${displayPath}`), out.info(` Total files: ${formatFileCount(totalFileCount)}`), out.info(""), !await prm.confirm(
114
+ `Unpublish ALL ${versions.length} versions of '${packageName}'? This action cannot be undone.`,
115
+ !1
116
+ )))
117
+ return {
118
+ success: !1,
119
+ error: "Unpublish cancelled by user"
120
+ };
121
+ let spinner = out.spinner();
122
+ spinner.start(`Removing ${packageName} (${versions.length} versions)...`), await remove(packagePath), spinner.stop();
123
+ let data = {
124
+ packageName,
125
+ version: void 0,
126
+ // All versions removed
127
+ path: packagePath,
128
+ versionsRemoved: versions.length,
129
+ fileCount: totalFileCount,
130
+ remainingVersions: []
131
+ };
132
+ return displayUnpublishSuccess(data, process.cwd()), logger.info("All package versions unpublished successfully", {
133
+ packageName,
134
+ versionsRemoved: versions.length
135
+ }), {
136
+ success: !0,
137
+ data
138
+ };
139
+ }
140
+
141
+ // ../core/src/core/unpublish/unpublish-pipeline.ts
142
+ async function runUnpublishPipeline(packageSpec, options) {
143
+ if (options.local)
144
+ return await runLocalUnpublishPipeline(packageSpec, options);
145
+ throw new Error(
146
+ `Remote unpublish is not yet supported.
147
+ Use --local flag to unpublish from local registry (~/.openpackage/registry).`
148
+ );
149
+ }
150
+
151
+ // ../core/src/core/unpublish/interactive-unpublish-flow.ts
152
+ function formatPackageChoice(name, versionCount) {
153
+ return `${name} (${versionCount} version${versionCount === 1 ? "" : "s"})`;
154
+ }
155
+ function formatVersionChoice(version, fileCount, size) {
156
+ return `${version} (${formatFileCount(fileCount)}, ${size})`;
157
+ }
158
+ async function selectPackageFromList(out, prm) {
159
+ let packages = await listAllPackages();
160
+ if (packages.length === 0)
161
+ throw new ValidationError("No published packages found.");
162
+ let choices = await Promise.all(
163
+ packages.map(async (name) => {
164
+ let versions = await listPackageVersions(name);
165
+ return {
166
+ title: formatPackageChoice(name, versions.length),
167
+ value: name
168
+ };
169
+ })
170
+ );
171
+ return prm.select("Select a package to unpublish:", choices);
172
+ }
173
+ async function selectVersionsFromPackage(packageName, out, prm) {
174
+ let versions = await listPackageVersions(packageName);
175
+ if (versions.length === 0)
176
+ throw new ValidationError(`No versions found for ${packageName}.`);
177
+ let choices = await Promise.all(
178
+ versions.map(async (version) => {
179
+ let versionPath = getPackageVersionPath(packageName, version), [fileCount, size] = await Promise.all([
180
+ countFilesInDirectory(versionPath),
181
+ getDirectorySize(versionPath).then(formatFileSize)
182
+ ]);
183
+ return {
184
+ title: formatVersionChoice(version, fileCount, size),
185
+ value: version
186
+ };
187
+ })
188
+ );
189
+ return prm.multiselect(
190
+ `Select versions of ${packageName} to unpublish:`,
191
+ choices
192
+ );
193
+ }
194
+ async function runInteractiveUnpublishFlow(packageSpec, options, out, prm) {
195
+ let packageName;
196
+ if (packageSpec) {
197
+ let normalized = normalizePackageName(packageSpec);
198
+ if (!await findPackageByName(normalized))
199
+ throw new PackageNotFoundError(normalized);
200
+ packageName = normalized;
201
+ } else
202
+ packageName = await selectPackageFromList(out, prm);
203
+ let selectedVersions = await selectVersionsFromPackage(packageName, out, prm);
204
+ if (selectedVersions.length === 0)
205
+ throw new UserCancellationError();
206
+ let confirmMsg = selectedVersions.length === 1 ? `Unpublish ${packageName}@${selectedVersions[0]}?` : `Unpublish ${selectedVersions.length} versions of ${packageName}?`;
207
+ if (!await prm.confirm(confirmMsg))
208
+ throw new UserCancellationError();
209
+ let unpublishedVersions = [];
210
+ for (let version of selectedVersions) {
211
+ let spec = `${packageName}@${version}`, result = await runUnpublishPipeline(spec, { ...options, local: !0 });
212
+ result.success ? (unpublishedVersions.push(version), out.success(`Unpublished ${spec}`)) : out.error(`Failed to unpublish ${spec}: ${result.error}`);
213
+ }
214
+ return { unpublishedVersions, packageName };
215
+ }
216
+
217
+ // src/commands/unpublish.ts
218
+ async function setupUnpublishCommand(args) {
219
+ let [packageSpec, options] = args, ctx = await createCliExecutionContext({
220
+ outputMode: options.interactive ? "rich" : "plain"
221
+ }), out = resolveOutput(ctx), prm = resolvePrompt(ctx);
222
+ if (options.interactive) {
223
+ options.local = !0;
224
+ try {
225
+ let result2 = await runInteractiveUnpublishFlow(packageSpec, options, out, prm);
226
+ result2.unpublishedVersions.length > 0 && out.success(`Unpublished ${result2.unpublishedVersions.length} version${result2.unpublishedVersions.length === 1 ? "" : "s"} of ${result2.packageName}`);
227
+ } catch (error) {
228
+ if (error instanceof UserCancellationError) {
229
+ out.info("Unpublish cancelled.");
230
+ return;
231
+ }
232
+ throw error;
233
+ }
234
+ return;
235
+ }
236
+ if (!packageSpec)
237
+ throw new Error("Package specification is required. Usage: opkg unpublish <package[@version]> or use --interactive");
238
+ let result = await runUnpublishPipeline(packageSpec, options);
239
+ if (!result.success)
240
+ throw new Error(result.error || "Unpublish operation failed");
241
+ }
242
+ export {
243
+ setupUnpublishCommand
244
+ };
245
+ //# sourceMappingURL=unpublish-L2CYMK4B.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../core/src/core/unpublish/unpublish-output.ts", "../../core/src/core/unpublish/local-unpublish-pipeline.ts", "../../core/src/core/unpublish/unpublish-pipeline.ts", "../../core/src/core/unpublish/interactive-unpublish-flow.ts", "../src/commands/unpublish.ts"],
4
+ "sourcesContent": ["import { formatPathForDisplay, formatFileCount } from '../../utils/formatters.js';\nimport type { OutputPort } from '../ports/output.js';\nimport { resolveOutput } from '../ports/resolve.js';\nimport type { UnpublishData } from './unpublish-types.js';\n\n/**\n * Display success message after unpublish operation\n */\nexport function displayUnpublishSuccess(data: UnpublishData, cwd: string, output?: OutputPort): void {\n const out = output ?? resolveOutput();\n const displayPath = formatPathForDisplay(data.path, cwd);\n \n out.info(''); // Spacing\n \n if (data.versionsRemoved === 1 && data.version) {\n // Single version unpublished\n out.success(`Unpublished ${data.packageName}@${data.version}`);\n } else {\n // All versions unpublished\n out.success(`Unpublished ${data.packageName} (${data.versionsRemoved} versions)`);\n }\n \n out.success(`Removed: ${formatFileCount(data.fileCount)}`);\n out.success(`From: ${displayPath}`);\n \n // Show remaining versions if any\n if (data.remainingVersions.length > 0) {\n out.info('');\n out.info(`Remaining versions: ${data.remainingVersions.join(', ')}`);\n }\n \n out.info('');\n}\n", "import { parsePackageInput, normalizePackageName } from '../../utils/package-name.js';\nimport { \n getPackageVersionPath, \n getPackagePath, \n listPackageVersions,\n hasPackageVersion,\n findPackageByName,\n cleanupEmptyPackageDirectory\n} from '../directory.js';\nimport { exists, remove, countFilesInDirectory } from '../../utils/fs.js';\nimport { formatPathForDisplay, formatFileCount } from '../../utils/formatters.js';\nimport { logger } from '../../utils/logger.js';\nimport type { OutputPort } from '../ports/output.js';\nimport type { PromptPort } from '../ports/prompt.js';\nimport { resolveOutput, resolvePrompt } from '../ports/resolve.js';\nimport { ValidationError, PackageNotFoundError } from '../../utils/errors.js';\nimport { displayUnpublishSuccess } from './unpublish-output.js';\nimport type { UnpublishOptions, UnpublishResult, UnpublishData } from './unpublish-types.js';\n\n/**\n * Unpublish package from local registry\n */\nexport async function runLocalUnpublishPipeline(\n packageSpec: string,\n options: UnpublishOptions,\n output?: OutputPort,\n prompt?: PromptPort\n): Promise<UnpublishResult> {\n const out = output ?? resolveOutput();\n const prm = prompt ?? resolvePrompt();\n try {\n // Parse package spec (e.g., \"my-package@1.0.0\" or \"my-package\")\n const { name, version } = parsePackageInput(packageSpec);\n const normalizedName = normalizePackageName(name);\n \n logger.info('Unpublishing package', { packageName: normalizedName, version, options });\n \n // Verify package exists in registry\n const packageExists = await findPackageByName(normalizedName);\n if (!packageExists) {\n throw new PackageNotFoundError(\n `Package '${normalizedName}' not found in local registry`\n );\n }\n \n // List all available versions\n const availableVersions = await listPackageVersions(normalizedName);\n if (availableVersions.length === 0) {\n throw new ValidationError(\n `Package '${normalizedName}' has no published versions to unpublish`\n );\n }\n \n // Determine target version(s)\n let targetVersion: string | undefined = version;\n let unpublishAll = false;\n \n if (!targetVersion) {\n // No version specified - default to unpublishing ALL versions\n if (availableVersions.length === 1) {\n // Only one version exists - auto-select it\n targetVersion = availableVersions[0];\n out.info(`Only one version exists: ${targetVersion}`);\n } else {\n // Multiple versions - unpublish all (with confirmation)\n unpublishAll = true;\n }\n } else {\n // Version specified - verify it exists\n const versionExists = await hasPackageVersion(normalizedName, targetVersion);\n if (!versionExists) {\n throw new ValidationError(\n `Version ${targetVersion} of package '${normalizedName}' not found in local registry`\n );\n }\n }\n \n // Execute unpublish\n if (unpublishAll) {\n return await unpublishAllVersions(normalizedName, availableVersions, options, out, prm);\n } else {\n return await unpublishSpecificVersion(normalizedName, targetVersion!, options, out, prm);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('Local unpublish failed', { error: message });\n \n return {\n success: false,\n error: message\n };\n }\n}\n\n/**\n * Unpublish a specific version\n */\nasync function unpublishSpecificVersion(\n packageName: string,\n version: string,\n options: UnpublishOptions,\n out: OutputPort,\n prm: PromptPort\n): Promise<UnpublishResult<UnpublishData>> {\n const versionPath = getPackageVersionPath(packageName, version);\n const displayPath = formatPathForDisplay(versionPath);\n \n // Count files before removal\n const fileCount = await countFilesInDirectory(versionPath);\n \n // Confirmation (unless --force)\n if (!options.force) {\n out.info('');\n out.warn(`About to unpublish (delete) ${packageName}@${version} from local registry`);\n out.info(` Location: ${displayPath}`);\n out.info(` Files: ${formatFileCount(fileCount)}`);\n out.info('');\n \n const confirmed = await prm.confirm(\n `Are you sure you want to delete package '${packageName}'? This action cannot be undone.`,\n false\n );\n if (!confirmed) {\n return {\n success: false,\n error: 'Unpublish cancelled by user'\n };\n }\n }\n \n // Remove version directory\n const spinner = out.spinner();\n spinner.start(`Removing ${packageName}@${version}...`);\n \n await remove(versionPath);\n \n spinner.stop();\n \n // Get remaining versions\n const remainingVersions = await listPackageVersions(packageName);\n \n // Clean up empty package directory if no versions remain\n if (remainingVersions.length === 0) {\n await cleanupEmptyPackageDirectory(packageName);\n }\n \n // Display success\n const data: UnpublishData = {\n packageName,\n version,\n path: versionPath,\n versionsRemoved: 1,\n fileCount,\n remainingVersions\n };\n \n displayUnpublishSuccess(data, process.cwd());\n \n logger.info('Package version unpublished successfully', { \n packageName, \n version,\n remainingVersions: remainingVersions.length \n });\n \n return {\n success: true,\n data\n };\n}\n\n/**\n * Unpublish all versions of a package\n */\nasync function unpublishAllVersions(\n packageName: string,\n versions: string[],\n options: UnpublishOptions,\n out: OutputPort,\n prm: PromptPort\n): Promise<UnpublishResult<UnpublishData>> {\n const packagePath = getPackagePath(packageName);\n const displayPath = formatPathForDisplay(packagePath);\n \n // Count total files across all versions\n let totalFileCount = 0;\n for (const version of versions) {\n const versionPath = getPackageVersionPath(packageName, version);\n totalFileCount += await countFilesInDirectory(versionPath);\n }\n \n // Confirmation (unless --force)\n if (!options.force) {\n out.info('');\n out.warn(`About to unpublish (delete) ALL ${versions.length} versions of ${packageName}`);\n out.info(` Location: ${displayPath}`);\n out.info(` Total files: ${formatFileCount(totalFileCount)}`);\n out.info('');\n \n const confirmed = await prm.confirm(\n `Unpublish ALL ${versions.length} versions of '${packageName}'? This action cannot be undone.`,\n false\n );\n if (!confirmed) {\n return {\n success: false,\n error: 'Unpublish cancelled by user'\n };\n }\n }\n \n // Remove entire package directory\n const spinner = out.spinner();\n spinner.start(`Removing ${packageName} (${versions.length} versions)...`);\n \n await remove(packagePath);\n \n spinner.stop();\n \n // Display success\n const data: UnpublishData = {\n packageName,\n version: undefined, // All versions removed\n path: packagePath,\n versionsRemoved: versions.length,\n fileCount: totalFileCount,\n remainingVersions: []\n };\n \n displayUnpublishSuccess(data, process.cwd());\n \n logger.info('All package versions unpublished successfully', { \n packageName,\n versionsRemoved: versions.length\n });\n \n return {\n success: true,\n data\n };\n}\n", "import type { UnpublishOptions, UnpublishResult } from './unpublish-types.js';\nimport { runLocalUnpublishPipeline } from './local-unpublish-pipeline.js';\n// Future: import { runRemoteUnpublishPipeline } from './remote-unpublish-pipeline.js';\n\n/**\n * Main unpublish pipeline - routes to local or remote based on options\n */\nexport async function runUnpublishPipeline(\n packageSpec: string,\n options: UnpublishOptions\n): Promise<UnpublishResult> {\n // Route to appropriate pipeline\n if (!options.local) {\n // Remote unpublish - not yet implemented\n throw new Error(\n 'Remote unpublish is not yet supported.\\n' +\n 'Use --local flag to unpublish from local registry (~/.openpackage/registry).'\n );\n } else {\n return await runLocalUnpublishPipeline(packageSpec, options);\n }\n}\n", "/**\n * Interactive Unpublish Flow\n *\n * Orchestration logic for the interactive unpublish workflow:\n * list packages \u2192 select versions \u2192 confirm \u2192 execute.\n * Uses OutputPort/PromptPort for all user interaction so it can\n * be driven by CLI, GUI, or tests.\n */\n\nimport type { UnpublishOptions } from './unpublish-types.js';\nimport { runUnpublishPipeline } from './unpublish-pipeline.js';\nimport {\n listAllPackages,\n listPackageVersions,\n getPackageVersionPath,\n findPackageByName,\n} from '../directory.js';\nimport { getDirectorySize, countFilesInDirectory } from '../../utils/fs.js';\nimport { formatFileSize, formatFileCount } from '../../utils/formatters.js';\nimport { normalizePackageName } from '../../utils/package-name.js';\nimport type { OutputPort } from '../ports/output.js';\nimport type { PromptPort } from '../ports/prompt.js';\nimport { PackageNotFoundError, UserCancellationError, ValidationError } from '../../utils/errors.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface InteractiveUnpublishResult {\n unpublishedVersions: string[];\n packageName: string;\n}\n\n// ---------------------------------------------------------------------------\n// Formatting helpers (pure string transforms, no terminal deps)\n// ---------------------------------------------------------------------------\n\nfunction formatPackageChoice(name: string, versionCount: number): string {\n return `${name} (${versionCount} version${versionCount === 1 ? '' : 's'})`;\n}\n\nfunction formatVersionChoice(version: string, fileCount: number, size: string): string {\n return `${version} (${formatFileCount(fileCount)}, ${size})`;\n}\n\n// ---------------------------------------------------------------------------\n// Selection flows\n// ---------------------------------------------------------------------------\n\n/**\n * Present user with a list of all published packages and let them pick one.\n */\nexport async function selectPackageFromList(\n out: OutputPort,\n prm: PromptPort\n): Promise<string> {\n const packages = await listAllPackages();\n if (packages.length === 0) {\n throw new ValidationError('No published packages found.');\n }\n\n const choices = await Promise.all(\n packages.map(async (name) => {\n const versions = await listPackageVersions(name);\n return {\n title: formatPackageChoice(name, versions.length),\n value: name,\n };\n })\n );\n\n return prm.select<string>('Select a package to unpublish:', choices);\n}\n\n/**\n * Present user with a list of versions for a package and let them pick.\n */\nexport async function selectVersionsFromPackage(\n packageName: string,\n out: OutputPort,\n prm: PromptPort\n): Promise<string[]> {\n const versions = await listPackageVersions(packageName);\n if (versions.length === 0) {\n throw new ValidationError(`No versions found for ${packageName}.`);\n }\n\n const choices = await Promise.all(\n versions.map(async (version) => {\n const versionPath = getPackageVersionPath(packageName, version);\n const [fileCount, size] = await Promise.all([\n countFilesInDirectory(versionPath),\n getDirectorySize(versionPath).then(formatFileSize),\n ]);\n return {\n title: formatVersionChoice(version, fileCount, size),\n value: version,\n };\n })\n );\n\n return prm.multiselect<string>(\n `Select versions of ${packageName} to unpublish:`,\n choices\n );\n}\n\n// ---------------------------------------------------------------------------\n// Full interactive flow\n// ---------------------------------------------------------------------------\n\n/**\n * Run the full interactive unpublish workflow:\n * 1. Resolve or prompt for package name\n * 2. Prompt for version selection\n * 3. Confirm and execute\n *\n * Returns which versions were unpublished.\n */\nexport async function runInteractiveUnpublishFlow(\n packageSpec: string | undefined,\n options: UnpublishOptions,\n out: OutputPort,\n prm: PromptPort\n): Promise<InteractiveUnpublishResult> {\n // Step 1: Resolve package name\n let packageName: string;\n if (packageSpec) {\n const normalized = normalizePackageName(packageSpec);\n const found = await findPackageByName(normalized);\n if (!found) {\n throw new PackageNotFoundError(normalized);\n }\n packageName = normalized;\n } else {\n packageName = await selectPackageFromList(out, prm);\n }\n\n // Step 2: Select versions\n const selectedVersions = await selectVersionsFromPackage(packageName, out, prm);\n if (selectedVersions.length === 0) {\n throw new UserCancellationError();\n }\n\n // Step 3: Confirm\n const confirmMsg =\n selectedVersions.length === 1\n ? `Unpublish ${packageName}@${selectedVersions[0]}?`\n : `Unpublish ${selectedVersions.length} versions of ${packageName}?`;\n\n const confirmed = await prm.confirm(confirmMsg);\n if (!confirmed) {\n throw new UserCancellationError();\n }\n\n // Step 4: Execute\n const unpublishedVersions: string[] = [];\n for (const version of selectedVersions) {\n const spec = `${packageName}@${version}`;\n const result = await runUnpublishPipeline(spec, { ...options, local: true });\n if (result.success) {\n unpublishedVersions.push(version);\n out.success(`Unpublished ${spec}`);\n } else {\n out.error(`Failed to unpublish ${spec}: ${result.error}`);\n }\n }\n\n return { unpublishedVersions, packageName };\n}\n", "/**\n * Unpublish Command (CLI layer)\n *\n * Thin shell over core/unpublish/ pipelines.\n * Handles CLI arg parsing and delegates to core flows.\n */\n\nimport { UserCancellationError } from '@opkg/core/utils/errors.js';\nimport { runUnpublishPipeline } from '@opkg/core/core/unpublish/unpublish-pipeline.js';\nimport type { UnpublishOptions } from '@opkg/core/core/unpublish/unpublish-types.js';\nimport { runInteractiveUnpublishFlow } from '@opkg/core/core/unpublish/interactive-unpublish-flow.js';\nimport { createCliExecutionContext } from '../cli/context.js';\nimport { resolveOutput, resolvePrompt } from '@opkg/core/core/ports/resolve.js';\n\ninterface UnpublishCommandOptions extends UnpublishOptions {\n interactive?: boolean;\n}\n\nexport async function setupUnpublishCommand(args: any[]): Promise<void> {\n const [packageSpec, options] = args as [string | undefined, UnpublishCommandOptions];\n const ctx = await createCliExecutionContext({\n outputMode: options.interactive ? 'rich' : 'plain',\n });\n const out = resolveOutput(ctx);\n const prm = resolvePrompt(ctx);\n\n if (options.interactive) {\n options.local = true;\n try {\n const result = await runInteractiveUnpublishFlow(packageSpec, options, out, prm);\n if (result.unpublishedVersions.length > 0) {\n out.success(`Unpublished ${result.unpublishedVersions.length} version${result.unpublishedVersions.length === 1 ? '' : 's'} of ${result.packageName}`);\n }\n } catch (error) {\n if (error instanceof UserCancellationError) {\n out.info('Unpublish cancelled.');\n return;\n }\n throw error;\n }\n return;\n }\n\n if (!packageSpec) {\n throw new Error('Package specification is required. Usage: opkg unpublish <package[@version]> or use --interactive');\n }\n\n const result = await runUnpublishPipeline(packageSpec, options);\n if (!result.success) {\n throw new Error(result.error || 'Unpublish operation failed');\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["result"]
7
+ }
@@ -0,0 +1,245 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ formatFileCount,
4
+ formatFileSize,
5
+ formatPathForDisplay
6
+ } from "./chunk-4B5HJLP2.js";
7
+ import {
8
+ createCliExecutionContext,
9
+ resolveOutput,
10
+ resolvePrompt
11
+ } from "./chunk-BROJ6OUT.js";
12
+ import {
13
+ cleanupEmptyPackageDirectory,
14
+ findPackageByName,
15
+ getPackagePath,
16
+ getPackageVersionPath,
17
+ hasPackageVersion,
18
+ listAllPackages,
19
+ listPackageVersions
20
+ } from "./chunk-XEPVYZO3.js";
21
+ import {
22
+ normalizePackageName,
23
+ parsePackageInput
24
+ } from "./chunk-VN22A7NW.js";
25
+ import "./chunk-J4IFFBLP.js";
26
+ import {
27
+ countFilesInDirectory,
28
+ getDirectorySize,
29
+ remove
30
+ } from "./chunk-S47F4OG4.js";
31
+ import {
32
+ PackageNotFoundError,
33
+ UserCancellationError,
34
+ ValidationError
35
+ } from "./chunk-ID4SVDQZ.js";
36
+ import {
37
+ logger
38
+ } from "./chunk-5EFWGD33.js";
39
+
40
+ // ../core/src/core/unpublish/unpublish-output.ts
41
+ function displayUnpublishSuccess(data, cwd, output) {
42
+ let out = output ?? resolveOutput(), displayPath = formatPathForDisplay(data.path, cwd);
43
+ out.info(""), data.versionsRemoved === 1 && data.version ? out.success(`Unpublished ${data.packageName}@${data.version}`) : out.success(`Unpublished ${data.packageName} (${data.versionsRemoved} versions)`), out.success(`Removed: ${formatFileCount(data.fileCount)}`), out.success(`From: ${displayPath}`), data.remainingVersions.length > 0 && (out.info(""), out.info(`Remaining versions: ${data.remainingVersions.join(", ")}`)), out.info("");
44
+ }
45
+
46
+ // ../core/src/core/unpublish/local-unpublish-pipeline.ts
47
+ async function runLocalUnpublishPipeline(packageSpec, options, output, prompt) {
48
+ let out = output ?? resolveOutput(), prm = prompt ?? resolvePrompt();
49
+ try {
50
+ let { name, version } = parsePackageInput(packageSpec), normalizedName = normalizePackageName(name);
51
+ if (logger.info("Unpublishing package", { packageName: normalizedName, version, options }), !await findPackageByName(normalizedName))
52
+ throw new PackageNotFoundError(
53
+ `Package '${normalizedName}' not found in local registry`
54
+ );
55
+ let availableVersions = await listPackageVersions(normalizedName);
56
+ if (availableVersions.length === 0)
57
+ throw new ValidationError(
58
+ `Package '${normalizedName}' has no published versions to unpublish`
59
+ );
60
+ let targetVersion = version, unpublishAll = !1;
61
+ if (!targetVersion)
62
+ availableVersions.length === 1 ? (targetVersion = availableVersions[0], out.info(`Only one version exists: ${targetVersion}`)) : unpublishAll = !0;
63
+ else if (!await hasPackageVersion(normalizedName, targetVersion))
64
+ throw new ValidationError(
65
+ `Version ${targetVersion} of package '${normalizedName}' not found in local registry`
66
+ );
67
+ return unpublishAll ? await unpublishAllVersions(normalizedName, availableVersions, options, out, prm) : await unpublishSpecificVersion(normalizedName, targetVersion, options, out, prm);
68
+ } catch (error) {
69
+ let message = error instanceof Error ? error.message : String(error);
70
+ return logger.error("Local unpublish failed", { error: message }), {
71
+ success: !1,
72
+ error: message
73
+ };
74
+ }
75
+ }
76
+ async function unpublishSpecificVersion(packageName, version, options, out, prm) {
77
+ let versionPath = getPackageVersionPath(packageName, version), displayPath = formatPathForDisplay(versionPath), fileCount = await countFilesInDirectory(versionPath);
78
+ if (!options.force && (out.info(""), out.warn(`About to unpublish (delete) ${packageName}@${version} from local registry`), out.info(` Location: ${displayPath}`), out.info(` Files: ${formatFileCount(fileCount)}`), out.info(""), !await prm.confirm(
79
+ `Are you sure you want to delete package '${packageName}'? This action cannot be undone.`,
80
+ !1
81
+ )))
82
+ return {
83
+ success: !1,
84
+ error: "Unpublish cancelled by user"
85
+ };
86
+ let spinner = out.spinner();
87
+ spinner.start(`Removing ${packageName}@${version}...`), await remove(versionPath), spinner.stop();
88
+ let remainingVersions = await listPackageVersions(packageName);
89
+ remainingVersions.length === 0 && await cleanupEmptyPackageDirectory(packageName);
90
+ let data = {
91
+ packageName,
92
+ version,
93
+ path: versionPath,
94
+ versionsRemoved: 1,
95
+ fileCount,
96
+ remainingVersions
97
+ };
98
+ return displayUnpublishSuccess(data, process.cwd()), logger.info("Package version unpublished successfully", {
99
+ packageName,
100
+ version,
101
+ remainingVersions: remainingVersions.length
102
+ }), {
103
+ success: !0,
104
+ data
105
+ };
106
+ }
107
+ async function unpublishAllVersions(packageName, versions, options, out, prm) {
108
+ let packagePath = getPackagePath(packageName), displayPath = formatPathForDisplay(packagePath), totalFileCount = 0;
109
+ for (let version of versions) {
110
+ let versionPath = getPackageVersionPath(packageName, version);
111
+ totalFileCount += await countFilesInDirectory(versionPath);
112
+ }
113
+ if (!options.force && (out.info(""), out.warn(`About to unpublish (delete) ALL ${versions.length} versions of ${packageName}`), out.info(` Location: ${displayPath}`), out.info(` Total files: ${formatFileCount(totalFileCount)}`), out.info(""), !await prm.confirm(
114
+ `Unpublish ALL ${versions.length} versions of '${packageName}'? This action cannot be undone.`,
115
+ !1
116
+ )))
117
+ return {
118
+ success: !1,
119
+ error: "Unpublish cancelled by user"
120
+ };
121
+ let spinner = out.spinner();
122
+ spinner.start(`Removing ${packageName} (${versions.length} versions)...`), await remove(packagePath), spinner.stop();
123
+ let data = {
124
+ packageName,
125
+ version: void 0,
126
+ // All versions removed
127
+ path: packagePath,
128
+ versionsRemoved: versions.length,
129
+ fileCount: totalFileCount,
130
+ remainingVersions: []
131
+ };
132
+ return displayUnpublishSuccess(data, process.cwd()), logger.info("All package versions unpublished successfully", {
133
+ packageName,
134
+ versionsRemoved: versions.length
135
+ }), {
136
+ success: !0,
137
+ data
138
+ };
139
+ }
140
+
141
+ // ../core/src/core/unpublish/unpublish-pipeline.ts
142
+ async function runUnpublishPipeline(packageSpec, options) {
143
+ if (options.local)
144
+ return await runLocalUnpublishPipeline(packageSpec, options);
145
+ throw new Error(
146
+ `Remote unpublish is not yet supported.
147
+ Use --local flag to unpublish from local registry (~/.openpackage/registry).`
148
+ );
149
+ }
150
+
151
+ // ../core/src/core/unpublish/interactive-unpublish-flow.ts
152
+ function formatPackageChoice(name, versionCount) {
153
+ return `${name} (${versionCount} version${versionCount === 1 ? "" : "s"})`;
154
+ }
155
+ function formatVersionChoice(version, fileCount, size) {
156
+ return `${version} (${formatFileCount(fileCount)}, ${size})`;
157
+ }
158
+ async function selectPackageFromList(out, prm) {
159
+ let packages = await listAllPackages();
160
+ if (packages.length === 0)
161
+ throw new ValidationError("No published packages found.");
162
+ let choices = await Promise.all(
163
+ packages.map(async (name) => {
164
+ let versions = await listPackageVersions(name);
165
+ return {
166
+ title: formatPackageChoice(name, versions.length),
167
+ value: name
168
+ };
169
+ })
170
+ );
171
+ return prm.select("Select a package to unpublish:", choices);
172
+ }
173
+ async function selectVersionsFromPackage(packageName, out, prm) {
174
+ let versions = await listPackageVersions(packageName);
175
+ if (versions.length === 0)
176
+ throw new ValidationError(`No versions found for ${packageName}.`);
177
+ let choices = await Promise.all(
178
+ versions.map(async (version) => {
179
+ let versionPath = getPackageVersionPath(packageName, version), [fileCount, size] = await Promise.all([
180
+ countFilesInDirectory(versionPath),
181
+ getDirectorySize(versionPath).then(formatFileSize)
182
+ ]);
183
+ return {
184
+ title: formatVersionChoice(version, fileCount, size),
185
+ value: version
186
+ };
187
+ })
188
+ );
189
+ return prm.multiselect(
190
+ `Select versions of ${packageName} to unpublish:`,
191
+ choices
192
+ );
193
+ }
194
+ async function runInteractiveUnpublishFlow(packageSpec, options, out, prm) {
195
+ let packageName;
196
+ if (packageSpec) {
197
+ let normalized = normalizePackageName(packageSpec);
198
+ if (!await findPackageByName(normalized))
199
+ throw new PackageNotFoundError(normalized);
200
+ packageName = normalized;
201
+ } else
202
+ packageName = await selectPackageFromList(out, prm);
203
+ let selectedVersions = await selectVersionsFromPackage(packageName, out, prm);
204
+ if (selectedVersions.length === 0)
205
+ throw new UserCancellationError();
206
+ let confirmMsg = selectedVersions.length === 1 ? `Unpublish ${packageName}@${selectedVersions[0]}?` : `Unpublish ${selectedVersions.length} versions of ${packageName}?`;
207
+ if (!await prm.confirm(confirmMsg))
208
+ throw new UserCancellationError();
209
+ let unpublishedVersions = [];
210
+ for (let version of selectedVersions) {
211
+ let spec = `${packageName}@${version}`, result = await runUnpublishPipeline(spec, { ...options, local: !0 });
212
+ result.success ? (unpublishedVersions.push(version), out.success(`Unpublished ${spec}`)) : out.error(`Failed to unpublish ${spec}: ${result.error}`);
213
+ }
214
+ return { unpublishedVersions, packageName };
215
+ }
216
+
217
+ // src/commands/unpublish.ts
218
+ async function setupUnpublishCommand(args) {
219
+ let [packageSpec, options] = args, ctx = await createCliExecutionContext({
220
+ outputMode: options.interactive ? "rich" : "plain"
221
+ }), out = resolveOutput(ctx), prm = resolvePrompt(ctx);
222
+ if (options.interactive) {
223
+ options.local = !0;
224
+ try {
225
+ let result2 = await runInteractiveUnpublishFlow(packageSpec, options, out, prm);
226
+ result2.unpublishedVersions.length > 0 && out.success(`Unpublished ${result2.unpublishedVersions.length} version${result2.unpublishedVersions.length === 1 ? "" : "s"} of ${result2.packageName}`);
227
+ } catch (error) {
228
+ if (error instanceof UserCancellationError) {
229
+ out.info("Unpublish cancelled.");
230
+ return;
231
+ }
232
+ throw error;
233
+ }
234
+ return;
235
+ }
236
+ if (!packageSpec)
237
+ throw new Error("Package specification is required. Usage: opkg unpublish <package[@version]> or use --interactive");
238
+ let result = await runUnpublishPipeline(packageSpec, options);
239
+ if (!result.success)
240
+ throw new Error(result.error || "Unpublish operation failed");
241
+ }
242
+ export {
243
+ setupUnpublishCommand
244
+ };
245
+ //# sourceMappingURL=unpublish-VBTNTMS5.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../core/src/core/unpublish/unpublish-output.ts", "../../core/src/core/unpublish/local-unpublish-pipeline.ts", "../../core/src/core/unpublish/unpublish-pipeline.ts", "../../core/src/core/unpublish/interactive-unpublish-flow.ts", "../src/commands/unpublish.ts"],
4
+ "sourcesContent": ["import { formatPathForDisplay, formatFileCount } from '../../utils/formatters.js';\nimport type { OutputPort } from '../ports/output.js';\nimport { resolveOutput } from '../ports/resolve.js';\nimport type { UnpublishData } from './unpublish-types.js';\n\n/**\n * Display success message after unpublish operation\n */\nexport function displayUnpublishSuccess(data: UnpublishData, cwd: string, output?: OutputPort): void {\n const out = output ?? resolveOutput();\n const displayPath = formatPathForDisplay(data.path, cwd);\n \n out.info(''); // Spacing\n \n if (data.versionsRemoved === 1 && data.version) {\n // Single version unpublished\n out.success(`Unpublished ${data.packageName}@${data.version}`);\n } else {\n // All versions unpublished\n out.success(`Unpublished ${data.packageName} (${data.versionsRemoved} versions)`);\n }\n \n out.success(`Removed: ${formatFileCount(data.fileCount)}`);\n out.success(`From: ${displayPath}`);\n \n // Show remaining versions if any\n if (data.remainingVersions.length > 0) {\n out.info('');\n out.info(`Remaining versions: ${data.remainingVersions.join(', ')}`);\n }\n \n out.info('');\n}\n", "import { parsePackageInput, normalizePackageName } from '../../utils/package-name.js';\nimport { \n getPackageVersionPath, \n getPackagePath, \n listPackageVersions,\n hasPackageVersion,\n findPackageByName,\n cleanupEmptyPackageDirectory\n} from '../directory.js';\nimport { exists, remove, countFilesInDirectory } from '../../utils/fs.js';\nimport { formatPathForDisplay, formatFileCount } from '../../utils/formatters.js';\nimport { logger } from '../../utils/logger.js';\nimport type { OutputPort } from '../ports/output.js';\nimport type { PromptPort } from '../ports/prompt.js';\nimport { resolveOutput, resolvePrompt } from '../ports/resolve.js';\nimport { ValidationError, PackageNotFoundError } from '../../utils/errors.js';\nimport { displayUnpublishSuccess } from './unpublish-output.js';\nimport type { UnpublishOptions, UnpublishResult, UnpublishData } from './unpublish-types.js';\n\n/**\n * Unpublish package from local registry\n */\nexport async function runLocalUnpublishPipeline(\n packageSpec: string,\n options: UnpublishOptions,\n output?: OutputPort,\n prompt?: PromptPort\n): Promise<UnpublishResult> {\n const out = output ?? resolveOutput();\n const prm = prompt ?? resolvePrompt();\n try {\n // Parse package spec (e.g., \"my-package@1.0.0\" or \"my-package\")\n const { name, version } = parsePackageInput(packageSpec);\n const normalizedName = normalizePackageName(name);\n \n logger.info('Unpublishing package', { packageName: normalizedName, version, options });\n \n // Verify package exists in registry\n const packageExists = await findPackageByName(normalizedName);\n if (!packageExists) {\n throw new PackageNotFoundError(\n `Package '${normalizedName}' not found in local registry`\n );\n }\n \n // List all available versions\n const availableVersions = await listPackageVersions(normalizedName);\n if (availableVersions.length === 0) {\n throw new ValidationError(\n `Package '${normalizedName}' has no published versions to unpublish`\n );\n }\n \n // Determine target version(s)\n let targetVersion: string | undefined = version;\n let unpublishAll = false;\n \n if (!targetVersion) {\n // No version specified - default to unpublishing ALL versions\n if (availableVersions.length === 1) {\n // Only one version exists - auto-select it\n targetVersion = availableVersions[0];\n out.info(`Only one version exists: ${targetVersion}`);\n } else {\n // Multiple versions - unpublish all (with confirmation)\n unpublishAll = true;\n }\n } else {\n // Version specified - verify it exists\n const versionExists = await hasPackageVersion(normalizedName, targetVersion);\n if (!versionExists) {\n throw new ValidationError(\n `Version ${targetVersion} of package '${normalizedName}' not found in local registry`\n );\n }\n }\n \n // Execute unpublish\n if (unpublishAll) {\n return await unpublishAllVersions(normalizedName, availableVersions, options, out, prm);\n } else {\n return await unpublishSpecificVersion(normalizedName, targetVersion!, options, out, prm);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error('Local unpublish failed', { error: message });\n \n return {\n success: false,\n error: message\n };\n }\n}\n\n/**\n * Unpublish a specific version\n */\nasync function unpublishSpecificVersion(\n packageName: string,\n version: string,\n options: UnpublishOptions,\n out: OutputPort,\n prm: PromptPort\n): Promise<UnpublishResult<UnpublishData>> {\n const versionPath = getPackageVersionPath(packageName, version);\n const displayPath = formatPathForDisplay(versionPath);\n \n // Count files before removal\n const fileCount = await countFilesInDirectory(versionPath);\n \n // Confirmation (unless --force)\n if (!options.force) {\n out.info('');\n out.warn(`About to unpublish (delete) ${packageName}@${version} from local registry`);\n out.info(` Location: ${displayPath}`);\n out.info(` Files: ${formatFileCount(fileCount)}`);\n out.info('');\n \n const confirmed = await prm.confirm(\n `Are you sure you want to delete package '${packageName}'? This action cannot be undone.`,\n false\n );\n if (!confirmed) {\n return {\n success: false,\n error: 'Unpublish cancelled by user'\n };\n }\n }\n \n // Remove version directory\n const spinner = out.spinner();\n spinner.start(`Removing ${packageName}@${version}...`);\n \n await remove(versionPath);\n \n spinner.stop();\n \n // Get remaining versions\n const remainingVersions = await listPackageVersions(packageName);\n \n // Clean up empty package directory if no versions remain\n if (remainingVersions.length === 0) {\n await cleanupEmptyPackageDirectory(packageName);\n }\n \n // Display success\n const data: UnpublishData = {\n packageName,\n version,\n path: versionPath,\n versionsRemoved: 1,\n fileCount,\n remainingVersions\n };\n \n displayUnpublishSuccess(data, process.cwd());\n \n logger.info('Package version unpublished successfully', { \n packageName, \n version,\n remainingVersions: remainingVersions.length \n });\n \n return {\n success: true,\n data\n };\n}\n\n/**\n * Unpublish all versions of a package\n */\nasync function unpublishAllVersions(\n packageName: string,\n versions: string[],\n options: UnpublishOptions,\n out: OutputPort,\n prm: PromptPort\n): Promise<UnpublishResult<UnpublishData>> {\n const packagePath = getPackagePath(packageName);\n const displayPath = formatPathForDisplay(packagePath);\n \n // Count total files across all versions\n let totalFileCount = 0;\n for (const version of versions) {\n const versionPath = getPackageVersionPath(packageName, version);\n totalFileCount += await countFilesInDirectory(versionPath);\n }\n \n // Confirmation (unless --force)\n if (!options.force) {\n out.info('');\n out.warn(`About to unpublish (delete) ALL ${versions.length} versions of ${packageName}`);\n out.info(` Location: ${displayPath}`);\n out.info(` Total files: ${formatFileCount(totalFileCount)}`);\n out.info('');\n \n const confirmed = await prm.confirm(\n `Unpublish ALL ${versions.length} versions of '${packageName}'? This action cannot be undone.`,\n false\n );\n if (!confirmed) {\n return {\n success: false,\n error: 'Unpublish cancelled by user'\n };\n }\n }\n \n // Remove entire package directory\n const spinner = out.spinner();\n spinner.start(`Removing ${packageName} (${versions.length} versions)...`);\n \n await remove(packagePath);\n \n spinner.stop();\n \n // Display success\n const data: UnpublishData = {\n packageName,\n version: undefined, // All versions removed\n path: packagePath,\n versionsRemoved: versions.length,\n fileCount: totalFileCount,\n remainingVersions: []\n };\n \n displayUnpublishSuccess(data, process.cwd());\n \n logger.info('All package versions unpublished successfully', { \n packageName,\n versionsRemoved: versions.length\n });\n \n return {\n success: true,\n data\n };\n}\n", "import type { UnpublishOptions, UnpublishResult } from './unpublish-types.js';\nimport { runLocalUnpublishPipeline } from './local-unpublish-pipeline.js';\n// Future: import { runRemoteUnpublishPipeline } from './remote-unpublish-pipeline.js';\n\n/**\n * Main unpublish pipeline - routes to local or remote based on options\n */\nexport async function runUnpublishPipeline(\n packageSpec: string,\n options: UnpublishOptions\n): Promise<UnpublishResult> {\n // Route to appropriate pipeline\n if (!options.local) {\n // Remote unpublish - not yet implemented\n throw new Error(\n 'Remote unpublish is not yet supported.\\n' +\n 'Use --local flag to unpublish from local registry (~/.openpackage/registry).'\n );\n } else {\n return await runLocalUnpublishPipeline(packageSpec, options);\n }\n}\n", "/**\n * Interactive Unpublish Flow\n *\n * Orchestration logic for the interactive unpublish workflow:\n * list packages \u2192 select versions \u2192 confirm \u2192 execute.\n * Uses OutputPort/PromptPort for all user interaction so it can\n * be driven by CLI, GUI, or tests.\n */\n\nimport type { UnpublishOptions } from './unpublish-types.js';\nimport { runUnpublishPipeline } from './unpublish-pipeline.js';\nimport {\n listAllPackages,\n listPackageVersions,\n getPackageVersionPath,\n findPackageByName,\n} from '../directory.js';\nimport { getDirectorySize, countFilesInDirectory } from '../../utils/fs.js';\nimport { formatFileSize, formatFileCount } from '../../utils/formatters.js';\nimport { normalizePackageName } from '../../utils/package-name.js';\nimport type { OutputPort } from '../ports/output.js';\nimport type { PromptPort } from '../ports/prompt.js';\nimport { PackageNotFoundError, UserCancellationError, ValidationError } from '../../utils/errors.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface InteractiveUnpublishResult {\n unpublishedVersions: string[];\n packageName: string;\n}\n\n// ---------------------------------------------------------------------------\n// Formatting helpers (pure string transforms, no terminal deps)\n// ---------------------------------------------------------------------------\n\nfunction formatPackageChoice(name: string, versionCount: number): string {\n return `${name} (${versionCount} version${versionCount === 1 ? '' : 's'})`;\n}\n\nfunction formatVersionChoice(version: string, fileCount: number, size: string): string {\n return `${version} (${formatFileCount(fileCount)}, ${size})`;\n}\n\n// ---------------------------------------------------------------------------\n// Selection flows\n// ---------------------------------------------------------------------------\n\n/**\n * Present user with a list of all published packages and let them pick one.\n */\nexport async function selectPackageFromList(\n out: OutputPort,\n prm: PromptPort\n): Promise<string> {\n const packages = await listAllPackages();\n if (packages.length === 0) {\n throw new ValidationError('No published packages found.');\n }\n\n const choices = await Promise.all(\n packages.map(async (name) => {\n const versions = await listPackageVersions(name);\n return {\n title: formatPackageChoice(name, versions.length),\n value: name,\n };\n })\n );\n\n return prm.select<string>('Select a package to unpublish:', choices);\n}\n\n/**\n * Present user with a list of versions for a package and let them pick.\n */\nexport async function selectVersionsFromPackage(\n packageName: string,\n out: OutputPort,\n prm: PromptPort\n): Promise<string[]> {\n const versions = await listPackageVersions(packageName);\n if (versions.length === 0) {\n throw new ValidationError(`No versions found for ${packageName}.`);\n }\n\n const choices = await Promise.all(\n versions.map(async (version) => {\n const versionPath = getPackageVersionPath(packageName, version);\n const [fileCount, size] = await Promise.all([\n countFilesInDirectory(versionPath),\n getDirectorySize(versionPath).then(formatFileSize),\n ]);\n return {\n title: formatVersionChoice(version, fileCount, size),\n value: version,\n };\n })\n );\n\n return prm.multiselect<string>(\n `Select versions of ${packageName} to unpublish:`,\n choices\n );\n}\n\n// ---------------------------------------------------------------------------\n// Full interactive flow\n// ---------------------------------------------------------------------------\n\n/**\n * Run the full interactive unpublish workflow:\n * 1. Resolve or prompt for package name\n * 2. Prompt for version selection\n * 3. Confirm and execute\n *\n * Returns which versions were unpublished.\n */\nexport async function runInteractiveUnpublishFlow(\n packageSpec: string | undefined,\n options: UnpublishOptions,\n out: OutputPort,\n prm: PromptPort\n): Promise<InteractiveUnpublishResult> {\n // Step 1: Resolve package name\n let packageName: string;\n if (packageSpec) {\n const normalized = normalizePackageName(packageSpec);\n const found = await findPackageByName(normalized);\n if (!found) {\n throw new PackageNotFoundError(normalized);\n }\n packageName = normalized;\n } else {\n packageName = await selectPackageFromList(out, prm);\n }\n\n // Step 2: Select versions\n const selectedVersions = await selectVersionsFromPackage(packageName, out, prm);\n if (selectedVersions.length === 0) {\n throw new UserCancellationError();\n }\n\n // Step 3: Confirm\n const confirmMsg =\n selectedVersions.length === 1\n ? `Unpublish ${packageName}@${selectedVersions[0]}?`\n : `Unpublish ${selectedVersions.length} versions of ${packageName}?`;\n\n const confirmed = await prm.confirm(confirmMsg);\n if (!confirmed) {\n throw new UserCancellationError();\n }\n\n // Step 4: Execute\n const unpublishedVersions: string[] = [];\n for (const version of selectedVersions) {\n const spec = `${packageName}@${version}`;\n const result = await runUnpublishPipeline(spec, { ...options, local: true });\n if (result.success) {\n unpublishedVersions.push(version);\n out.success(`Unpublished ${spec}`);\n } else {\n out.error(`Failed to unpublish ${spec}: ${result.error}`);\n }\n }\n\n return { unpublishedVersions, packageName };\n}\n", "/**\n * Unpublish Command (CLI layer)\n *\n * Thin shell over core/unpublish/ pipelines.\n * Handles CLI arg parsing and delegates to core flows.\n */\n\nimport { UserCancellationError } from '@opkg/core/utils/errors.js';\nimport { runUnpublishPipeline } from '@opkg/core/core/unpublish/unpublish-pipeline.js';\nimport type { UnpublishOptions } from '@opkg/core/core/unpublish/unpublish-types.js';\nimport { runInteractiveUnpublishFlow } from '@opkg/core/core/unpublish/interactive-unpublish-flow.js';\nimport { createCliExecutionContext } from '../cli/context.js';\nimport { resolveOutput, resolvePrompt } from '@opkg/core/core/ports/resolve.js';\n\ninterface UnpublishCommandOptions extends UnpublishOptions {\n interactive?: boolean;\n}\n\nexport async function setupUnpublishCommand(args: any[]): Promise<void> {\n const [packageSpec, options] = args as [string | undefined, UnpublishCommandOptions];\n const ctx = await createCliExecutionContext({\n outputMode: options.interactive ? 'rich' : 'plain',\n });\n const out = resolveOutput(ctx);\n const prm = resolvePrompt(ctx);\n\n if (options.interactive) {\n options.local = true;\n try {\n const result = await runInteractiveUnpublishFlow(packageSpec, options, out, prm);\n if (result.unpublishedVersions.length > 0) {\n out.success(`Unpublished ${result.unpublishedVersions.length} version${result.unpublishedVersions.length === 1 ? '' : 's'} of ${result.packageName}`);\n }\n } catch (error) {\n if (error instanceof UserCancellationError) {\n out.info('Unpublish cancelled.');\n return;\n }\n throw error;\n }\n return;\n }\n\n if (!packageSpec) {\n throw new Error('Package specification is required. Usage: opkg unpublish <package[@version]> or use --interactive');\n }\n\n const result = await runUnpublishPipeline(packageSpec, options);\n if (!result.success) {\n throw new Error(result.error || 'Unpublish operation failed');\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["result"]
7
+ }