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,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/commands/uninstall.ts", "../../core/src/core/resources/resource-builder.ts", "../../core/src/core/resources/resource-resolver.ts", "../../core/src/core/resources/scope-traversal.ts", "../../core/src/core/resources/disambiguation-prompt.ts", "../../core/src/core/uninstall/uninstall-executor.ts", "../../core/src/core/uninstall/uninstall-reporter.ts", "../../core/src/core/uninstall/direct-uninstall-flow.ts", "../../core/src/core/uninstall/workspace-resource-collector.ts"],
4
+ "sourcesContent": ["/**\n * Uninstall Command (CLI layer)\n *\n * Thin shell over core/uninstall/ pipelines.\n * Handles CLI arg parsing, spinner display, and result formatting.\n */\n\nimport { join } from 'path';\nimport type { Command } from 'commander';\n\nimport type { UninstallOptions } from '@opkg/core/types/index.js';\nimport { ValidationError } from '@opkg/core/utils/errors.js';\nimport { formatPathForDisplay } from '@opkg/core/utils/formatters.js';\nimport { createCliExecutionContext } from '../cli/context.js';\nimport { resolveOutput, resolvePrompt } from '@opkg/core/core/ports/resolve.js';\nimport { runDirectUninstallFlow } from '@opkg/core/core/uninstall/direct-uninstall-flow.js';\nimport { executeUninstallCandidate } from '@opkg/core/core/uninstall/uninstall-executor.js';\nimport {\n collectWorkspaceResources,\n buildGroupedUninstallOptions,\n executeBatchUninstall,\n type UninstallChoiceValue,\n} from '@opkg/core/core/uninstall/workspace-resource-collector.js';\n\ninterface UninstallCommandOptions extends UninstallOptions {\n global?: boolean;\n interactive?: boolean;\n}\n\nasync function uninstallCommand(\n nameArg: string | undefined,\n options: UninstallCommandOptions,\n command: Command\n) {\n const programOpts = command.parent?.opts() || {};\n const traverseOpts = {\n programOpts,\n ...(options.global ? { globalOnly: true as const } : { projectOnly: true as const }),\n };\n\n if (options.interactive) {\n await handleListUninstall(nameArg, options, programOpts, traverseOpts);\n return;\n }\n\n if (!nameArg) {\n throw new ValidationError('Resource or package name is required. Use --interactive to interactively select.');\n }\n\n const result = await runDirectUninstallFlow(\n nameArg,\n options,\n traverseOpts,\n (opts) => createCliExecutionContext({ ...opts, outputMode: opts.interactive ? 'rich' : 'plain' }),\n );\n\n if (result.cancelled) {\n const ctx = await createCliExecutionContext({ interactive: false, outputMode: 'plain' });\n resolveOutput(ctx).info('Uninstall cancelled');\n }\n}\n\n// ---------------------------------------------------------------------------\n// Interactive selection: opkg un --interactive [package-name]\n// ---------------------------------------------------------------------------\n\nasync function handleListUninstall(\n packageFilter: string | undefined,\n options: UninstallCommandOptions,\n programOpts: Record<string, any>,\n traverseOpts: { programOpts?: Record<string, any>; globalOnly?: boolean; projectOnly?: boolean }\n) {\n const ctx = await createCliExecutionContext({ interactive: true, outputMode: 'rich' });\n const out = resolveOutput(ctx);\n const prm = resolvePrompt(ctx);\n\n const s = out.spinner();\n s.start('Loading installed resources');\n\n const collection = await collectWorkspaceResources(traverseOpts, packageFilter);\n\n if (packageFilter && collection.allResources.length === 0 && collection.allPackages.length === 0) {\n s.stop('No resources found');\n throw new ValidationError(`Package '${packageFilter}' not found.`);\n }\n\n const { groupedOptions, totalItems } = await buildGroupedUninstallOptions(collection, programOpts);\n\n if (totalItems === 0) {\n s.stop('No installed resources found');\n out.note('Run `opkg install --interactive` to install resources.', 'Info');\n return;\n }\n\n s.stop(`Found ${totalItems} item${totalItems === 1 ? '' : 's'}`);\n\n const selected = await prm.groupMultiselect<UninstallChoiceValue>(\n 'Select items to uninstall:',\n groupedOptions\n );\n\n if (!selected || selected.length === 0) {\n out.info('Uninstall cancelled');\n return;\n }\n\n out.step(`Uninstalling ${selected.length} item${selected.length === 1 ? '' : 's'}`);\n\n const summary = await executeBatchUninstall(\n selected,\n options,\n collection,\n programOpts,\n (opts) => createCliExecutionContext({ ...opts, outputMode: opts.interactive ? 'rich' : 'plain' }),\n executeUninstallCandidate\n );\n\n // Display results\n const breakdown = Array.from(summary.typeCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([type, count]) => `${count} ${type}`)\n .join(', ');\n\n out.success(`Successfully uninstalled ${summary.uninstalledCount} item${summary.uninstalledCount === 1 ? '' : 's'} (${breakdown})`);\n\n if (summary.allRemovedFiles.length > 0) {\n const cwd = process.cwd();\n const absolutePaths = [...new Set(\n summary.allRemovedFiles.map(({ path: p, targetDir }) => join(targetDir, p))\n )].sort((a, b) => a.localeCompare(b));\n const displayFiles = absolutePaths.slice(0, 10);\n const fileLines = displayFiles.map(f => formatPathForDisplay(f, cwd));\n const more = absolutePaths.length > 10 ? `\\n... and ${absolutePaths.length - 10} more` : '';\n out.note(fileLines.join('\\n') + more, 'Removed files');\n }\n\n out.success('Uninstall complete');\n}\n\n// ---------------------------------------------------------------------------\n// Command setup\n// ---------------------------------------------------------------------------\n\nexport async function setupUninstallCommand(args: any[]): Promise<void> {\n const [nameArg, options, command] = args as [string | undefined, UninstallCommandOptions, Command];\n await uninstallCommand(nameArg, options, command);\n}\n", "/**\n * Resource Builder\n *\n * Scans all packages in the workspace index and untracked files to build\n * a flat list of resolved resources for resource-level operations.\n *\n * Also provides a source-side builder that wraps the resource discoverer\n * to build resources from a package source directory.\n */\n\nimport { readWorkspaceIndex } from '../../utils/workspace-index-yml.js';\nimport { classifySourceKey } from './source-key-classifier.js';\nimport { getTargetPath } from '../../utils/workspace-index-helpers.js';\nimport { scanUntrackedFiles } from '../list/untracked-files-scanner.js';\nimport { normalizeType, RESOURCE_TYPE_ORDER } from './resource-registry.js';\nimport { deriveUntrackedResourceName } from './resource-naming.js';\nimport type { ResourceScope } from './scope-traversal.js';\n\nexport interface ResolvedResource {\n kind: 'tracked' | 'untracked';\n resourceName: string;\n resourceType: string;\n /** Package name (only for tracked resources) */\n packageName?: string;\n /** Source keys in workspace index that belong to this resource (only for tracked) */\n sourceKeys: Set<string>;\n /** Target file paths in the workspace (for display) */\n targetFiles: string[];\n scope: ResourceScope;\n /** Absolute path to source file/directory (source-side builder only) */\n sourcePath?: string;\n /** Install kind - file or directory (source-side builder only) */\n installKind?: 'file' | 'directory';\n}\n\nexport interface ResolvedPackage {\n packageName: string;\n version?: string;\n resourceCount: number;\n targetFiles: string[];\n scope: ResourceScope;\n}\n\nexport interface WorkspaceResources {\n resources: ResolvedResource[];\n packages: ResolvedPackage[];\n}\n\n/**\n * Build a flat list of all workspace resources (tracked and untracked)\n * for use in resource-level operations.\n */\nexport async function buildWorkspaceResources(\n targetDir: string,\n scope: ResourceScope\n): Promise<WorkspaceResources> {\n const { index } = await readWorkspaceIndex(targetDir);\n const packages = index.packages || {};\n\n const resources: ResolvedResource[] = [];\n const resolvedPackages: ResolvedPackage[] = [];\n\n // Process tracked packages (including workspace package \u2014 its installed\n // resources can be uninstalled; manifest removal is skipped for root package)\n for (const [pkgName, pkgEntry] of Object.entries(packages)) {\n const filesMapping = pkgEntry.files || {};\n const resourceMap = new Map<string, { sourceKeys: Set<string>; targetFiles: string[] }>();\n const allTargetFiles: string[] = [];\n\n for (const [sourceKey, mappings] of Object.entries(filesMapping)) {\n const { resourceType, resourceName } = classifySourceKey(sourceKey);\n\n const key = resourceType === 'other'\n ? 'other::other'\n : `${resourceType}::${resourceName}`;\n\n if (!resourceMap.has(key)) {\n resourceMap.set(key, { sourceKeys: new Set(), targetFiles: [] });\n }\n const entry = resourceMap.get(key)!;\n entry.sourceKeys.add(sourceKey);\n\n for (const mapping of mappings) {\n const target = getTargetPath(mapping);\n entry.targetFiles.push(target);\n allTargetFiles.push(target);\n }\n }\n\n // Create ResolvedResource entries for this package\n for (const [key, entry] of resourceMap) {\n const [resourceType, resourceName] = key.split('::');\n resources.push({\n kind: 'tracked',\n resourceName,\n resourceType,\n packageName: pkgName,\n sourceKeys: entry.sourceKeys,\n targetFiles: entry.targetFiles,\n scope,\n });\n }\n\n // Build ResolvedPackage\n resolvedPackages.push({\n packageName: pkgName,\n version: pkgEntry.version,\n resourceCount: resourceMap.size,\n targetFiles: allTargetFiles,\n scope,\n });\n }\n\n // Process untracked files\n const untrackedResult = await scanUntrackedFiles(targetDir);\n const untrackedMap = new Map<string, string[]>();\n\n for (const file of untrackedResult.files) {\n const resourceType = normalizeType(file.category);\n const resourceName = deriveUntrackedResourceName(file.workspacePath);\n const key = `${resourceType}::${resourceName}`;\n\n if (!untrackedMap.has(key)) {\n untrackedMap.set(key, []);\n }\n untrackedMap.get(key)!.push(file.workspacePath);\n }\n\n for (const [key, targetFiles] of untrackedMap) {\n const [resourceType, resourceName] = key.split('::');\n resources.push({\n kind: 'untracked',\n resourceName,\n resourceType,\n sourceKeys: new Set(),\n targetFiles,\n scope,\n });\n }\n\n // Sort resources by type order then name\n const typeOrderMap = new Map(RESOURCE_TYPE_ORDER.map((t, i) => [t, i]));\n resources.sort((a, b) => {\n const orderA = typeOrderMap.get(a.resourceType as any) ?? Infinity;\n const orderB = typeOrderMap.get(b.resourceType as any) ?? Infinity;\n if (orderA !== orderB) return orderA - orderB;\n return a.resourceName.localeCompare(b.resourceName);\n });\n\n // Sort packages by name\n resolvedPackages.sort((a, b) => a.packageName.localeCompare(b.packageName));\n\n return { resources, packages: resolvedPackages };\n}\n\n/**\n * Build a flat list of resources from a package source directory.\n * Wraps the resource discoverer and normalizes output into ResolvedResource[].\n * Used by commands that operate on package sources (add --copy, remove).\n *\n * @param sourceDir - Absolute path to the package source directory\n * @param scope - Resource scope for the source\n */\nexport async function buildSourceResources(\n sourceDir: string,\n scope: ResourceScope\n): Promise<WorkspaceResources> {\n const { discoverResources } = await import('../install/resource-discoverer.js');\n const discovery = await discoverResources(sourceDir, sourceDir);\n\n const resources: ResolvedResource[] = [];\n\n for (const discovered of discovery.all) {\n resources.push({\n kind: 'tracked',\n resourceName: discovered.displayName,\n resourceType: discovered.resourceType,\n sourceKeys: new Set([discovered.resourcePath]),\n targetFiles: [discovered.resourcePath],\n scope,\n sourcePath: discovered.filePath,\n installKind: discovered.installKind,\n });\n }\n\n // Sort by type order then name (same as workspace builder)\n const typeOrderMap = new Map(RESOURCE_TYPE_ORDER.map((t, i) => [t, i]));\n resources.sort((a, b) => {\n const orderA = typeOrderMap.get(a.resourceType as any) ?? Infinity;\n const orderB = typeOrderMap.get(b.resourceType as any) ?? Infinity;\n if (orderA !== orderB) return orderA - orderB;\n return a.resourceName.localeCompare(b.resourceName);\n });\n\n return { resources, packages: [] };\n}\n", "/**\n * Resource Resolver\n * \n * Resolves a user-provided name (e.g., `custom-rules`) to matching\n * resources and/or packages in the workspace. Used by the uninstall\n * command for direct `opkg un <name>` resolution.\n */\n\nimport { buildWorkspaceResources, type ResolvedResource, type ResolvedPackage } from './resource-builder.js';\nimport type { ResourceScope } from './scope-traversal.js';\nimport { logger } from '../../utils/logger.js';\n\nexport interface ResolutionCandidate {\n kind: 'resource' | 'package';\n resource?: ResolvedResource;\n package?: ResolvedPackage;\n}\n\nexport interface ResolutionResult {\n candidates: ResolutionCandidate[];\n}\n\n/**\n * Resolve a name to matching resources and packages within a single scope.\n * \n * Resources are matched case-insensitively by `resourceName`.\n * Packages are matched exactly (case-sensitive) by `packageName`.\n * \n * @param name - User-provided name to resolve\n * @param targetDir - Workspace directory to search\n * @param scope - Resource scope ('project' or 'global')\n * @returns Resolution result with matching candidates\n */\nexport async function resolveByName(\n name: string,\n targetDir: string,\n scope: ResourceScope\n): Promise<ResolutionResult> {\n const workspace = await buildWorkspaceResources(targetDir, scope);\n const candidates: ResolutionCandidate[] = [];\n const nameLower = name.toLowerCase();\n\n // Match resources by name (case-insensitive)\n for (const resource of workspace.resources) {\n if (resource.resourceName.toLowerCase() === nameLower) {\n candidates.push({ kind: 'resource', resource });\n }\n }\n\n // Match packages by name (exact, case-sensitive)\n for (const pkg of workspace.packages) {\n if (pkg.packageName === name) {\n candidates.push({ kind: 'package', package: pkg });\n }\n }\n\n return { candidates };\n}\n\n/**\n * Resolve a name across both project and global scopes.\n * \n * If the project directory has no .openpackage workspace, only global\n * results are returned (no error is thrown).\n * \n * @param name - User-provided name to resolve\n * @param projectDir - Project workspace directory\n * @param globalDir - Global workspace directory\n * @returns Combined resolution result from both scopes\n */\nexport async function resolveAcrossScopes(\n name: string,\n projectDir: string,\n globalDir: string\n): Promise<ResolutionResult> {\n let projectCandidates: ResolutionCandidate[] = [];\n\n try {\n const projectResult = await resolveByName(name, projectDir, 'project');\n projectCandidates = projectResult.candidates;\n } catch (error) {\n logger.debug('Project scope resolution skipped', {\n projectDir,\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n\n const globalResult = await resolveByName(name, globalDir, 'global');\n\n return {\n candidates: [...projectCandidates, ...globalResult.candidates],\n };\n}\n", "import { createExecutionContext } from '../execution-context.js';\nimport type { ExecutionContext } from '../../types/execution-context.js';\nimport { logger } from '../../utils/logger.js';\n\n/**\n * Resource scope for workspace operations\n */\nexport type ResourceScope = 'project' | 'global';\n\nexport interface ScopeEntry {\n scope: ResourceScope;\n context: ExecutionContext;\n}\n\nexport interface TraverseScopesOptions {\n /** Program-level options (e.g., from command.parent?.opts()) */\n programOpts?: Record<string, any>;\n /** If true, skip project scope entirely */\n globalOnly?: boolean;\n /** If true, skip global scope entirely */\n projectOnly?: boolean;\n}\n\n/**\n * Traverse applicable scopes (project and/or global) and run a callback for each.\n * \n * Project scope failures are silently skipped (common when no .openpackage workspace exists).\n * Global scope failures are also caught and logged.\n * \n * @param options - Scope traversal options\n * @param callback - Async function to run for each scope\n * @returns Array of results from successful scope callbacks\n */\nexport async function traverseScopes<T>(\n options: TraverseScopesOptions,\n callback: (entry: ScopeEntry) => Promise<T>\n): Promise<Array<{ scope: ResourceScope; result: T }>> {\n const results: Array<{ scope: ResourceScope; result: T }> = [];\n const cwd = options.programOpts?.cwd;\n\n // Project scope\n if (!options.globalOnly) {\n try {\n const context = await createExecutionContext({ global: false, cwd });\n const result = await callback({ scope: 'project', context });\n results.push({ scope: 'project', result });\n } catch (error) {\n logger.debug('Project scope traversal skipped', {\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Global scope\n if (!options.projectOnly) {\n try {\n const context = await createExecutionContext({ global: true, cwd });\n const result = await callback({ scope: 'global', context });\n results.push({ scope: 'global', result });\n } catch (error) {\n logger.debug('Global scope traversal skipped', {\n reason: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return results;\n}\n\n/**\n * Traverse scopes and flatten/merge results into a single array.\n * Convenience wrapper when you just need all items across scopes.\n */\nexport async function traverseScopesFlat<T>(\n options: TraverseScopesOptions,\n callback: (entry: ScopeEntry) => Promise<T[]>\n): Promise<T[]> {\n const scopeResults = await traverseScopes(options, callback);\n return scopeResults.flatMap(sr => sr.result);\n}\n", "/**\n * Disambiguation Prompt\n *\n * Reusable \"0/1/N\" resolution pattern for resource and package name disambiguation.\n * - 0 candidates \u2192 throws ValidationError\n * - 1 candidate \u2192 returns it directly (no prompt)\n * - N candidates \u2192 shows multiselect prompt for user to choose\n */\n\nimport type { OutputPort } from '../ports/output.js';\nimport type { PromptPort } from '../ports/prompt.js';\nimport { resolveOutput, resolvePrompt } from '../ports/resolve.js';\nimport { ValidationError } from '../../utils/errors.js';\n\nexport interface DisambiguationChoice<T> {\n title: string;\n description?: string;\n value: T;\n}\n\nexport interface DisambiguationOptions {\n /** Message shown when no candidates found. Use ${name} as placeholder for the searched name. */\n notFoundMessage?: string;\n /** Header message shown above choices when multiple candidates found. Use ${name} placeholder. */\n ambiguousHeader?: string;\n /** Prompt message for the multiselect */\n promptMessage?: string;\n /** Whether to allow multiple selections (default: true) */\n multi?: boolean;\n}\n\n/**\n * Disambiguate among candidates using the 0/1/N pattern.\n *\n * @param name - The name that was searched for (used in messages)\n * @param candidates - Array of candidate items\n * @param formatChoice - Function to format each candidate as a prompt choice\n * @param options - Configuration options\n * @param output - Optional OutputPort\n * @param prompt - Optional PromptPort\n * @returns Array of selected candidates (single-element for 1 match or multi=false)\n */\nexport async function disambiguate<T>(\n name: string,\n candidates: T[],\n formatChoice: (candidate: T, index: number) => DisambiguationChoice<T>,\n options: DisambiguationOptions = {},\n output?: OutputPort,\n prompt?: PromptPort\n): Promise<T[]> {\n const {\n notFoundMessage = `\"${name}\" not found.\\nRun \\`opkg ls\\` to see installed resources.`,\n ambiguousHeader = `\\n\"${name}\" matches multiple items:\\n`,\n promptMessage = 'Select which to act on:',\n multi = true,\n } = options;\n\n const out = output ?? resolveOutput();\n const prm = prompt ?? resolvePrompt();\n\n // 0 candidates \u2192 error\n if (candidates.length === 0) {\n throw new ValidationError(\n notFoundMessage.replace(/\\$\\{name\\}/g, name)\n );\n }\n\n // 1 candidate \u2192 auto-select\n if (candidates.length === 1) {\n return [candidates[0]];\n }\n\n // N candidates \u2192 prompt\n const choices = candidates.map((c, i) => {\n const choice = formatChoice(c, i);\n return {\n title: choice.title,\n description: choice.description,\n value: i,\n };\n });\n\n out.info(ambiguousHeader.replace(/\\$\\{name\\}/g, name).trim());\n\n if (multi) {\n const selectedIndices = await prm.multiselect<number>(\n promptMessage,\n choices\n );\n\n if (!selectedIndices || selectedIndices.length === 0) {\n return [];\n }\n return selectedIndices.map(i => candidates[i]);\n } else {\n // Single select mode\n const selectedIndex = await prm.select<number>(\n promptMessage,\n choices\n );\n\n if (selectedIndex === null || selectedIndex === undefined) {\n return [];\n }\n return [candidates[selectedIndex]];\n }\n}\n", "/**\n * Uninstall Executor\n *\n * Executes a single uninstall candidate (package or resource).\n * Extracted from the CLI command layer so the same logic can\n * be driven by any UI (CLI, GUI, tests).\n */\n\nimport path from 'path';\nimport type { UninstallOptions } from '../../types/index.js';\nimport type { ExecutionContext } from '../../types/execution-context.js';\nimport { ValidationError } from '../../utils/errors.js';\nimport { remove, exists } from '../../utils/fs.js';\nimport { buildPreservedDirectoriesSet } from '../platform/directory-preservation.js';\nimport { cleanupEmptyParents } from '../../utils/cleanup-empty-parents.js';\nimport { runUninstallPipeline, runSelectiveUninstallPipeline } from './uninstall-pipeline.js';\nimport { reportUninstallResult, reportResourceUninstallResult } from './uninstall-reporter.js';\nimport type { ResolutionCandidate } from '../resources/resource-resolver.js';\nimport { resolveOutput } from '../ports/resolve.js';\n\n/**\n * Execute a single uninstall candidate (package or individual resource).\n */\nexport async function executeUninstallCandidate(\n candidate: ResolutionCandidate,\n options: UninstallOptions,\n execContext: ExecutionContext\n): Promise<void> {\n if (candidate.kind === 'package') {\n const pkg = candidate.package!;\n const result = await runUninstallPipeline(pkg.packageName, options, execContext);\n if (!result.success) {\n throw new ValidationError(result.error || `Uninstall failed for ${pkg.packageName}`);\n }\n reportUninstallResult({\n packageName: pkg.packageName,\n removedFiles: result.data?.removedFiles ?? [],\n rootFilesUpdated: result.data?.rootFilesUpdated ?? []\n }, execContext);\n return;\n }\n\n const resource = candidate.resource!;\n\n if (resource.kind === 'tracked') {\n const result = await runSelectiveUninstallPipeline(\n resource.packageName!,\n resource.sourceKeys,\n options,\n execContext\n );\n if (!result.success) {\n throw new ValidationError(result.error || `Uninstall failed for ${resource.resourceName}`);\n }\n reportResourceUninstallResult({\n resourceName: resource.resourceName,\n resourceType: resource.resourceType,\n packageName: resource.packageName,\n removedFiles: result.data?.removedFiles ?? [],\n rootFilesUpdated: result.data?.rootFilesUpdated ?? []\n }, execContext);\n return;\n }\n\n // Untracked resource \u2014 direct file deletion\n const targetDir = execContext.targetDir;\n const out = resolveOutput(execContext);\n const removedFiles: string[] = [];\n\n if (options.dryRun) {\n out.info(`(dry-run) Would remove ${resource.targetFiles.length} file${resource.targetFiles.length === 1 ? '' : 's'}:`);\n const displayFiles = resource.targetFiles.slice(0, 10);\n for (const file of displayFiles) {\n out.message(` \u251C\u2500\u2500 ${file}`);\n }\n if (resource.targetFiles.length > 10) {\n out.message(` ... and ${resource.targetFiles.length - 10} more`);\n }\n }\n\n for (const filePath of resource.targetFiles) {\n const absPath = path.join(targetDir, filePath);\n if (options.dryRun) {\n removedFiles.push(filePath);\n } else if (await exists(absPath)) {\n await remove(absPath);\n removedFiles.push(filePath);\n }\n }\n\n // Cleanup empty parent directories\n if (!options.dryRun && removedFiles.length > 0) {\n const preservedDirs = buildPreservedDirectoriesSet(targetDir);\n const deletedAbsPaths = removedFiles.map(f => path.join(targetDir, f));\n await cleanupEmptyParents(targetDir, deletedAbsPaths, preservedDirs);\n }\n\n reportResourceUninstallResult({\n resourceName: resource.resourceName,\n resourceType: resource.resourceType,\n removedFiles,\n rootFilesUpdated: []\n }, execContext);\n}\n", "import type { OutputPort } from '../ports/output.js';\nimport { resolveOutput } from '../ports/resolve.js';\nimport { formatPathForDisplay } from '../../utils/formatters.js';\n\nexport interface UninstallResult {\n packageName: string;\n removedFiles: string[];\n rootFilesUpdated: string[];\n}\n\n/**\n * Report uninstall results to console\n */\nexport function reportUninstallResult(result: UninstallResult, context?: { outputMode?: string }, output?: OutputPort): void {\n // Suppress per-item output in rich mode (batch summary shown by caller)\n if (context?.outputMode === 'rich') return;\n \n const out = output ?? resolveOutput();\n const cwd = process.cwd();\n \n // Main success message\n out.success(`Uninstalled ${result.packageName}`);\n \n // Display removed files in tree-style format\n if (result.removedFiles.length > 0) {\n out.success(`Removed files: ${result.removedFiles.length}`);\n const sortedFiles = [...result.removedFiles].sort((a, b) => a.localeCompare(b));\n const displayFiles = sortedFiles.slice(0, 10);\n for (const file of displayFiles) {\n out.info(` \u251C\u2500\u2500 ${formatPathForDisplay(file, cwd)}`);\n }\n if (sortedFiles.length > 10) {\n out.info(` ... and ${sortedFiles.length - 10} more`);\n }\n }\n \n // Display updated root files in tree-style format\n if (result.rootFilesUpdated.length > 0) {\n out.success(`Updated root files: ${result.rootFilesUpdated.length}`);\n const sortedFiles = [...result.rootFilesUpdated].sort((a, b) => a.localeCompare(b));\n const displayFiles = sortedFiles.slice(0, 10);\n for (const file of displayFiles) {\n out.info(` \u251C\u2500\u2500 ${formatPathForDisplay(file, cwd)}`);\n }\n if (sortedFiles.length > 10) {\n out.info(` ... and ${sortedFiles.length - 10} more`);\n }\n }\n}\n\nexport interface ResourceUninstallResult {\n resourceName: string;\n resourceType: string;\n packageName?: string;\n removedFiles: string[];\n rootFilesUpdated: string[];\n}\n\n/**\n * Report resource-level uninstall results to console\n */\nexport function reportResourceUninstallResult(result: ResourceUninstallResult, context?: { outputMode?: string }, output?: OutputPort): void {\n // Suppress per-item output in rich mode (batch summary shown by caller)\n if (context?.outputMode === 'rich') return;\n \n const out = output ?? resolveOutput();\n const cwd = process.cwd();\n \n // Main success message\n const fromPkg = result.packageName ? ` from ${result.packageName}` : '';\n out.success(`Uninstalled ${result.resourceName}${fromPkg}`);\n \n // Display removed files in tree-style format\n if (result.removedFiles.length > 0) {\n out.success(`Removed files: ${result.removedFiles.length}`);\n const sortedFiles = [...result.removedFiles].sort((a, b) => a.localeCompare(b));\n const displayFiles = sortedFiles.slice(0, 10);\n for (const file of displayFiles) {\n out.info(` \u251C\u2500\u2500 ${formatPathForDisplay(file, cwd)}`);\n }\n if (sortedFiles.length > 10) {\n out.info(` ... and ${sortedFiles.length - 10} more`);\n }\n }\n \n // Display updated root files in tree-style format\n if (result.rootFilesUpdated.length > 0) {\n out.success(`Updated root files: ${result.rootFilesUpdated.length}`);\n const sortedFiles = [...result.rootFilesUpdated].sort((a, b) => a.localeCompare(b));\n const displayFiles = sortedFiles.slice(0, 10);\n for (const file of displayFiles) {\n out.info(` \u251C\u2500\u2500 ${formatPathForDisplay(file, cwd)}`);\n }\n if (sortedFiles.length > 10) {\n out.info(` ... and ${sortedFiles.length - 10} more`);\n }\n }\n}\n", "/**\n * Direct Uninstall Flow\n *\n * Core orchestration for `opkg un <name>` (non-interactive).\n * Resolves candidates across scopes, disambiguates, and executes.\n * No terminal-UI dependencies \u2014 uses OutputPort/PromptPort via context.\n */\n\nimport type { UninstallOptions } from '../../types/index.js';\nimport type { ExecutionContext } from '../../types/execution-context.js';\nimport { resolveByName, type ResolutionCandidate } from '../resources/resource-resolver.js';\nimport { traverseScopesFlat, type ResourceScope } from '../resources/scope-traversal.js';\nimport { disambiguate } from '../resources/disambiguation-prompt.js';\nimport { formatScopeTag } from '../../utils/formatters.js';\nimport { executeUninstallCandidate } from './uninstall-executor.js';\nimport { resolveOutput, resolvePrompt } from '../ports/resolve.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface DirectUninstallOptions extends UninstallOptions {\n global?: boolean;\n}\n\nexport interface DirectUninstallResult {\n uninstalledCount: number;\n cancelled: boolean;\n}\n\nexport interface CandidateFormatters {\n formatTitle: (candidate: ResolutionCandidate) => string;\n formatDescription: (candidate: ResolutionCandidate) => string;\n}\n\n// ---------------------------------------------------------------------------\n// Default formatters (can be overridden by CLI/GUI for richer display)\n// ---------------------------------------------------------------------------\n\nfunction defaultFormatTitle(candidate: ResolutionCandidate): string {\n if (candidate.kind === 'package') {\n const pkg = candidate.package!;\n const version = pkg.version && pkg.version !== '0.0.0' ? ` (v${pkg.version})` : '';\n const scopeTag = formatScopeTag(pkg.scope);\n return `${pkg.packageName}${version} (package, ${pkg.resourceCount} resources)${scopeTag}`;\n }\n const r = candidate.resource!;\n const fromPkg = r.packageName ? `, from ${r.packageName}` : '';\n const scopeTag = formatScopeTag(r.scope);\n return `${r.resourceName} (${r.resourceType}${fromPkg})${scopeTag}`;\n}\n\nfunction defaultFormatDescription(candidate: ResolutionCandidate): string {\n const files = candidate.kind === 'package'\n ? candidate.package!.targetFiles\n : candidate.resource!.targetFiles;\n if (files.length === 0) return 'no files';\n const displayFiles = files.slice(0, 5);\n const remaining = files.length - displayFiles.length;\n let desc = displayFiles.join('\\n');\n if (remaining > 0) {\n desc += `\\n+${remaining} more`;\n }\n return desc;\n}\n\n// ---------------------------------------------------------------------------\n// Flow\n// ---------------------------------------------------------------------------\n\n/**\n * Run the direct (non-interactive) uninstall flow:\n * 1. Traverse scopes and resolve candidates by name\n * 2. Disambiguate if multiple matches\n * 3. Execute uninstall for each selected candidate\n */\nexport async function runDirectUninstallFlow(\n name: string,\n options: DirectUninstallOptions,\n traverseOpts: { programOpts?: Record<string, any>; globalOnly?: boolean; projectOnly?: boolean },\n createContext: (opts: { global: boolean; cwd?: string; interactive: boolean }) => Promise<ExecutionContext>,\n formatters?: CandidateFormatters\n): Promise<DirectUninstallResult> {\n const fmt = formatters ?? {\n formatTitle: defaultFormatTitle,\n formatDescription: defaultFormatDescription,\n };\n\n const candidates = await traverseScopesFlat<ResolutionCandidate>(\n traverseOpts,\n async ({ scope, context }) => {\n const result = await resolveByName(name, context.targetDir, scope);\n return result.candidates;\n }\n );\n\n // Create a temporary context for prompt/output port access during disambiguation\n const disambiguationCtx = await createContext({\n global: traverseOpts.globalOnly ?? false,\n cwd: traverseOpts.programOpts?.cwd,\n interactive: true,\n });\n\n const selected = await disambiguate(\n name,\n candidates,\n (c) => ({\n title: fmt.formatTitle(c),\n description: fmt.formatDescription(c),\n value: c,\n }),\n {\n notFoundMessage: `\"${name}\" not found as a resource or package.\\nRun \\`opkg ls\\` to see installed resources.`,\n promptMessage: 'Select which to uninstall:',\n },\n resolveOutput(disambiguationCtx),\n resolvePrompt(disambiguationCtx)\n );\n\n if (selected.length === 0) {\n return { uninstalledCount: 0, cancelled: true };\n }\n\n for (const candidate of selected) {\n const ctx = await createContext({\n global: candidate.resource?.scope === 'global' || candidate.package?.scope === 'global',\n cwd: traverseOpts.programOpts?.cwd,\n interactive: false,\n });\n await executeUninstallCandidate(candidate, options, ctx);\n }\n\n return { uninstalledCount: selected.length, cancelled: false };\n}\n", "/**\n * Workspace Resource Collector\n *\n * Collects and groups workspace resources for interactive uninstall.\n * Pure data collection \u2014 no terminal UI dependencies.\n */\n\nimport { join } from 'path';\nimport { buildWorkspaceResources, type ResolvedResource, type ResolvedPackage } from '../resources/resource-builder.js';\nimport { traverseScopes, type ResourceScope } from '../resources/scope-traversal.js';\nimport { normalizeType, RESOURCE_TYPE_ORDER, toLabelPlural } from '../resources/resource-registry.js';\nimport { parsePackageYml } from '../../utils/package-yml.js';\nimport { readWorkspaceIndex } from '../../utils/workspace-index-yml.js';\nimport { formatScopeTag } from '../../utils/formatters.js';\nimport type { ExecutionContext } from '../../types/execution-context.js';\nimport type { ResolutionCandidate } from '../resources/resource-resolver.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface WorkspaceCollectionResult {\n /** All resolved resources across scopes */\n allResources: ResolvedResource[];\n /** All resolved packages across scopes */\n allPackages: ResolvedPackage[];\n /** Map from scope to target directory */\n scopeToTargetDir: Map<ResourceScope, string>;\n}\n\nexport interface GroupedUninstallOptions {\n /** Grouped options for prompt display: category -> items */\n groupedOptions: Record<string, Array<{ label: string; value: UninstallChoiceValue }>>;\n /** Total number of selectable items */\n totalItems: number;\n}\n\nexport type UninstallChoiceValue =\n | { kind: 'resource'; resource: ResolvedResource }\n | { kind: 'package'; packageName: string; scope: ResourceScope; resources: ResolvedResource[] };\n\nexport interface BatchUninstallSummary {\n uninstalledCount: number;\n typeCounts: Map<string, number>;\n allRemovedFiles: Array<{ path: string; targetDir: string }>;\n}\n\n// ---------------------------------------------------------------------------\n// Resource collection\n// ---------------------------------------------------------------------------\n\n/**\n * Collect workspace resources across scopes, optionally filtered by package.\n */\nexport async function collectWorkspaceResources(\n traverseOpts: { programOpts?: Record<string, any>; globalOnly?: boolean; projectOnly?: boolean },\n packageFilter?: string\n): Promise<WorkspaceCollectionResult> {\n const scopeToTargetDir = new Map<ResourceScope, string>();\n\n const scopeResults = await traverseScopes(\n traverseOpts,\n async ({ scope, context }) => {\n scopeToTargetDir.set(scope, context.targetDir);\n return buildWorkspaceResources(context.targetDir, scope);\n }\n );\n\n let allResources = scopeResults.flatMap(sr => sr.result.resources);\n let allPackages = scopeResults.flatMap(sr => sr.result.packages);\n\n if (packageFilter) {\n allResources = allResources.filter(r => r.packageName === packageFilter);\n allPackages = allPackages.filter(p => p.packageName === packageFilter);\n }\n\n return { allResources, allPackages, scopeToTargetDir };\n}\n\n// ---------------------------------------------------------------------------\n// Group for selection\n// ---------------------------------------------------------------------------\n\n/**\n * Build grouped options for the interactive uninstall prompt.\n */\nexport async function buildGroupedUninstallOptions(\n collection: WorkspaceCollectionResult,\n programOpts: Record<string, any>\n): Promise<GroupedUninstallOptions> {\n const { allResources, allPackages, scopeToTargetDir } = collection;\n const groupedOptions: Record<string, Array<{ label: string; value: UninstallChoiceValue }>> = {};\n\n // Separate tracked resources by package+scope and untracked resources\n const resourcesByPackageAndScope = new Map<string, ResolvedResource[]>();\n const untrackedResources: ResolvedResource[] = [];\n\n for (const resource of allResources) {\n if (resource.kind === 'tracked' && resource.packageName) {\n const key = `${resource.packageName}::${resource.scope}`;\n if (!resourcesByPackageAndScope.has(key)) {\n resourcesByPackageAndScope.set(key, []);\n }\n resourcesByPackageAndScope.get(key)!.push(resource);\n } else {\n untrackedResources.push(resource);\n }\n }\n\n // Add empty packages (packages with 0 resources) to the map\n for (const pkg of allPackages) {\n const key = `${pkg.packageName}::${pkg.scope}`;\n if (!resourcesByPackageAndScope.has(key)) {\n resourcesByPackageAndScope.set(key, []);\n }\n }\n\n // Create sorted package groups\n const packageGroups = Array.from(resourcesByPackageAndScope.entries())\n .sort((a, b) => {\n const [pkgA, scopeA] = a[0].split('::');\n const [pkgB, scopeB] = b[0].split('::');\n const nameCompare = pkgA.localeCompare(pkgB);\n if (nameCompare !== 0) return nameCompare;\n return scopeA === 'project' ? -1 : 1;\n });\n\n const totalItems = packageGroups.length + untrackedResources.length;\n\n if (totalItems === 0) {\n return { groupedOptions, totalItems: 0 };\n }\n\n // Read package manifests for dependency counts\n const packageDependencyCounts = await loadPackageDependencyCounts(\n allPackages, scopeToTargetDir, programOpts\n );\n\n // Build package options\n const packageOptions: Array<{ label: string; value: UninstallChoiceValue }> = [];\n\n for (const [key, resources] of packageGroups) {\n const [pkgName, scope] = key.split('::');\n const pkg = allPackages.find(p => p.packageName === pkgName && p.scope === scope);\n const versionSuffix = pkg?.version && pkg.version !== '0.0.0' ? `@${pkg.version}` : '';\n const scopeTag = pkg ? formatScopeTag(pkg.scope) : formatScopeTag(scope);\n\n const resourceCount = resources.length;\n const depCount = packageDependencyCounts.get(key) || 0;\n\n let hint: string;\n if (resourceCount === 0) {\n hint = depCount > 0\n ? `No resources, declares ${depCount} ${depCount === 1 ? 'dependency' : 'dependencies'}`\n : 'No resources';\n } else {\n const totalFiles = resources.flatMap(r => r.targetFiles).length;\n hint = `${totalFiles} ${totalFiles === 1 ? 'file' : 'files'}`;\n }\n\n packageOptions.push({\n value: { kind: 'package', packageName: pkgName, scope: scope as ResourceScope, resources },\n label: `${pkgName}${versionSuffix}${scopeTag} (${hint})`\n });\n }\n\n if (packageOptions.length > 0) {\n groupedOptions['Packages'] = packageOptions;\n }\n\n // Untracked resources grouped by type\n const untrackedByType = new Map<string, ResolvedResource[]>();\n for (const resource of untrackedResources) {\n const type = normalizeType(resource.resourceType);\n if (!untrackedByType.has(type)) {\n untrackedByType.set(type, []);\n }\n untrackedByType.get(type)!.push(resource);\n }\n\n for (const typeId of RESOURCE_TYPE_ORDER) {\n const resources = untrackedByType.get(typeId);\n if (!resources || resources.length === 0) continue;\n\n const categoryName = toLabelPlural(typeId);\n groupedOptions[categoryName] = resources.map(resource => {\n const scopeTag = formatScopeTag(resource.scope);\n const fileCount = resource.targetFiles.length;\n return {\n value: { kind: 'resource' as const, resource },\n label: `${resource.resourceName}${scopeTag} (${fileCount} ${fileCount === 1 ? 'file' : 'files'})`\n };\n });\n }\n\n return { groupedOptions, totalItems };\n}\n\n// ---------------------------------------------------------------------------\n// Batch execution\n// ---------------------------------------------------------------------------\n\n/**\n * Execute a batch of uninstall selections.\n * Returns a summary of what was removed.\n */\nexport async function executeBatchUninstall(\n selected: UninstallChoiceValue[],\n options: { dryRun?: boolean },\n collection: WorkspaceCollectionResult,\n programOpts: Record<string, any>,\n createContext: (opts: { global: boolean; cwd?: string; interactive: boolean }) => Promise<ExecutionContext>,\n executeCandidate: (candidate: ResolutionCandidate, options: any, ctx: ExecutionContext) => Promise<void>\n): Promise<BatchUninstallSummary> {\n const { allPackages, scopeToTargetDir } = collection;\n const typeCounts = new Map<string, number>();\n let uninstalledCount = 0;\n const allRemovedFiles: Array<{ path: string; targetDir: string }> = [];\n\n for (const selection of selected) {\n if (selection.kind === 'package') {\n const { packageName, scope, resources } = selection;\n const targetDir = scopeToTargetDir.get(scope);\n const pkg = allPackages.find(p => p.packageName === packageName && p.scope === scope);\n const execCtx = await createContext({\n global: scope === 'global',\n cwd: programOpts.cwd,\n interactive: true\n });\n const candidate: ResolutionCandidate = {\n kind: 'package',\n package: {\n packageName,\n scope,\n version: pkg?.version,\n resourceCount: resources.length,\n targetFiles: resources.flatMap(r => r.targetFiles)\n }\n };\n if (targetDir) {\n candidate.package!.targetFiles.forEach(f => allRemovedFiles.push({ path: f, targetDir }));\n }\n await executeCandidate(candidate, options, execCtx);\n typeCounts.set('packages', (typeCounts.get('packages') || 0) + 1);\n uninstalledCount++;\n } else {\n const resource = selection.resource;\n const targetDir = scopeToTargetDir.get(resource.scope);\n const candidate: ResolutionCandidate = { kind: 'resource', resource };\n const execCtx = await createContext({\n global: resource.scope === 'global',\n cwd: programOpts.cwd,\n interactive: true\n });\n if (targetDir) {\n resource.targetFiles.forEach(f => allRemovedFiles.push({ path: f, targetDir }));\n }\n await executeCandidate(candidate, options, execCtx);\n const typePlural = toLabelPlural(normalizeType(resource.resourceType)).toLowerCase();\n typeCounts.set(typePlural, (typeCounts.get(typePlural) || 0) + 1);\n uninstalledCount++;\n }\n }\n\n return { uninstalledCount, typeCounts, allRemovedFiles };\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nasync function loadPackageDependencyCounts(\n packages: ResolvedPackage[],\n scopeToTargetDir: Map<ResourceScope, string>,\n programOpts: Record<string, any>\n): Promise<Map<string, number>> {\n const counts = new Map<string, number>();\n\n for (const pkg of packages) {\n const key = `${pkg.packageName}::${pkg.scope}`;\n try {\n const targetDir = scopeToTargetDir.get(pkg.scope);\n if (!targetDir) continue;\n\n const { index } = await readWorkspaceIndex(targetDir);\n const pkgEntry = index.packages[pkg.packageName];\n if (!pkgEntry?.path) continue;\n\n const packagePath = pkgEntry.path.startsWith('~')\n ? pkgEntry.path.replace('~', programOpts.homeDir || process.env.HOME || process.env.USERPROFILE || '')\n : pkgEntry.path;\n\n const manifestPath = join(packagePath, 'openpackage.yml');\n const manifest = await parsePackageYml(manifestPath);\n const depCount = (manifest.dependencies || []).length + (manifest['dev-dependencies'] || []).length;\n counts.set(key, depCount);\n } catch {\n counts.set(key, 0);\n }\n }\n\n return counts;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["join", "scopeTag", "join"]
7
+ }