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,222 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
DIR_PATTERNS,
|
|
4
|
+
FILE_PATTERNS,
|
|
5
|
+
UNVERSIONED
|
|
6
|
+
} from "./chunk-IHVZ5AUJ.js";
|
|
7
|
+
import {
|
|
8
|
+
ensureDir,
|
|
9
|
+
exists,
|
|
10
|
+
readTextFile,
|
|
11
|
+
writeTextFile
|
|
12
|
+
} from "./chunk-S47F4OG4.js";
|
|
13
|
+
import {
|
|
14
|
+
ValidationError
|
|
15
|
+
} from "./chunk-ID4SVDQZ.js";
|
|
16
|
+
import {
|
|
17
|
+
logger
|
|
18
|
+
} from "./chunk-5EFWGD33.js";
|
|
19
|
+
|
|
20
|
+
// ../core/src/utils/version-generator.ts
|
|
21
|
+
import * as semver from "semver";
|
|
22
|
+
function extractBaseVersion(version) {
|
|
23
|
+
let hyphenIndex = version.indexOf("-"), candidate = hyphenIndex === -1 ? version : version.slice(0, hyphenIndex), parsed = semver.parse(candidate);
|
|
24
|
+
return parsed ? `${parsed.major}.${parsed.minor}.${parsed.patch}` : candidate;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// ../core/src/core/package-versioning.ts
|
|
28
|
+
import * as semver2 from "semver";
|
|
29
|
+
import yaml from "js-yaml";
|
|
30
|
+
function isUnversionedVersion(version) {
|
|
31
|
+
return version == null || version === UNVERSIONED;
|
|
32
|
+
}
|
|
33
|
+
function formatVersionLabel(version) {
|
|
34
|
+
return isUnversionedVersion(version) ? UNVERSIONED : version;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// ../core/src/utils/tarball.ts
|
|
38
|
+
import * as tar from "tar";
|
|
39
|
+
import { createHash } from "crypto";
|
|
40
|
+
import { unlink, readdir, stat, readFile, writeFile } from "fs/promises";
|
|
41
|
+
import { join } from "path";
|
|
42
|
+
import { tmpdir } from "os";
|
|
43
|
+
async function createTarballFromPackage(pkg) {
|
|
44
|
+
logger.debug(`Creating tarball for package: ${pkg.metadata.name}@${pkg.metadata.version}`);
|
|
45
|
+
let tempDir = join(tmpdir(), `openpackage-tarball-${Date.now()}`), tarballPath = join(tempDir, "package.tar.gz");
|
|
46
|
+
try {
|
|
47
|
+
await ensureDir(tempDir);
|
|
48
|
+
for (let file of pkg.files) {
|
|
49
|
+
let filePath = join(tempDir, file.path);
|
|
50
|
+
await ensureDir(join(filePath, "..")), await writeTextFile(filePath, file.content, file.encoding || "utf8");
|
|
51
|
+
}
|
|
52
|
+
await tar.create(
|
|
53
|
+
{
|
|
54
|
+
gzip: !0,
|
|
55
|
+
file: tarballPath,
|
|
56
|
+
cwd: tempDir
|
|
57
|
+
},
|
|
58
|
+
pkg.files.map((f) => f.path)
|
|
59
|
+
);
|
|
60
|
+
let tarballBuffer = await readFile(tarballPath), checksum = createHash("sha256").update(tarballBuffer).digest("hex");
|
|
61
|
+
return logger.debug(`Tarball created: ${tarballBuffer.length} bytes, checksum: ${checksum}`), {
|
|
62
|
+
buffer: tarballBuffer,
|
|
63
|
+
size: tarballBuffer.length,
|
|
64
|
+
checksum
|
|
65
|
+
};
|
|
66
|
+
} catch (error) {
|
|
67
|
+
throw logger.error("Failed to create tarball", { error, packageName: pkg.metadata.name }), new ValidationError(`Failed to create tarball: ${error}`);
|
|
68
|
+
} finally {
|
|
69
|
+
try {
|
|
70
|
+
await exists(tarballPath) && await unlink(tarballPath);
|
|
71
|
+
} catch (cleanupError) {
|
|
72
|
+
logger.warn("Failed to clean up temp files", { cleanupError });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function extractPackageFromTarball(tarballBuffer, expectedChecksum) {
|
|
77
|
+
logger.debug(`Extracting package from tarball (${tarballBuffer.length} bytes)`);
|
|
78
|
+
let tempDir = join(tmpdir(), `openpackage-extract-${Date.now()}`), isGzipBuffer = (buffer) => buffer.length >= 2 && buffer[0] === 31 && buffer[1] === 139, previewBufferAsText = (buffer, maxBytes = 200) => buffer.subarray(0, Math.min(maxBytes, buffer.length)).toString("utf8").replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g, "\uFFFD"), isGzip = isGzipBuffer(tarballBuffer), tarballPath = join(tempDir, isGzip ? "package.tar.gz" : "package.tar");
|
|
79
|
+
try {
|
|
80
|
+
let actualChecksum = createHash("sha256").update(tarballBuffer).digest("hex");
|
|
81
|
+
if (expectedChecksum && actualChecksum !== expectedChecksum)
|
|
82
|
+
throw new ValidationError(
|
|
83
|
+
`Tarball checksum mismatch. Expected: ${expectedChecksum}, Got: ${actualChecksum}`
|
|
84
|
+
);
|
|
85
|
+
await ensureDir(tempDir), await writeFile(tarballPath, tarballBuffer), await tar.extract({
|
|
86
|
+
file: tarballPath,
|
|
87
|
+
cwd: tempDir
|
|
88
|
+
});
|
|
89
|
+
let files = [], extractFiles = async (dir, basePath = "") => {
|
|
90
|
+
let entries = await readdir(dir);
|
|
91
|
+
for (let entry of entries) {
|
|
92
|
+
let fullPath = join(dir, entry), relativePath = basePath ? join(basePath, entry) : entry, stats = await stat(fullPath);
|
|
93
|
+
if (stats.isFile()) {
|
|
94
|
+
let content = await readTextFile(fullPath);
|
|
95
|
+
files.push({
|
|
96
|
+
path: relativePath,
|
|
97
|
+
content,
|
|
98
|
+
encoding: "utf8"
|
|
99
|
+
});
|
|
100
|
+
} else stats.isDirectory() && await extractFiles(fullPath, relativePath);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
await extractFiles(tempDir);
|
|
104
|
+
let filteredFiles = files.filter((f) => f.path !== "package.tar.gz" && f.path !== "package.tar");
|
|
105
|
+
return logger.debug(`Extracted ${filteredFiles.length} files from tarball`), {
|
|
106
|
+
files: filteredFiles,
|
|
107
|
+
checksum: actualChecksum
|
|
108
|
+
};
|
|
109
|
+
} catch (error) {
|
|
110
|
+
let hint = (() => {
|
|
111
|
+
if (isGzip)
|
|
112
|
+
return;
|
|
113
|
+
let preview = previewBufferAsText(tarballBuffer), trimmed = preview.trimStart();
|
|
114
|
+
return trimmed.startsWith("{") || trimmed.startsWith("[") || trimmed.startsWith("<") ? `Downloaded payload does not look like a tarball (starts with: '${trimmed.slice(0, 60)}')` : `Downloaded payload does not look gzip-compressed (first bytes: '${preview.slice(0, 60)}')`;
|
|
115
|
+
})();
|
|
116
|
+
logger.error("Failed to extract tarball", { error, isGzip, hint });
|
|
117
|
+
let baseMessage = error instanceof Error ? error.message : String(error);
|
|
118
|
+
throw new ValidationError(hint ? `${baseMessage}. ${hint}` : `Failed to extract tarball: ${baseMessage}`);
|
|
119
|
+
} finally {
|
|
120
|
+
try {
|
|
121
|
+
await exists(tarballPath) && await unlink(tarballPath);
|
|
122
|
+
} catch (cleanupError) {
|
|
123
|
+
logger.warn("Failed to clean up temp files", { cleanupError });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function createFormDataForUpload(packageName, version, tarballInfo) {
|
|
128
|
+
let formData = new FormData();
|
|
129
|
+
formData.append("name", packageName), version && formData.append("version", version);
|
|
130
|
+
let blob = new Blob([tarballInfo.buffer], { type: "application/gzip" }), filename = version ? `${packageName}-${version}${FILE_PATTERNS.TGZ_FILES}` : `${packageName}-${UNVERSIONED}${FILE_PATTERNS.TGZ_FILES}`;
|
|
131
|
+
return formData.append("file", blob, filename), formData;
|
|
132
|
+
}
|
|
133
|
+
function verifyTarballIntegrity(buffer, expectedSize, expectedChecksum) {
|
|
134
|
+
try {
|
|
135
|
+
if (expectedSize && buffer.length !== expectedSize)
|
|
136
|
+
return logger.warn("Tarball size mismatch", {
|
|
137
|
+
expected: expectedSize,
|
|
138
|
+
actual: buffer.length
|
|
139
|
+
}), !1;
|
|
140
|
+
if (expectedChecksum) {
|
|
141
|
+
let actualChecksum = createHash("sha256").update(buffer).digest("hex");
|
|
142
|
+
if (actualChecksum !== expectedChecksum)
|
|
143
|
+
return logger.warn("Tarball checksum mismatch", {
|
|
144
|
+
expected: expectedChecksum,
|
|
145
|
+
actual: actualChecksum
|
|
146
|
+
}), !1;
|
|
147
|
+
}
|
|
148
|
+
return !0;
|
|
149
|
+
} catch (error) {
|
|
150
|
+
return logger.error("Tarball integrity check failed", { error }), !1;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// ../core/src/core/install/plugin-detector.ts
|
|
155
|
+
import { join as join2 } from "path";
|
|
156
|
+
import { promises as fs } from "fs";
|
|
157
|
+
async function detectPluginType(dirPath) {
|
|
158
|
+
let pluginDir = join2(dirPath, DIR_PATTERNS.CLAUDE_PLUGIN), pluginManifestPath = join2(pluginDir, FILE_PATTERNS.PLUGIN_JSON);
|
|
159
|
+
if (await exists(pluginManifestPath))
|
|
160
|
+
return logger.info("Detected individual Claude Code plugin", { path: pluginManifestPath }), {
|
|
161
|
+
isPlugin: !0,
|
|
162
|
+
type: "individual",
|
|
163
|
+
manifestPath: pluginManifestPath
|
|
164
|
+
};
|
|
165
|
+
let marketplaceManifestPath = join2(pluginDir, FILE_PATTERNS.MARKETPLACE_JSON);
|
|
166
|
+
return await exists(marketplaceManifestPath) ? (logger.info("Detected Claude Code plugin marketplace", { path: marketplaceManifestPath }), {
|
|
167
|
+
isPlugin: !0,
|
|
168
|
+
type: "marketplace",
|
|
169
|
+
manifestPath: marketplaceManifestPath
|
|
170
|
+
}) : { isPlugin: !1 };
|
|
171
|
+
}
|
|
172
|
+
async function detectPluginWithMarketplace(dirPath, marketplaceEntry) {
|
|
173
|
+
let standardDetection = await detectPluginType(dirPath);
|
|
174
|
+
return standardDetection.isPlugin ? standardDetection : marketplaceEntry?.strict === !1 && await hasPluginContent(dirPath) ? (logger.info("Detected marketplace-defined plugin (strict:false)", {
|
|
175
|
+
dirPath,
|
|
176
|
+
pluginName: marketplaceEntry.name
|
|
177
|
+
}), {
|
|
178
|
+
isPlugin: !0,
|
|
179
|
+
type: "marketplace-defined"
|
|
180
|
+
}) : { isPlugin: !1 };
|
|
181
|
+
}
|
|
182
|
+
async function hasPluginContent(dirPath) {
|
|
183
|
+
let pluginContentDirs = ["commands", "agents", "skills", "hooks"], pluginContentFiles = [".mcp.json", ".lsp.json"];
|
|
184
|
+
for (let subdir of pluginContentDirs) {
|
|
185
|
+
let subdirPath = join2(dirPath, subdir);
|
|
186
|
+
if (await exists(subdirPath))
|
|
187
|
+
try {
|
|
188
|
+
if ((await fs.readdir(subdirPath)).length > 0)
|
|
189
|
+
return !0;
|
|
190
|
+
} catch {
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
for (let file of pluginContentFiles) {
|
|
194
|
+
let filePath = join2(dirPath, file);
|
|
195
|
+
if (await exists(filePath))
|
|
196
|
+
return !0;
|
|
197
|
+
}
|
|
198
|
+
return !1;
|
|
199
|
+
}
|
|
200
|
+
async function validatePluginManifest(manifestPath) {
|
|
201
|
+
try {
|
|
202
|
+
let content = await readTextFile(manifestPath);
|
|
203
|
+
return JSON.parse(content), !0;
|
|
204
|
+
} catch (error) {
|
|
205
|
+
return logger.error("Failed to parse plugin manifest", { manifestPath, error }), !1;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export {
|
|
210
|
+
extractBaseVersion,
|
|
211
|
+
isUnversionedVersion,
|
|
212
|
+
formatVersionLabel,
|
|
213
|
+
createTarballFromPackage,
|
|
214
|
+
extractPackageFromTarball,
|
|
215
|
+
createFormDataForUpload,
|
|
216
|
+
verifyTarballIntegrity,
|
|
217
|
+
detectPluginType,
|
|
218
|
+
detectPluginWithMarketplace,
|
|
219
|
+
hasPluginContent,
|
|
220
|
+
validatePluginManifest
|
|
221
|
+
};
|
|
222
|
+
//# sourceMappingURL=chunk-HYKYECAE.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../core/src/utils/version-generator.ts", "../../core/src/core/package-versioning.ts", "../../core/src/utils/tarball.ts", "../../core/src/core/install/plugin-detector.ts"],
|
|
4
|
+
"sourcesContent": ["import { createHash } from 'crypto';\nimport * as semver from 'semver';\n\n/**\n * Version generation utilities for local and WIP versions.\n */\n\nexport const WIP_TIMESTAMP_TOKEN_LENGTH = 6;\nexport const WORKSPACE_HASH_TOKEN_LENGTH = 8;\n// Length of the short workspace tag used in WIP versions (e.g. 3 base36 chars)\nexport const WIP_WORKSPACE_TAG_LENGTH = 3;\n\n\n\n/**\n * Extract the stable base (major.minor.patch) portion of a version string.\n *\n * - For any valid semver (including pre-releases like \"1.2.3-000fz8.a3k\"\n * or legacy \"1.2.3-wip.abc\"), this returns \"1.2.3\".\n * - For non-semver strings, it returns the portion before the first \"-\"\n * (if any), otherwise the input unchanged.\n */\nexport function extractBaseVersion(version: string): string {\n const hyphenIndex = version.indexOf('-');\n const candidate = hyphenIndex === -1 ? version : version.slice(0, hyphenIndex);\n\n const parsed = semver.parse(candidate);\n if (parsed) {\n return `${parsed.major}.${parsed.minor}.${parsed.patch}`;\n }\n return candidate;\n}\n\nconst TIMESTAMP_ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz';\n\n/**\n * Encode a non-negative integer into a fixed-length base36-like string.\n * Values that exceed the requested length are truncated from the left (highest order digits).\n */\nexport function encodeBase62(value: number, length: number = WIP_TIMESTAMP_TOKEN_LENGTH): string {\n if (!Number.isFinite(value) || value < 0) {\n value = 0;\n }\n\n const base = TIMESTAMP_ALPHABET.length;\n let remaining = Math.floor(value);\n let encoded = '';\n\n do {\n const digit = remaining % base;\n encoded = `${TIMESTAMP_ALPHABET[digit]}${encoded}`;\n remaining = Math.floor(remaining / base);\n } while (remaining > 0);\n\n if (encoded.length < length) {\n encoded = encoded.padStart(length, '0');\n } else if (encoded.length > length) {\n encoded = encoded.slice(-length);\n }\n\n return encoded;\n}\n\n/**\n * Generate a 6-character base36 timestamp from the provided Date (defaults to now).\n */\nexport function generateBase62Timestamp(\n date: Date = new Date(),\n length: number = WIP_TIMESTAMP_TOKEN_LENGTH\n): string {\n const seconds = Math.floor(date.getTime() / 1000);\n return encodeBase62(seconds, length);\n}\n\n/**\n * Create a deterministic hash for the current workspace path.\n * Returns a lower-case hex slice (default 8 characters).\n */\nexport function createWorkspaceHash(\n inputPath: string,\n length: number = WORKSPACE_HASH_TOKEN_LENGTH\n): string {\n const normalizedPath = inputPath.replace(/\\\\/g, '/');\n const digest = createHash('sha256').update(normalizedPath).digest('hex');\n if (length <= 0) {\n return '';\n }\n if (digest.length <= length) {\n return digest.padEnd(length, '0');\n }\n return digest.slice(0, length);\n}\n\n/**\n * Sanitize a workspace hash string to a fixed length.\n * Internal helper used for tag generation.\n */\nfunction sanitizeWorkspaceHash(\n hash: string,\n length: number\n): string {\n const cleaned = (hash || '').toLowerCase().replace(/[^0-9a-z]/g, '');\n if (cleaned.length === 0) {\n return ''.padEnd(length, '0');\n }\n if (cleaned.length >= length) {\n return cleaned.slice(0, length);\n }\n return `${cleaned}${'0'.repeat(length - cleaned.length)}`;\n}\n\n/**\n * Create the workspace tag used in WIP versions.\n * Returns a 3-character tag derived from the workspace path hash.\n * This is the single source of truth for workspace tags used in version strings.\n */\nexport function createWorkspaceTag(inputPath: string): string {\n const workspaceHash = createWorkspaceHash(inputPath);\n return sanitizeWorkspaceHash(workspaceHash, WIP_WORKSPACE_TAG_LENGTH);\n}\n\n/**\n * Generate a WIP version string in the canonical S-<t>.<w> form.\n *\n * - `stable` is the normalized base stable version (e.g. \"1.2.3\").\n * - `workspacePath` is the workspace path; the tag is derived from it.\n * - `options.now` can be provided for deterministic testing.\n */\nexport function generateWipVersion(\n stable: string,\n workspacePath: string,\n options?: { now?: Date }\n): string {\n const timestampPart = generateBase62Timestamp(\n options?.now ?? new Date(),\n WIP_TIMESTAMP_TOKEN_LENGTH\n );\n const hashPart = createWorkspaceTag(workspacePath);\n return `${stable}-${timestampPart}.${hashPart}`;\n}\n\nexport interface ParsedWipVersion {\n baseStable: string;\n timestamp: string;\n workspaceHash: string;\n}\n\n/**\n * Parse a WIP version string.\n *\n * Supports the S-<t>.<w> scheme: {base}-{timestamp}.{workspaceTag} (e.g. 1.2.3-000fz8.a3k)\n */\nexport function parseWipVersion(version: string): ParsedWipVersion | null {\n const parsed = semver.parse(version);\n if (parsed && parsed.prerelease.length === 2) {\n const [timestamp, workspaceHash] = parsed.prerelease;\n if (typeof timestamp === 'string' && typeof workspaceHash === 'string') {\n return {\n baseStable: `${parsed.major}.${parsed.minor}.${parsed.patch}`,\n timestamp,\n workspaceHash\n };\n }\n }\n\n return null;\n}\n\nexport function extractWorkspaceHashFromVersion(version: string): string | null {\n const parsed = parseWipVersion(version);\n return parsed?.workspaceHash ?? null;\n}\n\n", "import * as semver from 'semver';\nimport yaml from 'js-yaml';\nimport { PackageFile, PackageYml } from '../types/index.js';\nimport { extractBaseVersion } from '../utils/version-generator.js';\nimport { getPackageVersionPath } from './directory.js';\nimport { exists } from '../utils/fs.js';\nimport { FILE_PATTERNS, UNVERSIONED } from '../constants/index.js';\nimport { isScopedName } from '../utils/package-name.js';\n\n/**\n * Compute stable version from a prerelease version\n * Example: \"1.2.3-dev.abc123\" -> \"1.2.3\"\n */\nexport function computeStableVersion(version: string): string {\n const parsed = semver.parse(version);\n if (parsed) {\n return `${parsed.major}.${parsed.minor}.${parsed.patch}`;\n }\n return extractBaseVersion(version);\n}\n\n/**\n * Dump YAML with proper quoting for scoped names (e.g., @scope/name)\n */\nexport function dumpYamlWithScopedQuoting(config: PackageYml, options: yaml.DumpOptions = {}): string {\n let dumped = yaml.dump(config, { flowLevel: 1, ...options, quotingType: '\"' });\n \n // Ensure scoped names are quoted\n if (isScopedName(config.name)) {\n const lines = dumped.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].trim().startsWith('name:')) {\n const valueMatch = lines[i].match(/name:\\s*(.+)$/);\n if (valueMatch) {\n const value = valueMatch[1].trim();\n if (!value.startsWith('\"') && !value.startsWith(\"'\")) {\n lines[i] = lines[i].replace(/name:\\s*(.+)$/, `name: \"${config.name}\"`);\n }\n }\n break;\n }\n }\n dumped = lines.join('\\n');\n }\n \n return dumped;\n}\n\n/**\n * Transform package files for version change only (no name change)\n * Updates openpackage.yml version field\n */\nexport function transformPackageFilesForVersionChange(\n files: PackageFile[],\n newVersion: string,\n packageName: string\n): PackageFile[] {\n return files.map((file) => {\n if (file.path === FILE_PATTERNS.OPENPACKAGE_YML) {\n try {\n const parsed = yaml.load(file.content) as PackageYml;\n const updated: PackageYml = {\n ...parsed,\n version: newVersion\n };\n const dumped = dumpYamlWithScopedQuoting(updated, { lineWidth: 120 });\n return { ...file, content: dumped };\n } catch {\n // Fallback: minimal rewrite if parsing fails\n const fallback: PackageYml = {\n name: packageName,\n version: newVersion\n };\n const dumped = dumpYamlWithScopedQuoting(fallback, { lineWidth: 120 });\n return { ...file, content: dumped };\n }\n }\n return file;\n });\n}\n\n/**\n * Check if a package version already exists\n */\nexport async function packageVersionExists(packageName: string, version?: string): Promise<boolean> {\n const targetPath = getPackageVersionPath(packageName, version ?? UNVERSIONED);\n return await exists(targetPath);\n}\n\n/**\n * Returns true when a version is absent or explicitly marked as unversioned.\n */\nexport function isUnversionedVersion(version?: string | null): boolean {\n return version === undefined || version === null || version === UNVERSIONED;\n}\n\n/**\n * Normalizes a version string for display/logging.\n */\nexport function formatVersionLabel(version?: string | null): string {\n return isUnversionedVersion(version) ? UNVERSIONED : (version as string);\n}\n\n/**\n * Filter a list of versions down to semver-valid stable releases.\n */\nexport function filterStableVersions(versions: string[]): string[] {\n return versions.filter((version) => semver.valid(version) && !semver.prerelease(version));\n}\n\n/**\n * Find the latest stable version from a list (returns null if none).\n */\nexport function getLatestStableVersion(versions: string[]): string | null {\n const stableVersions = filterStableVersions(versions);\n if (stableVersions.length === 0) {\n return null;\n }\n return semver.rsort(stableVersions)[0];\n}\n", "import * as tar from 'tar';\nimport { createHash } from 'crypto';\nimport { unlink, readdir, stat, readFile, writeFile } from 'fs/promises';\nimport { join } from 'path';\nimport { tmpdir } from 'os';\nimport { PackageFile, Package } from '../types/index.js';\nimport { logger } from './logger.js';\nimport { ValidationError } from './errors.js';\nimport { writeTextFile, readTextFile, ensureDir, exists } from './fs.js';\nimport { UNVERSIONED, FILE_PATTERNS } from '../constants/index.js';\n\n/**\n * Tarball utilities for package packaging and extraction\n */\n\nexport interface TarballInfo {\n buffer: Buffer;\n size: number;\n checksum: string;\n}\n\nexport interface ExtractedPackage {\n files: PackageFile[];\n checksum: string;\n}\n\n/**\n * Create a tarball from package files\n */\nexport async function createTarballFromPackage(pkg: Package): Promise<TarballInfo> {\n logger.debug(`Creating tarball for package: ${pkg.metadata.name}@${pkg.metadata.version}`);\n \n const tempDir = join(tmpdir(), `openpackage-tarball-${Date.now()}`);\n const tarballPath = join(tempDir, 'package.tar.gz');\n \n try {\n // Create temp directory\n await ensureDir(tempDir);\n \n // Write package files to temp directory\n for (const file of pkg.files) {\n const filePath = join(tempDir, file.path);\n await ensureDir(join(filePath, '..'));\n await writeTextFile(filePath, file.content, (file.encoding as BufferEncoding) || 'utf8');\n }\n \n // Create tarball\n await tar.create(\n {\n gzip: true,\n file: tarballPath,\n cwd: tempDir\n },\n pkg.files.map(f => f.path)\n );\n \n // Read tarball into buffer\n const tarballBuffer = await readFile(tarballPath);\n \n // Calculate checksum\n const checksum = createHash('sha256').update(tarballBuffer).digest('hex');\n \n logger.debug(`Tarball created: ${tarballBuffer.length} bytes, checksum: ${checksum}`);\n \n return {\n buffer: tarballBuffer,\n size: tarballBuffer.length,\n checksum\n };\n } catch (error) {\n logger.error('Failed to create tarball', { error, packageName: pkg.metadata.name });\n throw new ValidationError(`Failed to create tarball: ${error}`);\n } finally {\n // Clean up temp directory\n try {\n if (await exists(tarballPath)) {\n await unlink(tarballPath);\n }\n // Note: We're not removing the temp dir itself as it may have subdirectories\n // The OS temp cleanup will handle this\n } catch (cleanupError) {\n logger.warn('Failed to clean up temp files', { cleanupError });\n }\n }\n}\n\n/**\n * Extract package files from tarball buffer\n */\nexport async function extractPackageFromTarball(\n tarballBuffer: Buffer, \n expectedChecksum?: string\n): Promise<ExtractedPackage> {\n logger.debug(`Extracting package from tarball (${tarballBuffer.length} bytes)`);\n \n const tempDir = join(tmpdir(), `openpackage-extract-${Date.now()}`);\n\n const isGzipBuffer = (buffer: Buffer): boolean => {\n // gzip magic header: 1f 8b\n return buffer.length >= 2 && buffer[0] === 0x1f && buffer[1] === 0x8b;\n };\n\n const previewBufferAsText = (buffer: Buffer, maxBytes: number = 200): string => {\n const slice = buffer.subarray(0, Math.min(maxBytes, buffer.length));\n // Replace control characters to keep logs readable\n return slice\n .toString('utf8')\n .replace(/[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\u007F]/g, '\uFFFD');\n };\n\n const isGzip = isGzipBuffer(tarballBuffer);\n const tarballPath = join(tempDir, isGzip ? 'package.tar.gz' : 'package.tar');\n \n try {\n // Verify checksum if provided\n const actualChecksum = createHash('sha256').update(tarballBuffer).digest('hex');\n \n if (expectedChecksum && actualChecksum !== expectedChecksum) {\n throw new ValidationError(\n `Tarball checksum mismatch. Expected: ${expectedChecksum}, Got: ${actualChecksum}`\n );\n }\n \n // Create temp directory and write tarball\n await ensureDir(tempDir);\n await writeFile(tarballPath, tarballBuffer);\n \n // Extract tarball\n await tar.extract({\n file: tarballPath,\n cwd: tempDir\n });\n \n // Read extracted files\n const files: PackageFile[] = [];\n const extractFiles = async (dir: string, basePath: string = ''): Promise<void> => {\n const entries = await readdir(dir);\n \n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const relativePath = basePath ? join(basePath, entry) : entry;\n \n const stats = await stat(fullPath);\n if (stats.isFile()) {\n const content = await readTextFile(fullPath);\n files.push({\n path: relativePath,\n content,\n encoding: 'utf8'\n });\n } else if (stats.isDirectory()) {\n await extractFiles(fullPath, relativePath);\n }\n }\n };\n \n await extractFiles(tempDir);\n \n // Remove the tarball file itself from the list\n const filteredFiles = files.filter(f => f.path !== 'package.tar.gz' && f.path !== 'package.tar');\n \n logger.debug(`Extracted ${filteredFiles.length} files from tarball`);\n \n return {\n files: filteredFiles,\n checksum: actualChecksum\n };\n } catch (error) {\n const hint = (() => {\n // If we didn't get gzip bytes, the first bytes are often informative (JSON/XML)\n if (isGzip) {\n return undefined;\n }\n const preview = previewBufferAsText(tarballBuffer);\n const trimmed = preview.trimStart();\n if (trimmed.startsWith('{') || trimmed.startsWith('[') || trimmed.startsWith('<')) {\n return `Downloaded payload does not look like a tarball (starts with: '${trimmed.slice(0, 60)}')`;\n }\n return `Downloaded payload does not look gzip-compressed (first bytes: '${preview.slice(0, 60)}')`;\n })();\n\n logger.error('Failed to extract tarball', { error, isGzip, hint });\n const baseMessage = error instanceof Error ? error.message : String(error);\n throw new ValidationError(hint ? `${baseMessage}. ${hint}` : `Failed to extract tarball: ${baseMessage}`);\n } finally {\n // Clean up temp files\n try {\n if (await exists(tarballPath)) {\n await unlink(tarballPath);\n }\n } catch (cleanupError) {\n logger.warn('Failed to clean up temp files', { cleanupError });\n }\n }\n}\n\n/**\n * Create FormData for multipart upload\n */\nexport function createFormDataForUpload(\n packageName: string,\n version: string | undefined,\n tarballInfo: TarballInfo\n): FormData {\n const formData = new FormData();\n \n // Add form fields\n formData.append('name', packageName);\n if (version) {\n formData.append('version', version);\n }\n \n // Add tarball file\n const blob = new Blob([tarballInfo.buffer], { type: 'application/gzip' });\n const filename = version ? `${packageName}-${version}${FILE_PATTERNS.TGZ_FILES}` : `${packageName}-${UNVERSIONED}${FILE_PATTERNS.TGZ_FILES}`;\n formData.append('file', blob, filename);\n \n return formData;\n}\n\n/**\n * Verify tarball integrity\n */\nexport function verifyTarballIntegrity(\n buffer: Buffer,\n expectedSize?: number,\n expectedChecksum?: string\n): boolean {\n try {\n // Check size\n if (expectedSize && buffer.length !== expectedSize) {\n logger.warn('Tarball size mismatch', { \n expected: expectedSize, \n actual: buffer.length \n });\n return false;\n }\n \n // Check checksum\n if (expectedChecksum) {\n const actualChecksum = createHash('sha256').update(buffer).digest('hex');\n if (actualChecksum !== expectedChecksum) {\n logger.warn('Tarball checksum mismatch', { \n expected: expectedChecksum, \n actual: actualChecksum \n });\n return false;\n }\n }\n \n return true;\n } catch (error) {\n logger.error('Tarball integrity check failed', { error });\n return false;\n }\n}\n\n", "import { join } from 'path';\nimport { promises as fs } from 'fs';\nimport { exists, readTextFile } from '../../utils/fs.js';\nimport { logger } from '../../utils/logger.js';\nimport { DIR_PATTERNS, FILE_PATTERNS } from '../../constants/index.js';\nimport type { MarketplacePluginEntry } from './marketplace-handler.js';\n\nexport type PluginType = 'individual' | 'marketplace' | 'marketplace-defined';\n\nexport interface PluginDetectionResult {\n isPlugin: boolean;\n type?: PluginType;\n manifestPath?: string;\n}\n\n/**\n * Detect if a directory contains a Claude Code plugin.\n * \n * Detection order:\n * 1. Check for .claude-plugin/plugin.json (individual plugin)\n * 2. Check for .claude-plugin/marketplace.json (marketplace)\n * \n * @param dirPath - Absolute path to directory to check\n * @returns Detection result with plugin type if found\n */\nexport async function detectPluginType(dirPath: string): Promise<PluginDetectionResult> {\n const pluginDir = join(dirPath, DIR_PATTERNS.CLAUDE_PLUGIN);\n \n // Check for individual plugin\n const pluginManifestPath = join(pluginDir, FILE_PATTERNS.PLUGIN_JSON);\n if (await exists(pluginManifestPath)) {\n logger.info('Detected individual Claude Code plugin', { path: pluginManifestPath });\n return {\n isPlugin: true,\n type: 'individual',\n manifestPath: pluginManifestPath\n };\n }\n \n // Check for marketplace\n const marketplaceManifestPath = join(pluginDir, FILE_PATTERNS.MARKETPLACE_JSON);\n if (await exists(marketplaceManifestPath)) {\n logger.info('Detected Claude Code plugin marketplace', { path: marketplaceManifestPath });\n return {\n isPlugin: true,\n type: 'marketplace',\n manifestPath: marketplaceManifestPath\n };\n }\n \n // Not a plugin\n return { isPlugin: false };\n}\n\n/**\n * Detect if a directory contains a Claude Code plugin, with marketplace context.\n * \n * This enhanced detection supports marketplace-defined plugins (strict:false) that\n * may not have their own plugin.json file.\n * \n * Detection order:\n * 1. Check for .claude-plugin/plugin.json (individual plugin)\n * 2. Check for .claude-plugin/marketplace.json (marketplace)\n * 3. If marketplaceEntry exists AND strict:false, check for plugin content\n * \n * @param dirPath - Absolute path to directory to check\n * @param marketplaceEntry - Optional marketplace entry for this plugin\n * @returns Detection result with plugin type if found\n */\nexport async function detectPluginWithMarketplace(\n dirPath: string,\n marketplaceEntry?: MarketplacePluginEntry\n): Promise<PluginDetectionResult> {\n // First try standard detection\n const standardDetection = await detectPluginType(dirPath);\n \n if (standardDetection.isPlugin) {\n return standardDetection;\n }\n \n // If no plugin.json and marketplace entry with strict:false, check for plugin content\n if (marketplaceEntry?.strict === false) {\n const hasContent = await hasPluginContent(dirPath);\n \n if (hasContent) {\n logger.info('Detected marketplace-defined plugin (strict:false)', { \n dirPath,\n pluginName: marketplaceEntry.name \n });\n \n return {\n isPlugin: true,\n type: 'marketplace-defined'\n };\n }\n }\n \n return { isPlugin: false };\n}\n\n/**\n * Check if a directory has plugin content (commands, agents, etc.)\n * Used to validate marketplace-defined plugins that don't have plugin.json.\n * Exported for use in file-discovery and path-package-loader.\n */\nexport async function hasPluginContent(dirPath: string): Promise<boolean> {\n const pluginContentDirs = ['commands', 'agents', 'skills', 'hooks'];\n const pluginContentFiles = ['.mcp.json', '.lsp.json'];\n \n // Check for plugin content directories\n for (const subdir of pluginContentDirs) {\n const subdirPath = join(dirPath, subdir);\n if (await exists(subdirPath)) {\n // Check if directory is not empty\n try {\n const items = await fs.readdir(subdirPath);\n if (items.length > 0) {\n return true;\n }\n } catch {\n // Ignore errors reading directory\n }\n }\n }\n \n // Check for plugin content files\n for (const file of pluginContentFiles) {\n const filePath = join(dirPath, file);\n if (await exists(filePath)) {\n return true;\n }\n }\n \n return false;\n}\n\n/**\n * Validate that a plugin manifest can be parsed.\n * Returns true if the manifest is valid JSON.\n */\nexport async function validatePluginManifest(manifestPath: string): Promise<boolean> {\n try {\n const content = await readTextFile(manifestPath);\n JSON.parse(content);\n return true;\n } catch (error) {\n logger.error('Failed to parse plugin manifest', { manifestPath, error });\n return false;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["semver", "join", "join"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
getOpenPackageDirectories
|
|
4
|
+
} from "./chunk-GDVFS3YP.js";
|
|
5
|
+
import {
|
|
6
|
+
SCOPED_PACKAGE_REGEX,
|
|
7
|
+
normalizePackageName
|
|
8
|
+
} from "./chunk-VN22A7NW.js";
|
|
9
|
+
import {
|
|
10
|
+
DIR_PATTERNS,
|
|
11
|
+
OPENPACKAGE_DIRS
|
|
12
|
+
} from "./chunk-IHVZ5AUJ.js";
|
|
13
|
+
|
|
14
|
+
// ../core/src/core/scope-resolution.ts
|
|
15
|
+
import { join } from "path";
|
|
16
|
+
function getScopePackageDir(cwd, scope, packageName, customPath) {
|
|
17
|
+
if (customPath)
|
|
18
|
+
return customPath;
|
|
19
|
+
if (scope === "root")
|
|
20
|
+
return cwd;
|
|
21
|
+
if (!packageName)
|
|
22
|
+
throw new Error(`Package name is required for ${scope} scope`);
|
|
23
|
+
let normalizedName = normalizePackageName(packageName);
|
|
24
|
+
if (scope === "project")
|
|
25
|
+
return getScopedPackagePath(
|
|
26
|
+
join(cwd, DIR_PATTERNS.OPENPACKAGE, OPENPACKAGE_DIRS.PACKAGES),
|
|
27
|
+
normalizedName
|
|
28
|
+
);
|
|
29
|
+
if (scope === "global") {
|
|
30
|
+
let dirs = getOpenPackageDirectories();
|
|
31
|
+
return getScopedPackagePath(
|
|
32
|
+
join(dirs.data, OPENPACKAGE_DIRS.PACKAGES),
|
|
33
|
+
normalizedName
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
throw new Error(`Invalid scope: ${scope}`);
|
|
37
|
+
}
|
|
38
|
+
function getScopePackageYmlPath(cwd, scope, packageName, customPath) {
|
|
39
|
+
let packageDir = getScopePackageDir(cwd, scope, packageName, customPath);
|
|
40
|
+
return join(packageDir, "openpackage.yml");
|
|
41
|
+
}
|
|
42
|
+
function getScopeDescription(scope) {
|
|
43
|
+
switch (scope) {
|
|
44
|
+
case "root":
|
|
45
|
+
return "Current directory (root package)";
|
|
46
|
+
case "project":
|
|
47
|
+
return "Project-scoped (.openpackage/packages/)";
|
|
48
|
+
case "global":
|
|
49
|
+
return "Global shared (~/.openpackage/packages/)";
|
|
50
|
+
default:
|
|
51
|
+
return "Unknown scope";
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function getScopeDisplayPath(scope, packageName, customPath) {
|
|
55
|
+
if (customPath)
|
|
56
|
+
return customPath;
|
|
57
|
+
if (scope === "root")
|
|
58
|
+
return "./openpackage.yml";
|
|
59
|
+
if (!packageName)
|
|
60
|
+
return scope === "project" ? "./.openpackage/packages/<package-name>/" : "~/.openpackage/packages/<package-name>/";
|
|
61
|
+
let normalizedName = normalizePackageName(packageName);
|
|
62
|
+
return scope === "project" ? `./.openpackage/packages/${normalizedName}/` : `~/.openpackage/packages/${normalizedName}/`;
|
|
63
|
+
}
|
|
64
|
+
function parseWorkspaceScope(scopeValue) {
|
|
65
|
+
let parsed = parseScope(scopeValue);
|
|
66
|
+
if (parsed === "root")
|
|
67
|
+
throw new Error("root scope not supported; use project or global");
|
|
68
|
+
return parsed;
|
|
69
|
+
}
|
|
70
|
+
function parseScope(scopeValue) {
|
|
71
|
+
let normalized = scopeValue.toLowerCase().trim();
|
|
72
|
+
if (normalized === "root" || normalized === "r")
|
|
73
|
+
return "root";
|
|
74
|
+
if (normalized === "project" || normalized === "p")
|
|
75
|
+
return "project";
|
|
76
|
+
if (normalized === "global" || normalized === "g")
|
|
77
|
+
return "global";
|
|
78
|
+
throw new Error(
|
|
79
|
+
`Invalid scope: '${scopeValue}'
|
|
80
|
+
Valid scopes: root, project, global`
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
function getScopedPackagePath(baseDir, packageName) {
|
|
84
|
+
let scopedMatch = packageName.match(SCOPED_PACKAGE_REGEX);
|
|
85
|
+
if (scopedMatch) {
|
|
86
|
+
let [, scope, localName] = scopedMatch;
|
|
87
|
+
return join(baseDir, "@" + scope, localName);
|
|
88
|
+
}
|
|
89
|
+
return join(baseDir, packageName);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export {
|
|
93
|
+
getScopePackageDir,
|
|
94
|
+
getScopePackageYmlPath,
|
|
95
|
+
getScopeDescription,
|
|
96
|
+
getScopeDisplayPath,
|
|
97
|
+
parseWorkspaceScope,
|
|
98
|
+
parseScope
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=chunk-I7FEAHB4.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../core/src/core/scope-resolution.ts"],
|
|
4
|
+
"sourcesContent": ["import { join } from 'path';\nimport { getOpenPackageDirectories } from './directory.js';\nimport { DIR_PATTERNS, OPENPACKAGE_DIRS } from '../constants/index.js';\nimport { normalizePackageName, SCOPED_PACKAGE_REGEX } from '../utils/package-name.js';\n\n/**\n * Package scope types\n * - root: Current directory (cwd) as a package\n * - project: Workspace-scoped package in .openpackage/packages/\n * - global: User-scoped package in ~/.openpackage/packages/\n */\nexport type PackageScope = 'root' | 'project' | 'global';\n\n/**\n * Get the package directory for a given scope\n * \n * @param cwd - Current working directory\n * @param scope - Package scope\n * @param packageName - Package name (required for project/global, ignored for root)\n * @param customPath - Optional custom path (overrides scope-based resolution)\n * @returns Absolute path to package directory\n */\nexport function getScopePackageDir(\n cwd: string,\n scope: PackageScope,\n packageName?: string,\n customPath?: string\n): string {\n // Custom path takes precedence over scope\n if (customPath) {\n // Note: This is a simple delegation - full validation happens elsewhere\n // This function just returns the path for consistency with the API\n return customPath;\n }\n\n if (scope === 'root') {\n // Root scope: current directory is the package\n return cwd;\n }\n\n if (!packageName) {\n throw new Error(`Package name is required for ${scope} scope`);\n }\n\n const normalizedName = normalizePackageName(packageName);\n\n if (scope === 'project') {\n // Project scope: .openpackage/packages/<name>/\n return getScopedPackagePath(\n join(cwd, DIR_PATTERNS.OPENPACKAGE, OPENPACKAGE_DIRS.PACKAGES),\n normalizedName\n );\n }\n\n if (scope === 'global') {\n // Global scope: ~/.openpackage/packages/<name>/\n const dirs = getOpenPackageDirectories();\n return getScopedPackagePath(\n join(dirs.data, OPENPACKAGE_DIRS.PACKAGES),\n normalizedName\n );\n }\n\n throw new Error(`Invalid scope: ${scope}`);\n}\n\n/**\n * Get the openpackage.yml path for a given scope\n * \n * @param cwd - Current working directory\n * @param scope - Package scope\n * @param packageName - Package name (required for project/global, ignored for root)\n * @param customPath - Optional custom path (overrides scope-based resolution)\n * @returns Absolute path to openpackage.yml\n */\nexport function getScopePackageYmlPath(\n cwd: string,\n scope: PackageScope,\n packageName?: string,\n customPath?: string\n): string {\n const packageDir = getScopePackageDir(cwd, scope, packageName, customPath);\n return join(packageDir, 'openpackage.yml');\n}\n\n/**\n * Get a human-readable description of the scope\n * \n * @param scope - Package scope\n * @returns Description string\n */\nexport function getScopeDescription(scope: PackageScope): string {\n switch (scope) {\n case 'root':\n return 'Current directory (root package)';\n case 'project':\n return 'Project-scoped (.openpackage/packages/)';\n case 'global':\n return 'Global shared (~/.openpackage/packages/)';\n default:\n return 'Unknown scope';\n }\n}\n\n/**\n * Get the relative display path for a scope\n * Used in CLI output to show where package will be created\n * \n * @param scope - Package scope\n * @param packageName - Package name (optional)\n * @param customPath - Optional custom path for display\n * @returns Display path string\n */\nexport function getScopeDisplayPath(\n scope: PackageScope,\n packageName?: string,\n customPath?: string\n): string {\n if (customPath) {\n return customPath;\n }\n\n if (scope === 'root') {\n return './openpackage.yml';\n }\n\n if (!packageName) {\n return scope === 'project'\n ? './.openpackage/packages/<package-name>/'\n : '~/.openpackage/packages/<package-name>/';\n }\n\n const normalizedName = normalizePackageName(packageName);\n return scope === 'project'\n ? `./.openpackage/packages/${normalizedName}/`\n : `~/.openpackage/packages/${normalizedName}/`;\n}\n\n/**\n * Workspace scope for list/uninstall/view (project or global only, no root)\n */\nexport type WorkspaceScope = 'project' | 'global';\n\n/**\n * Parse and validate workspace scope from CLI (project or global only)\n * Used by list, uninstall, view - rejects root scope.\n *\n * @param scopeValue - Raw scope value from CLI option\n * @returns Validated WorkspaceScope\n */\nexport function parseWorkspaceScope(scopeValue: string): WorkspaceScope {\n const parsed = parseScope(scopeValue);\n if (parsed === 'root') {\n throw new Error('root scope not supported; use project or global');\n }\n return parsed;\n}\n\n/**\n * Parse and validate scope option from CLI\n * \n * @param scopeValue - Raw scope value from CLI option\n * @returns Validated PackageScope\n */\nexport function parseScope(scopeValue: string): PackageScope {\n const normalized = scopeValue.toLowerCase().trim();\n\n if (normalized === 'root' || normalized === 'r') {\n return 'root';\n }\n\n if (normalized === 'project' || normalized === 'p') {\n return 'project';\n }\n\n if (normalized === 'global' || normalized === 'g') {\n return 'global';\n }\n\n throw new Error(\n `Invalid scope: '${scopeValue}'\\n` +\n `Valid scopes: root, project, global`\n );\n}\n\n/**\n * Helper to get the package path handling scoped packages (@scope/name)\n * Scoped packages get nested directory structure: @scope/name/\n */\nfunction getScopedPackagePath(baseDir: string, packageName: string): string {\n const scopedMatch = packageName.match(SCOPED_PACKAGE_REGEX);\n if (scopedMatch) {\n const [, scope, localName] = scopedMatch;\n return join(baseDir, '@' + scope, localName);\n }\n return join(baseDir, packageName);\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;AAAA,SAAS,YAAY;AAsBd,SAAS,mBACd,KACA,OACA,aACA,YACQ;AAER,MAAI;AAGF,WAAO;AAGT,MAAI,UAAU;AAEZ,WAAO;AAGT,MAAI,CAAC;AACH,UAAM,IAAI,MAAM,gCAAgC,KAAK,QAAQ;AAG/D,MAAM,iBAAiB,qBAAqB,WAAW;AAEvD,MAAI,UAAU;AAEZ,WAAO;AAAA,MACL,KAAK,KAAK,aAAa,aAAa,iBAAiB,QAAQ;AAAA,MAC7D;AAAA,IACF;AAGF,MAAI,UAAU,UAAU;AAEtB,QAAM,OAAO,0BAA0B;AACvC,WAAO;AAAA,MACL,KAAK,KAAK,MAAM,iBAAiB,QAAQ;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,kBAAkB,KAAK,EAAE;AAC3C;AAWO,SAAS,uBACd,KACA,OACA,aACA,YACQ;AACR,MAAM,aAAa,mBAAmB,KAAK,OAAO,aAAa,UAAU;AACzE,SAAO,KAAK,YAAY,iBAAiB;AAC3C;AAQO,SAAS,oBAAoB,OAA6B;AAC/D,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAWO,SAAS,oBACd,OACA,aACA,YACQ;AACR,MAAI;AACF,WAAO;AAGT,MAAI,UAAU;AACZ,WAAO;AAGT,MAAI,CAAC;AACH,WAAO,UAAU,YACb,4CACA;AAGN,MAAM,iBAAiB,qBAAqB,WAAW;AACvD,SAAO,UAAU,YACb,2BAA2B,cAAc,MACzC,2BAA2B,cAAc;AAC/C;AAcO,SAAS,oBAAoB,YAAoC;AACtE,MAAM,SAAS,WAAW,UAAU;AACpC,MAAI,WAAW;AACb,UAAM,IAAI,MAAM,iDAAiD;AAEnE,SAAO;AACT;AAQO,SAAS,WAAW,YAAkC;AAC3D,MAAM,aAAa,WAAW,YAAY,EAAE,KAAK;AAEjD,MAAI,eAAe,UAAU,eAAe;AAC1C,WAAO;AAGT,MAAI,eAAe,aAAa,eAAe;AAC7C,WAAO;AAGT,MAAI,eAAe,YAAY,eAAe;AAC5C,WAAO;AAGT,QAAM,IAAI;AAAA,IACR,mBAAmB,UAAU;AAAA;AAAA,EAE/B;AACF;AAMA,SAAS,qBAAqB,SAAiB,aAA6B;AAC1E,MAAM,cAAc,YAAY,MAAM,oBAAoB;AAC1D,MAAI,aAAa;AACf,QAAM,CAAC,EAAE,OAAO,SAAS,IAAI;AAC7B,WAAO,KAAK,SAAS,MAAM,OAAO,SAAS;AAAA,EAC7C;AACA,SAAO,KAAK,SAAS,WAAW;AAClC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// ../core/src/constants/index.ts
|
|
4
|
+
var DIR_PATTERNS = {
|
|
5
|
+
OPENPACKAGE: ".openpackage",
|
|
6
|
+
CLAUDE_PLUGIN: ".claude-plugin"
|
|
7
|
+
}, FILE_PATTERNS = {
|
|
8
|
+
MD_FILES: ".md",
|
|
9
|
+
MDC_FILES: ".mdc",
|
|
10
|
+
TOML_FILES: ".toml",
|
|
11
|
+
OPENPACKAGE_YML: "openpackage.yml",
|
|
12
|
+
OPENPACKAGE_INDEX_YML: "openpackage.index.yml",
|
|
13
|
+
README_MD: "README.md",
|
|
14
|
+
// Platform-specific root files
|
|
15
|
+
AGENTS_MD: "AGENTS.md",
|
|
16
|
+
CLAUDE_MD: "CLAUDE.md",
|
|
17
|
+
GEMINI_MD: "GEMINI.md",
|
|
18
|
+
QWEN_MD: "QWEN.md",
|
|
19
|
+
WARP_MD: "WARP.md",
|
|
20
|
+
// Claude Code plugin manifest files
|
|
21
|
+
PLUGIN_JSON: "plugin.json",
|
|
22
|
+
MARKETPLACE_JSON: "marketplace.json",
|
|
23
|
+
// Archive file extensions
|
|
24
|
+
TGZ_FILES: ".tgz",
|
|
25
|
+
TAR_GZ_FILES: ".tar.gz",
|
|
26
|
+
// File patterns arrays
|
|
27
|
+
MARKDOWN_FILES: [".md", ".mdc"],
|
|
28
|
+
YML_FILE: ".yml"
|
|
29
|
+
}, OPENPACKAGE_DIRS = {
|
|
30
|
+
REGISTRY: "registry",
|
|
31
|
+
PACKAGES: "packages",
|
|
32
|
+
CACHE: "cache",
|
|
33
|
+
RUNTIME: "runtime"
|
|
34
|
+
}, PACKAGE_ROOT_DIRS = {
|
|
35
|
+
/**
|
|
36
|
+
* Direct copy directory: files under `root/**` are copied 1:1 to workspace root
|
|
37
|
+
* with the `root/` prefix stripped during install.
|
|
38
|
+
*/
|
|
39
|
+
ROOT_COPY: "root"
|
|
40
|
+
}, PACKAGE_PATHS = {
|
|
41
|
+
/**
|
|
42
|
+
* The canonical location of the package manifest within a package:
|
|
43
|
+
* <package-root>/openpackage.yml
|
|
44
|
+
*/
|
|
45
|
+
MANIFEST_RELATIVE: `${FILE_PATTERNS.OPENPACKAGE_YML}`,
|
|
46
|
+
/**
|
|
47
|
+
* The canonical location of the package index file within a cached package copy:
|
|
48
|
+
* <cached-package-root>/openpackage.index.yml
|
|
49
|
+
*/
|
|
50
|
+
INDEX_RELATIVE: `${FILE_PATTERNS.OPENPACKAGE_INDEX_YML}`
|
|
51
|
+
}, CLAUDE_PLUGIN_PATHS = {
|
|
52
|
+
/**
|
|
53
|
+
* The Claude plugin manifest file path (relative to plugin directory):
|
|
54
|
+
* <plugin-root>/.claude-plugin/plugin.json
|
|
55
|
+
*/
|
|
56
|
+
PLUGIN_MANIFEST: `${DIR_PATTERNS.CLAUDE_PLUGIN}/${FILE_PATTERNS.PLUGIN_JSON}`,
|
|
57
|
+
/**
|
|
58
|
+
* The Claude plugin marketplace manifest file path (relative to marketplace directory):
|
|
59
|
+
* <marketplace-root>/.claude-plugin/marketplace.json
|
|
60
|
+
*/
|
|
61
|
+
MARKETPLACE_MANIFEST: `${DIR_PATTERNS.CLAUDE_PLUGIN}/${FILE_PATTERNS.MARKETPLACE_JSON}`
|
|
62
|
+
}, DEPENDENCY_ARRAYS = {
|
|
63
|
+
DEPENDENCIES: "dependencies",
|
|
64
|
+
DEV_DEPENDENCIES: "dev-dependencies",
|
|
65
|
+
// Deprecated - kept for backward compatibility
|
|
66
|
+
PACKAGES: "packages",
|
|
67
|
+
DEV_PACKAGES: "dev-packages"
|
|
68
|
+
};
|
|
69
|
+
var UNVERSIONED = "0.0.0", SOURCE_TYPES = {
|
|
70
|
+
PATH: "path",
|
|
71
|
+
REGISTRY: "registry",
|
|
72
|
+
GIT: "git"
|
|
73
|
+
}, MUTABILITY = {
|
|
74
|
+
MUTABLE: "mutable",
|
|
75
|
+
IMMUTABLE: "immutable"
|
|
76
|
+
};
|
|
77
|
+
var DEFAULT_VERSION_CONSTRAINT = "*", REGISTRY_PATH_PREFIXES = {
|
|
78
|
+
BASE: "~/.openpackage/registry/",
|
|
79
|
+
GIT: "~/.openpackage/registry/git/"
|
|
80
|
+
}, DIR_TO_TYPE = {
|
|
81
|
+
rules: "rule",
|
|
82
|
+
agents: "agent",
|
|
83
|
+
commands: "command",
|
|
84
|
+
skills: "skill",
|
|
85
|
+
hooks: "hook"
|
|
86
|
+
}, STRUCTURAL_PREFIX_DIRS = /* @__PURE__ */ new Set([
|
|
87
|
+
"plugins",
|
|
88
|
+
"packages"
|
|
89
|
+
]);
|
|
90
|
+
|
|
91
|
+
export {
|
|
92
|
+
DIR_PATTERNS,
|
|
93
|
+
FILE_PATTERNS,
|
|
94
|
+
OPENPACKAGE_DIRS,
|
|
95
|
+
PACKAGE_ROOT_DIRS,
|
|
96
|
+
PACKAGE_PATHS,
|
|
97
|
+
CLAUDE_PLUGIN_PATHS,
|
|
98
|
+
DEPENDENCY_ARRAYS,
|
|
99
|
+
UNVERSIONED,
|
|
100
|
+
SOURCE_TYPES,
|
|
101
|
+
MUTABILITY,
|
|
102
|
+
DEFAULT_VERSION_CONSTRAINT,
|
|
103
|
+
REGISTRY_PATH_PREFIXES,
|
|
104
|
+
DIR_TO_TYPE,
|
|
105
|
+
STRUCTURAL_PREFIX_DIRS
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=chunk-IHVZ5AUJ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../core/src/constants/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Shared constants for the OpenPackage CLI application\n * This file provides a single source of truth for all directory names,\n * file patterns, and other constants used throughout the application.\n */\n\nexport const DIR_PATTERNS = {\n OPENPACKAGE: '.openpackage',\n CLAUDE_PLUGIN: '.claude-plugin'\n} as const;\n\nexport const FILE_PATTERNS = {\n MD_FILES: '.md',\n MDC_FILES: '.mdc',\n TOML_FILES: '.toml',\n OPENPACKAGE_YML: 'openpackage.yml',\n OPENPACKAGE_INDEX_YML: 'openpackage.index.yml',\n README_MD: 'README.md',\n // Platform-specific root files\n AGENTS_MD: 'AGENTS.md',\n CLAUDE_MD: 'CLAUDE.md',\n GEMINI_MD: 'GEMINI.md',\n QWEN_MD: 'QWEN.md',\n WARP_MD: 'WARP.md',\n // Claude Code plugin manifest files\n PLUGIN_JSON: 'plugin.json',\n MARKETPLACE_JSON: 'marketplace.json',\n // Archive file extensions\n TGZ_FILES: '.tgz',\n TAR_GZ_FILES: '.tar.gz',\n // File patterns arrays\n MARKDOWN_FILES: ['.md', '.mdc'],\n YML_FILE: '.yml',\n} as const;\n\n// Universal subdirectory names are now dynamically discovered from platform configs\n// No hardcoded subdirs - platforms define their own universal directories\n\nexport const OPENPACKAGE_DIRS = {\n REGISTRY: 'registry',\n PACKAGES: 'packages',\n CACHE: 'cache',\n RUNTIME: 'runtime'\n} as const;\n\n/**\n * Package root directory names (relative to package root).\n */\nexport const PACKAGE_ROOT_DIRS = {\n /**\n * Direct copy directory: files under `root/**` are copied 1:1 to workspace root\n * with the `root/` prefix stripped during install.\n */\n ROOT_COPY: 'root'\n} as const;\n\n/**\n * Canonical paths within a package or cached copy (relative to the package root).\n */\nexport const PACKAGE_PATHS = {\n /**\n * The canonical location of the package manifest within a package:\n * <package-root>/openpackage.yml\n */\n MANIFEST_RELATIVE: `${FILE_PATTERNS.OPENPACKAGE_YML}`,\n /**\n * The canonical location of the package index file within a cached package copy:\n * <cached-package-root>/openpackage.index.yml\n */\n INDEX_RELATIVE: `${FILE_PATTERNS.OPENPACKAGE_INDEX_YML}`,\n} as const;\n\n/**\n * Claude Code plugin-related paths.\n */\nexport const CLAUDE_PLUGIN_PATHS = {\n /**\n * The Claude plugin manifest file path (relative to plugin directory):\n * <plugin-root>/.claude-plugin/plugin.json\n */\n PLUGIN_MANIFEST: `${DIR_PATTERNS.CLAUDE_PLUGIN}/${FILE_PATTERNS.PLUGIN_JSON}`,\n /**\n * The Claude plugin marketplace manifest file path (relative to marketplace directory):\n * <marketplace-root>/.claude-plugin/marketplace.json\n */\n MARKETPLACE_MANIFEST: `${DIR_PATTERNS.CLAUDE_PLUGIN}/${FILE_PATTERNS.MARKETPLACE_JSON}`,\n} as const;\n\nexport const DEPENDENCY_ARRAYS = {\n DEPENDENCIES: 'dependencies',\n DEV_DEPENDENCIES: 'dev-dependencies',\n // Deprecated - kept for backward compatibility\n PACKAGES: 'packages',\n DEV_PACKAGES: 'dev-packages'\n} as const;\n\nexport const CONFLICT_RESOLUTION = {\n SKIPPED: 'skipped',\n KEPT: 'kept',\n OVERWRITTEN: 'overwritten'\n} as const;\n\nexport const UNVERSIONED = '0.0.0' as const;\n\n/**\n * Source type constants for package resolution.\n */\nexport const SOURCE_TYPES = {\n PATH: 'path',\n REGISTRY: 'registry',\n GIT: 'git'\n} as const;\n\n/**\n * Mutability constants for package sources.\n */\nexport const MUTABILITY = {\n MUTABLE: 'mutable',\n IMMUTABLE: 'immutable'\n} as const;\n\n/**\n * Resolution source constants (where version was resolved from).\n */\nexport const RESOLUTION_SOURCES = {\n LOCAL: 'local',\n REMOTE: 'remote'\n} as const;\n\n/**\n * Git-related constants.\n */\nexport const GIT = {\n DIRECTORY: 'git',\n DEFAULT_REF: 'HEAD',\n COMMANDS: {\n CLONE: 'clone',\n FETCH: 'fetch',\n CHECKOUT: 'checkout',\n PULL: 'pull',\n DEPTH_FLAG: '--depth',\n DEPTH_VALUE: '1',\n BRANCH_FLAG: '--branch',\n ORIGIN: 'origin'\n }\n} as const;\n\n/**\n * Default version constraint (wildcard/latest).\n */\nexport const DEFAULT_VERSION_CONSTRAINT = '*' as const;\n\n/**\n * Registry path prefixes (for constructing declared paths).\n */\nexport const REGISTRY_PATH_PREFIXES = {\n BASE: '~/.openpackage/registry/',\n GIT: '~/.openpackage/registry/git/'\n} as const;\n\nexport type FilePattern = typeof FILE_PATTERNS[keyof typeof FILE_PATTERNS];\nexport type UniversalSubdir = string;\nexport type OpenPackageDir = typeof OPENPACKAGE_DIRS[keyof typeof OPENPACKAGE_DIRS];\nexport type DependencyArray = typeof DEPENDENCY_ARRAYS[keyof typeof DEPENDENCY_ARRAYS];\nexport type ConflictResolution = typeof CONFLICT_RESOLUTION[keyof typeof CONFLICT_RESOLUTION];\nexport type SourceType = typeof SOURCE_TYPES[keyof typeof SOURCE_TYPES];\nexport type Mutability = typeof MUTABILITY[keyof typeof MUTABILITY];\nexport type ResolutionSource = typeof RESOLUTION_SOURCES[keyof typeof RESOLUTION_SOURCES];\n\nimport type { ResourceTypeId } from '../types/resources.js';\n\n/**\n * Maps resource directory names to their canonical type IDs.\n * Moved from core/resources/resource-registry.ts for utils accessibility.\n */\nexport const DIR_TO_TYPE: Readonly<Record<string, ResourceTypeId>> = {\n rules: 'rule',\n agents: 'agent',\n commands: 'command',\n skills: 'skill',\n hooks: 'hook',\n};\n\n/**\n * Known structural prefix directories used to organize plugins/collections\n * within a repository (e.g. `plugins/code-review`, `packages/my-tool`).\n *\n * These are NOT resource types \u2014 they are organizational containers that sit\n * above resource directories in the repo hierarchy. Used by the namespace\n * slug derivation algorithm to identify meaningful package names.\n */\nexport const STRUCTURAL_PREFIX_DIRS: ReadonlySet<string> = new Set([\n 'plugins',\n 'packages',\n]);"],
|
|
5
|
+
"mappings": ";;;AAMO,IAAM,eAAe;AAAA,EAC1B,aAAa;AAAA,EACb,eAAe;AACjB,GAEa,gBAAgB;AAAA,EAC3B,UAAU;AAAA,EACV,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,EACvB,WAAW;AAAA;AAAA,EAEX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS;AAAA;AAAA,EAET,aAAa;AAAA,EACb,kBAAkB;AAAA;AAAA,EAElB,WAAW;AAAA,EACX,cAAc;AAAA;AAAA,EAEd,gBAAgB,CAAC,OAAO,MAAM;AAAA,EAC9B,UAAU;AACZ,GAKa,mBAAmB;AAAA,EAC9B,UAAU;AAAA,EACV,UAAU;AAAA,EACV,OAAO;AAAA,EACP,SAAS;AACX,GAKa,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK/B,WAAW;AACb,GAKa,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK3B,mBAAmB,GAAG,cAAc,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA,EAKnD,gBAAgB,GAAG,cAAc,qBAAqB;AACxD,GAKa,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKjC,iBAAiB,GAAG,aAAa,aAAa,IAAI,cAAc,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAK3E,sBAAsB,GAAG,aAAa,aAAa,IAAI,cAAc,gBAAgB;AACvF,GAEa,oBAAoB;AAAA,EAC/B,cAAc;AAAA,EACd,kBAAkB;AAAA;AAAA,EAElB,UAAU;AAAA,EACV,cAAc;AAChB;AAQO,IAAM,cAAc,SAKd,eAAe;AAAA,EAC1B,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK;AACP,GAKa,aAAa;AAAA,EACxB,SAAS;AAAA,EACT,WAAW;AACb;AA+BO,IAAM,6BAA6B,KAK7B,yBAAyB;AAAA,EACpC,MAAM;AAAA,EACN,KAAK;AACP,GAiBa,cAAwD;AAAA,EACnE,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AACT,GAUa,yBAA8C,oBAAI,IAAI;AAAA,EACjE;AAAA,EACA;AACF,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
configManager
|
|
4
|
+
} from "./chunk-S6OARUVQ.js";
|
|
5
|
+
import {
|
|
6
|
+
resolvePrompt
|
|
7
|
+
} from "./chunk-BROJ6OUT.js";
|
|
8
|
+
import {
|
|
9
|
+
getPackagePath
|
|
10
|
+
} from "./chunk-XEPVYZO3.js";
|
|
11
|
+
import {
|
|
12
|
+
isScopedName,
|
|
13
|
+
normalizePackageName,
|
|
14
|
+
validatePackageName
|
|
15
|
+
} from "./chunk-VN22A7NW.js";
|
|
16
|
+
import {
|
|
17
|
+
exists
|
|
18
|
+
} from "./chunk-S47F4OG4.js";
|
|
19
|
+
import {
|
|
20
|
+
UserCancellationError
|
|
21
|
+
} from "./chunk-ID4SVDQZ.js";
|
|
22
|
+
|
|
23
|
+
// ../core/src/core/scoping/package-scoping.ts
|
|
24
|
+
async function isPackageNameTaken(name) {
|
|
25
|
+
let normalized = normalizePackageName(name);
|
|
26
|
+
return await exists(getPackagePath(normalized));
|
|
27
|
+
}
|
|
28
|
+
function buildScopedNameFromScope(unscopedName, scope) {
|
|
29
|
+
let normalizedScope = normalizePackageName(scope.replace(/^@/, "")), normalizedName = normalizePackageName(unscopedName);
|
|
30
|
+
return `@${normalizedScope}/${normalizedName}`;
|
|
31
|
+
}
|
|
32
|
+
async function ensureScopedNameAvailable(name) {
|
|
33
|
+
try {
|
|
34
|
+
validatePackageName(name);
|
|
35
|
+
} catch (error) {
|
|
36
|
+
throw new Error(error.message.replace("%s", name));
|
|
37
|
+
}
|
|
38
|
+
if (!isScopedName(name))
|
|
39
|
+
throw new Error("Name must be scoped (e.g. @scope/name)");
|
|
40
|
+
if (await isPackageNameTaken(name))
|
|
41
|
+
throw new Error(
|
|
42
|
+
`Package '${name}' already exists in local registry. Choose a different scoped name.`
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
async function getDefaultScopeForProfile(profileName) {
|
|
46
|
+
return profileName ? (await configManager.getAll()).profiles?.[profileName]?.defaults?.scope : void 0;
|
|
47
|
+
}
|
|
48
|
+
async function resolveScopedNameForPushWithUserScope(unscopedName, username, profileName, prompt) {
|
|
49
|
+
if (isScopedName(unscopedName))
|
|
50
|
+
throw new Error(`Expected unscoped name, received '${unscopedName}'`);
|
|
51
|
+
if (!username?.trim())
|
|
52
|
+
throw new Error("Username is required to apply default scope.");
|
|
53
|
+
let prm = prompt ?? resolvePrompt(), normalizedName = normalizePackageName(unscopedName), choice = await prm.select(
|
|
54
|
+
`Package '${normalizedName}' must be scoped before pushing. Choose a scope:`,
|
|
55
|
+
[
|
|
56
|
+
{
|
|
57
|
+
title: `Use default scope @${username}`,
|
|
58
|
+
value: "default",
|
|
59
|
+
description: `Renames to @${username}/${normalizedName}`
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
title: "Enter scope...",
|
|
63
|
+
value: "custom",
|
|
64
|
+
description: `Enter a custom scope for ${normalizedName}`
|
|
65
|
+
}
|
|
66
|
+
],
|
|
67
|
+
"Use arrow keys to select, Enter to confirm"
|
|
68
|
+
);
|
|
69
|
+
if (!choice)
|
|
70
|
+
throw new UserCancellationError("Operation cancelled by user");
|
|
71
|
+
let scope = username;
|
|
72
|
+
if (choice === "custom") {
|
|
73
|
+
let initialScope = (await getDefaultScopeForProfile(profileName))?.replace(/^@/, "") || username, enteredScope = await prm.text(
|
|
74
|
+
`Enter a scope (without @) for '${normalizedName}':`,
|
|
75
|
+
{
|
|
76
|
+
initial: initialScope,
|
|
77
|
+
validate: async (value) => {
|
|
78
|
+
if (!value) return "Scope is required";
|
|
79
|
+
let candidate = buildScopedNameFromScope(normalizedName, value);
|
|
80
|
+
try {
|
|
81
|
+
return await ensureScopedNameAvailable(candidate), !0;
|
|
82
|
+
} catch (error) {
|
|
83
|
+
return error.message;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
);
|
|
88
|
+
if (!enteredScope)
|
|
89
|
+
throw new UserCancellationError("Operation cancelled by user");
|
|
90
|
+
scope = enteredScope;
|
|
91
|
+
}
|
|
92
|
+
let scopedName = buildScopedNameFromScope(normalizedName, scope);
|
|
93
|
+
return await ensureScopedNameAvailable(scopedName), scopedName;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export {
|
|
97
|
+
resolveScopedNameForPushWithUserScope
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=chunk-KI7FDU3H.js.map
|