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