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,251 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
resolveMutableSource
|
|
4
|
+
} from "./chunk-QQFDQPT3.js";
|
|
5
|
+
import "./chunk-IBIYIU3K.js";
|
|
6
|
+
import "./chunk-E2DVTD75.js";
|
|
7
|
+
import "./chunk-V5OW4YEB.js";
|
|
8
|
+
import {
|
|
9
|
+
formatPathForDisplay
|
|
10
|
+
} from "./chunk-MIURCESJ.js";
|
|
11
|
+
import {
|
|
12
|
+
createCliExecutionContext,
|
|
13
|
+
resolveOutput,
|
|
14
|
+
resolvePrompt
|
|
15
|
+
} from "./chunk-RAKMX654.js";
|
|
16
|
+
import "./chunk-XEPVYZO3.js";
|
|
17
|
+
import {
|
|
18
|
+
parsePackageYml,
|
|
19
|
+
writePackageYml
|
|
20
|
+
} from "./chunk-QTQYI4L5.js";
|
|
21
|
+
import {
|
|
22
|
+
normalizePackageName,
|
|
23
|
+
validatePackageName
|
|
24
|
+
} from "./chunk-VN22A7NW.js";
|
|
25
|
+
import "./chunk-YMKK4XPN.js";
|
|
26
|
+
import {
|
|
27
|
+
FILE_PATTERNS
|
|
28
|
+
} from "./chunk-J4IFFBLP.js";
|
|
29
|
+
import {
|
|
30
|
+
exists
|
|
31
|
+
} from "./chunk-S47F4OG4.js";
|
|
32
|
+
import {
|
|
33
|
+
UserCancellationError,
|
|
34
|
+
ValidationError
|
|
35
|
+
} from "./chunk-ID4SVDQZ.js";
|
|
36
|
+
import {
|
|
37
|
+
logger
|
|
38
|
+
} from "./chunk-5EFWGD33.js";
|
|
39
|
+
|
|
40
|
+
// ../core/src/core/set/set-pipeline.ts
|
|
41
|
+
import path from "path";
|
|
42
|
+
import semver from "semver";
|
|
43
|
+
|
|
44
|
+
// ../core/src/core/set/set-output.ts
|
|
45
|
+
function displayConfigChanges(changes, output) {
|
|
46
|
+
let out = output ?? resolveOutput();
|
|
47
|
+
if (changes.length === 0) {
|
|
48
|
+
out.info(`
|
|
49
|
+
No changes detected.`);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
out.info(`
|
|
53
|
+
\u{1F4DD} Changes to apply:`);
|
|
54
|
+
for (let change of changes) {
|
|
55
|
+
let oldDisplay = formatValue(change.oldValue), newDisplay = formatValue(change.newValue);
|
|
56
|
+
out.info(` ${change.field}: ${oldDisplay} \u2192 ${newDisplay}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function formatValue(value) {
|
|
60
|
+
return value == null ? "(not set)" : Array.isArray(value) ? value.length === 0 ? "[]" : `[${value.join(", ")}]` : typeof value == "boolean" ? value.toString() : typeof value == "string" ? value : JSON.stringify(value);
|
|
61
|
+
}
|
|
62
|
+
function displaySetSuccess(result, cwd, output) {
|
|
63
|
+
let out = output ?? resolveOutput(), displayPath = formatPathForDisplay(result.packagePath, cwd);
|
|
64
|
+
if (out.success(`Updated ${result.packageName} manifest`), out.info(` Path: ${displayPath}`), out.info(` Type: ${result.sourceType} package`), result.updatedFields.length > 0) {
|
|
65
|
+
let fieldList = result.updatedFields.join(", ");
|
|
66
|
+
out.info(` Updated: ${fieldList}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function displayCurrentConfig(config, packagePath, output) {
|
|
70
|
+
let out = output ?? resolveOutput();
|
|
71
|
+
out.info(`
|
|
72
|
+
Current package: ${config.name}`), config.version && out.info(`Version: ${config.version}`), out.info(`Path: ${packagePath}`), out.info(`
|
|
73
|
+
Leave blank to keep current value, or enter new value:
|
|
74
|
+
`);
|
|
75
|
+
}
|
|
76
|
+
function displayNoChanges(packageName, output) {
|
|
77
|
+
let out = output ?? resolveOutput();
|
|
78
|
+
out.success(`No changes made to ${packageName}`), out.info(" Manifest unchanged");
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// ../core/src/core/set/set-pipeline.ts
|
|
82
|
+
async function resolvePackageForSet(cwd, packageInput) {
|
|
83
|
+
if (packageInput) {
|
|
84
|
+
let resolved = await resolveMutableSource({
|
|
85
|
+
cwd,
|
|
86
|
+
packageName: packageInput
|
|
87
|
+
}), sourceType = resolved.absolutePath.includes(".openpackage/packages") ? resolved.absolutePath.includes(cwd) ? "workspace" : "global" : "cwd";
|
|
88
|
+
return {
|
|
89
|
+
packagePath: resolved.absolutePath,
|
|
90
|
+
packageName: resolved.packageName,
|
|
91
|
+
sourceType
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
let manifestPath = path.join(cwd, FILE_PATTERNS.OPENPACKAGE_YML);
|
|
95
|
+
if (!await exists(manifestPath))
|
|
96
|
+
throw new Error(
|
|
97
|
+
`No openpackage.yml found in current directory.
|
|
98
|
+
Either specify a package name or run from a package root:
|
|
99
|
+
opkg set <package-name> [options]
|
|
100
|
+
opkg set [options] # When in package root`
|
|
101
|
+
);
|
|
102
|
+
let manifest = await parsePackageYml(manifestPath);
|
|
103
|
+
return {
|
|
104
|
+
packagePath: cwd,
|
|
105
|
+
packageName: manifest.name,
|
|
106
|
+
sourceType: "cwd"
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function validateUpdates(updates) {
|
|
110
|
+
if (updates.name !== void 0 && validatePackageName(updates.name), updates.version !== void 0 && !semver.valid(updates.version))
|
|
111
|
+
throw new ValidationError(
|
|
112
|
+
`Invalid version format: "${updates.version}"
|
|
113
|
+
Version must be valid semver (e.g., 1.0.0, 2.1.3-beta.1)`
|
|
114
|
+
);
|
|
115
|
+
if (updates.homepage !== void 0 && updates.homepage.trim().length > 0)
|
|
116
|
+
try {
|
|
117
|
+
new URL(updates.homepage);
|
|
118
|
+
} catch {
|
|
119
|
+
throw new ValidationError(
|
|
120
|
+
`Invalid homepage URL: "${updates.homepage}"
|
|
121
|
+
Must be a valid URL (e.g., https://example.com)`
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function extractUpdatesFromOptions(options) {
|
|
126
|
+
let updates = {};
|
|
127
|
+
return options.name !== void 0 && (updates.name = normalizePackageName(options.name)), options.ver !== void 0 && (updates.version = options.ver), options.description !== void 0 && (updates.description = options.description), options.keywords !== void 0 && (updates.keywords = options.keywords.trim().split(/\s+/).filter((k) => k.length > 0)), options.author !== void 0 && (updates.author = options.author), options.license !== void 0 && (updates.license = options.license), options.homepage !== void 0 && (updates.homepage = options.homepage), options.private !== void 0 && (updates.private = options.private), updates;
|
|
128
|
+
}
|
|
129
|
+
async function promptPackageUpdates(currentConfig, prm) {
|
|
130
|
+
displayCurrentConfig(currentConfig, "");
|
|
131
|
+
let name = await prm.text("Package name:", {
|
|
132
|
+
initial: currentConfig.name,
|
|
133
|
+
validate: (value) => {
|
|
134
|
+
if (!value) return "Name is required";
|
|
135
|
+
try {
|
|
136
|
+
validatePackageName(value);
|
|
137
|
+
} catch (error) {
|
|
138
|
+
return error.message.replace(/^Validation error:\s*/, "");
|
|
139
|
+
}
|
|
140
|
+
return !0;
|
|
141
|
+
}
|
|
142
|
+
}), version = await prm.text("Version:", {
|
|
143
|
+
initial: currentConfig.version || "",
|
|
144
|
+
validate: (value) => value ? semver.valid(value) ? !0 : "Version must be valid semver (e.g., 1.0.0)" : !0
|
|
145
|
+
}), description = await prm.text("Description:", {
|
|
146
|
+
initial: currentConfig.description || ""
|
|
147
|
+
}), keywords = await prm.text("Keywords (space-separated):", {
|
|
148
|
+
initial: currentConfig.keywords ? currentConfig.keywords.join(" ") : ""
|
|
149
|
+
}), author = await prm.text("Author:", {
|
|
150
|
+
initial: currentConfig.author || ""
|
|
151
|
+
}), license = await prm.text("License:", {
|
|
152
|
+
initial: currentConfig.license || ""
|
|
153
|
+
}), homepage = await prm.text("Homepage:", {
|
|
154
|
+
initial: currentConfig.homepage || "",
|
|
155
|
+
validate: (value) => {
|
|
156
|
+
if (!value || value.trim().length === 0) return !0;
|
|
157
|
+
try {
|
|
158
|
+
return new URL(value), !0;
|
|
159
|
+
} catch {
|
|
160
|
+
return "Must be a valid URL";
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}), isPrivate = await prm.confirm("Private package?", currentConfig.private || !1), updates = {}, normalizedName = normalizePackageName(name);
|
|
164
|
+
normalizedName !== currentConfig.name && (updates.name = normalizedName), version && version !== currentConfig.version && (updates.version = version), description !== (currentConfig.description || "") && (updates.description = description || void 0);
|
|
165
|
+
let newKeywords = keywords ? keywords.trim().split(/\s+/).filter((k) => k.length > 0) : [], currentKeywords = currentConfig.keywords || [];
|
|
166
|
+
return JSON.stringify(newKeywords) !== JSON.stringify(currentKeywords) && (updates.keywords = newKeywords.length > 0 ? newKeywords : void 0), author !== (currentConfig.author || "") && (updates.author = author || void 0), license !== (currentConfig.license || "") && (updates.license = license || void 0), homepage !== (currentConfig.homepage || "") && (updates.homepage = homepage || void 0), isPrivate !== (currentConfig.private || !1) && (updates.private = isPrivate), updates;
|
|
167
|
+
}
|
|
168
|
+
function detectChanges(currentConfig, updates) {
|
|
169
|
+
let changes = [];
|
|
170
|
+
for (let [field, newValue] of Object.entries(updates)) {
|
|
171
|
+
let oldValue = currentConfig[field];
|
|
172
|
+
Array.isArray(newValue) && Array.isArray(oldValue) ? JSON.stringify(oldValue) !== JSON.stringify(newValue) && changes.push({ field, oldValue, newValue }) : oldValue !== newValue && changes.push({ field, oldValue, newValue });
|
|
173
|
+
}
|
|
174
|
+
return changes;
|
|
175
|
+
}
|
|
176
|
+
function applyUpdates(currentConfig, updates) {
|
|
177
|
+
return {
|
|
178
|
+
...currentConfig,
|
|
179
|
+
...updates
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
async function runSetPipeline(packageInput, options = {}, prompt) {
|
|
183
|
+
let cwd = process.cwd(), prm = prompt ?? resolvePrompt();
|
|
184
|
+
try {
|
|
185
|
+
let hasFieldFlags = !!(options.ver || options.name || options.description !== void 0 || options.keywords !== void 0 || options.author !== void 0 || options.license !== void 0 || options.homepage !== void 0 || options.private !== void 0), isInteractive = !options.nonInteractive && !hasFieldFlags;
|
|
186
|
+
if (options.nonInteractive && !hasFieldFlags)
|
|
187
|
+
throw new ValidationError(
|
|
188
|
+
`Non-interactive mode requires at least one field flag.
|
|
189
|
+
Available flags: --ver, --name, --description, --keywords, --author, --license, --homepage, --private
|
|
190
|
+
Example: opkg set my-package --ver 1.0.0 --non-interactive`
|
|
191
|
+
);
|
|
192
|
+
logger.debug("Starting set pipeline", { packageInput, options, isInteractive });
|
|
193
|
+
let resolved = await resolvePackageForSet(cwd, packageInput);
|
|
194
|
+
logger.info("Package resolved for set", {
|
|
195
|
+
packageName: resolved.packageName,
|
|
196
|
+
packagePath: resolved.packagePath,
|
|
197
|
+
sourceType: resolved.sourceType
|
|
198
|
+
});
|
|
199
|
+
let manifestPath = path.join(resolved.packagePath, FILE_PATTERNS.OPENPACKAGE_YML), currentConfig = await parsePackageYml(manifestPath), updates;
|
|
200
|
+
isInteractive ? updates = await promptPackageUpdates(currentConfig, prm) : updates = extractUpdatesFromOptions(options);
|
|
201
|
+
let changes = detectChanges(currentConfig, updates);
|
|
202
|
+
if (changes.length === 0)
|
|
203
|
+
return displayNoChanges(resolved.packageName), {
|
|
204
|
+
success: !0,
|
|
205
|
+
data: {
|
|
206
|
+
packageName: resolved.packageName,
|
|
207
|
+
packagePath: resolved.packagePath,
|
|
208
|
+
sourceType: resolved.sourceType,
|
|
209
|
+
updatedFields: [],
|
|
210
|
+
manifestPath
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
if (validateUpdates(updates), displayConfigChanges(changes), !options.force && isInteractive && !await prm.confirm("Apply these changes?", !0))
|
|
214
|
+
throw new UserCancellationError();
|
|
215
|
+
let updatedConfig = applyUpdates(currentConfig, updates);
|
|
216
|
+
await writePackageYml(manifestPath, updatedConfig), logger.info("Manifest updated successfully", {
|
|
217
|
+
packageName: resolved.packageName,
|
|
218
|
+
updatedFields: changes.map((c) => c.field)
|
|
219
|
+
});
|
|
220
|
+
let result = {
|
|
221
|
+
packageName: resolved.packageName,
|
|
222
|
+
packagePath: resolved.packagePath,
|
|
223
|
+
sourceType: resolved.sourceType,
|
|
224
|
+
updatedFields: changes.map((c) => c.field),
|
|
225
|
+
manifestPath
|
|
226
|
+
};
|
|
227
|
+
return displaySetSuccess(result, cwd), {
|
|
228
|
+
success: !0,
|
|
229
|
+
data: result
|
|
230
|
+
};
|
|
231
|
+
} catch (error) {
|
|
232
|
+
if (error instanceof UserCancellationError)
|
|
233
|
+
throw error;
|
|
234
|
+
let message = error instanceof Error ? error.message : String(error);
|
|
235
|
+
return logger.error("Set pipeline failed", { error: message }), {
|
|
236
|
+
success: !1,
|
|
237
|
+
error: message
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// src/commands/set.ts
|
|
243
|
+
async function setupSetCommand(args) {
|
|
244
|
+
let [packageInput, options] = args, ctx = await createCliExecutionContext({ outputMode: "rich" }), prompt = resolvePrompt(ctx), result = await runSetPipeline(packageInput, options, prompt);
|
|
245
|
+
if (!result.success)
|
|
246
|
+
throw new Error(result.error || "Set operation failed");
|
|
247
|
+
}
|
|
248
|
+
export {
|
|
249
|
+
setupSetCommand
|
|
250
|
+
};
|
|
251
|
+
//# sourceMappingURL=set-DCWF73F6.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../core/src/core/set/set-pipeline.ts", "../../core/src/core/set/set-output.ts", "../src/commands/set.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * @fileoverview Main pipeline for the set command\n * \n * Orchestrates package resolution, manifest updates, and display.\n */\n\nimport path from 'path';\nimport semver from 'semver';\n\nimport type { CommandResult, PackageYml } from '../../types/index.js';\nimport { FILE_PATTERNS } from '../../constants/index.js';\nimport { parsePackageYml, writePackageYml } from '../../utils/package-yml.js';\nimport { exists } from '../../utils/fs.js';\nimport { logger } from '../../utils/logger.js';\nimport { normalizePackageName, validatePackageName } from '../../utils/package-name.js';\nimport { ValidationError, UserCancellationError } from '../../utils/errors.js';\nimport { resolveMutableSource } from '../source-resolution/resolve-mutable-source.js';\nimport type { PromptPort } from '../ports/prompt.js';\nimport { resolvePrompt } from '../ports/resolve.js';\nimport { \n displayConfigChanges, \n displaySetSuccess, \n displayCurrentConfig,\n displayNoChanges \n} from './set-output.js';\nimport type { \n SetCommandOptions, \n PackageManifestUpdates, \n SetPipelineResult,\n ConfigChange \n} from './set-types.js';\n\n/**\n * Resolve package source for set operation\n * Priority: provided package name \u2192 CWD package\n */\nasync function resolvePackageForSet(\n cwd: string,\n packageInput?: string\n): Promise<{\n packagePath: string;\n packageName: string;\n sourceType: 'workspace' | 'global' | 'cwd';\n}> {\n // If package name provided, resolve mutable source\n if (packageInput) {\n const resolved = await resolveMutableSource({\n cwd,\n packageName: packageInput\n });\n \n const sourceType = resolved.absolutePath.includes('.openpackage/packages')\n ? (resolved.absolutePath.includes(cwd) ? 'workspace' as const : 'global' as const)\n : 'cwd' as const;\n \n return {\n packagePath: resolved.absolutePath,\n packageName: resolved.packageName,\n sourceType\n };\n }\n \n // No package name - check CWD\n const manifestPath = path.join(cwd, FILE_PATTERNS.OPENPACKAGE_YML);\n if (!(await exists(manifestPath))) {\n throw new Error(\n 'No openpackage.yml found in current directory.\\n' +\n 'Either specify a package name or run from a package root:\\n' +\n ' opkg set <package-name> [options]\\n' +\n ' opkg set [options] # When in package root'\n );\n }\n \n const manifest = await parsePackageYml(manifestPath);\n \n return {\n packagePath: cwd,\n packageName: manifest.name,\n sourceType: 'cwd'\n };\n}\n\n/**\n * Validate field values before applying\n */\nfunction validateUpdates(updates: PackageManifestUpdates): void {\n // Validate name\n if (updates.name !== undefined) {\n validatePackageName(updates.name);\n }\n \n // Validate version\n if (updates.version !== undefined) {\n if (!semver.valid(updates.version)) {\n throw new ValidationError(\n `Invalid version format: \"${updates.version}\"\\n` +\n `Version must be valid semver (e.g., 1.0.0, 2.1.3-beta.1)`\n );\n }\n }\n \n // Validate homepage URL format (basic check)\n if (updates.homepage !== undefined && updates.homepage.trim().length > 0) {\n try {\n new URL(updates.homepage);\n } catch {\n throw new ValidationError(\n `Invalid homepage URL: \"${updates.homepage}\"\\n` +\n `Must be a valid URL (e.g., https://example.com)`\n );\n }\n }\n}\n\n/**\n * Extract updates from CLI options\n */\nfunction extractUpdatesFromOptions(options: SetCommandOptions): PackageManifestUpdates {\n const updates: PackageManifestUpdates = {};\n \n if (options.name !== undefined) {\n updates.name = normalizePackageName(options.name);\n }\n \n if (options.ver !== undefined) {\n updates.version = options.ver;\n }\n \n if (options.description !== undefined) {\n updates.description = options.description;\n }\n \n if (options.keywords !== undefined) {\n // Parse space-separated keywords into array\n updates.keywords = options.keywords\n .trim()\n .split(/\\s+/)\n .filter(k => k.length > 0);\n }\n \n if (options.author !== undefined) {\n updates.author = options.author;\n }\n \n if (options.license !== undefined) {\n updates.license = options.license;\n }\n \n if (options.homepage !== undefined) {\n updates.homepage = options.homepage;\n }\n \n if (options.private !== undefined) {\n updates.private = options.private;\n }\n \n return updates;\n}\n\n/**\n * Prompt user for updates interactively\n */\nasync function promptPackageUpdates(\n currentConfig: PackageYml,\n prm: PromptPort\n): Promise<PackageManifestUpdates> {\n displayCurrentConfig(currentConfig, '');\n \n const name = await prm.text('Package name:', {\n initial: currentConfig.name,\n validate: (value: string) => {\n if (!value) return 'Name is required';\n try {\n validatePackageName(value);\n } catch (error) {\n const message = (error as Error).message;\n return message.replace(/^Validation error:\\s*/, '');\n }\n return true;\n }\n });\n \n const version = await prm.text('Version:', {\n initial: currentConfig.version || '',\n validate: (value: string) => {\n if (!value) return true; // Allow empty (will keep current)\n if (!semver.valid(value)) {\n return 'Version must be valid semver (e.g., 1.0.0)';\n }\n return true;\n }\n });\n \n const description = await prm.text('Description:', {\n initial: currentConfig.description || ''\n });\n \n const keywords = await prm.text('Keywords (space-separated):', {\n initial: currentConfig.keywords ? currentConfig.keywords.join(' ') : ''\n });\n \n const author = await prm.text('Author:', {\n initial: currentConfig.author || ''\n });\n \n const license = await prm.text('License:', {\n initial: currentConfig.license || ''\n });\n \n const homepage = await prm.text('Homepage:', {\n initial: currentConfig.homepage || '',\n validate: (value: string) => {\n if (!value || value.trim().length === 0) return true;\n try {\n new URL(value);\n return true;\n } catch {\n return 'Must be a valid URL';\n }\n }\n });\n \n const isPrivate = await prm.confirm('Private package?', currentConfig.private || false);\n \n // Build updates object only for changed fields\n const updates: PackageManifestUpdates = {};\n \n // Normalize name for comparison\n const normalizedName = normalizePackageName(name);\n if (normalizedName !== currentConfig.name) {\n updates.name = normalizedName;\n }\n \n if (version && version !== currentConfig.version) {\n updates.version = version;\n }\n \n if (description !== (currentConfig.description || '')) {\n updates.description = description || undefined;\n }\n \n // Parse and compare keywords\n const newKeywords = keywords\n ? keywords.trim().split(/\\s+/).filter((k: string) => k.length > 0)\n : [];\n const currentKeywords = currentConfig.keywords || [];\n if (JSON.stringify(newKeywords) !== JSON.stringify(currentKeywords)) {\n updates.keywords = newKeywords.length > 0 ? newKeywords : undefined;\n }\n \n if (author !== (currentConfig.author || '')) {\n updates.author = author || undefined;\n }\n \n if (license !== (currentConfig.license || '')) {\n updates.license = license || undefined;\n }\n \n if (homepage !== (currentConfig.homepage || '')) {\n updates.homepage = homepage || undefined;\n }\n \n if (isPrivate !== (currentConfig.private || false)) {\n updates.private = isPrivate;\n }\n \n return updates;\n}\n\n/**\n * Detect changes between current config and updates\n */\nfunction detectChanges(\n currentConfig: PackageYml,\n updates: PackageManifestUpdates\n): ConfigChange[] {\n const changes: ConfigChange[] = [];\n \n for (const [field, newValue] of Object.entries(updates)) {\n const oldValue = currentConfig[field as keyof PackageYml];\n \n // Deep comparison for arrays\n if (Array.isArray(newValue) && Array.isArray(oldValue)) {\n if (JSON.stringify(oldValue) !== JSON.stringify(newValue)) {\n changes.push({ field, oldValue, newValue });\n }\n } else if (oldValue !== newValue) {\n changes.push({ field, oldValue, newValue });\n }\n }\n \n return changes;\n}\n\n/**\n * Apply updates to manifest configuration\n */\nfunction applyUpdates(\n currentConfig: PackageYml,\n updates: PackageManifestUpdates\n): PackageYml {\n return {\n ...currentConfig,\n ...updates\n };\n}\n\n/**\n * Run the set pipeline\n */\nexport async function runSetPipeline(\n packageInput: string | undefined,\n options: SetCommandOptions = {},\n prompt?: PromptPort\n): Promise<CommandResult<SetPipelineResult>> {\n const cwd = process.cwd();\n const prm = prompt ?? resolvePrompt();\n \n try {\n // Step 1: Validate inputs\n const hasFieldFlags = Boolean(\n options.ver || \n options.name || \n options.description !== undefined ||\n options.keywords !== undefined || \n options.author !== undefined || \n options.license !== undefined || \n options.homepage !== undefined || \n options.private !== undefined\n );\n \n const isInteractive = !options.nonInteractive && !hasFieldFlags;\n \n if (options.nonInteractive && !hasFieldFlags) {\n throw new ValidationError(\n 'Non-interactive mode requires at least one field flag.\\n' +\n 'Available flags: --ver, --name, --description, --keywords, --author, --license, --homepage, --private\\n' +\n 'Example: opkg set my-package --ver 1.0.0 --non-interactive'\n );\n }\n \n logger.debug('Starting set pipeline', { packageInput, options, isInteractive });\n \n // Step 2: Resolve package source\n const resolved = await resolvePackageForSet(cwd, packageInput);\n \n logger.info('Package resolved for set', {\n packageName: resolved.packageName,\n packagePath: resolved.packagePath,\n sourceType: resolved.sourceType\n });\n \n // Step 3: Load current manifest\n const manifestPath = path.join(resolved.packagePath, FILE_PATTERNS.OPENPACKAGE_YML);\n const currentConfig = await parsePackageYml(manifestPath);\n \n // Step 4: Determine updates\n let updates: PackageManifestUpdates;\n \n if (isInteractive) {\n updates = await promptPackageUpdates(currentConfig, prm);\n } else {\n updates = extractUpdatesFromOptions(options);\n }\n \n // Step 5: Detect changes\n const changes = detectChanges(currentConfig, updates);\n \n if (changes.length === 0) {\n displayNoChanges(resolved.packageName);\n return {\n success: true,\n data: {\n packageName: resolved.packageName,\n packagePath: resolved.packagePath,\n sourceType: resolved.sourceType,\n updatedFields: [],\n manifestPath\n }\n };\n }\n \n // Step 6: Validate updates\n validateUpdates(updates);\n \n // Step 7: Show changes and confirm (unless force mode)\n displayConfigChanges(changes);\n \n if (!options.force && isInteractive) {\n const confirmed = await prm.confirm('Apply these changes?', true);\n if (!confirmed) {\n throw new UserCancellationError();\n }\n }\n \n // Step 8: Apply updates\n const updatedConfig = applyUpdates(currentConfig, updates);\n \n // Step 9: Write manifest\n await writePackageYml(manifestPath, updatedConfig);\n \n logger.info('Manifest updated successfully', {\n packageName: resolved.packageName,\n updatedFields: changes.map(c => c.field)\n });\n \n // Step 10: Display success\n const result: SetPipelineResult = {\n packageName: resolved.packageName,\n packagePath: resolved.packagePath,\n sourceType: resolved.sourceType,\n updatedFields: changes.map(c => c.field),\n manifestPath\n };\n \n displaySetSuccess(result, cwd);\n \n return {\n success: true,\n data: result\n };\n \n } catch (error) {\n if (error instanceof UserCancellationError) {\n throw error;\n }\n \n const message = error instanceof Error ? error.message : String(error);\n logger.error('Set pipeline failed', { error: message });\n \n return {\n success: false,\n error: message\n };\n }\n}\n", "/**\n * @fileoverview Output formatting and display for the set command\n */\n\nimport { formatPathForDisplay } from '../../utils/formatters.js';\nimport type { PackageYml } from '../../types/index.js';\nimport type { ConfigChange, SetPipelineResult } from './set-types.js';\nimport type { OutputPort } from '../ports/output.js';\nimport { resolveOutput } from '../ports/resolve.js';\n\n/**\n * Display changes that will be applied to the manifest\n */\nexport function displayConfigChanges(changes: ConfigChange[], output?: OutputPort): void {\n const out = output ?? resolveOutput();\n\n if (changes.length === 0) {\n out.info('\\nNo changes detected.');\n return;\n }\n\n out.info('\\n\uD83D\uDCDD Changes to apply:');\n \n for (const change of changes) {\n const oldDisplay = formatValue(change.oldValue);\n const newDisplay = formatValue(change.newValue);\n out.info(` ${change.field}: ${oldDisplay} \u2192 ${newDisplay}`);\n }\n}\n\n/**\n * Format a value for display in change output\n */\nfunction formatValue(value: any): string {\n if (value === undefined || value === null) {\n return '(not set)';\n }\n \n if (Array.isArray(value)) {\n if (value.length === 0) {\n return '[]';\n }\n return `[${value.join(', ')}]`;\n }\n \n if (typeof value === 'boolean') {\n return value.toString();\n }\n \n if (typeof value === 'string') {\n return value;\n }\n \n return JSON.stringify(value);\n}\n\n/**\n * Display success message after updating manifest\n */\nexport function displaySetSuccess(\n result: SetPipelineResult,\n cwd: string,\n output?: OutputPort\n): void {\n const out = output ?? resolveOutput();\n const displayPath = formatPathForDisplay(result.packagePath, cwd);\n \n out.success(`Updated ${result.packageName} manifest`);\n out.info(` Path: ${displayPath}`);\n out.info(` Type: ${result.sourceType} package`);\n \n if (result.updatedFields.length > 0) {\n const fieldList = result.updatedFields.join(', ');\n out.info(` Updated: ${fieldList}`);\n }\n}\n\n/**\n * Display current package configuration for interactive mode\n */\nexport function displayCurrentConfig(config: PackageYml, packagePath: string, output?: OutputPort): void {\n const out = output ?? resolveOutput();\n\n out.info(`\\nCurrent package: ${config.name}`);\n \n if (config.version) {\n out.info(`Version: ${config.version}`);\n }\n \n out.info(`Path: ${packagePath}`);\n out.info('\\nLeave blank to keep current value, or enter new value:\\n');\n}\n\n/**\n * Display no-changes message\n */\nexport function displayNoChanges(packageName: string, output?: OutputPort): void {\n const out = output ?? resolveOutput();\n\n out.success(`No changes made to ${packageName}`);\n out.info(' Manifest unchanged');\n}\n", "/**\n * @fileoverview Command setup for 'opkg set'\n * \n * Updates manifest fields in openpackage.yml for mutable packages.\n */\n\nimport { runSetPipeline } from '@opkg/core/core/set/set-pipeline.js';\nimport type { SetCommandOptions } from '@opkg/core/core/set/set-types.js';\nimport { createCliExecutionContext } from '../cli/context.js';\nimport { resolvePrompt } from '@opkg/core/core/ports/resolve.js';\n\n/**\n * Setup the 'opkg set' command\n */\nexport async function setupSetCommand(args: any[]): Promise<void> {\n const [packageInput, options] = args as [string | undefined, SetCommandOptions];\n const ctx = await createCliExecutionContext({ outputMode: 'rich' });\n const prompt = resolvePrompt(ctx);\n const result = await runSetPipeline(packageInput, options, prompt);\n if (!result.success) {\n throw new Error(result.error || 'Set operation failed');\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
resolveMutableSource
|
|
4
|
+
} from "./chunk-AYTGQCXH.js";
|
|
5
|
+
import "./chunk-BVVSU7QD.js";
|
|
6
|
+
import "./chunk-3PZRVA6O.js";
|
|
7
|
+
import "./chunk-GSWHZBT2.js";
|
|
8
|
+
import {
|
|
9
|
+
formatPathForDisplay
|
|
10
|
+
} from "./chunk-MIURCESJ.js";
|
|
11
|
+
import {
|
|
12
|
+
createCliExecutionContext,
|
|
13
|
+
resolveOutput,
|
|
14
|
+
resolvePrompt
|
|
15
|
+
} from "./chunk-RAKMX654.js";
|
|
16
|
+
import "./chunk-GDVFS3YP.js";
|
|
17
|
+
import {
|
|
18
|
+
parsePackageYml,
|
|
19
|
+
writePackageYml
|
|
20
|
+
} from "./chunk-427DCURL.js";
|
|
21
|
+
import {
|
|
22
|
+
normalizePackageName,
|
|
23
|
+
validatePackageName
|
|
24
|
+
} from "./chunk-VN22A7NW.js";
|
|
25
|
+
import "./chunk-YMKK4XPN.js";
|
|
26
|
+
import {
|
|
27
|
+
FILE_PATTERNS
|
|
28
|
+
} from "./chunk-IHVZ5AUJ.js";
|
|
29
|
+
import {
|
|
30
|
+
exists
|
|
31
|
+
} from "./chunk-S47F4OG4.js";
|
|
32
|
+
import {
|
|
33
|
+
UserCancellationError,
|
|
34
|
+
ValidationError
|
|
35
|
+
} from "./chunk-ID4SVDQZ.js";
|
|
36
|
+
import {
|
|
37
|
+
logger
|
|
38
|
+
} from "./chunk-5EFWGD33.js";
|
|
39
|
+
|
|
40
|
+
// ../core/src/core/set/set-pipeline.ts
|
|
41
|
+
import path from "path";
|
|
42
|
+
import semver from "semver";
|
|
43
|
+
|
|
44
|
+
// ../core/src/core/set/set-output.ts
|
|
45
|
+
function displayConfigChanges(changes, output) {
|
|
46
|
+
let out = output ?? resolveOutput();
|
|
47
|
+
if (changes.length === 0) {
|
|
48
|
+
out.info(`
|
|
49
|
+
No changes detected.`);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
out.info(`
|
|
53
|
+
\u{1F4DD} Changes to apply:`);
|
|
54
|
+
for (let change of changes) {
|
|
55
|
+
let oldDisplay = formatValue(change.oldValue), newDisplay = formatValue(change.newValue);
|
|
56
|
+
out.info(` ${change.field}: ${oldDisplay} \u2192 ${newDisplay}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function formatValue(value) {
|
|
60
|
+
return value == null ? "(not set)" : Array.isArray(value) ? value.length === 0 ? "[]" : `[${value.join(", ")}]` : typeof value == "boolean" ? value.toString() : typeof value == "string" ? value : JSON.stringify(value);
|
|
61
|
+
}
|
|
62
|
+
function displaySetSuccess(result, cwd, output) {
|
|
63
|
+
let out = output ?? resolveOutput(), displayPath = formatPathForDisplay(result.packagePath, cwd);
|
|
64
|
+
if (out.success(`Updated ${result.packageName} manifest`), out.info(` Path: ${displayPath}`), out.info(` Type: ${result.sourceType} package`), result.updatedFields.length > 0) {
|
|
65
|
+
let fieldList = result.updatedFields.join(", ");
|
|
66
|
+
out.info(` Updated: ${fieldList}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function displayCurrentConfig(config, packagePath, output) {
|
|
70
|
+
let out = output ?? resolveOutput();
|
|
71
|
+
out.info(`
|
|
72
|
+
Current package: ${config.name}`), config.version && out.info(`Version: ${config.version}`), out.info(`Path: ${packagePath}`), out.info(`
|
|
73
|
+
Leave blank to keep current value, or enter new value:
|
|
74
|
+
`);
|
|
75
|
+
}
|
|
76
|
+
function displayNoChanges(packageName, output) {
|
|
77
|
+
let out = output ?? resolveOutput();
|
|
78
|
+
out.success(`No changes made to ${packageName}`), out.info(" Manifest unchanged");
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// ../core/src/core/set/set-pipeline.ts
|
|
82
|
+
async function resolvePackageForSet(cwd, packageInput) {
|
|
83
|
+
if (packageInput) {
|
|
84
|
+
let resolved = await resolveMutableSource({
|
|
85
|
+
cwd,
|
|
86
|
+
packageName: packageInput
|
|
87
|
+
}), sourceType = resolved.absolutePath.includes(".openpackage/packages") ? resolved.absolutePath.includes(cwd) ? "workspace" : "global" : "cwd";
|
|
88
|
+
return {
|
|
89
|
+
packagePath: resolved.absolutePath,
|
|
90
|
+
packageName: resolved.packageName,
|
|
91
|
+
sourceType
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
let manifestPath = path.join(cwd, FILE_PATTERNS.OPENPACKAGE_YML);
|
|
95
|
+
if (!await exists(manifestPath))
|
|
96
|
+
throw new Error(
|
|
97
|
+
`No openpackage.yml found in current directory.
|
|
98
|
+
Either specify a package name or run from a package root:
|
|
99
|
+
opkg set <package-name> [options]
|
|
100
|
+
opkg set [options] # When in package root`
|
|
101
|
+
);
|
|
102
|
+
let manifest = await parsePackageYml(manifestPath);
|
|
103
|
+
return {
|
|
104
|
+
packagePath: cwd,
|
|
105
|
+
packageName: manifest.name,
|
|
106
|
+
sourceType: "cwd"
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function validateUpdates(updates) {
|
|
110
|
+
if (updates.name !== void 0 && validatePackageName(updates.name), updates.version !== void 0 && !semver.valid(updates.version))
|
|
111
|
+
throw new ValidationError(
|
|
112
|
+
`Invalid version format: "${updates.version}"
|
|
113
|
+
Version must be valid semver (e.g., 1.0.0, 2.1.3-beta.1)`
|
|
114
|
+
);
|
|
115
|
+
if (updates.homepage !== void 0 && updates.homepage.trim().length > 0)
|
|
116
|
+
try {
|
|
117
|
+
new URL(updates.homepage);
|
|
118
|
+
} catch {
|
|
119
|
+
throw new ValidationError(
|
|
120
|
+
`Invalid homepage URL: "${updates.homepage}"
|
|
121
|
+
Must be a valid URL (e.g., https://example.com)`
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function extractUpdatesFromOptions(options) {
|
|
126
|
+
let updates = {};
|
|
127
|
+
return options.name !== void 0 && (updates.name = normalizePackageName(options.name)), options.ver !== void 0 && (updates.version = options.ver), options.description !== void 0 && (updates.description = options.description), options.keywords !== void 0 && (updates.keywords = options.keywords.trim().split(/\s+/).filter((k) => k.length > 0)), options.author !== void 0 && (updates.author = options.author), options.license !== void 0 && (updates.license = options.license), options.homepage !== void 0 && (updates.homepage = options.homepage), options.private !== void 0 && (updates.private = options.private), updates;
|
|
128
|
+
}
|
|
129
|
+
async function promptPackageUpdates(currentConfig, prm) {
|
|
130
|
+
displayCurrentConfig(currentConfig, "");
|
|
131
|
+
let name = await prm.text("Package name:", {
|
|
132
|
+
initial: currentConfig.name,
|
|
133
|
+
validate: (value) => {
|
|
134
|
+
if (!value) return "Name is required";
|
|
135
|
+
try {
|
|
136
|
+
validatePackageName(value);
|
|
137
|
+
} catch (error) {
|
|
138
|
+
return error.message.replace(/^Validation error:\s*/, "");
|
|
139
|
+
}
|
|
140
|
+
return !0;
|
|
141
|
+
}
|
|
142
|
+
}), version = await prm.text("Version:", {
|
|
143
|
+
initial: currentConfig.version || "",
|
|
144
|
+
validate: (value) => value ? semver.valid(value) ? !0 : "Version must be valid semver (e.g., 1.0.0)" : !0
|
|
145
|
+
}), description = await prm.text("Description:", {
|
|
146
|
+
initial: currentConfig.description || ""
|
|
147
|
+
}), keywords = await prm.text("Keywords (space-separated):", {
|
|
148
|
+
initial: currentConfig.keywords ? currentConfig.keywords.join(" ") : ""
|
|
149
|
+
}), author = await prm.text("Author:", {
|
|
150
|
+
initial: currentConfig.author || ""
|
|
151
|
+
}), license = await prm.text("License:", {
|
|
152
|
+
initial: currentConfig.license || ""
|
|
153
|
+
}), homepage = await prm.text("Homepage:", {
|
|
154
|
+
initial: currentConfig.homepage || "",
|
|
155
|
+
validate: (value) => {
|
|
156
|
+
if (!value || value.trim().length === 0) return !0;
|
|
157
|
+
try {
|
|
158
|
+
return new URL(value), !0;
|
|
159
|
+
} catch {
|
|
160
|
+
return "Must be a valid URL";
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}), isPrivate = await prm.confirm("Private package?", currentConfig.private || !1), updates = {}, normalizedName = normalizePackageName(name);
|
|
164
|
+
normalizedName !== currentConfig.name && (updates.name = normalizedName), version && version !== currentConfig.version && (updates.version = version), description !== (currentConfig.description || "") && (updates.description = description || void 0);
|
|
165
|
+
let newKeywords = keywords ? keywords.trim().split(/\s+/).filter((k) => k.length > 0) : [], currentKeywords = currentConfig.keywords || [];
|
|
166
|
+
return JSON.stringify(newKeywords) !== JSON.stringify(currentKeywords) && (updates.keywords = newKeywords.length > 0 ? newKeywords : void 0), author !== (currentConfig.author || "") && (updates.author = author || void 0), license !== (currentConfig.license || "") && (updates.license = license || void 0), homepage !== (currentConfig.homepage || "") && (updates.homepage = homepage || void 0), isPrivate !== (currentConfig.private || !1) && (updates.private = isPrivate), updates;
|
|
167
|
+
}
|
|
168
|
+
function detectChanges(currentConfig, updates) {
|
|
169
|
+
let changes = [];
|
|
170
|
+
for (let [field, newValue] of Object.entries(updates)) {
|
|
171
|
+
let oldValue = currentConfig[field];
|
|
172
|
+
Array.isArray(newValue) && Array.isArray(oldValue) ? JSON.stringify(oldValue) !== JSON.stringify(newValue) && changes.push({ field, oldValue, newValue }) : oldValue !== newValue && changes.push({ field, oldValue, newValue });
|
|
173
|
+
}
|
|
174
|
+
return changes;
|
|
175
|
+
}
|
|
176
|
+
function applyUpdates(currentConfig, updates) {
|
|
177
|
+
return {
|
|
178
|
+
...currentConfig,
|
|
179
|
+
...updates
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
async function runSetPipeline(packageInput, options = {}, prompt) {
|
|
183
|
+
let cwd = process.cwd(), prm = prompt ?? resolvePrompt();
|
|
184
|
+
try {
|
|
185
|
+
let hasFieldFlags = !!(options.ver || options.name || options.description !== void 0 || options.keywords !== void 0 || options.author !== void 0 || options.license !== void 0 || options.homepage !== void 0 || options.private !== void 0), isInteractive = !options.nonInteractive && !hasFieldFlags;
|
|
186
|
+
if (options.nonInteractive && !hasFieldFlags)
|
|
187
|
+
throw new ValidationError(
|
|
188
|
+
`Non-interactive mode requires at least one field flag.
|
|
189
|
+
Available flags: --ver, --name, --description, --keywords, --author, --license, --homepage, --private
|
|
190
|
+
Example: opkg set my-package --ver 1.0.0 --non-interactive`
|
|
191
|
+
);
|
|
192
|
+
logger.debug("Starting set pipeline", { packageInput, options, isInteractive });
|
|
193
|
+
let resolved = await resolvePackageForSet(cwd, packageInput);
|
|
194
|
+
logger.info("Package resolved for set", {
|
|
195
|
+
packageName: resolved.packageName,
|
|
196
|
+
packagePath: resolved.packagePath,
|
|
197
|
+
sourceType: resolved.sourceType
|
|
198
|
+
});
|
|
199
|
+
let manifestPath = path.join(resolved.packagePath, FILE_PATTERNS.OPENPACKAGE_YML), currentConfig = await parsePackageYml(manifestPath), updates;
|
|
200
|
+
isInteractive ? updates = await promptPackageUpdates(currentConfig, prm) : updates = extractUpdatesFromOptions(options);
|
|
201
|
+
let changes = detectChanges(currentConfig, updates);
|
|
202
|
+
if (changes.length === 0)
|
|
203
|
+
return displayNoChanges(resolved.packageName), {
|
|
204
|
+
success: !0,
|
|
205
|
+
data: {
|
|
206
|
+
packageName: resolved.packageName,
|
|
207
|
+
packagePath: resolved.packagePath,
|
|
208
|
+
sourceType: resolved.sourceType,
|
|
209
|
+
updatedFields: [],
|
|
210
|
+
manifestPath
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
if (validateUpdates(updates), displayConfigChanges(changes), !options.force && isInteractive && !await prm.confirm("Apply these changes?", !0))
|
|
214
|
+
throw new UserCancellationError();
|
|
215
|
+
let updatedConfig = applyUpdates(currentConfig, updates);
|
|
216
|
+
await writePackageYml(manifestPath, updatedConfig), logger.info("Manifest updated successfully", {
|
|
217
|
+
packageName: resolved.packageName,
|
|
218
|
+
updatedFields: changes.map((c) => c.field)
|
|
219
|
+
});
|
|
220
|
+
let result = {
|
|
221
|
+
packageName: resolved.packageName,
|
|
222
|
+
packagePath: resolved.packagePath,
|
|
223
|
+
sourceType: resolved.sourceType,
|
|
224
|
+
updatedFields: changes.map((c) => c.field),
|
|
225
|
+
manifestPath
|
|
226
|
+
};
|
|
227
|
+
return displaySetSuccess(result, cwd), {
|
|
228
|
+
success: !0,
|
|
229
|
+
data: result
|
|
230
|
+
};
|
|
231
|
+
} catch (error) {
|
|
232
|
+
if (error instanceof UserCancellationError)
|
|
233
|
+
throw error;
|
|
234
|
+
let message = error instanceof Error ? error.message : String(error);
|
|
235
|
+
return logger.error("Set pipeline failed", { error: message }), {
|
|
236
|
+
success: !1,
|
|
237
|
+
error: message
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// src/commands/set.ts
|
|
243
|
+
async function setupSetCommand(args) {
|
|
244
|
+
let [packageInput, options] = args, ctx = await createCliExecutionContext({ outputMode: "rich" }), prompt = resolvePrompt(ctx), result = await runSetPipeline(packageInput, options, prompt);
|
|
245
|
+
if (!result.success)
|
|
246
|
+
throw new Error(result.error || "Set operation failed");
|
|
247
|
+
}
|
|
248
|
+
export {
|
|
249
|
+
setupSetCommand
|
|
250
|
+
};
|
|
251
|
+
//# sourceMappingURL=set-GJEG2F6Y.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../core/src/core/set/set-pipeline.ts", "../../core/src/core/set/set-output.ts", "../src/commands/set.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * @fileoverview Main pipeline for the set command\n * \n * Orchestrates package resolution, manifest updates, and display.\n */\n\nimport path from 'path';\nimport semver from 'semver';\n\nimport type { CommandResult, PackageYml } from '../../types/index.js';\nimport { FILE_PATTERNS } from '../../constants/index.js';\nimport { parsePackageYml, writePackageYml } from '../../utils/package-yml.js';\nimport { exists } from '../../utils/fs.js';\nimport { logger } from '../../utils/logger.js';\nimport { normalizePackageName, validatePackageName } from '../../utils/package-name.js';\nimport { ValidationError, UserCancellationError } from '../../utils/errors.js';\nimport { resolveMutableSource } from '../source-resolution/resolve-mutable-source.js';\nimport type { PromptPort } from '../ports/prompt.js';\nimport { resolvePrompt } from '../ports/resolve.js';\nimport { \n displayConfigChanges, \n displaySetSuccess, \n displayCurrentConfig,\n displayNoChanges \n} from './set-output.js';\nimport type { \n SetCommandOptions, \n PackageManifestUpdates, \n SetPipelineResult,\n ConfigChange \n} from './set-types.js';\n\n/**\n * Resolve package source for set operation\n * Priority: provided package name \u2192 CWD package\n */\nasync function resolvePackageForSet(\n cwd: string,\n packageInput?: string\n): Promise<{\n packagePath: string;\n packageName: string;\n sourceType: 'workspace' | 'global' | 'cwd';\n}> {\n // If package name provided, resolve mutable source\n if (packageInput) {\n const resolved = await resolveMutableSource({\n cwd,\n packageName: packageInput\n });\n \n const sourceType = resolved.absolutePath.includes('.openpackage/packages')\n ? (resolved.absolutePath.includes(cwd) ? 'workspace' as const : 'global' as const)\n : 'cwd' as const;\n \n return {\n packagePath: resolved.absolutePath,\n packageName: resolved.packageName,\n sourceType\n };\n }\n \n // No package name - check CWD\n const manifestPath = path.join(cwd, FILE_PATTERNS.OPENPACKAGE_YML);\n if (!(await exists(manifestPath))) {\n throw new Error(\n 'No openpackage.yml found in current directory.\\n' +\n 'Either specify a package name or run from a package root:\\n' +\n ' opkg set <package-name> [options]\\n' +\n ' opkg set [options] # When in package root'\n );\n }\n \n const manifest = await parsePackageYml(manifestPath);\n \n return {\n packagePath: cwd,\n packageName: manifest.name,\n sourceType: 'cwd'\n };\n}\n\n/**\n * Validate field values before applying\n */\nfunction validateUpdates(updates: PackageManifestUpdates): void {\n // Validate name\n if (updates.name !== undefined) {\n validatePackageName(updates.name);\n }\n \n // Validate version\n if (updates.version !== undefined) {\n if (!semver.valid(updates.version)) {\n throw new ValidationError(\n `Invalid version format: \"${updates.version}\"\\n` +\n `Version must be valid semver (e.g., 1.0.0, 2.1.3-beta.1)`\n );\n }\n }\n \n // Validate homepage URL format (basic check)\n if (updates.homepage !== undefined && updates.homepage.trim().length > 0) {\n try {\n new URL(updates.homepage);\n } catch {\n throw new ValidationError(\n `Invalid homepage URL: \"${updates.homepage}\"\\n` +\n `Must be a valid URL (e.g., https://example.com)`\n );\n }\n }\n}\n\n/**\n * Extract updates from CLI options\n */\nfunction extractUpdatesFromOptions(options: SetCommandOptions): PackageManifestUpdates {\n const updates: PackageManifestUpdates = {};\n \n if (options.name !== undefined) {\n updates.name = normalizePackageName(options.name);\n }\n \n if (options.ver !== undefined) {\n updates.version = options.ver;\n }\n \n if (options.description !== undefined) {\n updates.description = options.description;\n }\n \n if (options.keywords !== undefined) {\n // Parse space-separated keywords into array\n updates.keywords = options.keywords\n .trim()\n .split(/\\s+/)\n .filter(k => k.length > 0);\n }\n \n if (options.author !== undefined) {\n updates.author = options.author;\n }\n \n if (options.license !== undefined) {\n updates.license = options.license;\n }\n \n if (options.homepage !== undefined) {\n updates.homepage = options.homepage;\n }\n \n if (options.private !== undefined) {\n updates.private = options.private;\n }\n \n return updates;\n}\n\n/**\n * Prompt user for updates interactively\n */\nasync function promptPackageUpdates(\n currentConfig: PackageYml,\n prm: PromptPort\n): Promise<PackageManifestUpdates> {\n displayCurrentConfig(currentConfig, '');\n \n const name = await prm.text('Package name:', {\n initial: currentConfig.name,\n validate: (value: string) => {\n if (!value) return 'Name is required';\n try {\n validatePackageName(value);\n } catch (error) {\n const message = (error as Error).message;\n return message.replace(/^Validation error:\\s*/, '');\n }\n return true;\n }\n });\n \n const version = await prm.text('Version:', {\n initial: currentConfig.version || '',\n validate: (value: string) => {\n if (!value) return true; // Allow empty (will keep current)\n if (!semver.valid(value)) {\n return 'Version must be valid semver (e.g., 1.0.0)';\n }\n return true;\n }\n });\n \n const description = await prm.text('Description:', {\n initial: currentConfig.description || ''\n });\n \n const keywords = await prm.text('Keywords (space-separated):', {\n initial: currentConfig.keywords ? currentConfig.keywords.join(' ') : ''\n });\n \n const author = await prm.text('Author:', {\n initial: currentConfig.author || ''\n });\n \n const license = await prm.text('License:', {\n initial: currentConfig.license || ''\n });\n \n const homepage = await prm.text('Homepage:', {\n initial: currentConfig.homepage || '',\n validate: (value: string) => {\n if (!value || value.trim().length === 0) return true;\n try {\n new URL(value);\n return true;\n } catch {\n return 'Must be a valid URL';\n }\n }\n });\n \n const isPrivate = await prm.confirm('Private package?', currentConfig.private || false);\n \n // Build updates object only for changed fields\n const updates: PackageManifestUpdates = {};\n \n // Normalize name for comparison\n const normalizedName = normalizePackageName(name);\n if (normalizedName !== currentConfig.name) {\n updates.name = normalizedName;\n }\n \n if (version && version !== currentConfig.version) {\n updates.version = version;\n }\n \n if (description !== (currentConfig.description || '')) {\n updates.description = description || undefined;\n }\n \n // Parse and compare keywords\n const newKeywords = keywords\n ? keywords.trim().split(/\\s+/).filter((k: string) => k.length > 0)\n : [];\n const currentKeywords = currentConfig.keywords || [];\n if (JSON.stringify(newKeywords) !== JSON.stringify(currentKeywords)) {\n updates.keywords = newKeywords.length > 0 ? newKeywords : undefined;\n }\n \n if (author !== (currentConfig.author || '')) {\n updates.author = author || undefined;\n }\n \n if (license !== (currentConfig.license || '')) {\n updates.license = license || undefined;\n }\n \n if (homepage !== (currentConfig.homepage || '')) {\n updates.homepage = homepage || undefined;\n }\n \n if (isPrivate !== (currentConfig.private || false)) {\n updates.private = isPrivate;\n }\n \n return updates;\n}\n\n/**\n * Detect changes between current config and updates\n */\nfunction detectChanges(\n currentConfig: PackageYml,\n updates: PackageManifestUpdates\n): ConfigChange[] {\n const changes: ConfigChange[] = [];\n \n for (const [field, newValue] of Object.entries(updates)) {\n const oldValue = currentConfig[field as keyof PackageYml];\n \n // Deep comparison for arrays\n if (Array.isArray(newValue) && Array.isArray(oldValue)) {\n if (JSON.stringify(oldValue) !== JSON.stringify(newValue)) {\n changes.push({ field, oldValue, newValue });\n }\n } else if (oldValue !== newValue) {\n changes.push({ field, oldValue, newValue });\n }\n }\n \n return changes;\n}\n\n/**\n * Apply updates to manifest configuration\n */\nfunction applyUpdates(\n currentConfig: PackageYml,\n updates: PackageManifestUpdates\n): PackageYml {\n return {\n ...currentConfig,\n ...updates\n };\n}\n\n/**\n * Run the set pipeline\n */\nexport async function runSetPipeline(\n packageInput: string | undefined,\n options: SetCommandOptions = {},\n prompt?: PromptPort\n): Promise<CommandResult<SetPipelineResult>> {\n const cwd = process.cwd();\n const prm = prompt ?? resolvePrompt();\n \n try {\n // Step 1: Validate inputs\n const hasFieldFlags = Boolean(\n options.ver || \n options.name || \n options.description !== undefined ||\n options.keywords !== undefined || \n options.author !== undefined || \n options.license !== undefined || \n options.homepage !== undefined || \n options.private !== undefined\n );\n \n const isInteractive = !options.nonInteractive && !hasFieldFlags;\n \n if (options.nonInteractive && !hasFieldFlags) {\n throw new ValidationError(\n 'Non-interactive mode requires at least one field flag.\\n' +\n 'Available flags: --ver, --name, --description, --keywords, --author, --license, --homepage, --private\\n' +\n 'Example: opkg set my-package --ver 1.0.0 --non-interactive'\n );\n }\n \n logger.debug('Starting set pipeline', { packageInput, options, isInteractive });\n \n // Step 2: Resolve package source\n const resolved = await resolvePackageForSet(cwd, packageInput);\n \n logger.info('Package resolved for set', {\n packageName: resolved.packageName,\n packagePath: resolved.packagePath,\n sourceType: resolved.sourceType\n });\n \n // Step 3: Load current manifest\n const manifestPath = path.join(resolved.packagePath, FILE_PATTERNS.OPENPACKAGE_YML);\n const currentConfig = await parsePackageYml(manifestPath);\n \n // Step 4: Determine updates\n let updates: PackageManifestUpdates;\n \n if (isInteractive) {\n updates = await promptPackageUpdates(currentConfig, prm);\n } else {\n updates = extractUpdatesFromOptions(options);\n }\n \n // Step 5: Detect changes\n const changes = detectChanges(currentConfig, updates);\n \n if (changes.length === 0) {\n displayNoChanges(resolved.packageName);\n return {\n success: true,\n data: {\n packageName: resolved.packageName,\n packagePath: resolved.packagePath,\n sourceType: resolved.sourceType,\n updatedFields: [],\n manifestPath\n }\n };\n }\n \n // Step 6: Validate updates\n validateUpdates(updates);\n \n // Step 7: Show changes and confirm (unless force mode)\n displayConfigChanges(changes);\n \n if (!options.force && isInteractive) {\n const confirmed = await prm.confirm('Apply these changes?', true);\n if (!confirmed) {\n throw new UserCancellationError();\n }\n }\n \n // Step 8: Apply updates\n const updatedConfig = applyUpdates(currentConfig, updates);\n \n // Step 9: Write manifest\n await writePackageYml(manifestPath, updatedConfig);\n \n logger.info('Manifest updated successfully', {\n packageName: resolved.packageName,\n updatedFields: changes.map(c => c.field)\n });\n \n // Step 10: Display success\n const result: SetPipelineResult = {\n packageName: resolved.packageName,\n packagePath: resolved.packagePath,\n sourceType: resolved.sourceType,\n updatedFields: changes.map(c => c.field),\n manifestPath\n };\n \n displaySetSuccess(result, cwd);\n \n return {\n success: true,\n data: result\n };\n \n } catch (error) {\n if (error instanceof UserCancellationError) {\n throw error;\n }\n \n const message = error instanceof Error ? error.message : String(error);\n logger.error('Set pipeline failed', { error: message });\n \n return {\n success: false,\n error: message\n };\n }\n}\n", "/**\n * @fileoverview Output formatting and display for the set command\n */\n\nimport { formatPathForDisplay } from '../../utils/formatters.js';\nimport type { PackageYml } from '../../types/index.js';\nimport type { ConfigChange, SetPipelineResult } from './set-types.js';\nimport type { OutputPort } from '../ports/output.js';\nimport { resolveOutput } from '../ports/resolve.js';\n\n/**\n * Display changes that will be applied to the manifest\n */\nexport function displayConfigChanges(changes: ConfigChange[], output?: OutputPort): void {\n const out = output ?? resolveOutput();\n\n if (changes.length === 0) {\n out.info('\\nNo changes detected.');\n return;\n }\n\n out.info('\\n\uD83D\uDCDD Changes to apply:');\n \n for (const change of changes) {\n const oldDisplay = formatValue(change.oldValue);\n const newDisplay = formatValue(change.newValue);\n out.info(` ${change.field}: ${oldDisplay} \u2192 ${newDisplay}`);\n }\n}\n\n/**\n * Format a value for display in change output\n */\nfunction formatValue(value: any): string {\n if (value === undefined || value === null) {\n return '(not set)';\n }\n \n if (Array.isArray(value)) {\n if (value.length === 0) {\n return '[]';\n }\n return `[${value.join(', ')}]`;\n }\n \n if (typeof value === 'boolean') {\n return value.toString();\n }\n \n if (typeof value === 'string') {\n return value;\n }\n \n return JSON.stringify(value);\n}\n\n/**\n * Display success message after updating manifest\n */\nexport function displaySetSuccess(\n result: SetPipelineResult,\n cwd: string,\n output?: OutputPort\n): void {\n const out = output ?? resolveOutput();\n const displayPath = formatPathForDisplay(result.packagePath, cwd);\n \n out.success(`Updated ${result.packageName} manifest`);\n out.info(` Path: ${displayPath}`);\n out.info(` Type: ${result.sourceType} package`);\n \n if (result.updatedFields.length > 0) {\n const fieldList = result.updatedFields.join(', ');\n out.info(` Updated: ${fieldList}`);\n }\n}\n\n/**\n * Display current package configuration for interactive mode\n */\nexport function displayCurrentConfig(config: PackageYml, packagePath: string, output?: OutputPort): void {\n const out = output ?? resolveOutput();\n\n out.info(`\\nCurrent package: ${config.name}`);\n \n if (config.version) {\n out.info(`Version: ${config.version}`);\n }\n \n out.info(`Path: ${packagePath}`);\n out.info('\\nLeave blank to keep current value, or enter new value:\\n');\n}\n\n/**\n * Display no-changes message\n */\nexport function displayNoChanges(packageName: string, output?: OutputPort): void {\n const out = output ?? resolveOutput();\n\n out.success(`No changes made to ${packageName}`);\n out.info(' Manifest unchanged');\n}\n", "/**\n * @fileoverview Command setup for 'opkg set'\n * \n * Updates manifest fields in openpackage.yml for mutable packages.\n */\n\nimport { runSetPipeline } from '@opkg/core/core/set/set-pipeline.js';\nimport type { SetCommandOptions } from '@opkg/core/core/set/set-types.js';\nimport { createCliExecutionContext } from '../cli/context.js';\nimport { resolvePrompt } from '@opkg/core/core/ports/resolve.js';\n\n/**\n * Setup the 'opkg set' command\n */\nexport async function setupSetCommand(args: any[]): Promise<void> {\n const [packageInput, options] = args as [string | undefined, SetCommandOptions];\n const ctx = await createCliExecutionContext({ outputMode: 'rich' });\n const prompt = resolvePrompt(ctx);\n const result = await runSetPipeline(packageInput, options, prompt);\n if (!result.success) {\n throw new Error(result.error || 'Set operation failed');\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|