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,542 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ buildWorkspacePackageContext,
4
+ expandDirectorySelections,
5
+ hasDirectorySelections,
6
+ interactiveFileSelect,
7
+ resolveSourceOperationArguments
8
+ } from "./chunk-FMVVJH5M.js";
9
+ import {
10
+ resolveMutableSource
11
+ } from "./chunk-AYTGQCXH.js";
12
+ import {
13
+ assertMutableSourceOrThrow
14
+ } from "./chunk-BVVSU7QD.js";
15
+ import {
16
+ createInteractionPolicy
17
+ } from "./chunk-SVEFLCC2.js";
18
+ import "./chunk-3PZRVA6O.js";
19
+ import "./chunk-A6ISKBNM.js";
20
+ import {
21
+ cleanupEmptyParents
22
+ } from "./chunk-AMHDY5PC.js";
23
+ import {
24
+ findMatchingDependencyInManifest,
25
+ removeDependencyFromManifest
26
+ } from "./chunk-D3O7LY2Q.js";
27
+ import "./chunk-HYKYECAE.js";
28
+ import {
29
+ readWorkspaceIndex
30
+ } from "./chunk-DEC24S7E.js";
31
+ import {
32
+ getLocalOpenPackageDir,
33
+ getLocalPackagesDir
34
+ } from "./chunk-VXNS3X5O.js";
35
+ import "./chunk-GSWHZBT2.js";
36
+ import "./chunk-WNRXZLWW.js";
37
+ import {
38
+ formatPathForDisplay,
39
+ getTreeConnector
40
+ } from "./chunk-MIURCESJ.js";
41
+ import {
42
+ createCliExecutionContext,
43
+ resolveOutput,
44
+ resolvePrompt
45
+ } from "./chunk-RAKMX654.js";
46
+ import "./chunk-GDVFS3YP.js";
47
+ import "./chunk-427DCURL.js";
48
+ import "./chunk-VN22A7NW.js";
49
+ import "./chunk-N43IXOND.js";
50
+ import {
51
+ normalizePathForProcessing
52
+ } from "./chunk-YMKK4XPN.js";
53
+ import {
54
+ FILE_PATTERNS
55
+ } from "./chunk-IHVZ5AUJ.js";
56
+ import {
57
+ exists,
58
+ isDirectory,
59
+ isFile,
60
+ listDirectories,
61
+ remove,
62
+ walkFiles
63
+ } from "./chunk-S47F4OG4.js";
64
+ import {
65
+ UserCancellationError
66
+ } from "./chunk-ID4SVDQZ.js";
67
+ import {
68
+ logger
69
+ } from "./chunk-5EFWGD33.js";
70
+
71
+ // src/commands/remove.ts
72
+ import { join as join5 } from "path";
73
+
74
+ // ../core/src/core/remove/remove-from-source-pipeline.ts
75
+ import { join as join3 } from "path";
76
+
77
+ // ../core/src/core/remove/removal-collector.ts
78
+ import { join, relative, sep } from "path";
79
+ async function collectRemovalEntries(packageRootDir, pathPattern) {
80
+ let entries = [], normalizedPattern = normalizePathForProcessing(pathPattern) || pathPattern, targetPath = join(packageRootDir, normalizedPattern);
81
+ if (!await exists(targetPath))
82
+ throw new Error(
83
+ `Path '${pathPattern}' not found in package.
84
+ Package source: ${packageRootDir}`
85
+ );
86
+ if (await isDirectory(targetPath)) {
87
+ for await (let filePath of walkFiles(targetPath)) {
88
+ let registryPath = relative(packageRootDir, filePath).split(sep).join("/");
89
+ entries.push({
90
+ packagePath: filePath,
91
+ registryPath
92
+ });
93
+ }
94
+ if (entries.length === 0)
95
+ throw new Error(
96
+ `Directory '${pathPattern}' is empty.
97
+ No files to remove.`
98
+ );
99
+ return entries;
100
+ }
101
+ if (await isFile(targetPath)) {
102
+ let registryPath = relative(packageRootDir, targetPath).split(sep).join("/");
103
+ return entries.push({
104
+ packagePath: targetPath,
105
+ registryPath
106
+ }), entries;
107
+ }
108
+ throw new Error(
109
+ `Path '${pathPattern}' is not a file or directory.
110
+ Package source: ${packageRootDir}`
111
+ );
112
+ }
113
+
114
+ // ../core/src/core/remove/remove-input-classifier.ts
115
+ import { join as join2 } from "path";
116
+ async function classifyRemoveInput(pathArg, packageRootDir, manifestPath) {
117
+ let normalizedPath = normalizePathForProcessing(pathArg) || pathArg, targetPath = join2(packageRootDir, normalizedPath), hasFileMatch = await exists(targetPath) && (await isFile(targetPath) || await isDirectory(targetPath));
118
+ if (pathArg.startsWith("./") || pathArg.startsWith("../"))
119
+ return hasFileMatch ? (logger.debug("Classified explicit path as file", {
120
+ pathArg,
121
+ targetPath
122
+ }), { mode: "file", path: normalizedPath }) : null;
123
+ let matchedDependency = await findMatchingDependencyInManifest(manifestPath, pathArg);
124
+ return matchedDependency ? (logger.debug("Classified remove input as dependency", {
125
+ pathArg,
126
+ dependencyName: matchedDependency
127
+ }), { mode: "dependency", dependencyName: matchedDependency }) : hasFileMatch ? (logger.debug("Classified remove input as file", {
128
+ pathArg,
129
+ targetPath
130
+ }), { mode: "file", path: normalizedPath }) : null;
131
+ }
132
+
133
+ // ../core/src/core/remove/remove-dependency-flow.ts
134
+ async function runRemoveDependencyFlow(manifestPath, dependencyName, packageName) {
135
+ let result = await removeDependencyFromManifest(manifestPath, dependencyName);
136
+ return logger.info(
137
+ result.removed ? `Removed ${dependencyName} from ${manifestPath}` : `No matching dependency found for ${dependencyName}`
138
+ ), {
139
+ packageName,
140
+ targetManifest: manifestPath,
141
+ dependencyName,
142
+ removed: result.removed,
143
+ section: result.section
144
+ };
145
+ }
146
+
147
+ // ../core/src/core/remove/removal-confirmation.ts
148
+ async function confirmRemoval(packageName, entries, options = {}) {
149
+ if (options.force || options.dryRun)
150
+ return !0;
151
+ if (!options.execContext?.interactionPolicy?.canPrompt(2 /* Confirmation */))
152
+ throw new Error("Removal requires confirmation. Use --force in non-interactive mode.");
153
+ if (!await resolvePrompt(options.execContext).confirm("Confirm removal?", !1))
154
+ throw new UserCancellationError();
155
+ return !0;
156
+ }
157
+
158
+ // ../core/src/core/remove/remove-from-source-pipeline.ts
159
+ async function runRemoveFromSourcePipeline(packageName, pathArg, options = {}) {
160
+ let cwd = process.cwd(), resolvedPackageName, resolvedPath;
161
+ try {
162
+ let resolved = await resolveSourceOperationArguments(
163
+ cwd,
164
+ packageName,
165
+ pathArg,
166
+ { command: "remove", checkWorkspaceRoot: !0 }
167
+ );
168
+ resolvedPackageName = resolved.resolvedPackageName, resolvedPath = resolved.resolvedPath;
169
+ } catch (error) {
170
+ return { success: !1, error: error instanceof Error ? error.message : String(error) };
171
+ }
172
+ let packageRootDir, resolvedName, sourceType;
173
+ if (resolvedPackageName === null)
174
+ try {
175
+ let context = await buildWorkspacePackageContext(cwd);
176
+ packageRootDir = context.packageRootDir, resolvedName = context.name, sourceType = "workspace", logger.info("Removing files from workspace package", {
177
+ sourcePath: packageRootDir,
178
+ inputPath: resolvedPath
179
+ });
180
+ } catch (error) {
181
+ return {
182
+ success: !1,
183
+ error: error instanceof Error ? error.message : String(error)
184
+ };
185
+ }
186
+ else {
187
+ let source;
188
+ try {
189
+ source = await resolveMutableSource({ cwd, packageName: resolvedPackageName });
190
+ } catch (error) {
191
+ return { success: !1, error: error instanceof Error ? error.message : String(error) };
192
+ }
193
+ assertMutableSourceOrThrow(source.absolutePath, { packageName: source.packageName, command: "remove" }), packageRootDir = source.absolutePath, resolvedName = source.packageName, sourceType = source.absolutePath.includes(`${cwd}/.openpackage/packages/`) ? "workspace" : "global", logger.info("Removing files from package source", {
194
+ packageName: source.packageName,
195
+ sourcePath: source.absolutePath,
196
+ sourceType: source.sourceType,
197
+ inputPath: resolvedPath
198
+ });
199
+ }
200
+ let manifestPath = join3(packageRootDir, FILE_PATTERNS.OPENPACKAGE_YML), classification = await classifyRemoveInput(resolvedPath, packageRootDir, manifestPath);
201
+ if (classification?.mode === "dependency") {
202
+ let depResult = await runRemoveDependencyFlow(
203
+ manifestPath,
204
+ classification.dependencyName,
205
+ resolvedName
206
+ );
207
+ return depResult.removed ? {
208
+ success: !0,
209
+ data: {
210
+ packageName: resolvedName,
211
+ filesRemoved: 0,
212
+ sourcePath: packageRootDir,
213
+ sourceType,
214
+ removedPaths: [],
215
+ removalType: "dependency",
216
+ removedDependency: classification.dependencyName,
217
+ removedFromSection: depResult.section
218
+ }
219
+ } : {
220
+ success: !1,
221
+ error: `Dependency '${resolvedPath}' not found in package.`
222
+ };
223
+ }
224
+ let entries;
225
+ try {
226
+ entries = await collectRemovalEntries(packageRootDir, resolvedPath);
227
+ } catch (error) {
228
+ return {
229
+ success: !1,
230
+ error: error instanceof Error ? error.message : String(error)
231
+ };
232
+ }
233
+ if (entries.length === 0)
234
+ return {
235
+ success: !1,
236
+ error: `No files found to remove at path: ${resolvedPath}`
237
+ };
238
+ options.beforeConfirm?.({
239
+ packageName: resolvedName,
240
+ sourcePath: packageRootDir
241
+ });
242
+ let doConfirm = () => confirmRemoval(resolvedName, entries, options);
243
+ try {
244
+ await doConfirm();
245
+ } catch (error) {
246
+ if (error instanceof UserCancellationError)
247
+ throw error;
248
+ return {
249
+ success: !1,
250
+ error: error instanceof Error ? error.message : "Removal cancelled by user."
251
+ };
252
+ }
253
+ if (options.dryRun)
254
+ return logger.info("Dry-run mode: no files will be removed", {
255
+ packageName: resolvedName,
256
+ filesCount: entries.length
257
+ }), {
258
+ success: !0,
259
+ data: {
260
+ packageName: resolvedName,
261
+ filesRemoved: entries.length,
262
+ sourcePath: packageRootDir,
263
+ sourceType,
264
+ removedPaths: entries.map((e) => e.registryPath),
265
+ removalType: "files"
266
+ }
267
+ };
268
+ let removedPaths = [], removedAbsolutePaths = [];
269
+ for (let entry of entries)
270
+ await exists(entry.packagePath) && (await remove(entry.packagePath), removedPaths.push(entry.registryPath), removedAbsolutePaths.push(entry.packagePath), logger.debug("Removed file", { path: entry.packagePath }));
271
+ return await cleanupEmptyParents(packageRootDir, removedAbsolutePaths), logger.info("Files removed from package source", {
272
+ packageName: resolvedName,
273
+ filesRemoved: removedPaths.length
274
+ }), {
275
+ success: !0,
276
+ data: {
277
+ packageName: resolvedName,
278
+ filesRemoved: removedPaths.length,
279
+ sourcePath: packageRootDir,
280
+ sourceType,
281
+ removedPaths,
282
+ removalType: "files"
283
+ }
284
+ };
285
+ }
286
+ async function runRemoveFromSourcePipelineBatch(packageName, packageRootDir, resolvedName, pathArgs, options = {}) {
287
+ let sourceType = packageRootDir.includes(`${process.cwd()}/.openpackage/packages/`) ? "workspace" : "global", allEntries = [], seenRegistryPaths = /* @__PURE__ */ new Set();
288
+ for (let pathArg of pathArgs)
289
+ try {
290
+ let entries = await collectRemovalEntries(packageRootDir, pathArg);
291
+ for (let entry of entries)
292
+ seenRegistryPaths.has(entry.registryPath) || (seenRegistryPaths.add(entry.registryPath), allEntries.push(entry));
293
+ } catch (error) {
294
+ return { success: !1, error: error instanceof Error ? error.message : String(error) };
295
+ }
296
+ if (allEntries.length === 0)
297
+ return { success: !1, error: "No files found to remove." };
298
+ try {
299
+ await confirmRemoval(resolvedName, allEntries, options);
300
+ } catch (error) {
301
+ if (error instanceof UserCancellationError)
302
+ throw error;
303
+ return { success: !1, error: error instanceof Error ? error.message : "Removal cancelled by user." };
304
+ }
305
+ if (options.dryRun)
306
+ return {
307
+ success: !0,
308
+ data: {
309
+ packageName: resolvedName,
310
+ filesRemoved: allEntries.length,
311
+ sourcePath: packageRootDir,
312
+ sourceType,
313
+ removedPaths: allEntries.map((e) => e.registryPath),
314
+ removalType: "files"
315
+ }
316
+ };
317
+ let removedPaths = [], removedAbsolutePaths = [];
318
+ for (let entry of allEntries)
319
+ await exists(entry.packagePath) && (await remove(entry.packagePath), removedPaths.push(entry.registryPath), removedAbsolutePaths.push(entry.packagePath));
320
+ return await cleanupEmptyParents(packageRootDir, removedAbsolutePaths), {
321
+ success: !0,
322
+ data: {
323
+ packageName: resolvedName,
324
+ filesRemoved: removedPaths.length,
325
+ sourcePath: packageRootDir,
326
+ sourceType,
327
+ removedPaths,
328
+ removalType: "files"
329
+ }
330
+ };
331
+ }
332
+
333
+ // src/utils/interactive-package-selector.ts
334
+ import { select } from "@clack/prompts";
335
+ import { join as join4 } from "path";
336
+ var WORKSPACE_PACKAGE = "__workspace__";
337
+ async function interactivePackageSelect(options) {
338
+ let {
339
+ cwd,
340
+ message = "Select a package",
341
+ allowWorkspace = !0
342
+ } = options;
343
+ try {
344
+ let packages = await getAvailablePackages(cwd);
345
+ if (packages.length === 0 && !allowWorkspace)
346
+ return logger.warn("No packages found"), null;
347
+ let packageOptions = [];
348
+ allowWorkspace && packageOptions.push({
349
+ value: WORKSPACE_PACKAGE,
350
+ label: "workspace package",
351
+ hint: "Files in .openpackage/"
352
+ });
353
+ for (let pkg of packages)
354
+ packageOptions.push({
355
+ value: pkg,
356
+ label: pkg,
357
+ hint: `Package in .openpackage/packages/${pkg}`
358
+ });
359
+ if (packageOptions.length === 0)
360
+ return logger.warn("No packages available for selection"), null;
361
+ let selected = await select({
362
+ message,
363
+ options: packageOptions.map((opt) => ({
364
+ value: opt.value,
365
+ label: opt.label,
366
+ hint: opt.hint
367
+ }))
368
+ });
369
+ return typeof selected == "symbol" ? (logger.debug("Package selection cancelled"), null) : (logger.debug(`User selected package: ${selected}`), selected);
370
+ } catch (error) {
371
+ throw logger.error("Error during package selection", { error }), new Error(`Package selection failed: ${error}`);
372
+ }
373
+ }
374
+ async function getAvailablePackages(cwd) {
375
+ let packagesDir = getLocalPackagesDir(cwd);
376
+ if (!await exists(packagesDir))
377
+ return logger.debug("Packages directory does not exist", { packagesDir }), [];
378
+ try {
379
+ let dirs = await listDirectories(packagesDir), packages = [];
380
+ for (let dir of dirs) {
381
+ let packageYmlPath = join4(packagesDir, dir, FILE_PATTERNS.OPENPACKAGE_YML);
382
+ if (dir.startsWith("@")) {
383
+ let scopeDir = join4(packagesDir, dir), scopedPackages = await listDirectories(scopeDir);
384
+ for (let scopedPkg of scopedPackages) {
385
+ let scopedYmlPath = join4(scopeDir, scopedPkg, FILE_PATTERNS.OPENPACKAGE_YML);
386
+ await exists(scopedYmlPath) && packages.push(`${dir}/${scopedPkg}`);
387
+ }
388
+ } else await exists(packageYmlPath) && packages.push(dir);
389
+ }
390
+ return packages.sort((a, b) => a.localeCompare(b)), logger.debug(`Found ${packages.length} packages`, { packages }), packages;
391
+ } catch (error) {
392
+ return logger.error("Error scanning packages directory", { error, packagesDir }), [];
393
+ }
394
+ }
395
+ function resolvePackageSelection(cwd, selection) {
396
+ return selection ? selection === WORKSPACE_PACKAGE ? {
397
+ packageName: null,
398
+ packageDir: getLocalOpenPackageDir(cwd)
399
+ } : {
400
+ packageName: selection,
401
+ packageDir: join4(getLocalPackagesDir(cwd), selection)
402
+ } : null;
403
+ }
404
+
405
+ // src/commands/remove.ts
406
+ async function setupRemoveCommand(args) {
407
+ let [resource, options, command] = args, cwd = process.cwd(), programOpts = command.parent?.opts() || {}, interactive = !resource, execContext = await createCliExecutionContext({
408
+ global: !1,
409
+ cwd: programOpts.cwd,
410
+ interactive,
411
+ outputMode: interactive ? "rich" : "plain"
412
+ }), policy = createInteractionPolicy({
413
+ interactive,
414
+ force: options.force
415
+ });
416
+ execContext.interactionPolicy = policy;
417
+ let out = resolveOutput(execContext);
418
+ if (!resource) {
419
+ if (!policy.canPrompt(4 /* OptionalMenu */))
420
+ throw new Error(
421
+ `<resource> argument is required in non-interactive mode.
422
+ Usage: opkg remove <resource> [options]
423
+
424
+ Examples:
425
+ opkg remove file.txt # Remove file from workspace package
426
+ opkg remove file.txt --from package-name # Remove from specific package
427
+ opkg remove essential-agent --from essentials # Remove dependency from package
428
+ opkg remove # Interactive mode (TTY only)`
429
+ );
430
+ let selectedPackage = null, packageDir;
431
+ if (options.from)
432
+ try {
433
+ let source = await resolveMutableSource({ cwd, packageName: options.from });
434
+ selectedPackage = source.packageName, packageDir = source.absolutePath;
435
+ } catch (error) {
436
+ throw new Error(error instanceof Error ? error.message : String(error));
437
+ }
438
+ else {
439
+ let selection = await interactivePackageSelect({
440
+ cwd,
441
+ message: "Select package to remove files from",
442
+ allowWorkspace: !0
443
+ });
444
+ if (!selection)
445
+ return;
446
+ let resolved = resolvePackageSelection(cwd, selection);
447
+ if (!resolved)
448
+ return;
449
+ selectedPackage = resolved.packageName, packageDir = resolved.packageDir;
450
+ }
451
+ let packageLabel = selectedPackage || "workspace package", displayPath = formatPathForDisplay(packageDir, cwd);
452
+ out.step(`From: ${packageLabel} (${displayPath})`), out.connector();
453
+ let selectedFiles = await interactiveFileSelect({
454
+ cwd,
455
+ basePath: packageDir,
456
+ message: `Select files or directories to remove from ${packageLabel}`,
457
+ placeholder: "Type to search...",
458
+ includeDirs: !0
459
+ });
460
+ if (!selectedFiles || selectedFiles.length === 0)
461
+ return;
462
+ let filesToProcess;
463
+ hasDirectorySelections(selectedFiles) ? (filesToProcess = await expandDirectorySelections(selectedFiles, packageDir), out.info(`Found ${filesToProcess.length} total file${filesToProcess.length === 1 ? "" : "s"} to remove`)) : filesToProcess = selectedFiles;
464
+ let resolvedName = selectedPackage ?? (await buildWorkspacePackageContext(cwd)).name;
465
+ try {
466
+ let result = await runRemoveFromSourcePipelineBatch(
467
+ selectedPackage,
468
+ packageDir,
469
+ resolvedName,
470
+ filesToProcess,
471
+ { ...options, execContext }
472
+ );
473
+ if (!result.success) throw new Error(result.error || "Remove operation failed");
474
+ result.data && await handleRemoveResult(result.data, options, cwd, out, interactive, !0);
475
+ } catch (error) {
476
+ if (error instanceof UserCancellationError) return;
477
+ throw error;
478
+ }
479
+ return;
480
+ }
481
+ await processRemoveResource(options.from, resource, options, cwd, execContext, out, interactive);
482
+ }
483
+ async function handleRemoveResult(data, options, cwd, out, interactive, skipHeader = !1) {
484
+ let { filesRemoved, sourcePath, packageName: resolvedName, removedPaths, removalType, removedDependency, removedFromSection } = data, isWorkspaceRoot = sourcePath.includes(".openpackage") && !sourcePath.includes(".openpackage/packages");
485
+ if (removalType === "dependency")
486
+ if (interactive) {
487
+ if (!skipHeader) {
488
+ let pkgLabel = isWorkspaceRoot ? "workspace package" : resolvedName, displayPath = formatPathForDisplay(sourcePath, cwd);
489
+ out.info(`From: ${pkgLabel} (${displayPath})`);
490
+ }
491
+ out.success(`Removed dependency ${removedDependency} from ${resolvedName}`);
492
+ } else {
493
+ let section = removedFromSection || "dependencies", manifestPath = join5(sourcePath, "openpackage.yml"), displayPath = formatPathForDisplay(manifestPath, cwd);
494
+ out.success(`Removed from ${section} (${displayPath})`);
495
+ let connector = getTreeConnector(!0);
496
+ out.message(` ${connector}${removedDependency}`);
497
+ }
498
+ else {
499
+ if (interactive) {
500
+ if (!skipHeader) {
501
+ let pkgLabel = isWorkspaceRoot ? "workspace package" : resolvedName, displayPath = formatPathForDisplay(sourcePath, cwd);
502
+ out.info(`From: ${pkgLabel} (${displayPath})`);
503
+ }
504
+ let target = isWorkspaceRoot ? "workspace package" : resolvedName;
505
+ options.dryRun ? out.success(`(dry-run) Would remove ${filesRemoved} file${filesRemoved !== 1 ? "s" : ""} from ${target}`) : out.success(`Removed ${filesRemoved} file${filesRemoved !== 1 ? "s" : ""} from ${target}`);
506
+ } else {
507
+ let target = isWorkspaceRoot ? "workspace package" : resolvedName, displayPath = formatPathForDisplay(sourcePath, cwd);
508
+ options.dryRun ? out.success(`(dry-run) Would remove ${filesRemoved} file${filesRemoved !== 1 ? "s" : ""} from ${target} (${displayPath})`) : out.success(`Removed ${filesRemoved} file${filesRemoved !== 1 ? "s" : ""} from ${target} (${displayPath})`);
509
+ }
510
+ if (removedPaths.length > 0) {
511
+ let sortedPaths = [...removedPaths].sort((a, b) => a.localeCompare(b));
512
+ if (interactive) {
513
+ let displayPaths = sortedPaths.slice(0, 10), more = sortedPaths.length > 10 ? `
514
+ ... and ${sortedPaths.length - 10} more` : "";
515
+ out.note(displayPaths.join(`
516
+ `) + more, "Removed files");
517
+ } else
518
+ for (let i = 0; i < sortedPaths.length; i++)
519
+ out.message(` ${getTreeConnector(i === sortedPaths.length - 1)}${sortedPaths[i]}`);
520
+ }
521
+ }
522
+ !options.dryRun && !isWorkspaceRoot && (await readWorkspaceIndex(cwd)).index.packages[resolvedName] && out.message(`Run \`opkg install ${resolvedName}\` to sync.`);
523
+ }
524
+ async function processRemoveResource(packageName, resource, options, cwd, execContext, out, interactive) {
525
+ let headerShown = !1, result = await runRemoveFromSourcePipeline(packageName, resource, {
526
+ ...options,
527
+ execContext,
528
+ beforeConfirm: (info) => {
529
+ if (interactive) {
530
+ let pkgLabel = info.packageName, displayPath = formatPathForDisplay(info.sourcePath, cwd);
531
+ out.info(`From: ${pkgLabel} (${displayPath})`);
532
+ }
533
+ headerShown = interactive;
534
+ }
535
+ });
536
+ if (!result.success) throw new Error(result.error || "Remove operation failed");
537
+ result.data && await handleRemoveResult(result.data, options, cwd, out, interactive, headerShown);
538
+ }
539
+ export {
540
+ setupRemoveCommand
541
+ };
542
+ //# sourceMappingURL=remove-G5NRC7LD.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/commands/remove.ts", "../../core/src/core/remove/remove-from-source-pipeline.ts", "../../core/src/core/remove/removal-collector.ts", "../../core/src/core/remove/remove-input-classifier.ts", "../../core/src/core/remove/remove-dependency-flow.ts", "../../core/src/core/remove/removal-confirmation.ts", "../src/utils/interactive-package-selector.ts"],
4
+ "sourcesContent": ["import type { Command } from 'commander';\nimport { join } from 'path';\n\nimport { runRemoveFromSourcePipeline, runRemoveFromSourcePipelineBatch, type RemoveFromSourceOptions } from '@opkg/core/core/remove/remove-from-source-pipeline.js';\nimport { resolveMutableSource } from '@opkg/core/core/source-resolution/resolve-mutable-source.js';\nimport { readWorkspaceIndex } from '@opkg/core/utils/workspace-index-yml.js';\nimport { formatPathForDisplay, getTreeConnector } from '@opkg/core/utils/formatters.js';\nimport { interactiveFileSelect } from '../utils/interactive-file-selector.js';\nimport { expandDirectorySelections, hasDirectorySelections } from '@opkg/core/utils/expand-directory-selections.js';\nimport { interactivePackageSelect, resolvePackageSelection } from '../utils/interactive-package-selector.js';\nimport { createCliExecutionContext } from '../cli/context.js';\nimport { buildWorkspacePackageContext } from '@opkg/core/utils/workspace-package-context.js';\nimport { UserCancellationError } from '@opkg/core/utils/errors.js';\nimport { createInteractionPolicy, PromptTier } from '@opkg/core/core/interaction-policy.js';\nimport { resolveOutput } from '@opkg/core/core/ports/resolve.js';\nimport type { ExecutionContext } from '@opkg/core/types/execution-context.js';\n\nexport async function setupRemoveCommand(args: any[]): Promise<void> {\n const [resource, options, command] = args as [string | undefined, RemoveFromSourceOptions & { from?: string }, Command];\n const cwd = process.cwd();\n const programOpts = command.parent?.opts() || {};\n\n // Determine interactive mode: interactive when no resource arg, plain otherwise\n const interactive = !resource;\n\n const execContext = await createCliExecutionContext({\n global: false,\n cwd: programOpts.cwd,\n interactive,\n outputMode: interactive ? 'rich' : 'plain',\n });\n\n const policy = createInteractionPolicy({\n interactive,\n force: options.force,\n });\n execContext.interactionPolicy = policy;\n\n const out = resolveOutput(execContext);\n\n // If no resource provided, show interactive selector\n if (!resource) {\n if (!policy.canPrompt(PromptTier.OptionalMenu)) {\n throw new Error(\n '<resource> argument is required in non-interactive mode.\\n' +\n 'Usage: opkg remove <resource> [options]\\n\\n' +\n 'Examples:\\n' +\n ' opkg remove file.txt # Remove file from workspace package\\n' +\n ' opkg remove file.txt --from package-name # Remove from specific package\\n' +\n ' opkg remove essential-agent --from essentials # Remove dependency from package\\n' +\n ' opkg remove # Interactive mode (TTY only)'\n );\n }\n \n // Step 1: Select package (if not specified via --from)\n let selectedPackage: string | null = null;\n let packageDir: string;\n \n if (options.from) {\n // Package specified via --from option - resolve from workspace or global\n try {\n const source = await resolveMutableSource({ cwd, packageName: options.from });\n selectedPackage = source.packageName;\n packageDir = source.absolutePath;\n } catch (error) {\n throw new Error(error instanceof Error ? error.message : String(error));\n }\n } else {\n // Show interactive package selector\n const selection = await interactivePackageSelect({\n cwd,\n message: 'Select package to remove files from',\n allowWorkspace: true\n });\n \n if (!selection) {\n return;\n }\n \n const resolved = resolvePackageSelection(cwd, selection);\n if (!resolved) {\n return;\n }\n \n selectedPackage = resolved.packageName;\n packageDir = resolved.packageDir;\n }\n \n // Show package/source before file selection\n const packageLabel = selectedPackage || 'workspace package';\n const displayPath = formatPathForDisplay(packageDir, cwd);\n out.step(`From: ${packageLabel} (${displayPath})`);\n out.connector();\n \n // Step 2: Select files from package\n const selectedFiles = await interactiveFileSelect({\n cwd,\n basePath: packageDir,\n message: `Select files or directories to remove from ${packageLabel}`,\n placeholder: 'Type to search...',\n includeDirs: true\n });\n \n // Handle cancellation or empty selection\n if (!selectedFiles || selectedFiles.length === 0) {\n return;\n }\n \n // Expand any directory selections to individual files\n let filesToProcess: string[];\n if (hasDirectorySelections(selectedFiles)) {\n filesToProcess = await expandDirectorySelections(selectedFiles, packageDir);\n out.info(`Found ${filesToProcess.length} total file${filesToProcess.length === 1 ? '' : 's'} to remove`);\n } else {\n filesToProcess = selectedFiles;\n }\n\n const resolvedName = selectedPackage ?? (await buildWorkspacePackageContext(cwd)).name;\n\n // Batch remove: one confirmation, one removal pass\n try {\n const result = await runRemoveFromSourcePipelineBatch(\n selectedPackage,\n packageDir,\n resolvedName,\n filesToProcess,\n { ...options, execContext }\n );\n if (!result.success) throw new Error(result.error || 'Remove operation failed');\n if (result.data) await handleRemoveResult(result.data, options, cwd, out, interactive, true);\n } catch (error) {\n if (error instanceof UserCancellationError) return;\n throw error;\n }\n\n return;\n }\n \n // Process single resource (existing behavior)\n await processRemoveResource(options.from, resource, options, cwd, execContext, out, interactive);\n}\n\n/** Shared result handling for single-path and batch removal.\n * @param skipHeader - When true (interactive remove), header was already shown before selection\n */\nasync function handleRemoveResult(\n data: { filesRemoved: number; sourcePath: string; packageName: string; removedPaths: string[]; removalType?: string; removedDependency?: string; removedFromSection?: string },\n options: RemoveFromSourceOptions & { from?: string },\n cwd: string,\n out: ReturnType<typeof resolveOutput>,\n interactive: boolean,\n skipHeader = false\n): Promise<void> {\n const { filesRemoved, sourcePath, packageName: resolvedName, removedPaths, removalType, removedDependency, removedFromSection } = data;\n const isWorkspaceRoot = sourcePath.includes('.openpackage') && !sourcePath.includes('.openpackage/packages');\n\n if (removalType === 'dependency') {\n // Dependency removal\n if (interactive) {\n if (!skipHeader) {\n const pkgLabel = isWorkspaceRoot ? 'workspace package' : resolvedName;\n const displayPath = formatPathForDisplay(sourcePath, cwd);\n out.info(`From: ${pkgLabel} (${displayPath})`);\n }\n out.success(`Removed dependency ${removedDependency} from ${resolvedName}`);\n } else {\n // Non-interactive: clean tree format\n // \u2713 Removed from dependencies (.openpackage/openpackage.yml)\n // \u2514\u2500\u2500 essentials\n const section = removedFromSection || 'dependencies';\n const manifestPath = join(sourcePath, 'openpackage.yml');\n const displayPath = formatPathForDisplay(manifestPath, cwd);\n out.success(`Removed from ${section} (${displayPath})`);\n const connector = getTreeConnector(true);\n out.message(` ${connector}${removedDependency}`);\n }\n } else {\n // File removal\n if (interactive) {\n if (!skipHeader) {\n const pkgLabel = isWorkspaceRoot ? 'workspace package' : resolvedName;\n const displayPath = formatPathForDisplay(sourcePath, cwd);\n out.info(`From: ${pkgLabel} (${displayPath})`);\n }\n const target = isWorkspaceRoot ? 'workspace package' : resolvedName;\n if (options.dryRun) {\n out.success(`(dry-run) Would remove ${filesRemoved} file${filesRemoved !== 1 ? 's' : ''} from ${target}`);\n } else {\n out.success(`Removed ${filesRemoved} file${filesRemoved !== 1 ? 's' : ''} from ${target}`);\n }\n } else {\n // Non-interactive: clean format with path in success line\n const target = isWorkspaceRoot ? 'workspace package' : resolvedName;\n const displayPath = formatPathForDisplay(sourcePath, cwd);\n if (options.dryRun) {\n out.success(`(dry-run) Would remove ${filesRemoved} file${filesRemoved !== 1 ? 's' : ''} from ${target} (${displayPath})`);\n } else {\n out.success(`Removed ${filesRemoved} file${filesRemoved !== 1 ? 's' : ''} from ${target} (${displayPath})`);\n }\n }\n\n if (removedPaths.length > 0) {\n const sortedPaths = [...removedPaths].sort((a, b) => a.localeCompare(b));\n if (interactive) {\n const maxDisplay = 10;\n const displayPaths = sortedPaths.slice(0, maxDisplay);\n const more = sortedPaths.length > maxDisplay ? `\\n... and ${sortedPaths.length - maxDisplay} more` : '';\n out.note(displayPaths.join('\\n') + more, 'Removed files');\n } else {\n for (let i = 0; i < sortedPaths.length; i++) {\n out.message(` ${getTreeConnector(i === sortedPaths.length - 1)}${sortedPaths[i]}`);\n }\n }\n }\n }\n\n if (!options.dryRun && !isWorkspaceRoot) {\n const workspaceIndexRecord = await readWorkspaceIndex(cwd);\n if (workspaceIndexRecord.index.packages[resolvedName]) {\n out.message(`Run \\`opkg install ${resolvedName}\\` to sync.`);\n }\n }\n}\n\nasync function processRemoveResource(\n packageName: string | undefined,\n resource: string,\n options: RemoveFromSourceOptions & { from?: string },\n cwd: string,\n execContext: ExecutionContext,\n out: ReturnType<typeof resolveOutput>,\n interactive: boolean\n): Promise<void> {\n let headerShown = false;\n const result = await runRemoveFromSourcePipeline(packageName, resource, {\n ...options,\n execContext,\n beforeConfirm: (info) => {\n // Show context header before confirmation prompt (interactive only).\n // Non-interactive: skip header here, let handleRemoveResult show the clean format.\n if (interactive) {\n const pkgLabel = info.packageName;\n const displayPath = formatPathForDisplay(info.sourcePath, cwd);\n out.info(`From: ${pkgLabel} (${displayPath})`);\n }\n headerShown = interactive;\n }\n });\n if (!result.success) throw new Error(result.error || 'Remove operation failed');\n if (result.data) await handleRemoveResult(result.data, options, cwd, out, interactive, headerShown);\n}\n", "import { resolve as resolvePath, join } from 'path';\n\nimport type { CommandResult } from '../../types/index.js';\nimport type { ExecutionContext } from '../../types/execution-context.js';\nimport { FILE_PATTERNS } from '../../constants/index.js';\nimport { resolveMutableSource } from '../source-resolution/resolve-mutable-source.js';\nimport { assertMutableSourceOrThrow } from '../source-mutability.js';\nimport { collectRemovalEntries, type RemovalEntry } from './removal-collector.js';\nimport { classifyRemoveInput } from './remove-input-classifier.js';\nimport { runRemoveDependencyFlow } from './remove-dependency-flow.js';\nimport { confirmRemoval } from './removal-confirmation.js';\nimport { exists, remove } from '../../utils/fs.js';\nimport { logger } from '../../utils/logger.js';\nimport { UserCancellationError } from '../../utils/errors.js';\nimport { cleanupEmptyParents } from '../../utils/cleanup-empty-parents.js';\nimport { resolveSourceOperationArguments } from '../../utils/source-operation-arguments.js';\nimport { buildWorkspacePackageContext } from '../workspace-package-context.js';\n\n\nexport interface RemoveFromSourceOptions {\n force?: boolean;\n dryRun?: boolean;\n execContext?: ExecutionContext;\n /** Called before confirmation prompt (for non-interactive: show header before \"Confirm removal?\") */\n beforeConfirm?: (info: { packageName: string; sourcePath: string }) => void;\n}\n\nexport interface RemoveFromSourceResult {\n packageName: string;\n filesRemoved: number;\n sourcePath: string;\n sourceType: 'workspace' | 'global';\n removedPaths: string[];\n /** Set when a dependency was removed (vs. file removal) */\n removalType?: 'files' | 'dependency';\n /** Dependency name when removalType is 'dependency' */\n removedDependency?: string;\n /** Which manifest section the dependency was removed from */\n removedFromSection?: 'dependencies' | 'dev-dependencies';\n}\n\nexport async function runRemoveFromSourcePipeline(\n packageName: string | undefined,\n pathArg: string | undefined,\n options: RemoveFromSourceOptions = {}\n): Promise<CommandResult<RemoveFromSourceResult>> {\n const cwd = process.cwd();\n\n // Resolve arguments: packageName from --from option, pathArg is required\n let resolvedPackageName: string | null;\n let resolvedPath: string;\n try {\n const resolved = await resolveSourceOperationArguments(\n cwd,\n packageName,\n pathArg,\n { command: 'remove', checkWorkspaceRoot: true }\n );\n resolvedPackageName = resolved.resolvedPackageName;\n resolvedPath = resolved.resolvedPath;\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n\n // Build removal context (workspace root or mutable package source)\n let packageRootDir: string;\n let resolvedName: string;\n let sourceType: 'workspace' | 'global';\n \n if (resolvedPackageName === null) {\n // No package name: remove from workspace root (.openpackage/)\n try {\n const context = await buildWorkspacePackageContext(cwd);\n packageRootDir = context.packageRootDir;\n resolvedName = context.name;\n sourceType = 'workspace';\n \n logger.info('Removing files from workspace package', {\n sourcePath: packageRootDir,\n inputPath: resolvedPath\n });\n } catch (error) {\n return { \n success: false, \n error: error instanceof Error ? error.message : String(error) \n };\n }\n } else {\n // Package name provided: resolve mutable source\n let source;\n try {\n source = await resolveMutableSource({ cwd, packageName: resolvedPackageName });\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n \n // Additional safety check\n assertMutableSourceOrThrow(source.absolutePath, { packageName: source.packageName, command: 'remove' });\n\n packageRootDir = source.absolutePath;\n resolvedName = source.packageName;\n sourceType = source.absolutePath.includes(`${cwd}/.openpackage/packages/`) \n ? 'workspace' as const\n : 'global' as const;\n \n logger.info('Removing files from package source', {\n packageName: source.packageName,\n sourcePath: source.absolutePath,\n sourceType: source.sourceType,\n inputPath: resolvedPath\n });\n }\n\n // Classify input: file/directory path vs. dependency (./ = file, bare name = dep-first)\n const manifestPath = join(packageRootDir, FILE_PATTERNS.OPENPACKAGE_YML);\n const classification = await classifyRemoveInput(resolvedPath, packageRootDir, manifestPath);\n\n if (classification?.mode === 'dependency') {\n // Dependency removal: update manifest\n const depResult = await runRemoveDependencyFlow(\n manifestPath,\n classification.dependencyName!,\n resolvedName\n );\n if (!depResult.removed) {\n return {\n success: false,\n error: `Dependency '${resolvedPath}' not found in package.`\n };\n }\n return {\n success: true,\n data: {\n packageName: resolvedName,\n filesRemoved: 0,\n sourcePath: packageRootDir,\n sourceType,\n removedPaths: [],\n removalType: 'dependency',\n removedDependency: classification.dependencyName,\n removedFromSection: depResult.section\n }\n };\n }\n\n // File removal: collect and remove files\n let entries: RemovalEntry[];\n try {\n entries = await collectRemovalEntries(packageRootDir, resolvedPath);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n\n if (entries.length === 0) {\n return {\n success: false,\n error: `No files found to remove at path: ${resolvedPath}`\n };\n }\n\n options.beforeConfirm?.({\n packageName: resolvedName,\n sourcePath: packageRootDir\n });\n\n // Confirm removal with user (unless --force or --dry-run).\n const doConfirm = () => confirmRemoval(resolvedName, entries, options);\n try {\n await doConfirm();\n } catch (error) {\n if (error instanceof UserCancellationError) {\n throw error;\n }\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Removal cancelled by user.'\n };\n }\n\n // Handle dry-run\n if (options.dryRun) {\n logger.info('Dry-run mode: no files will be removed', {\n packageName: resolvedName,\n filesCount: entries.length\n });\n\n return {\n success: true,\n data: {\n packageName: resolvedName,\n filesRemoved: entries.length,\n sourcePath: packageRootDir,\n sourceType,\n removedPaths: entries.map(e => e.registryPath),\n removalType: 'files'\n }\n };\n }\n\n // Remove files\n const removedPaths: string[] = [];\n const removedAbsolutePaths: string[] = [];\n\n for (const entry of entries) {\n if (await exists(entry.packagePath)) {\n await remove(entry.packagePath);\n removedPaths.push(entry.registryPath);\n removedAbsolutePaths.push(entry.packagePath);\n logger.debug('Removed file', { path: entry.packagePath });\n }\n }\n\n // Clean up empty directories\n await cleanupEmptyParents(packageRootDir, removedAbsolutePaths);\n\n logger.info('Files removed from package source', {\n packageName: resolvedName,\n filesRemoved: removedPaths.length\n });\n\n return {\n success: true,\n data: {\n packageName: resolvedName,\n filesRemoved: removedPaths.length,\n sourcePath: packageRootDir,\n sourceType,\n removedPaths,\n removalType: 'files'\n }\n };\n}\n\n/**\n * Run removal for multiple paths as a single batch (one confirmation, one removal).\n * Used when interactive selection yields multiple files.\n */\nexport async function runRemoveFromSourcePipelineBatch(\n packageName: string | null,\n packageRootDir: string,\n resolvedName: string,\n pathArgs: string[],\n options: RemoveFromSourceOptions = {}\n): Promise<CommandResult<RemoveFromSourceResult>> {\n const sourceType: 'workspace' | 'global' =\n packageRootDir.includes(`${process.cwd()}/.openpackage/packages/`) ? 'workspace' : 'global';\n\n const allEntries: RemovalEntry[] = [];\n const seenRegistryPaths = new Set<string>();\n\n for (const pathArg of pathArgs) {\n try {\n const entries = await collectRemovalEntries(packageRootDir, pathArg);\n for (const entry of entries) {\n if (!seenRegistryPaths.has(entry.registryPath)) {\n seenRegistryPaths.add(entry.registryPath);\n allEntries.push(entry);\n }\n }\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n }\n\n if (allEntries.length === 0) {\n return { success: false, error: 'No files found to remove.' };\n }\n\n try {\n await confirmRemoval(resolvedName, allEntries, options);\n } catch (error) {\n if (error instanceof UserCancellationError) {\n throw error;\n }\n return { success: false, error: error instanceof Error ? error.message : 'Removal cancelled by user.' };\n }\n\n if (options.dryRun) {\n return {\n success: true,\n data: {\n packageName: resolvedName,\n filesRemoved: allEntries.length,\n sourcePath: packageRootDir,\n sourceType,\n removedPaths: allEntries.map(e => e.registryPath),\n removalType: 'files'\n }\n };\n }\n\n const removedPaths: string[] = [];\n const removedAbsolutePaths: string[] = [];\n\n for (const entry of allEntries) {\n if (await exists(entry.packagePath)) {\n await remove(entry.packagePath);\n removedPaths.push(entry.registryPath);\n removedAbsolutePaths.push(entry.packagePath);\n }\n }\n\n await cleanupEmptyParents(packageRootDir, removedAbsolutePaths);\n\n return {\n success: true,\n data: {\n packageName: resolvedName,\n filesRemoved: removedPaths.length,\n sourcePath: packageRootDir,\n sourceType,\n removedPaths,\n removalType: 'files'\n }\n };\n}\n", "import { join, relative, sep } from 'path';\n\nimport { exists, isDirectory, isFile, walkFiles } from '../../utils/fs.js';\nimport { normalizePathForProcessing } from '../../utils/path-normalization.js';\n\nexport interface RemovalEntry {\n packagePath: string; // Absolute path in package source\n registryPath: string; // Relative path for display (normalized)\n}\n\n/**\n * Collect files to remove from package source based on path pattern.\n * \n * @param packageRootDir - Absolute path to package root\n * @param pathPattern - Path pattern relative to package root (file or directory)\n * @returns Array of files to remove\n */\nexport async function collectRemovalEntries(\n packageRootDir: string,\n pathPattern: string\n): Promise<RemovalEntry[]> {\n const entries: RemovalEntry[] = [];\n \n // Normalize the input path\n const normalizedPattern = normalizePathForProcessing(pathPattern) || pathPattern;\n const targetPath = join(packageRootDir, normalizedPattern);\n\n // Check if target exists\n if (!(await exists(targetPath))) {\n throw new Error(\n `Path '${pathPattern}' not found in package.\\n` +\n `Package source: ${packageRootDir}`\n );\n }\n\n // Handle directory\n if (await isDirectory(targetPath)) {\n for await (const filePath of walkFiles(targetPath)) {\n const registryPath = relative(packageRootDir, filePath)\n .split(sep)\n .join('/');\n entries.push({\n packagePath: filePath,\n registryPath\n });\n }\n \n if (entries.length === 0) {\n throw new Error(\n `Directory '${pathPattern}' is empty.\\n` +\n `No files to remove.`\n );\n }\n \n return entries;\n }\n\n // Handle single file\n if (await isFile(targetPath)) {\n const registryPath = relative(packageRootDir, targetPath)\n .split(sep)\n .join('/');\n entries.push({\n packagePath: targetPath,\n registryPath\n });\n return entries;\n }\n\n throw new Error(\n `Path '${pathPattern}' is not a file or directory.\\n` +\n `Package source: ${packageRootDir}`\n );\n}\n", "import { join } from 'path';\n\nimport { exists, isDirectory, isFile } from '../../utils/fs.js';\nimport { findMatchingDependencyInManifest } from '../package-management.js';\nimport { normalizePathForProcessing } from '../../utils/path-normalization.js';\nimport { logger } from '../../utils/logger.js';\n\nexport type RemoveMode = 'file' | 'dependency';\n\nexport type RemoveInputClassification =\n | { mode: 'file'; path: string }\n | { mode: 'dependency'; dependencyName: string };\n\n/**\n * Classify remove command input to determine mode (file vs. dependency) and extract metadata.\n *\n * Resolution rules:\n * - `./path` or `../path`: Explicit path syntax \u2192 file only (no dependency check)\n * - Bare names: Dependency-first resolution; if both dep and file match, prefer dependency\n *\n * @param pathArg - User input (e.g. essential-agent, ./essential-agent, agents/essential-agent.md)\n * @param packageRootDir - Absolute path to package source directory\n * @param manifestPath - Absolute path to openpackage.yml\n * @returns Classification or null if neither file nor dependency matches\n */\nexport async function classifyRemoveInput(\n pathArg: string,\n packageRootDir: string,\n manifestPath: string\n): Promise<RemoveInputClassification | null> {\n const normalizedPath = normalizePathForProcessing(pathArg) || pathArg;\n const targetPath = join(packageRootDir, normalizedPath);\n\n const pathExists = await exists(targetPath);\n const hasFileMatch =\n pathExists &&\n ((await isFile(targetPath)) || (await isDirectory(targetPath)));\n\n // Explicit path (./ or ../) \u2192 file only, skip dependency lookup\n if (pathArg.startsWith('./') || pathArg.startsWith('../')) {\n if (hasFileMatch) {\n logger.debug('Classified explicit path as file', {\n pathArg,\n targetPath\n });\n return { mode: 'file', path: normalizedPath };\n }\n return null;\n }\n\n // Bare names: dependency-first resolution\n const matchedDependency = await findMatchingDependencyInManifest(manifestPath, pathArg);\n\n if (matchedDependency) {\n logger.debug('Classified remove input as dependency', {\n pathArg,\n dependencyName: matchedDependency\n });\n return { mode: 'dependency', dependencyName: matchedDependency };\n }\n\n if (hasFileMatch) {\n logger.debug('Classified remove input as file', {\n pathArg,\n targetPath\n });\n return { mode: 'file', path: normalizedPath };\n }\n\n return null;\n}\n", "import { removeDependencyFromManifest } from '../package-management.js';\nimport { logger } from '../../utils/logger.js';\n\nexport interface RemoveDependencyResult {\n packageName: string;\n targetManifest: string;\n dependencyName: string;\n removed: boolean;\n section?: 'dependencies' | 'dev-dependencies';\n}\n\n/**\n * Remove a dependency from a package manifest.\n * Mirrors add-dependency-flow for consistency.\n *\n * @param manifestPath - Absolute path to openpackage.yml\n * @param dependencyName - User-specified name (e.g. essential-agent, .opencode)\n * @param packageName - Display name for the package (for logging/result)\n * @returns Result with removal status\n */\nexport async function runRemoveDependencyFlow(\n manifestPath: string,\n dependencyName: string,\n packageName: string\n): Promise<RemoveDependencyResult> {\n const result = await removeDependencyFromManifest(manifestPath, dependencyName);\n\n logger.info(\n result.removed ? `Removed ${dependencyName} from ${manifestPath}` : `No matching dependency found for ${dependencyName}`\n );\n\n return {\n packageName,\n targetManifest: manifestPath,\n dependencyName,\n removed: result.removed,\n section: result.section\n };\n}\n", "import { UserCancellationError } from '../../utils/errors.js';\nimport type { RemovalEntry } from './removal-collector.js';\nimport { PromptTier } from '../../core/interaction-policy.js';\nimport type { OutputPort } from '../ports/output.js';\nimport type { PromptPort } from '../ports/prompt.js';\nimport { resolvePrompt } from '../ports/resolve.js';\n\nexport interface RemovalConfirmationOptions {\n force?: boolean;\n dryRun?: boolean;\n execContext?: { interactionPolicy?: { canPrompt(tier: PromptTier): boolean }; prompt?: PromptPort; output?: OutputPort };\n output?: OutputPort;\n}\n\n/**\n * Confirm removal operation with user.\n * Uses the PromptPort from the execution context so the confirmation\n * renders consistently with the committed output mode (rich or plain).\n *\n * @param packageName - Name of the package\n * @param entries - Files to be removed\n * @param options - Confirmation options\n * @returns true if user confirms, false otherwise\n * @throws UserCancellationError if user cancels\n */\nexport async function confirmRemoval(\n packageName: string,\n entries: RemovalEntry[],\n options: RemovalConfirmationOptions = {}\n): Promise<boolean> {\n // Skip confirmation if force flag is set or dry-run\n if (options.force || options.dryRun) {\n return true;\n }\n\n const policy = options.execContext?.interactionPolicy;\n if (!policy?.canPrompt(PromptTier.Confirmation)) {\n throw new Error('Removal requires confirmation. Use --force in non-interactive mode.');\n }\n\n const prm = resolvePrompt(options.execContext);\n const confirmed = await prm.confirm('Confirm removal?', false);\n if (!confirmed) {\n throw new UserCancellationError();\n }\n return true;\n}\n", "/**\n * Interactive Package Selector\n * \n * Provides interactive package selection from available packages in .openpackage/packages/\n */\n\nimport { select } from '@clack/prompts';\nimport { getLocalPackagesDir, getLocalOpenPackageDir } from '@opkg/core/utils/paths.js';\nimport { exists, listDirectories } from '@opkg/core/utils/fs.js';\nimport { logger } from '@opkg/core/utils/logger.js';\nimport { join } from 'path';\nimport { FILE_PATTERNS } from '@opkg/core/constants/index.js';\n\n/**\n * Options for interactive package selection\n */\nexport interface PackageSelectionOptions {\n /** Base directory (workspace root) */\n cwd: string;\n \n /** Prompt message to display */\n message?: string;\n \n /** Include workspace package as an option (default: true) */\n allowWorkspace?: boolean;\n}\n\n/**\n * Package option for the selector\n */\ninterface PackageOption {\n value: string;\n label: string;\n hint?: string;\n}\n\n/**\n * Special value to represent the workspace package\n */\nexport const WORKSPACE_PACKAGE = '__workspace__';\n\n/**\n * Display an interactive package selector\n * \n * @param options - Selection options\n * @returns Selected package name, WORKSPACE_PACKAGE for workspace, or null if cancelled\n * \n * @example\n * const packageName = await interactivePackageSelect({ \n * cwd: process.cwd(),\n * allowWorkspace: true \n * });\n * \n * if (packageName === WORKSPACE_PACKAGE) {\n * // Handle workspace package\n * } else if (packageName) {\n * // Handle regular package\n * } else {\n * // User cancelled\n * }\n */\nexport async function interactivePackageSelect(\n options: PackageSelectionOptions\n): Promise<string | null> {\n const {\n cwd,\n message = 'Select a package',\n allowWorkspace = true\n } = options;\n \n try {\n const packages = await getAvailablePackages(cwd);\n \n // Check if we have any packages\n if (packages.length === 0 && !allowWorkspace) {\n logger.warn('No packages found');\n return null;\n }\n \n // Build options list\n const packageOptions: PackageOption[] = [];\n \n // Add workspace package option if allowed\n if (allowWorkspace) {\n packageOptions.push({\n value: WORKSPACE_PACKAGE,\n label: 'workspace package',\n hint: 'Files in .openpackage/'\n });\n }\n \n // Add regular packages\n for (const pkg of packages) {\n packageOptions.push({\n value: pkg,\n label: pkg,\n hint: `Package in .openpackage/packages/${pkg}`\n });\n }\n \n if (packageOptions.length === 0) {\n logger.warn('No packages available for selection');\n return null;\n }\n \n // Show selection prompt\n const selected = await select({\n message,\n options: packageOptions.map(opt => ({\n value: opt.value,\n label: opt.label,\n hint: opt.hint\n }))\n });\n \n // Handle cancellation\n if (typeof selected === 'symbol') {\n logger.debug('Package selection cancelled');\n return null;\n }\n \n logger.debug(`User selected package: ${selected}`);\n return selected as string;\n \n } catch (error) {\n logger.error('Error during package selection', { error });\n throw new Error(`Package selection failed: ${error}`);\n }\n}\n\n/**\n * Get list of available packages in .openpackage/packages/\n * \n * @param cwd - Workspace root directory\n * @returns Array of package names\n */\nasync function getAvailablePackages(cwd: string): Promise<string[]> {\n const packagesDir = getLocalPackagesDir(cwd);\n \n // Check if packages directory exists\n if (!(await exists(packagesDir))) {\n logger.debug('Packages directory does not exist', { packagesDir });\n return [];\n }\n \n try {\n // List all directories in packages/\n const dirs = await listDirectories(packagesDir);\n \n // Filter to only include directories with openpackage.yml\n const packages: string[] = [];\n \n for (const dir of dirs) {\n const packageYmlPath = join(packagesDir, dir, FILE_PATTERNS.OPENPACKAGE_YML);\n \n // Check if this is a scoped package directory (@scope)\n if (dir.startsWith('@')) {\n // List packages inside the scope directory\n const scopeDir = join(packagesDir, dir);\n const scopedPackages = await listDirectories(scopeDir);\n \n for (const scopedPkg of scopedPackages) {\n const scopedYmlPath = join(scopeDir, scopedPkg, FILE_PATTERNS.OPENPACKAGE_YML);\n if (await exists(scopedYmlPath)) {\n packages.push(`${dir}/${scopedPkg}`);\n }\n }\n } else if (await exists(packageYmlPath)) {\n packages.push(dir);\n }\n }\n \n // Sort packages alphabetically\n packages.sort((a, b) => a.localeCompare(b));\n \n logger.debug(`Found ${packages.length} packages`, { packages });\n return packages;\n \n } catch (error) {\n logger.error('Error scanning packages directory', { error, packagesDir });\n return [];\n }\n}\n\n/**\n * Resolve package name and directory from selection result\n * \n * @param cwd - Workspace root directory\n * @param selection - Result from interactivePackageSelect()\n * @returns Package name (or null for workspace) and absolute directory path\n */\nexport function resolvePackageSelection(\n cwd: string,\n selection: string | null\n): { packageName: string | null; packageDir: string } | null {\n if (!selection) {\n return null;\n }\n \n if (selection === WORKSPACE_PACKAGE) {\n return {\n packageName: null,\n packageDir: getLocalOpenPackageDir(cwd)\n };\n }\n \n return {\n packageName: selection,\n packageDir: join(getLocalPackagesDir(cwd), selection)\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["join", "join", "join", "join", "join", "join", "join", "join"]
7
+ }