opkg 0.9.2 → 0.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/code-reviewer.md +171 -0
- package/.claude/commands/commit-push-pr.md +20 -0
- package/.claude/commands/{specs/read.md → read-specs.md} +1 -1
- package/.claude/commands/{specs/update.md → update-specs.md} +4 -0
- package/.claude/skills/code-review-excellence/SKILL.md +538 -0
- package/README.md +2 -2
- package/package.json +3 -1
- package/packages/cli/dist/add-IJAPFHIX.js +624 -0
- package/packages/cli/dist/add-IJAPFHIX.js.map +7 -0
- package/packages/cli/dist/add-LLUNFLJI.js +624 -0
- package/packages/cli/dist/add-LLUNFLJI.js.map +7 -0
- package/packages/cli/dist/add-U44SL3OR.js +624 -0
- package/packages/cli/dist/add-U44SL3OR.js.map +7 -0
- package/packages/cli/dist/chunk-23VBP5L6.js +371 -0
- package/packages/cli/dist/chunk-23VBP5L6.js.map +7 -0
- package/packages/cli/dist/chunk-2SVHLF5C.js +1419 -0
- package/packages/cli/dist/chunk-2SVHLF5C.js.map +7 -0
- package/packages/cli/dist/chunk-37256POU.js +99 -0
- package/packages/cli/dist/chunk-37256POU.js.map +7 -0
- package/packages/cli/dist/chunk-3PZRVA6O.js +196 -0
- package/packages/cli/dist/chunk-3PZRVA6O.js.map +7 -0
- package/packages/cli/dist/chunk-427DCURL.js +155 -0
- package/packages/cli/dist/chunk-427DCURL.js.map +7 -0
- package/packages/cli/dist/chunk-4B5HJLP2.js +48 -0
- package/packages/cli/dist/chunk-4B5HJLP2.js.map +7 -0
- package/packages/cli/dist/chunk-4OWT3YEG.js +413 -0
- package/packages/cli/dist/chunk-4OWT3YEG.js.map +7 -0
- package/packages/cli/dist/chunk-4RIBTBXI.js +568 -0
- package/packages/cli/dist/chunk-4RIBTBXI.js.map +7 -0
- package/packages/cli/dist/chunk-4X2EJHJN.js +63 -0
- package/packages/cli/dist/chunk-4X2EJHJN.js.map +7 -0
- package/packages/cli/dist/chunk-6CYW66HD.js +1136 -0
- package/packages/cli/dist/chunk-6CYW66HD.js.map +7 -0
- package/packages/cli/dist/chunk-6DITYAFA.js +172 -0
- package/packages/cli/dist/chunk-6DITYAFA.js.map +7 -0
- package/packages/cli/dist/chunk-7KEAKEVZ.js +568 -0
- package/packages/cli/dist/chunk-7KEAKEVZ.js.map +7 -0
- package/packages/cli/dist/chunk-ABFUD25D.js +61 -0
- package/packages/cli/dist/chunk-ABFUD25D.js.map +7 -0
- package/packages/cli/dist/chunk-AR7GJCG6.js +274 -0
- package/packages/cli/dist/chunk-AR7GJCG6.js.map +7 -0
- package/packages/cli/dist/chunk-AYTGQCXH.js +86 -0
- package/packages/cli/dist/chunk-AYTGQCXH.js.map +7 -0
- package/packages/cli/dist/chunk-BROJ6OUT.js +631 -0
- package/packages/cli/dist/chunk-BROJ6OUT.js.map +7 -0
- package/packages/cli/dist/chunk-BVVSU7QD.js +23 -0
- package/packages/cli/dist/chunk-BVVSU7QD.js.map +7 -0
- package/packages/cli/dist/chunk-C6FY55UP.js +108 -0
- package/packages/cli/dist/chunk-C6FY55UP.js.map +7 -0
- package/packages/cli/dist/chunk-CVA64SXK.js +1136 -0
- package/packages/cli/dist/chunk-CVA64SXK.js.map +7 -0
- package/packages/cli/dist/chunk-D3O7LY2Q.js +1151 -0
- package/packages/cli/dist/chunk-D3O7LY2Q.js.map +7 -0
- package/packages/cli/dist/chunk-D6LEPODL.js +413 -0
- package/packages/cli/dist/chunk-D6LEPODL.js.map +7 -0
- package/packages/cli/dist/chunk-DEC24S7E.js +186 -0
- package/packages/cli/dist/chunk-DEC24S7E.js.map +7 -0
- package/packages/cli/dist/chunk-FMVVJH5M.js +371 -0
- package/packages/cli/dist/chunk-FMVVJH5M.js.map +7 -0
- package/packages/cli/dist/chunk-GDVFS3YP.js +130 -0
- package/packages/cli/dist/chunk-GDVFS3YP.js.map +7 -0
- package/packages/cli/dist/chunk-GEP2G5HF.js +31 -0
- package/packages/cli/dist/chunk-GEP2G5HF.js.map +7 -0
- package/packages/cli/dist/chunk-GSWHZBT2.js +62 -0
- package/packages/cli/dist/chunk-GSWHZBT2.js.map +7 -0
- package/packages/cli/dist/chunk-HTYHJA3B.js +61 -0
- package/packages/cli/dist/chunk-HTYHJA3B.js.map +7 -0
- package/packages/cli/dist/chunk-HYKYECAE.js +222 -0
- package/packages/cli/dist/chunk-HYKYECAE.js.map +7 -0
- package/packages/cli/dist/chunk-I7FEAHB4.js +100 -0
- package/packages/cli/dist/chunk-I7FEAHB4.js.map +7 -0
- package/packages/cli/dist/chunk-IHVZ5AUJ.js +107 -0
- package/packages/cli/dist/chunk-IHVZ5AUJ.js.map +7 -0
- package/packages/cli/dist/chunk-KI7FDU3H.js +99 -0
- package/packages/cli/dist/chunk-KI7FDU3H.js.map +7 -0
- package/packages/cli/dist/chunk-L5GRJQBS.js +32 -0
- package/packages/cli/dist/chunk-L5GRJQBS.js.map +7 -0
- package/packages/cli/dist/chunk-LHEAUDJL.js +302 -0
- package/packages/cli/dist/chunk-LHEAUDJL.js.map +7 -0
- package/packages/cli/dist/chunk-MIURCESJ.js +48 -0
- package/packages/cli/dist/chunk-MIURCESJ.js.map +7 -0
- package/packages/cli/dist/chunk-N43IXOND.js +732 -0
- package/packages/cli/dist/chunk-N43IXOND.js.map +7 -0
- package/packages/cli/dist/chunk-OUZRMGPV.js +274 -0
- package/packages/cli/dist/chunk-OUZRMGPV.js.map +7 -0
- package/packages/cli/dist/chunk-PSQXKAL4.js +371 -0
- package/packages/cli/dist/chunk-PSQXKAL4.js.map +7 -0
- package/packages/cli/dist/chunk-PUDRKDVZ.js +1419 -0
- package/packages/cli/dist/chunk-PUDRKDVZ.js.map +7 -0
- package/packages/cli/dist/chunk-RAKMX654.js +631 -0
- package/packages/cli/dist/chunk-RAKMX654.js.map +7 -0
- package/packages/cli/dist/chunk-RSFLK2TP.js +195 -0
- package/packages/cli/dist/chunk-RSFLK2TP.js.map +7 -0
- package/packages/cli/dist/chunk-S26PR2BS.js +99 -0
- package/packages/cli/dist/chunk-S26PR2BS.js.map +7 -0
- package/packages/cli/dist/chunk-U7FW7SXX.js +568 -0
- package/packages/cli/dist/chunk-U7FW7SXX.js.map +7 -0
- package/packages/cli/dist/chunk-VKM6K5TN.js +413 -0
- package/packages/cli/dist/chunk-VKM6K5TN.js.map +7 -0
- package/packages/cli/dist/chunk-VKNJG4JN.js +253 -0
- package/packages/cli/dist/chunk-VKNJG4JN.js.map +7 -0
- package/packages/cli/dist/chunk-VQ2KY6CK.js +113 -0
- package/packages/cli/dist/chunk-VQ2KY6CK.js.map +7 -0
- package/packages/cli/dist/chunk-VQDTXLOX.js +1312 -0
- package/packages/cli/dist/chunk-VQDTXLOX.js.map +7 -0
- package/packages/cli/dist/chunk-VXNS3X5O.js +60 -0
- package/packages/cli/dist/chunk-VXNS3X5O.js.map +7 -0
- package/packages/cli/dist/chunk-WF7H2YDU.js +376 -0
- package/packages/cli/dist/chunk-WF7H2YDU.js.map +7 -0
- package/packages/cli/dist/chunk-WNRXZLWW.js +266 -0
- package/packages/cli/dist/chunk-WNRXZLWW.js.map +7 -0
- package/packages/cli/dist/chunk-WT4VVCXM.js +1121 -0
- package/packages/cli/dist/chunk-WT4VVCXM.js.map +7 -0
- package/packages/cli/dist/configure-3AZUMDJZ.js +107 -0
- package/packages/cli/dist/configure-3AZUMDJZ.js.map +7 -0
- package/packages/cli/dist/configure-D722JQOD.js +107 -0
- package/packages/cli/dist/configure-D722JQOD.js.map +7 -0
- package/packages/cli/dist/configure-IU5H7XD6.js +107 -0
- package/packages/cli/dist/configure-IU5H7XD6.js.map +7 -0
- package/packages/cli/dist/file-format-detector-PXCIAKTK.js +22 -0
- package/packages/cli/dist/file-format-detector-PXCIAKTK.js.map +7 -0
- package/packages/cli/dist/index.js +17 -17
- package/packages/cli/dist/install-EZNWMLJR.js +7581 -0
- package/packages/cli/dist/install-EZNWMLJR.js.map +7 -0
- package/packages/cli/dist/install-F5ANFUBX.js +7577 -0
- package/packages/cli/dist/install-F5ANFUBX.js.map +7 -0
- package/packages/cli/dist/install-JSXEPPC2.js +7104 -0
- package/packages/cli/dist/install-JSXEPPC2.js.map +7 -0
- package/packages/cli/dist/install-QHEBX7JH.js +7101 -0
- package/packages/cli/dist/install-QHEBX7JH.js.map +7 -0
- package/packages/cli/dist/list-DMOUATYI.js +327 -0
- package/packages/cli/dist/list-DMOUATYI.js.map +7 -0
- package/packages/cli/dist/list-UESSCB7Y.js +327 -0
- package/packages/cli/dist/list-UESSCB7Y.js.map +7 -0
- package/packages/cli/dist/list-XR7RSJFS.js +327 -0
- package/packages/cli/dist/list-XR7RSJFS.js.map +7 -0
- package/packages/cli/dist/login-EYZ2SOYZ.js +150 -0
- package/packages/cli/dist/login-EYZ2SOYZ.js.map +7 -0
- package/packages/cli/dist/login-JWCSTAEU.js +150 -0
- package/packages/cli/dist/login-JWCSTAEU.js.map +7 -0
- package/packages/cli/dist/login-NRKHXZKM.js +150 -0
- package/packages/cli/dist/login-NRKHXZKM.js.map +7 -0
- package/packages/cli/dist/logout-HDMYRXIE.js +40 -0
- package/packages/cli/dist/logout-HDMYRXIE.js.map +7 -0
- package/packages/cli/dist/logout-SYHXCVCQ.js +40 -0
- package/packages/cli/dist/logout-SYHXCVCQ.js.map +7 -0
- package/packages/cli/dist/logout-X3XUUOH5.js +40 -0
- package/packages/cli/dist/logout-X3XUUOH5.js.map +7 -0
- package/packages/cli/dist/new-3LTFKDTQ.js +277 -0
- package/packages/cli/dist/new-3LTFKDTQ.js.map +7 -0
- package/packages/cli/dist/new-F46OSD72.js +277 -0
- package/packages/cli/dist/new-F46OSD72.js.map +7 -0
- package/packages/cli/dist/new-OPCCLNL2.js +277 -0
- package/packages/cli/dist/new-OPCCLNL2.js.map +7 -0
- package/packages/cli/dist/package-marker-detector-T5O5YD2E.js +80 -0
- package/packages/cli/dist/package-marker-detector-T5O5YD2E.js.map +7 -0
- package/packages/cli/dist/package-yml-QWZIJDYU.js +16 -0
- package/packages/cli/dist/package-yml-QWZIJDYU.js.map +7 -0
- package/packages/cli/dist/plugin-naming-YP2I4NPA.js +29 -0
- package/packages/cli/dist/plugin-naming-YP2I4NPA.js.map +7 -0
- package/packages/cli/dist/publish-4H43PCSG.js +619 -0
- package/packages/cli/dist/publish-4H43PCSG.js.map +7 -0
- package/packages/cli/dist/publish-RULKLNUX.js +619 -0
- package/packages/cli/dist/publish-RULKLNUX.js.map +7 -0
- package/packages/cli/dist/publish-URWY2P3E.js +619 -0
- package/packages/cli/dist/publish-URWY2P3E.js.map +7 -0
- package/packages/cli/dist/remove-BD52BHR2.js +542 -0
- package/packages/cli/dist/remove-BD52BHR2.js.map +7 -0
- package/packages/cli/dist/remove-G5NRC7LD.js +542 -0
- package/packages/cli/dist/remove-G5NRC7LD.js.map +7 -0
- package/packages/cli/dist/remove-TC3FQUYQ.js +542 -0
- package/packages/cli/dist/remove-TC3FQUYQ.js.map +7 -0
- package/packages/cli/dist/resource-discoverer-4X4RY43E.js +17 -0
- package/packages/cli/dist/resource-discoverer-4X4RY43E.js.map +7 -0
- package/packages/cli/dist/save-24TESYKI.js +1728 -0
- package/packages/cli/dist/save-24TESYKI.js.map +7 -0
- package/packages/cli/dist/save-N3QWF2WN.js +1728 -0
- package/packages/cli/dist/save-N3QWF2WN.js.map +7 -0
- package/packages/cli/dist/save-P2U67DTV.js +1728 -0
- package/packages/cli/dist/save-P2U67DTV.js.map +7 -0
- package/packages/cli/dist/search-ABROK3UO.js +157 -0
- package/packages/cli/dist/search-ABROK3UO.js.map +7 -0
- package/packages/cli/dist/search-WVFXFNAV.js +157 -0
- package/packages/cli/dist/search-WVFXFNAV.js.map +7 -0
- package/packages/cli/dist/search-YQN2Q2SO.js +157 -0
- package/packages/cli/dist/search-YQN2Q2SO.js.map +7 -0
- package/packages/cli/dist/set-DCWF73F6.js +251 -0
- package/packages/cli/dist/set-DCWF73F6.js.map +7 -0
- package/packages/cli/dist/set-GJEG2F6Y.js +251 -0
- package/packages/cli/dist/set-GJEG2F6Y.js.map +7 -0
- package/packages/cli/dist/set-NGM2FIKF.js +251 -0
- package/packages/cli/dist/set-NGM2FIKF.js.map +7 -0
- package/packages/cli/dist/uninstall-3CJQMTYH.js +539 -0
- package/packages/cli/dist/uninstall-3CJQMTYH.js.map +7 -0
- package/packages/cli/dist/uninstall-Q3CP4UN5.js +539 -0
- package/packages/cli/dist/uninstall-Q3CP4UN5.js.map +7 -0
- package/packages/cli/dist/uninstall-QU5OMEEC.js +539 -0
- package/packages/cli/dist/uninstall-QU5OMEEC.js.map +7 -0
- package/packages/cli/dist/unpublish-GHJQYC4S.js +245 -0
- package/packages/cli/dist/unpublish-GHJQYC4S.js.map +7 -0
- package/packages/cli/dist/unpublish-L2CYMK4B.js +245 -0
- package/packages/cli/dist/unpublish-L2CYMK4B.js.map +7 -0
- package/packages/cli/dist/unpublish-VBTNTMS5.js +245 -0
- package/packages/cli/dist/unpublish-VBTNTMS5.js.map +7 -0
- package/packages/cli/dist/view-MXRBMXOG.js +488 -0
- package/packages/cli/dist/view-MXRBMXOG.js.map +7 -0
- package/packages/cli/dist/view-NMND7SAW.js +488 -0
- package/packages/cli/dist/view-NMND7SAW.js.map +7 -0
- package/packages/cli/dist/view-RPQRDSYB.js +488 -0
- package/packages/cli/dist/view-RPQRDSYB.js.map +7 -0
- package/packages/cli/package.json +2 -0
- package/packages/core/dist/constants/index.d.ts +9 -0
- package/packages/core/dist/constants/index.d.ts.map +1 -1
- package/packages/core/dist/constants/index.js +12 -0
- package/packages/core/dist/constants/index.js.map +1 -1
- package/packages/core/dist/core/dependency-resolver/index.d.ts +2 -10
- package/packages/core/dist/core/dependency-resolver/index.d.ts.map +1 -1
- package/packages/core/dist/core/dependency-resolver/index.js +3 -14
- package/packages/core/dist/core/dependency-resolver/index.js.map +1 -1
- package/packages/core/dist/core/install/base-detector.d.ts +2 -1
- package/packages/core/dist/core/install/base-detector.d.ts.map +1 -1
- package/packages/core/dist/core/install/base-detector.js +54 -1
- package/packages/core/dist/core/install/base-detector.js.map +1 -1
- package/packages/core/dist/core/install/conflicts/file-conflict-resolver.d.ts +7 -5
- package/packages/core/dist/core/install/conflicts/file-conflict-resolver.d.ts.map +1 -1
- package/packages/core/dist/core/install/conflicts/file-conflict-resolver.js +25 -9
- package/packages/core/dist/core/install/conflicts/file-conflict-resolver.js.map +1 -1
- package/packages/core/dist/core/install/flow-index-installer.d.ts +2 -1
- package/packages/core/dist/core/install/flow-index-installer.d.ts.map +1 -1
- package/packages/core/dist/core/install/flow-index-installer.js +19 -4
- package/packages/core/dist/core/install/flow-index-installer.js.map +1 -1
- package/packages/core/dist/core/install/input-classifier-base.js +3 -3
- package/packages/core/dist/core/install/input-classifier-base.js.map +1 -1
- package/packages/core/dist/core/install/install-reporting.d.ts.map +1 -1
- package/packages/core/dist/core/install/install-reporting.js +7 -9
- package/packages/core/dist/core/install/install-reporting.js.map +1 -1
- package/packages/core/dist/core/install/list-handler.d.ts.map +1 -1
- package/packages/core/dist/core/install/list-handler.js +3 -0
- package/packages/core/dist/core/install/list-handler.js.map +1 -1
- package/packages/core/dist/core/install/marketplace-handler.d.ts.map +1 -1
- package/packages/core/dist/core/install/marketplace-handler.js.map +1 -1
- package/packages/core/dist/core/install/operations/conflict-handler.d.ts +2 -1
- package/packages/core/dist/core/install/operations/conflict-handler.d.ts.map +1 -1
- package/packages/core/dist/core/install/operations/conflict-handler.js +2 -2
- package/packages/core/dist/core/install/operations/conflict-handler.js.map +1 -1
- package/packages/core/dist/core/install/operations/installation-executor.d.ts +3 -0
- package/packages/core/dist/core/install/operations/installation-executor.d.ts.map +1 -1
- package/packages/core/dist/core/install/operations/installation-executor.js +39 -22
- package/packages/core/dist/core/install/operations/installation-executor.js.map +1 -1
- package/packages/core/dist/core/install/orchestrator/orchestrator.d.ts +7 -3
- package/packages/core/dist/core/install/orchestrator/orchestrator.d.ts.map +1 -1
- package/packages/core/dist/core/install/orchestrator/orchestrator.js +193 -93
- package/packages/core/dist/core/install/orchestrator/orchestrator.js.map +1 -1
- package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.d.ts +1 -0
- package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.d.ts.map +1 -1
- package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.js +11 -24
- package/packages/core/dist/core/install/orchestrator/strategies/git-strategy.js.map +1 -1
- package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.d.ts +2 -0
- package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.d.ts.map +1 -1
- package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.js +14 -14
- package/packages/core/dist/core/install/orchestrator/strategies/path-strategy.js.map +1 -1
- package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.d.ts +7 -0
- package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.d.ts.map +1 -1
- package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.js +28 -0
- package/packages/core/dist/core/install/orchestrator/strategies/registry-strategy.js.map +1 -1
- package/packages/core/dist/core/install/orchestrator/types.d.ts +2 -0
- package/packages/core/dist/core/install/orchestrator/types.d.ts.map +1 -1
- package/packages/core/dist/core/install/path-package-loader.d.ts.map +1 -1
- package/packages/core/dist/core/install/path-package-loader.js +20 -1
- package/packages/core/dist/core/install/path-package-loader.js.map +1 -1
- package/packages/core/dist/core/install/platform-resolution.d.ts +3 -0
- package/packages/core/dist/core/install/platform-resolution.d.ts.map +1 -1
- package/packages/core/dist/core/install/platform-resolution.js +5 -2
- package/packages/core/dist/core/install/platform-resolution.js.map +1 -1
- package/packages/core/dist/core/install/preprocessing/context-population.d.ts +18 -0
- package/packages/core/dist/core/install/preprocessing/context-population.d.ts.map +1 -0
- package/packages/core/dist/core/install/preprocessing/context-population.js +36 -0
- package/packages/core/dist/core/install/preprocessing/context-population.js.map +1 -0
- package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.d.ts +23 -0
- package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.d.ts.map +1 -1
- package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.js +44 -0
- package/packages/core/dist/core/install/preprocessing/convenience-preprocessor.js.map +1 -1
- package/packages/core/dist/core/install/sources/git-source.d.ts.map +1 -1
- package/packages/core/dist/core/install/sources/git-source.js +67 -4
- package/packages/core/dist/core/install/sources/git-source.js.map +1 -1
- package/packages/core/dist/core/install/sources/path-source.d.ts.map +1 -1
- package/packages/core/dist/core/install/sources/path-source.js +8 -0
- package/packages/core/dist/core/install/sources/path-source.js.map +1 -1
- package/packages/core/dist/core/install/strategies/flow-based-strategy.d.ts.map +1 -1
- package/packages/core/dist/core/install/strategies/flow-based-strategy.js +12 -5
- package/packages/core/dist/core/install/strategies/flow-based-strategy.js.map +1 -1
- package/packages/core/dist/core/install/strategies/types.d.ts +11 -1
- package/packages/core/dist/core/install/strategies/types.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/context-builders.d.ts +5 -0
- package/packages/core/dist/core/install/unified/context-builders.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/context-builders.js +12 -0
- package/packages/core/dist/core/install/unified/context-builders.js.map +1 -1
- package/packages/core/dist/core/install/unified/context-helpers.d.ts +0 -4
- package/packages/core/dist/core/install/unified/context-helpers.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/context-helpers.js +0 -24
- package/packages/core/dist/core/install/unified/context-helpers.js.map +1 -1
- package/packages/core/dist/core/install/unified/index.d.ts +1 -1
- package/packages/core/dist/core/install/unified/index.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/index.js +1 -1
- package/packages/core/dist/core/install/unified/index.js.map +1 -1
- package/packages/core/dist/core/install/unified/multi-context-pipeline.d.ts +6 -0
- package/packages/core/dist/core/install/unified/multi-context-pipeline.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/multi-context-pipeline.js +11 -4
- package/packages/core/dist/core/install/unified/multi-context-pipeline.js.map +1 -1
- package/packages/core/dist/core/install/unified/phases/conflicts.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/phases/conflicts.js +1 -1
- package/packages/core/dist/core/install/unified/phases/conflicts.js.map +1 -1
- package/packages/core/dist/core/install/unified/phases/execute.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/phases/execute.js +5 -5
- package/packages/core/dist/core/install/unified/phases/execute.js.map +1 -1
- package/packages/core/dist/core/install/unified/phases/load-package.js +3 -3
- package/packages/core/dist/core/install/unified/phases/load-package.js.map +1 -1
- package/packages/core/dist/core/install/unified/phases/report.js +1 -1
- package/packages/core/dist/core/install/unified/phases/report.js.map +1 -1
- package/packages/core/dist/core/install/unified/pipeline.d.ts.map +1 -1
- package/packages/core/dist/core/install/unified/pipeline.js +7 -10
- package/packages/core/dist/core/install/unified/pipeline.js.map +1 -1
- package/packages/core/dist/core/install/wave-resolver/content-root-cache.d.ts +24 -0
- package/packages/core/dist/core/install/wave-resolver/content-root-cache.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/content-root-cache.js +71 -0
- package/packages/core/dist/core/install/wave-resolver/content-root-cache.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/context-builder.d.ts +39 -0
- package/packages/core/dist/core/install/wave-resolver/context-builder.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/context-builder.js +148 -0
- package/packages/core/dist/core/install/wave-resolver/context-builder.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/fetcher.d.ts +49 -0
- package/packages/core/dist/core/install/wave-resolver/fetcher.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/fetcher.js +221 -0
- package/packages/core/dist/core/install/wave-resolver/fetcher.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/index-updater.d.ts +23 -0
- package/packages/core/dist/core/install/wave-resolver/index-updater.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/index-updater.js +87 -0
- package/packages/core/dist/core/install/wave-resolver/index-updater.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/index-write-collector.d.ts +101 -0
- package/packages/core/dist/core/install/wave-resolver/index-write-collector.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/index-write-collector.js +194 -0
- package/packages/core/dist/core/install/wave-resolver/index-write-collector.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/index.d.ts +17 -0
- package/packages/core/dist/core/install/wave-resolver/index.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/index.js +16 -0
- package/packages/core/dist/core/install/wave-resolver/index.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/manifest-reader.d.ts +34 -0
- package/packages/core/dist/core/install/wave-resolver/manifest-reader.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/manifest-reader.js +112 -0
- package/packages/core/dist/core/install/wave-resolver/manifest-reader.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/types.d.ts +210 -0
- package/packages/core/dist/core/install/wave-resolver/types.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/types.js +6 -0
- package/packages/core/dist/core/install/wave-resolver/types.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/version-solver.d.ts +65 -0
- package/packages/core/dist/core/install/wave-resolver/version-solver.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/version-solver.js +166 -0
- package/packages/core/dist/core/install/wave-resolver/version-solver.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/wave-engine.d.ts +16 -0
- package/packages/core/dist/core/install/wave-resolver/wave-engine.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/wave-engine.js +337 -0
- package/packages/core/dist/core/install/wave-resolver/wave-engine.js.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/wave-installer.d.ts +50 -0
- package/packages/core/dist/core/install/wave-resolver/wave-installer.d.ts.map +1 -0
- package/packages/core/dist/core/install/wave-resolver/wave-installer.js +246 -0
- package/packages/core/dist/core/install/wave-resolver/wave-installer.js.map +1 -0
- package/packages/core/dist/core/ports/buffered-output.d.ts +36 -0
- package/packages/core/dist/core/ports/buffered-output.d.ts.map +1 -0
- package/packages/core/dist/core/ports/buffered-output.js +89 -0
- package/packages/core/dist/core/ports/buffered-output.js.map +1 -0
- package/packages/core/dist/core/ports/resolve.d.ts +0 -13
- package/packages/core/dist/core/ports/resolve.d.ts.map +1 -1
- package/packages/core/dist/core/ports/resolve.js +0 -28
- package/packages/core/dist/core/ports/resolve.js.map +1 -1
- package/packages/core/dist/core/remove/removal-confirmation.d.ts +4 -1
- package/packages/core/dist/core/remove/removal-confirmation.d.ts.map +1 -1
- package/packages/core/dist/core/remove/removal-confirmation.js +5 -4
- package/packages/core/dist/core/remove/removal-confirmation.js.map +1 -1
- package/packages/core/dist/core/remove/remove-from-source-pipeline.d.ts.map +1 -1
- package/packages/core/dist/core/remove/remove-from-source-pipeline.js +1 -10
- package/packages/core/dist/core/remove/remove-from-source-pipeline.js.map +1 -1
- package/packages/core/dist/core/uninstall/uninstall-executor.js +1 -1
- package/packages/core/dist/core/uninstall/uninstall-executor.js.map +1 -1
- package/packages/core/dist/core/uninstall/uninstall-reporter.d.ts +2 -2
- package/packages/core/dist/core/uninstall/uninstall-reporter.d.ts.map +1 -1
- package/packages/core/dist/core/uninstall/uninstall-reporter.js +4 -4
- package/packages/core/dist/core/uninstall/uninstall-reporter.js.map +1 -1
- package/packages/core/dist/index.d.ts +1 -1
- package/packages/core/dist/index.d.ts.map +1 -1
- package/packages/core/dist/types/execution-context.d.ts +40 -10
- package/packages/core/dist/types/execution-context.d.ts.map +1 -1
- package/packages/core/dist/utils/concurrency-pool.d.ts +34 -0
- package/packages/core/dist/utils/concurrency-pool.d.ts.map +1 -0
- package/packages/core/dist/utils/concurrency-pool.js +58 -0
- package/packages/core/dist/utils/concurrency-pool.js.map +1 -0
- package/packages/core/dist/utils/plugin-naming.d.ts +11 -3
- package/packages/core/dist/utils/plugin-naming.d.ts.map +1 -1
- package/packages/core/dist/utils/plugin-naming.js +27 -7
- package/packages/core/dist/utils/plugin-naming.js.map +1 -1
- package/plans/wave-resolver.md +254 -0
- package/.claude/agents/essentials/code-simplifier.md +0 -52
- package/.claude/commands/essentials/cleanup.md +0 -1
- package/.claude/commands/essentials/review.md +0 -8
- package/.claude/commands/git/commit.md +0 -5
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../core/src/utils/resolution-mode.ts", "../../core/src/core/install/validators/options-validator.ts", "../../core/src/core/install/preprocessing/options-normalizer.ts", "../../core/src/core/install/preprocessing/input-classifier.ts", "../../core/src/core/install/preprocessing/base-resolver.ts", "../../core/src/core/install/preprocessing/convenience-preprocessor.ts", "../../core/src/core/install/convenience-matchers.ts", "../../core/src/core/install/unified/context-builders.ts", "../../core/src/core/remote-pull.ts", "../../core/src/utils/manifest-paths.ts", "../../core/src/core/platform/registry-entry-filter.ts", "../../core/src/utils/package-merge.ts", "../../core/src/core/cache-manager.ts", "../../core/src/utils/git-cache.ts", "../../core/src/core/git-clone.ts", "../../core/src/core/install/git-package-loader.ts"],
|
|
4
|
+
"sourcesContent": ["import type { InstallOptions } from '../types/index.js';\nimport type { InstallResolutionMode } from '../types/install.js';\n\n/**\n * Determine the resolution mode based on CLI flags\n */\nexport function determineResolutionMode(\n options: InstallOptions & { local?: boolean; remote?: boolean }\n): InstallResolutionMode {\n if (options.resolutionMode) {\n return options.resolutionMode;\n }\n\n if ((options as any).remote) {\n return 'remote-primary';\n }\n\n if ((options as any).local) {\n return 'local-only';\n }\n\n return 'default';\n}\n", "import type { InstallOptions } from '../../../types/index.js';\n\n/**\n * Validate that resolution flags are not conflicting.\n * @throws Error if both --remote and --local are specified\n */\nexport function validateResolutionFlags(\n options: InstallOptions & { local?: boolean; remote?: boolean }\n): void {\n if (options.remote && options.local) {\n throw new Error('--remote and --local cannot be used together. Choose one resolution mode.');\n }\n}\n\n/**\n * Validate conflict strategy value.\n * @returns Normalized strategy value\n * @throws Error if invalid strategy\n */\nexport function validateConflictStrategy(\n strategy: string | undefined\n): InstallOptions['conflictStrategy'] | undefined {\n if (!strategy) return undefined;\n \n const normalized = strategy.toLowerCase();\n const allowedStrategies: InstallOptions['conflictStrategy'][] = [\n 'namespace', 'overwrite', 'skip', 'ask'\n ];\n \n if (!allowedStrategies.includes(normalized as any)) {\n throw new Error(\n `Invalid --conflicts value '${strategy}'. ` +\n `Use one of: namespace, overwrite, skip, ask.`\n );\n }\n \n return normalized as InstallOptions['conflictStrategy'];\n}\n", "import type { InstallOptions } from '../../../types/index.js';\nimport type { NormalizedInstallOptions } from '../orchestrator/types.js';\nimport { normalizePlatforms } from '../../platform/platform-mapper.js';\nimport { determineResolutionMode } from '../../../utils/resolution-mode.js';\nimport { validateConflictStrategy } from '../validators/options-validator.js';\n\n/**\n * Normalize --plugins option by deduplicating.\n */\nexport function normalizePluginsOption(value: string[] | undefined): string[] | undefined {\n if (!value || value.length === 0) {\n return undefined;\n }\n const plugins = [...new Set(value)];\n return plugins.length > 0 ? plugins : undefined;\n}\n\n/**\n * Normalize all install options at CLI boundary.\n * This creates immutable, properly typed options for the install flow.\n */\nexport function normalizeInstallOptions(\n options: InstallOptions & { \n conflicts?: string;\n agents?: string[];\n skills?: string[];\n rules?: string[];\n commands?: string[];\n interactive?: boolean;\n }\n): NormalizedInstallOptions {\n // Normalize platforms\n const platforms = normalizePlatforms(options.platforms);\n\n // Normalize plugins\n const plugins = normalizePluginsOption(options.plugins);\n\n // Normalize and validate conflict strategy\n const rawConflictStrategy = options.conflicts ?? options.conflictStrategy;\n const conflictStrategy = validateConflictStrategy(rawConflictStrategy) ?? 'namespace';\n\n // Determine resolution mode\n const resolutionMode = determineResolutionMode(options);\n\n return {\n ...options,\n platforms,\n plugins,\n conflictStrategy,\n resolutionMode,\n agents: options.agents,\n skills: options.skills,\n rules: options.rules,\n commands: options.commands,\n interactive: options.interactive,\n };\n}\n", "import type { InputClassification, InputFeatures } from '../orchestrator/types.js';\nimport type { InstallOptions, ExecutionContext } from '../../../types/index.js';\nimport { classifyInputBase, type BaseInputClassification } from '../input-classifier-base.js';\n\n/**\n * Classify package input for routing to appropriate install strategy.\n * \n * Uses the shared base classifier and enriches results with install-specific features:\n * - Convenience filters (--agents, --skills, --rules, --commands)\n * - Resource path tracking for selective installation\n * \n * @param input - Raw user input (undefined for bulk install)\n * @param options - Install options (to check for convenience filters)\n * @param execContext - Execution context (uses sourceCwd for resolving inputs)\n * @returns Unified input classification with install features\n */\nexport async function classifyInput(\n input: string | undefined,\n options: InstallOptions & { agents?: string[]; skills?: string[]; rules?: string[]; commands?: string[] },\n execContext: ExecutionContext\n): Promise<InputClassification> {\n // Detect convenience filters\n const hasConvenienceFilters = !!(\n options.agents?.length ||\n options.skills?.length ||\n options.rules?.length ||\n options.commands?.length\n );\n\n // Use base classifier\n const base = await classifyInputBase(input, execContext.sourceCwd);\n\n // Convert to install-specific classification with features\n return enrichWithInstallFeatures(base, hasConvenienceFilters);\n}\n\n/**\n * Enrich base classification with install-specific features\n */\nfunction enrichWithInstallFeatures(\n base: BaseInputClassification,\n hasConvenienceFilters: boolean\n): InputClassification {\n const features: InputFeatures = {\n hasConvenienceFilters,\n hasResourcePath: false\n };\n\n switch (base.type) {\n case 'bulk':\n return { type: 'bulk', features };\n\n case 'git':\n return {\n type: 'git',\n gitUrl: base.gitUrl,\n gitRef: base.gitRef,\n resourcePath: base.gitPath,\n features: {\n ...features,\n hasResourcePath: !!base.gitPath\n }\n };\n\n case 'local-path':\n return {\n type: 'path',\n localPath: base.absolutePath,\n features\n };\n\n case 'registry':\n return {\n type: 'registry',\n packageName: base.packageName,\n version: base.version,\n resourcePath: base.registryPath,\n features: {\n ...features,\n hasResourcePath: !!base.registryPath\n }\n };\n }\n}\n\n", "import type { InstallationContext } from '../unified/context.js';\nimport type { LoadedPackage } from '../sources/base.js';\nimport { join, relative } from 'path';\nimport { stat } from 'fs/promises';\nimport { logger } from '../../../utils/logger.js';\nimport { ValidationError } from '../../../utils/errors.js';\n\nexport interface ResourceScopingResult {\n /** Relative path from the base to the resource. Empty string means resource IS the base. */\n relPath: string;\n /** Whether the resource path is a directory on disk. */\n isDirectory: boolean;\n /** The computed glob pattern for file matching (e.g. \"**\", \"dir/**\", or \"file.ts\"). */\n pattern: string;\n}\n\nexport interface ResolveResourceScopingOptions {\n /**\n * When true, throws ValidationError if the resource path does not exist on disk.\n * When false (default), a missing path is treated as a file (isDirectory = false).\n */\n strict?: boolean;\n}\n\n/**\n * Core computation: resolve a resource path relative to a package base and produce a match pattern.\n *\n * This is the single source of truth for the path-math shared by both\n * `computePathScoping()` (direct installs) and the installation planner (recursive installs).\n *\n * @returns A ResourceScopingResult, or `null` if the resource path is outside the base.\n */\nexport async function resolveResourceScoping(\n repoRoot: string,\n baseAbs: string,\n resourcePath: string,\n options?: ResolveResourceScopingOptions\n): Promise<ResourceScopingResult | null> {\n const absResourcePath = join(repoRoot, resourcePath);\n const rawRel = relative(baseAbs, absResourcePath).replace(/\\\\/g, '/');\n\n // Resource is outside the detected base \u2014 caller decides how to handle.\n if (rawRel.startsWith('..')) {\n return null;\n }\n\n // Strip cosmetic \"./\" prefix (when resource is at the same level as base).\n const relToBaseRaw = rawRel.replace(/^\\.\\/?/, '');\n\n let isDirectory = false;\n try {\n const s = await stat(absResourcePath);\n isDirectory = s.isDirectory();\n } catch {\n if (options?.strict) {\n throw new ValidationError(\n `The specified resource path does not exist in the repository: ${resourcePath}\\n\\n` +\n `Please verify the path. The file or directory may have been moved, or you may have meant a different path.`\n );\n }\n // Non-strict: best-effort, default to file\n }\n\n // When relToBaseRaw is \"\" the resource IS the base directory \u2192 pattern \"**\"\n const prefix = relToBaseRaw.replace(/\\/$/, '');\n const pattern = isDirectory ? (prefix ? `${prefix}/**` : '**') : relToBaseRaw;\n\n return { relPath: relToBaseRaw, isDirectory, pattern };\n}\n\nexport type SpecialHandling = 'marketplace' | 'ambiguous';\n\nexport interface AmbiguousBaseMatch {\n pattern: string;\n base: string;\n startIndex: number;\n}\n\nexport interface ApplyBaseDetectionResult {\n specialHandling?: SpecialHandling;\n ambiguousMatches?: AmbiguousBaseMatch[];\n}\n\n/**\n * Apply base detection results from a loader into an InstallationContext.\n *\n * This centralizes logic that used to be duplicated in strategies and the\n * pipeline load phase.\n * \n * Includes state tracking to prevent redundant application when called\n * multiple times (e.g., in strategy preprocessing and load phase).\n */\nexport function applyBaseDetection(\n ctx: InstallationContext,\n loaded: LoadedPackage\n): ApplyBaseDetectionResult {\n const baseDetection: any = loaded.sourceMetadata?.baseDetection;\n if (!baseDetection) {\n return {};\n }\n\n // Check if base detection has already been applied\n if (ctx.source._baseDetectionPerformed) {\n logger.debug('Base detection already applied, skipping redundant application');\n return {};\n }\n\n // If loaders already detected marketplace, surface it for orchestrator routing.\n if (loaded.pluginMetadata?.pluginType === 'marketplace') {\n ctx.source._baseDetectionPerformed = true;\n return { specialHandling: 'marketplace' };\n }\n\n if (baseDetection?.base) {\n ctx.detectedBase = baseDetection.base;\n // Keep source.detectedBase in sync\n ctx.source.detectedBase = baseDetection.base;\n }\n\n if (baseDetection?.matchedPattern && !ctx.matchedPattern) {\n ctx.matchedPattern = baseDetection.matchedPattern;\n }\n\n if (baseDetection?.matchType) {\n ctx.baseSource = baseDetection.matchType as any;\n }\n\n // Keep source contentRoot aligned with detected base (resource model).\n const effectiveContentRoot = ctx.detectedBase || loaded.contentRoot;\n if (effectiveContentRoot) {\n ctx.source.contentRoot = effectiveContentRoot;\n }\n\n // Compute baseRelative when repoRoot is available.\n const repoRoot = loaded.sourceMetadata?.repoPath;\n if (!ctx.baseRelative && repoRoot && ctx.detectedBase) {\n ctx.baseRelative = relative(repoRoot, ctx.detectedBase) || '.';\n } else if (!ctx.baseRelative && loaded.contentRoot && ctx.detectedBase) {\n // Fallback (less ideal if contentRoot already equals detectedBase).\n ctx.baseRelative = relative(loaded.contentRoot, ctx.detectedBase) || '.';\n }\n\n // Mark as performed\n ctx.source._baseDetectionPerformed = true;\n\n if (baseDetection?.matchType === 'marketplace') {\n return { specialHandling: 'marketplace' };\n }\n\n if (baseDetection?.matchType === 'ambiguous' && Array.isArray(baseDetection.ambiguousMatches)) {\n return { specialHandling: 'ambiguous', ambiguousMatches: baseDetection.ambiguousMatches };\n }\n\n return {};\n}\n\n/**\n * Compute resource path scoping for installs targeting a concrete resource.\n *\n * Updates ctx.matchedPattern to scope the install to the specified resourcePath.\n * \n * Includes state tracking to prevent redundant computation when called\n * multiple times (e.g., in strategy preprocessing and load phase).\n *\n * Rules:\n * - If resource resolves to a directory, pattern becomes `<dir>/**`\n * - If resource resolves to a file, pattern becomes `<file>`\n * - If the resource cannot be stat'ed or is outside the detected base, throws ValidationError.\n */\nexport async function computePathScoping(\n ctx: InstallationContext,\n loaded: LoadedPackage,\n resourcePath: string\n): Promise<void> {\n // Check if path scoping has already been computed\n if (ctx._pathScopingPerformed) {\n logger.debug('Path scoping already computed, skipping redundant computation');\n return;\n }\n\n const repoRoot = loaded.sourceMetadata?.repoPath || loaded.contentRoot;\n if (!repoRoot) {\n return;\n }\n\n const baseAbs = ctx.detectedBase || loaded.contentRoot;\n if (!baseAbs) {\n return;\n }\n\n const result = await resolveResourceScoping(repoRoot, baseAbs, resourcePath, { strict: true });\n if (!result) {\n // Path is outside the detected package base - invalid for single-file install\n throw new ValidationError(\n `The specified resource path is outside the package base: ${resourcePath}\\n\\n` +\n `Please verify the path is within the package you are installing.`\n );\n }\n\n ctx.matchedPattern = result.pattern;\n\n // Mark as performed\n ctx._pathScopingPerformed = true;\n}\n", "import { join } from 'path';\nimport { exists } from '../../../utils/fs.js';\nimport type { ConvenienceFilterOptions, ResourceInstallationSpec } from '../convenience-matchers.js';\nimport { applyConvenienceFilters, displayFilterErrors } from '../convenience-matchers.js';\nimport { buildResourceInstallContexts, prepareResourceContextsForMultiInstall } from '../unified/context-builders.js';\nimport { logger } from '../../../utils/logger.js';\nimport type { InstallationContext } from '../unified/context.js';\nimport type { LoadedPackage } from '../sources/base.js';\n\n/**\n * Find the base path where agents/skills/rules/commands subdirs live.\n * Registry packages may have these at contentRoot or under platform dirs (.opencode, .cursor, etc.).\n */\nexport async function findBaseForConvenienceFilters(\n contentRoot: string,\n options: ConvenienceFilterOptions\n): Promise<string> {\n const candidates = [contentRoot];\n for (const sub of ['.opencode', '.cursor', '.claude', '.claude-plugin']) {\n candidates.push(join(contentRoot, sub));\n }\n for (const base of candidates) {\n if (options.agents?.length && (await exists(join(base, 'agents')))) return base;\n if (options.skills?.length && (await exists(join(base, 'skills')))) return base;\n if (options.rules?.length && (await exists(join(base, 'rules')))) return base;\n if (options.commands?.length && (await exists(join(base, 'commands')))) return base;\n }\n return contentRoot;\n}\n\n/**\n * Resolve convenience resources (agents/skills) to install.\n *\n * This centralizes user-facing error display and \"continue with partial matches\"\n * behavior so strategies/handlers don't duplicate it.\n *\n * @throws Error if none of the requested resources can be found.\n */\nexport async function resolveConvenienceResources(\n basePath: string,\n repoRoot: string,\n options: ConvenienceFilterOptions\n): Promise<ResourceInstallationSpec[]> {\n const filterResult = await applyConvenienceFilters(basePath, repoRoot, options);\n\n if (filterResult.errors.length > 0) {\n displayFilterErrors(filterResult.errors);\n\n if (filterResult.resources.length === 0) {\n throw new Error('None of the requested resources were found');\n }\n\n logger.debug(`Continuing with ${filterResult.resources.length} resource(s)`);\n }\n\n return filterResult.resources;\n}\n\n/** Options for base path resolution */\nexport interface ConvenienceFilterInstallOpts {\n /** Use context.detectedBase as base (e.g. when loader already ran base detection). Otherwise uses findBaseForConvenienceFilters. */\n useDetectedBase?: boolean;\n}\n\n/**\n * Run the full convenience filter flow: resolve resources, build contexts, prepare for pipeline.\n * Shared by registry, path, and git strategies.\n *\n * @param context - Installation context (must have source populated)\n * @param loaded - Loaded package from loader\n * @param options - Convenience filter options (agents, skills, rules, commands)\n * @param opts - Base path resolution: useDetectedBase=true for git (has base detection)\n * @returns Resource contexts ready for createMultiResourceResult\n */\nexport async function runConvenienceFilterInstall(\n context: InstallationContext,\n loaded: LoadedPackage,\n options: ConvenienceFilterOptions,\n opts?: ConvenienceFilterInstallOpts\n): Promise<InstallationContext[]> {\n const contentRoot = loaded.contentRoot;\n const repoRoot = loaded.sourceMetadata?.repoPath ?? contentRoot;\n\n const basePath = opts?.useDetectedBase && context.detectedBase\n ? context.detectedBase\n : await findBaseForConvenienceFilters(contentRoot, options);\n\n const resources = await resolveConvenienceResources(basePath, repoRoot, options);\n const resourceContexts = buildResourceInstallContexts(context, resources, repoRoot);\n return prepareResourceContextsForMultiInstall(resourceContexts, repoRoot);\n}\n", "/**\n * Convenience matchers for --agents, --skills, --rules, and --commands filtering.\n * \n * Matches resource names against frontmatter fields and file/directory names\n * with deepest match resolution for ambiguous cases.\n */\n\nimport { join, basename, dirname, relative, resolve, sep } from 'path';\nimport { walkFiles } from '../../utils/file-walker.js';\nimport { exists, readTextFile } from '../../utils/fs.js';\nimport { splitFrontmatter } from '../markdown-frontmatter.js';\nimport { logger } from '../../utils/logger.js';\nimport type { OutputPort } from '../ports/output.js';\nimport { resolveOutput } from '../ports/resolve.js';\n\n/**\n * Result of a resource match\n */\nexport interface ResourceMatchResult {\n /** Resource name that was searched for */\n name: string;\n \n /** Whether the resource was found */\n found: boolean;\n \n /** Path to the matched resource (if found) */\n path?: string;\n \n /** For skills, the directory to install (parent of SKILL.md) */\n installDir?: string;\n \n /** How the resource was matched */\n matchedBy?: 'frontmatter' | 'filename' | 'dirname';\n \n /** Version extracted from frontmatter (if present) */\n version?: string;\n \n /** Error message (if not found) */\n error?: string;\n}\n\n/**\n * Container for all filtering results\n */\nexport interface ResourceInstallationSpec {\n /** Resource name that was requested */\n name: string;\n\n /** Resource type */\n resourceType: 'agent' | 'skill' | 'command' | 'rule';\n\n /** Path to resource relative to repo root */\n resourcePath: string;\n\n /** Base path where resource was discovered */\n basePath: string;\n\n /** Resource kind for scoping */\n resourceKind: 'file' | 'directory';\n\n /** How the resource was matched */\n matchedBy: 'frontmatter' | 'filename' | 'dirname';\n\n /** Version extracted from resource frontmatter (if present) */\n resourceVersion?: string;\n}\n\nexport interface ConvenienceMatcherResult {\n /** Matched resources to install */\n resources: ResourceInstallationSpec[];\n \n /** Errors for resources that weren't found */\n errors: string[];\n}\n\n/**\n * Options for convenience filtering\n */\nexport interface ConvenienceFilterOptions {\n /** Agent names to match */\n agents?: string[];\n \n /** Skill names to match */\n skills?: string[];\n \n /** Rule names to match */\n rules?: string[];\n \n /** Command names to match */\n commands?: string[];\n \n /** Plugin scope filter (marketplace context) */\n pluginScope?: string[];\n}\n\n/**\n * Apply convenience filters (--agents, --skills) to a resource.\n * \n * @param basePath - Base path to search from\n * @param options - Filter options\n * @returns Filter results with matched resources and errors\n */\nexport async function applyConvenienceFilters(\n basePath: string,\n repoRoot: string,\n options: ConvenienceFilterOptions\n): Promise<ConvenienceMatcherResult> {\n const resources: ResourceInstallationSpec[] = [];\n const errors: string[] = [];\n const baseRoot = resolve(basePath);\n const repoRootResolved = resolve(repoRoot);\n const scopeRoots = options.pluginScope?.map(scope => resolve(repoRootResolved, scope)) ?? [];\n\n const isInScope = (absPath: string): boolean => {\n if (scopeRoots.length === 0) {\n return true;\n }\n return scopeRoots.some(scopeRoot => {\n if (absPath === scopeRoot) {\n return true;\n }\n return absPath.startsWith(`${scopeRoot}${sep}`);\n });\n };\n\n const toRepoRelative = (absPath: string): string => {\n const rel = relative(repoRootResolved, absPath);\n return rel.replace(/\\\\/g, '/').replace(/^\\.\\/?/, '');\n };\n\n // Match agents\n if (options.agents && options.agents.length > 0) {\n const agentResults = await matchMarkdownResources(basePath, 'agents', 'Agent', options.agents);\n\n for (const result of agentResults) {\n if (result.found && result.path) {\n const absPath = resolve(result.path);\n if (!isInScope(absPath)) {\n errors.push(`Agent '${result.name}' not found in selected plugin scope`);\n continue;\n }\n const resourcePath = toRepoRelative(absPath);\n resources.push({\n name: result.name,\n resourceType: 'agent',\n resourcePath,\n basePath: baseRoot,\n resourceKind: 'file',\n matchedBy: (result.matchedBy || 'filename') as 'frontmatter' | 'filename' | 'dirname',\n resourceVersion: result.version\n });\n } else if (result.error) {\n errors.push(result.error);\n }\n }\n }\n\n // Match skills\n if (options.skills && options.skills.length > 0) {\n const skillResults = await matchSkills(basePath, options.skills);\n\n for (const result of skillResults) {\n if (result.found && result.path && result.installDir) {\n const absDir = resolve(result.installDir);\n if (!isInScope(absDir)) {\n errors.push(`Skill '${result.name}' not found in selected plugin scope`);\n continue;\n }\n const resourcePath = toRepoRelative(absDir);\n resources.push({\n name: result.name,\n resourceType: 'skill',\n resourcePath,\n basePath: baseRoot,\n resourceKind: 'directory',\n matchedBy: (result.matchedBy || 'dirname') as 'frontmatter' | 'filename' | 'dirname',\n resourceVersion: result.version\n });\n } else if (result.error) {\n errors.push(result.error);\n }\n }\n }\n\n // Match rules\n if (options.rules && options.rules.length > 0) {\n const ruleResults = await matchMarkdownResources(basePath, 'rules', 'Rule', options.rules);\n\n for (const result of ruleResults) {\n if (result.found && result.path) {\n const absPath = resolve(result.path);\n if (!isInScope(absPath)) {\n errors.push(`Rule '${result.name}' not found in selected plugin scope`);\n continue;\n }\n const resourcePath = toRepoRelative(absPath);\n resources.push({\n name: result.name,\n resourceType: 'rule',\n resourcePath,\n basePath: baseRoot,\n resourceKind: 'file',\n matchedBy: (result.matchedBy || 'filename') as 'frontmatter' | 'filename' | 'dirname',\n resourceVersion: result.version\n });\n } else if (result.error) {\n errors.push(result.error);\n }\n }\n }\n\n // Match commands\n if (options.commands && options.commands.length > 0) {\n const commandResults = await matchMarkdownResources(basePath, 'commands', 'Command', options.commands);\n\n for (const result of commandResults) {\n if (result.found && result.path) {\n const absPath = resolve(result.path);\n if (!isInScope(absPath)) {\n errors.push(`Command '${result.name}' not found in selected plugin scope`);\n continue;\n }\n const resourcePath = toRepoRelative(absPath);\n resources.push({\n name: result.name,\n resourceType: 'command',\n resourcePath,\n basePath: baseRoot,\n resourceKind: 'file',\n matchedBy: (result.matchedBy || 'filename') as 'frontmatter' | 'filename' | 'dirname',\n resourceVersion: result.version\n });\n } else if (result.error) {\n errors.push(result.error);\n }\n }\n }\n\n logger.info('Convenience filter results', {\n resourceCount: resources.length,\n errorCount: errors.length\n });\n\n return {\n resources,\n errors\n };\n}\n\n/**\n * Generic matcher for markdown file resources (agents, rules, commands).\n * Scans all .md files under basePath/subDir and matches by frontmatter name or filename.\n */\nasync function matchMarkdownResources(\n basePath: string,\n subDir: string,\n resourceLabel: string,\n requestedNames: string[]\n): Promise<ResourceMatchResult[]> {\n const results: ResourceMatchResult[] = [];\n \n const dir = join(basePath, subDir);\n const files: string[] = [];\n \n if (await exists(dir)) {\n for await (const file of walkFiles(dir)) {\n if (file.endsWith('.md')) {\n files.push(file);\n }\n }\n }\n\n for (const name of requestedNames) {\n const match = await findMarkdownResourceByName(files, name);\n \n if (match) {\n results.push({\n name,\n found: true,\n path: match.path,\n matchedBy: match.matchedBy,\n version: match.version\n });\n } else {\n results.push({\n name,\n found: false,\n error: `${resourceLabel} '${name}' not found`\n });\n }\n }\n\n return results;\n}\n\n/**\n * Find a markdown resource by name using frontmatter or filename.\n */\nasync function findMarkdownResourceByName(\n files: string[],\n name: string\n): Promise<{ path: string; matchedBy: 'frontmatter' | 'filename'; version?: string } | null> {\n // Priority 1: Frontmatter name match\n for (const file of files) {\n try {\n const content = await readTextFile(file);\n const { frontmatter } = splitFrontmatter(content);\n if (frontmatter?.name === name) {\n const version = extractVersionFromFrontmatter(frontmatter);\n return { path: file, matchedBy: 'frontmatter', version };\n }\n } catch (error) {\n // Ignore frontmatter parsing errors\n }\n }\n\n // Priority 2: Filename match (without .md extension)\n const byFilename = files.filter(f => basename(f, '.md') === name);\n\n if (byFilename.length === 1) {\n const file = byFilename[0];\n const version = await extractVersionFromFile(file);\n return { path: file, matchedBy: 'filename', version };\n }\n\n if (byFilename.length > 1) {\n // Deepest match - most segments in path\n const deepest = byFilename.sort((a, b) =>\n b.split('/').length - a.split('/').length\n )[0];\n const version = await extractVersionFromFile(deepest);\n return { path: deepest, matchedBy: 'filename', version };\n }\n\n return null;\n}\n\n/**\n * Match skills by name using SKILL.md frontmatter and directory name matching.\n * \n * @param basePath - Base path to search from\n * @param requestedNames - Skill names to find\n * @returns Array of match results\n */\nasync function matchSkills(\n basePath: string,\n requestedNames: string[]\n): Promise<ResourceMatchResult[]> {\n const results: ResourceMatchResult[] = [];\n \n // Find all SKILL.md files (skills/**/SKILL.md)\n const skillsDir = join(basePath, 'skills');\n const skillFiles: string[] = [];\n \n // Check if skills directory exists\n if (await exists(skillsDir)) {\n // Walk the skills directory and collect SKILL.md files\n for await (const file of walkFiles(skillsDir)) {\n if (basename(file) === 'SKILL.md') {\n skillFiles.push(file);\n }\n }\n }\n\n for (const name of requestedNames) {\n const match = await findSkillByName(skillFiles, name);\n \n if (match) {\n results.push({\n name,\n found: true,\n path: match.path,\n installDir: dirname(match.path), // Install entire parent directory\n matchedBy: match.matchedBy,\n version: match.version\n });\n } else {\n results.push({\n name,\n found: false,\n error: `Skill '${name}' not found (requires SKILL.md)`\n });\n }\n }\n\n return results;\n}\n\n/**\n * Find a skill by name using SKILL.md frontmatter or directory name.\n * Extracts version from SKILL.md frontmatter when available.\n */\nasync function findSkillByName(\n skillFiles: string[],\n name: string\n): Promise<{ path: string; matchedBy: 'frontmatter' | 'dirname'; version?: string } | null> {\n // Priority 1: Frontmatter name match in SKILL.md\n for (const file of skillFiles) {\n try {\n const content = await readTextFile(file);\n const { frontmatter } = splitFrontmatter(content);\n if (frontmatter?.name === name) {\n const version = extractVersionFromFrontmatter(frontmatter);\n return { path: file, matchedBy: 'frontmatter', version };\n }\n } catch (error) {\n // Ignore frontmatter parsing errors\n }\n }\n\n // Priority 2: Directory name match (immediate parent of SKILL.md)\n for (const file of skillFiles) {\n const dirName = basename(dirname(file));\n if (dirName === name) {\n const version = await extractVersionFromFile(file);\n return { path: file, matchedBy: 'dirname', version };\n }\n }\n\n // Priority 3: Nested directory name match (any ancestor directory)\n const matchingByNested = skillFiles.filter(file => {\n const dirPath = dirname(file);\n const segments = dirPath.split('/');\n return segments.includes(name);\n });\n\n if (matchingByNested.length > 0) {\n // Deepest match - most segments in path\n const deepest = matchingByNested.sort((a, b) =>\n b.split('/').length - a.split('/').length\n )[0];\n const version = await extractVersionFromFile(deepest);\n return { path: deepest, matchedBy: 'dirname', version };\n }\n\n return null;\n}\n\n/**\n * Display filter errors to the user.\n * \n * @param errors - Array of error messages\n * @param available - Available resources (for suggestions)\n */\nexport function displayFilterErrors(errors: string[], output?: OutputPort): void {\n if (errors.length === 0) {\n return;\n }\n\n const out = output ?? resolveOutput();\n out.error('\\nThe following resources were not found:');\n for (const error of errors) {\n out.error(` - ${error}`);\n }\n}\n\n/**\n * Extract version from frontmatter object.\n * Returns trimmed version string or undefined if not present/invalid.\n * Supports both top-level 'version' and nested 'metadata.version'.\n */\nfunction extractVersionFromFrontmatter(frontmatter: any): string | undefined {\n if (!frontmatter || typeof frontmatter !== 'object') {\n return undefined;\n }\n\n // Priority 1: Top-level version\n // Priority 2: Nested metadata.version\n const version = frontmatter.version ?? frontmatter.metadata?.version;\n\n if (typeof version === 'string') {\n const trimmed = version.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n\n return undefined;\n}\n\n/**\n * Extract version from a markdown file by parsing its frontmatter.\n * Returns undefined if file cannot be read or has no version.\n */\nasync function extractVersionFromFile(filePath: string): Promise<string | undefined> {\n try {\n const content = await readTextFile(filePath);\n const { frontmatter } = splitFrontmatter(content);\n return extractVersionFromFrontmatter(frontmatter);\n } catch (error) {\n return undefined;\n }\n}\n", "import { basename, join, relative } from 'path';\nimport type { InstallOptions, ExecutionContext } from '../../../types/index.js';\nimport type { InstallationContext, PackageSource } from './context.js';\nimport { classifyPackageInput } from '../package-input.js';\nimport { normalizePlatforms } from '../../platform/platform-mapper.js';\nimport { parsePackageYml } from '../../../utils/package-yml.js';\nimport { getLocalPackageYmlPath, getLocalOpenPackageDir } from '../../../utils/paths.js';\nimport { exists } from '../../../utils/fs.js';\nimport { createWorkspacePackageYml, ensureLocalOpenPackageStructure } from '../../package-management.js';\nimport { logger } from '../../../utils/logger.js';\nimport { resolveDeclaredPath } from '../../../utils/path-resolution.js';\nimport type { ResourceInstallationSpec } from '../convenience-matchers.js';\n\n/**\n * Result of building contexts for bulk install.\n * Workspace root is separate from dependency contexts so the orchestrator can run it as a distinct stage.\n */\nexport interface BulkInstallContextsResult {\n workspaceContext: InstallationContext | null;\n dependencyContexts: InstallationContext[];\n}\n\n/**\n * Build context for registry-based installation\n */\nexport async function buildRegistryInstallContext(\n execContext: ExecutionContext,\n packageName: string,\n options: InstallOptions & { version?: string; registryPath?: string }\n): Promise<InstallationContext> {\n const source: PackageSource = {\n type: 'registry',\n packageName,\n version: options.version,\n registryPath: options.registryPath\n };\n \n return {\n execution: execContext,\n targetDir: execContext.targetDir,\n source,\n mode: 'install',\n options,\n platforms: normalizePlatforms(options.platforms) || [],\n resolvedPackages: [],\n warnings: [],\n errors: []\n };\n}\n\n/**\n * Build context for path-based installation\n */\nexport async function buildPathInstallContext(\n execContext: ExecutionContext,\n sourcePath: string,\n options: InstallOptions & { sourceType: 'directory' | 'tarball' }\n): Promise<InstallationContext> {\n // Will need to load package to get name\n // For now, we'll populate after loading\n const source: PackageSource = {\n type: 'path',\n packageName: '', // Populated after loading\n localPath: sourcePath,\n sourceType: options.sourceType\n };\n \n return {\n execution: execContext,\n targetDir: execContext.targetDir,\n source,\n mode: 'install',\n options,\n platforms: normalizePlatforms(options.platforms) || [],\n resolvedPackages: [],\n warnings: [],\n errors: []\n };\n}\n\n/**\n * Build context for git-based installation\n */\nexport async function buildGitInstallContext(\n execContext: ExecutionContext,\n gitUrl: string,\n options: InstallOptions & { gitRef?: string; gitPath?: string }\n): Promise<InstallationContext> {\n const source: PackageSource = {\n type: 'git',\n packageName: '', // Populated after loading\n gitUrl,\n gitRef: options.gitRef,\n gitPath: options.gitPath\n };\n \n return {\n execution: execContext,\n targetDir: execContext.targetDir,\n source,\n mode: 'install',\n options,\n platforms: normalizePlatforms(options.platforms) || [],\n resolvedPackages: [],\n warnings: [],\n errors: []\n };\n}\n\n/**\n * Build context for workspace root installation\n * Used when installing/applying workspace-level files from .openpackage/\n */\nexport async function buildWorkspaceRootInstallContext(\n execContext: ExecutionContext,\n options: InstallOptions,\n mode: 'install' | 'apply' = 'install'\n): Promise<InstallationContext | null> {\n const cwd = execContext.targetDir;\n \n // Ensure .openpackage/ structure exists\n await ensureLocalOpenPackageStructure(cwd);\n \n // Create workspace manifest if it doesn't exist\n await createWorkspacePackageYml(cwd);\n \n const openpackageDir = getLocalOpenPackageDir(cwd);\n const packageYmlPath = getLocalPackageYmlPath(cwd);\n \n // Check if workspace manifest exists\n if (!(await exists(packageYmlPath))) {\n return null;\n }\n \n // Load workspace manifest\n let config;\n try {\n config = await parsePackageYml(packageYmlPath);\n } catch (error) {\n logger.warn(`Failed to read workspace manifest: ${error}`);\n return null;\n }\n \n // Use workspace directory name as package name if not specified in manifest\n const packageName = config.name || basename(cwd);\n \n const source: PackageSource = {\n type: 'workspace',\n packageName,\n version: config.version,\n contentRoot: openpackageDir\n };\n \n return {\n execution: execContext,\n targetDir: execContext.targetDir,\n source,\n mode,\n options: mode === 'apply' ? { ...options, force: true } : options,\n platforms: normalizePlatforms(options.platforms) || [],\n resolvedPackages: [],\n warnings: [],\n errors: []\n };\n}\n\n\n\n/**\n * Build context from package input (auto-detect type)\n */\nexport async function buildInstallContext(\n execContext: ExecutionContext,\n packageInput: string | undefined,\n options: InstallOptions\n): Promise<InstallationContext | InstallationContext[] | BulkInstallContextsResult> {\n // No input = bulk install (returns workspace + dependency contexts separately)\n if (!packageInput) {\n return buildBulkInstallContexts(execContext, options);\n }\n \n // Classify input to determine source type (use sourceCwd for input resolution)\n const classification = await classifyPackageInput(packageInput, execContext.sourceCwd);\n \n switch (classification.type) {\n case 'registry':\n return buildRegistryInstallContext(execContext, classification.name!, options);\n \n case 'directory':\n case 'tarball':\n return buildPathInstallContext(execContext, classification.resolvedPath!, {\n ...options,\n sourceType: classification.type\n });\n \n case 'git':\n return buildGitInstallContext(execContext, classification.gitUrl!, {\n ...options,\n gitRef: classification.gitRef,\n gitPath: classification.gitPath\n });\n \n default:\n throw new Error(`Unknown package input type: ${classification.type}`);\n }\n}\n\n/**\n * Build contexts for bulk installation.\n * Returns workspace root and dependency contexts separately so the orchestrator can run workspace as a distinct stage.\n */\nasync function buildBulkInstallContexts(\n execContext: ExecutionContext,\n options: InstallOptions\n): Promise<BulkInstallContextsResult> {\n const cwd = execContext.targetDir;\n const dependencyContexts: InstallationContext[] = [];\n\n // First, try to build workspace root context (run as distinct stage, not in dependency loop)\n const workspaceContext = await buildWorkspaceRootInstallContext(execContext, options, 'install');\n\n // Ensure workspace manifest exists before reading\n await createWorkspacePackageYml(cwd);\n\n // Read openpackage.yml and create context for each package\n const opkgYmlPath = getLocalPackageYmlPath(cwd);\n const opkgYml = await parsePackageYml(opkgYmlPath);\n\n // Get workspace package name to exclude it from bulk install\n const workspacePackageName = workspaceContext?.source.packageName;\n\n // Support both legacy `packages:` and current `dependencies:` + `dev-dependencies:` keys.\n const deps = ((opkgYml as any).packages ??\n (opkgYml as any).dependencies ??\n []) as any[];\n const devDeps = (((opkgYml as any).devDependencies ??\n (opkgYml as any)['dev-dependencies'] ??\n []) as any[]);\n\n // Merge + dedupe to avoid double-install from duplicate manifest entries\n const allDeps: any[] = [...deps, ...devDeps].filter(Boolean);\n const seen = new Set<string>();\n\n if (allDeps.length > 0) {\n for (const dep of allDeps) {\n const dedupeKey = JSON.stringify({\n name: dep?.name ?? null,\n url: dep?.url ?? dep?.git ?? null,\n ref: dep?.ref ?? null,\n path: dep?.path ?? null,\n version: dep?.version ?? null,\n base: dep?.base ?? null\n });\n if (seen.has(dedupeKey)) {\n continue;\n }\n seen.add(dedupeKey);\n\n // Skip if this package matches the workspace package name\n if (workspacePackageName && dep.name === workspacePackageName) {\n continue;\n }\n \n let source: PackageSource;\n \n if (dep.git || dep.url) {\n // Git source - handle both old (git) and new (url) formats\n const gitUrlRaw = dep.url || dep.git!;\n \n // Parse url field to extract ref if embedded\n const [gitUrl, embeddedRef] = gitUrlRaw.includes('#') \n ? gitUrlRaw.split('#', 2)\n : [gitUrlRaw, undefined];\n \n // Use embedded ref if present, otherwise fall back to separate ref field\n const gitRef = embeddedRef || dep.ref;\n\n // Bulk installs should match the resource-model behavior used by individual installs.\n // Many manifests use `name: gh@owner/repo/<resourcePath>` and/or `path:` to indicate a resource\n // (directory or file) within the repo. Passing that as `gitPath` breaks because gitPath implies\n // \"package lives in subdirectory\", and can be a file path (invalid).\n let resourcePathFromName: string | undefined;\n const depName = String(dep.name ?? '');\n if (depName.startsWith('gh@')) {\n const tail = depName.slice(3);\n const parts = tail.split('/').filter(Boolean);\n if (parts.length > 2) {\n resourcePathFromName = parts.slice(2).join('/');\n }\n }\n const effectiveResourcePath: string | undefined = dep.path || resourcePathFromName;\n const shouldTreatPathAsResource = depName.startsWith('gh@');\n \n source = {\n type: 'git',\n packageName: dep.name,\n gitUrl,\n gitRef,\n gitPath: shouldTreatPathAsResource ? undefined : dep.path,\n resourcePath: shouldTreatPathAsResource ? effectiveResourcePath : undefined,\n manifestBase: dep.base // Phase 5: Pass manifest base to source\n };\n } else if (dep.path) {\n // Path source - resolve tilde paths before creating source\n const resolved = resolveDeclaredPath(dep.path, cwd);\n const isTarball = dep.path.endsWith('.tgz') || dep.path.endsWith('.tar.gz');\n \n source = {\n type: 'path',\n packageName: dep.name,\n localPath: resolved.absolute,\n sourceType: isTarball ? 'tarball' : 'directory',\n manifestBase: dep.base // Phase 5: Pass manifest base to source\n };\n } else {\n // Registry source\n source = {\n type: 'registry',\n packageName: dep.name,\n version: dep.version,\n manifestBase: dep.base // Phase 5: Pass manifest base to source\n };\n }\n \n // Phase 5: Create context with base field from manifest if present\n const context: InstallationContext = {\n execution: execContext,\n targetDir: execContext.targetDir,\n source,\n mode: 'install',\n options,\n platforms: normalizePlatforms(options.platforms) || [],\n resolvedPackages: [],\n warnings: [],\n errors: []\n };\n \n // Phase 5: Store base from manifest for reproducibility\n // When base is present, skip base detection and use manifest value\n if (dep.base) {\n context.baseRelative = dep.base;\n context.baseSource = 'manifest';\n }\n \n dependencyContexts.push(context);\n }\n }\n\n return { workspaceContext: workspaceContext ?? null, dependencyContexts };\n}\n\n/**\n * Build context from a ResourceSpec (Phase 3: Resource Model)\n */\nexport async function buildResourceInstallContext(\n execContext: ExecutionContext,\n resourceSpec: any, // ResourceSpec from resource-arg-parser\n options: InstallOptions\n): Promise<InstallationContext> {\n let source: PackageSource;\n \n switch (resourceSpec.type) {\n case 'github-url':\n case 'github-shorthand':\n // Git source with resource path\n source = {\n type: 'git',\n packageName: '', // Populated after loading\n gitUrl: resourceSpec.gitUrl!,\n gitRef: resourceSpec.ref,\n // IMPORTANT: In resource-mode, `resourceSpec.path` represents a resource filter\n // (file or directory) within the repo, NOT a git subdirectory to clone into.\n // `gitPath` is reserved for \"package lives in subdirectory\" semantics (legacy/manifest).\n resourcePath: resourceSpec.path // Store resource path for base detection + scoping\n };\n break;\n \n case 'registry':\n // Registry source with optional path\n source = {\n type: 'registry',\n packageName: resourceSpec.name!,\n version: resourceSpec.version,\n resourcePath: resourceSpec.path\n };\n break;\n \n case 'filepath':\n // Local path source\n const absolutePath = resourceSpec.absolutePath!;\n const relativePath = relative(execContext.sourceCwd, absolutePath).replace(/\\\\/g, '/');\n const resourcePath = relativePath.startsWith('..') ? basename(absolutePath) : relativePath;\n source = {\n type: 'path',\n packageName: '', // Populated after loading\n localPath: absolutePath,\n sourceType: resourceSpec.isDirectory ? 'directory' : 'tarball',\n resourcePath\n };\n break;\n \n default:\n throw new Error(`Unknown resource type: ${resourceSpec.type}`);\n }\n \n return {\n execution: execContext,\n targetDir: execContext.targetDir,\n source,\n mode: 'install',\n options,\n platforms: normalizePlatforms(options.platforms) || [],\n resolvedPackages: [],\n warnings: [],\n errors: []\n };\n}\n\nfunction buildResourceMatchedPattern(\n resourceSpec: ResourceInstallationSpec,\n repoRoot: string,\n basePath: string\n): string | undefined {\n const absoluteResourcePath = join(repoRoot, resourceSpec.resourcePath);\n const relativeToBase = relative(basePath, absoluteResourcePath)\n .replace(/\\\\/g, '/')\n .replace(/^\\.\\/?/, '');\n\n if (!relativeToBase) {\n return undefined;\n }\n\n if (resourceSpec.resourceKind === 'directory') {\n const normalized = relativeToBase.replace(/\\/$/, '');\n return `${normalized}/**`;\n }\n\n return relativeToBase;\n}\n\n/**\n * Prepare resource contexts for multi-resource pipeline: set _skipDependencyResolution\n * and localPath for path sources so the pipeline skips reload and uses the correct root.\n */\nexport function prepareResourceContextsForMultiInstall(\n contexts: InstallationContext[],\n repoRoot: string\n): InstallationContext[] {\n return contexts.map(rc => {\n rc._skipDependencyResolution = true;\n if (rc.source.type === 'path') {\n rc.source.localPath = repoRoot;\n }\n return rc;\n });\n}\n\n/**\n * Build multiple contexts for resource-centric installations.\n * For single-file installs from plugins, scopes the package name to the resource path\n * so the workspace index key is e.g. gh@user/repo/plugin/agents/foo.md rather than the plugin root.\n */\nexport function buildResourceInstallContexts(\n baseContext: InstallationContext,\n resourceSpecs: ResourceInstallationSpec[],\n repoRoot: string\n): InstallationContext[] {\n const detectedBase = baseContext.detectedBase ?? baseContext.source.contentRoot ?? baseContext.targetDir;\n const baseRelative = baseContext.baseRelative ?? (relative(repoRoot, detectedBase) || '.');\n\n return resourceSpecs.map(spec => {\n const effectiveBase = baseContext.detectedBase ?? spec.basePath;\n const matchedPattern = buildResourceMatchedPattern(spec, repoRoot, effectiveBase) ?? baseContext.matchedPattern;\n\n // For single-file installs, scope the package name so index key and manifest are e.g.\n // gh@user/repo/plugins/feature-dev/agents/code-architect.md (not plugin root)\n const isSingleFile = Boolean(\n matchedPattern &&\n !matchedPattern.includes('*') &&\n !matchedPattern.includes('?') &&\n !matchedPattern.includes('[')\n );\n const baseName = baseContext.source.packageName;\n const scopedName = isSingleFile ? `${baseName}/${matchedPattern}` : baseName;\n\n const source: PackageSource = {\n ...baseContext.source,\n packageName: scopedName,\n resourcePath: spec.resourcePath,\n resourceVersion: spec.resourceVersion\n };\n\n let resolvedPackages = baseContext.resolvedPackages;\n if (isSingleFile && baseContext.resolvedPackages.length > 0) {\n resolvedPackages = baseContext.resolvedPackages.map(pkg => ({\n ...pkg,\n name: pkg.isRoot ? scopedName : pkg.name\n }));\n } else if (baseContext.resolvedPackages.length === 0) {\n resolvedPackages = [];\n }\n\n return {\n ...baseContext,\n source,\n resolvedPackages,\n warnings: [],\n errors: [],\n detectedBase: effectiveBase,\n baseRelative: baseRelative === '' ? '.' : baseRelative,\n baseSource: baseContext.baseSource,\n matchedPattern\n };\n });\n}\n\n\n", "import * as yaml from 'js-yaml';\nimport { PullPackageDownload, PullPackageResponse } from '../types/api.js';\nimport { Package, PackageYml } from '../types/index.js';\nimport { packageManager } from './package.js';\nimport type { PackageVersionState } from './package.js';\nimport { ensureRegistryDirectories } from './directory.js';\nimport { authManager } from './auth.js';\nimport { createHttpClient, HttpClient } from './http-client.js';\nimport { extractPackageFromTarball, verifyTarballIntegrity, ExtractedPackage } from '../utils/tarball.js';\nimport { logger } from '../utils/logger.js';\nimport { ConfigError, ValidationError } from '../utils/errors.js';\nimport { PACKAGE_PATHS } from '../constants/index.js';\nimport { formatVersionLabel } from './package-versioning.js';\nimport { normalizeRegistryPath } from './platform/registry-entry-filter.js';\nimport { mergePackageFiles } from '../utils/package-merge.js';\nimport { createCacheManager } from './cache-manager.js';\n\nconst NETWORK_ERROR_PATTERN = /(fetch failed|ENOTFOUND|EAI_AGAIN|ECONNREFUSED|ECONNRESET|ETIMEDOUT|EHOSTUNREACH|ENETUNREACH|network)/i;\n\nfunction matchesNetworkPattern(value: unknown): boolean {\n return typeof value === 'string' && NETWORK_ERROR_PATTERN.test(value);\n}\n\nfunction isNetworkFailure(error: Error): boolean {\n if (matchesNetworkPattern(error.message)) {\n return true;\n }\n\n const cause = (error as any).cause;\n if (cause && (matchesNetworkPattern(cause.message) || matchesNetworkPattern(cause.code) || matchesNetworkPattern(cause.errno))) {\n return true;\n }\n\n if (matchesNetworkPattern((error as any).code) || matchesNetworkPattern((error as any).errno)) {\n return true;\n }\n\n return false;\n}\n\nexport interface RemotePullContext {\n httpClient: HttpClient;\n profile: string;\n registryUrl: string;\n}\n\nexport interface RemotePullOptions {\n profile?: string;\n apiKey?: string;\n quiet?: boolean;\n preFetchedResponse?: PullPackageResponse;\n httpClient?: HttpClient;\n recursive?: boolean;\n paths?: string[];\n skipLocalCheck?: boolean; // For --remote flag, bypass local registry check\n}\n\nexport interface RemoteBatchPullOptions extends RemotePullOptions {\n dryRun?: boolean;\n filter?: (name: string, version: string, download: PullPackageDownload) => boolean;\n skipIfFull?: boolean;\n}\n\nexport type RemotePullFailureReason =\n | 'not-found'\n | 'access-denied'\n | 'network'\n | 'integrity'\n | 'unknown';\n\nexport interface RemotePullFailure {\n success: false;\n reason: RemotePullFailureReason;\n message: string;\n statusCode?: number;\n error?: unknown;\n}\n\nexport interface RemotePullSuccess {\n success: true;\n name: string;\n version: string;\n response: PullPackageResponse;\n extracted: ExtractedPackage;\n registryUrl: string;\n profile: string;\n downloadUrl: string;\n tarballSize: number | undefined;\n}\n\nexport type RemotePullResult = RemotePullSuccess | RemotePullFailure;\n\nexport interface RemotePackageMetadataSuccess {\n success: true;\n context: RemotePullContext;\n response: PullPackageResponse;\n}\n\nexport type RemotePackageMetadataResult = RemotePackageMetadataSuccess | RemotePullFailure;\n\nexport interface BatchDownloadItemResult {\n name: string;\n version: string;\n downloadUrl?: string;\n success: boolean;\n error?: string;\n}\n\nexport interface RemoteBatchPullResult {\n success: boolean;\n pulled: BatchDownloadItemResult[];\n failed: BatchDownloadItemResult[];\n warnings?: string[];\n}\n\nfunction normalizeDownloadPaths(paths?: string[]): string[] {\n if (!paths || paths.length === 0) {\n return [];\n }\n\n const normalized = paths\n .filter(path => typeof path === 'string')\n .map(path => path.startsWith('/') ? path.slice(1) : path)\n .map(path => normalizeRegistryPath(path))\n .filter(path => path.length > 0);\n\n return Array.from(new Set(normalized));\n}\n\nexport function buildPullEndpoint(\n name: string,\n version?: string,\n options?: { recursive?: boolean; paths?: string[] }\n): string {\n const encodedName = encodeURIComponent(name);\n const hasVersion = version && version !== 'latest';\n const endpoint = hasVersion\n ? `/packages/pull/by-name/${encodedName}/v/${encodeURIComponent(version as string)}`\n : `/packages/pull/by-name/${encodedName}`;\n\n const params: string[] = [];\n if (options?.recursive) {\n params.push('recursive=true');\n }\n\n const normalizedPaths = normalizeDownloadPaths(options?.paths);\n if (normalizedPaths.length > 0) {\n const encodedPaths = normalizedPaths.map(path => encodeURIComponent(path)).join(',');\n params.push(`paths=${encodedPaths}`);\n params.push('includeManifest=true');\n }\n\n if (params.length === 0) {\n return endpoint;\n }\n\n const delimiter = endpoint.includes('?') ? '&' : '?';\n return `${endpoint}${delimiter}${params.join('&')}`;\n}\n\n/**\n * Parse a download identifier that may contain registry path segments.\n *\n * Supports forms like:\n * - foo@1.2.3\n * - foo/bar@1.2.3\n * - @scope/foo/bar@1.2.3\n * - foo@1.2.3/path/to/file\n * - @scope/foo@1.2.3/path/to/file\n *\n+ * The registry path (if present) is returned separately so callers can\n * preserve file-level intent once the backend supports file-scoped downloads.\n */\nexport function parseDownloadIdentifier(\n downloadName: string\n): { packageName: string; version: string; registryPath?: string } {\n // Special handling for gh@ prefix - find version @ that's not at position 2\n let atIndex = -1;\n if (downloadName.startsWith('gh@')) {\n // Find the last @ that's not the one in gh@\n for (let i = downloadName.length - 1; i >= 0; i--) {\n if (downloadName[i] === '@' && i !== 2) {\n atIndex = i;\n break;\n }\n }\n } else {\n atIndex = downloadName.lastIndexOf('@');\n }\n\n if (atIndex <= 0 || atIndex === downloadName.length - 1) {\n throw new Error(`Invalid download name '${downloadName}'. Expected format '<package>@<version>'.`);\n }\n\n const rawName = downloadName.slice(0, atIndex);\n const rawVersion = downloadName.slice(atIndex + 1);\n\n // Parse package name and optional path from the name portion\n let packageName: string;\n let namePath: string | undefined;\n if (rawName.startsWith('gh@')) {\n // GitHub format: gh@username/repo or gh@username/repo/path\n const segments = rawName.split('/');\n if (segments.length < 2) {\n throw new Error(`Invalid GitHub package in download name '${downloadName}'.`);\n }\n // Take first two segments: gh@username/repo\n packageName = segments.slice(0, 2).join('/');\n // Everything after repo is the path\n if (segments.length > 2) {\n namePath = segments.slice(2).join('/');\n }\n } else if (rawName.startsWith('@')) {\n // Scoped format: @scope/pkg\n const segments = rawName.split('/');\n if (segments.length < 2) {\n throw new Error(`Invalid scoped package in download name '${downloadName}'.`);\n }\n packageName = segments.slice(0, 2).join('/'); // @scope/pkg\n namePath = segments.length > 2 ? segments.slice(2).join('/') : undefined;\n } else {\n // Unscoped format\n const segments = rawName.split('/');\n packageName = segments[0];\n namePath = segments.length > 1 ? segments.slice(1).join('/') : undefined;\n }\n\n // Parse version and optional path from the version portion\n const versionSegments = rawVersion.split('/');\n const version = versionSegments[0];\n const versionPath = versionSegments.length > 1 ? versionSegments.slice(1).join('/') : undefined;\n\n if (!packageName || !version) {\n throw new Error(`Invalid download name '${downloadName}'. Expected format '<package>@<version>'.`);\n }\n\n const registryPathParts = [namePath, versionPath].filter(Boolean) as string[];\n const registryPath = registryPathParts.length > 0 ? registryPathParts.join('/') : undefined;\n\n return { packageName, version, registryPath };\n}\n\n/**\n * Backward-compatible wrapper returning only name/version.\n */\nexport function aggregateRecursiveDownloads(responses: PullPackageResponse[]): PullPackageDownload[] {\n const aggregated = new Map<string, PullPackageDownload>();\n\n for (const response of responses) {\n if (!Array.isArray(response.downloads)) {\n continue;\n }\n\n for (const download of response.downloads) {\n if (!download?.name) {\n continue;\n }\n\n const existing = aggregated.get(download.name);\n\n if (!existing) {\n aggregated.set(download.name, download);\n continue;\n }\n\n if (!existing.downloadUrl && download.downloadUrl) {\n aggregated.set(download.name, download);\n }\n }\n }\n\n return Array.from(aggregated.values());\n}\n\nexport function isPartialDownload(download?: PullPackageDownload): boolean {\n return false;\n}\n\nexport async function pullDownloadsBatchFromRemote(\n responses: PullPackageResponse | PullPackageResponse[],\n options: RemoteBatchPullOptions = {}\n): Promise<RemoteBatchPullResult> {\n const responseArray = Array.isArray(responses) ? responses : [responses];\n\n if (responseArray.length === 0) {\n return { success: true, pulled: [], failed: [] };\n }\n\n await ensureRegistryDirectories();\n\n const context = await createContext(options);\n const httpClient = context.httpClient;\n\n const downloads = aggregateRecursiveDownloads(responseArray);\n const pulled: BatchDownloadItemResult[] = [];\n const failed: BatchDownloadItemResult[] = [];\n const warnings: string[] = [];\n const stateCache = new Map<string, PackageVersionState>();\n\n const getLocalState = async (name: string, version: string): Promise<PackageVersionState> => {\n const key = `${name}@${formatVersionLabel(version)}`;\n const cached = stateCache.get(key);\n if (cached) {\n return cached;\n }\n const state = await packageManager.getPackageVersionState(name, version);\n stateCache.set(key, state);\n return state;\n };\n\n const tasks = downloads.map(async (download) => {\n const identifier = download.name;\n\n let parsedName: { packageName: string; version: string; registryPath?: string };\n\n try {\n parsedName = parseDownloadIdentifier(identifier);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.warn(`Skipping download '${identifier}': ${message}`);\n failed.push({ name: identifier, version: '', downloadUrl: download.downloadUrl, success: false, error: message });\n return;\n }\n\n const { packageName: name, version } = parsedName;\n const isPartial = isPartialDownload(download);\n\n try {\n if (options.filter && !options.filter(name, version, download)) {\n return;\n }\n\n if (!download.downloadUrl) {\n const warning = `Download URL missing for ${identifier}`;\n logger.warn(warning);\n warnings.push(warning);\n failed.push({ name, version, downloadUrl: download.downloadUrl, success: false, error: 'download-url-missing' });\n return;\n }\n\n if (isPartial && options.skipIfFull !== false) {\n const localState = await getLocalState(name, version);\n if (localState.exists && !localState.isPartial) {\n const skipMessage = `${name}@${version} already exists locally (full); skipping partial download`;\n logger.info(skipMessage);\n warnings.push(skipMessage);\n pulled.push({ name, version, downloadUrl: download.downloadUrl, success: true });\n return;\n }\n }\n\n if (options.dryRun) {\n pulled.push({ name, version, downloadUrl: download.downloadUrl, success: true });\n return;\n }\n\n const tarballBuffer = await downloadPackageTarball(httpClient, download.downloadUrl);\n const extracted = await extractPackageFromTarball(tarballBuffer);\n const metadata = buildPackageMetadata(extracted, name, version);\n\n await packageManager.savePackage(\n { metadata, files: extracted.files },\n { partial: isPartial }\n );\n\n pulled.push({ name, version, downloadUrl: download.downloadUrl, success: true });\n } catch (error) {\n logger.debug('Batch download failed', { identifier, error });\n failed.push({\n name,\n version,\n downloadUrl: download.downloadUrl,\n success: false,\n error: error instanceof Error ? error.message : String(error)\n });\n }\n });\n\n await Promise.all(tasks);\n\n return {\n success: failed.length === 0,\n pulled,\n failed,\n warnings: warnings.length > 0 ? warnings : undefined\n };\n}\n\nfunction buildPackageMetadata(\n extracted: ExtractedPackage,\n fallbackName: string,\n fallbackVersion: string\n): PackageYml {\n const packageFile = extracted.files.find(\n file => file.path === PACKAGE_PATHS.MANIFEST_RELATIVE\n );\n\n if (packageFile) {\n try {\n const parsed = yaml.load(packageFile.content) as PackageYml | undefined;\n\n if (parsed && typeof parsed === 'object' && parsed.name && parsed.version) {\n return parsed;\n }\n\n logger.debug('Parsed openpackage.yml missing required fields, falling back to inferred metadata', {\n fallbackName,\n fallbackVersion\n });\n } catch (error) {\n logger.debug('Failed to parse openpackage.yml from extracted tarball', {\n fallbackName,\n fallbackVersion,\n error\n });\n }\n }\n\n return {\n name: fallbackName,\n version: fallbackVersion,\n } as PackageYml;\n}\n\nexport async function fetchRemotePackageMetadata(\n name: string,\n version: string | undefined,\n options: RemotePullOptions = {}\n): Promise<RemotePackageMetadataResult> {\n try {\n await ensureRegistryDirectories();\n\n const context = await createContext(options);\n const response = await getRemotePackage(\n context.httpClient,\n name,\n version,\n options.recursive,\n options.paths\n );\n\n return {\n success: true,\n context,\n response\n };\n } catch (error) {\n return mapErrorToFailure(error);\n }\n}\n\nexport async function pullPackageFromRemote(\n name: string,\n version?: string,\n options: RemotePullOptions = {}\n): Promise<RemotePullResult> {\n try {\n // CACHE CHECK: If specific version requested, check if already in local registry\n // Skip this check if skipLocalCheck is set (--remote flag forces fresh fetch)\n if (version && version !== 'latest' && !options.skipLocalCheck) {\n const cacheManager = createCacheManager();\n const localPath = await cacheManager.getLocalPackagePath(name, version);\n if (localPath) {\n logger.debug('Package already exists in local registry, skipping remote pull', { name, version, localPath });\n return {\n success: true,\n name,\n version,\n response: {} as PullPackageResponse,\n extracted: { files: [], checksum: '' },\n registryUrl: '',\n profile: '',\n downloadUrl: '',\n tarballSize: undefined\n };\n }\n }\n \n const metadataResult = options.preFetchedResponse\n ? await createResultFromPrefetched(options)\n : await fetchRemotePackageMetadata(name, version, options);\n\n if (!metadataResult.success) {\n return metadataResult;\n }\n\n const { context, response } = metadataResult;\n const primaryDownload = resolvePrimaryDownload(response);\n if (!primaryDownload?.downloadUrl) {\n return {\n success: false,\n reason: 'access-denied',\n message: 'Package download not available for this account',\n };\n }\n\n const isPartial = isPartialDownload(primaryDownload);\n const tarballBuffer = await downloadPackageTarball(context.httpClient, primaryDownload.downloadUrl);\n\n const expectedSize = isPartial ? undefined : response.version.tarballSize;\n if (!verifyTarballIntegrity(tarballBuffer, expectedSize)) {\n return {\n success: false,\n reason: 'integrity',\n message: 'Tarball integrity verification failed'\n };\n }\n\n const extracted = await extractPackageFromTarball(tarballBuffer);\n\n await savePackageToLocalRegistry(response, extracted, {\n partial: isPartial\n });\n\n return {\n success: true,\n name: response.package.name,\n version: formatVersionLabel(response.version.version),\n response,\n extracted,\n registryUrl: context.registryUrl,\n profile: context.profile,\n downloadUrl: primaryDownload.downloadUrl,\n tarballSize: response.version.tarballSize\n };\n } catch (error) {\n return mapErrorToFailure(error);\n }\n}\n\nfunction resolvePrimaryDownload(response: PullPackageResponse): PullPackageDownload | undefined {\n if (!Array.isArray(response.downloads) || response.downloads.length === 0) {\n return undefined;\n }\n\n const primaryMatch = response.downloads.find(download => download.name === response.package.name && download.downloadUrl);\n if (primaryMatch?.downloadUrl) {\n return primaryMatch;\n }\n\n const fallbackMatch = response.downloads.find(download => download.downloadUrl);\n return fallbackMatch;\n}\n\nasync function createResultFromPrefetched(options: RemotePullOptions): Promise<RemotePackageMetadataResult> {\n if (!options.preFetchedResponse) {\n throw new Error('preFetchedResponse missing from options');\n }\n\n const context = await createContext(options);\n\n return {\n success: true,\n context,\n response: options.preFetchedResponse\n };\n}\n\nasync function createContext(options: RemotePullOptions): Promise<RemotePullContext> {\n const authOptions = {\n profile: options.profile,\n apiKey: options.apiKey\n };\n\n const httpClient = options.httpClient || await createHttpClient(authOptions);\n const profile = authManager.getCurrentProfile(authOptions);\n const registryUrl = authManager.getRegistryUrl();\n\n return {\n httpClient,\n profile,\n registryUrl\n };\n}\n\nasync function getRemotePackage(\n httpClient: HttpClient,\n name: string,\n version?: string,\n recursive?: boolean,\n paths?: string[],\n): Promise<PullPackageResponse> {\n const finalEndpoint = buildPullEndpoint(name, version, { recursive, paths });\n logger.debug(`Fetching remote package metadata`, {\n name,\n version: version ?? 'latest',\n endpoint: finalEndpoint,\n recursive: !!recursive,\n hasPaths: !!paths && paths.length > 0\n });\n return await httpClient.get<PullPackageResponse>(finalEndpoint);\n}\n\nasync function downloadPackageTarball(httpClient: HttpClient, downloadUrl: string): Promise<Buffer> {\n const downloadHost = (() => {\n try {\n return new URL(downloadUrl).host;\n } catch {\n return '';\n }\n })();\n const registryHost = (() => {\n try {\n return new URL(authManager.getRegistryUrl()).host;\n } catch {\n return '';\n }\n })();\n const shouldSkipAuth = downloadHost !== '' && registryHost !== '' && downloadHost !== registryHost;\n const buffer = await httpClient.downloadFile(downloadUrl, { skipAuth: shouldSkipAuth });\n return Buffer.from(buffer);\n}\n\nasync function savePackageToLocalRegistry(\n response: PullPackageResponse,\n extracted: ExtractedPackage,\n saveOptions: { partial?: boolean } = {}\n): Promise<void> {\n const metadata: PackageYml & Record<string, unknown> = {\n name: response.package.name,\n version: response.version.version,\n description: response.package.description,\n keywords: response.package.keywords,\n private: response.package.isPrivate\n };\n\n (metadata as any).files = extracted.files.map(file => file.path);\n (metadata as any).created = response.version.createdAt;\n (metadata as any).updated = response.version.updatedAt;\n\n let files = extracted.files;\n\n if (saveOptions.partial) {\n try {\n const existing = await packageManager.loadPackage(response.package.name, response.version.version);\n files = mergePackageFiles(existing.files, files);\n } catch {\n // No existing version; keep files as-is\n }\n }\n\n await packageManager.savePackage(\n { metadata: metadata as PackageYml, files },\n { partial: Boolean(saveOptions.partial) }\n );\n}\n\nfunction mapErrorToFailure(error: unknown): RemotePullFailure {\n logger.debug('Remote pull operation failed', { error });\n\n if (error instanceof ValidationError) {\n return {\n success: false,\n reason: 'integrity',\n message: error.message,\n error\n };\n }\n\n if (error instanceof ConfigError) {\n return {\n success: false,\n reason: 'access-denied',\n message: error.message,\n error\n };\n }\n\n if (error instanceof Error) {\n const apiError = (error as any).apiError;\n\n if (apiError?.statusCode === 404) {\n const failure: RemotePullFailure = {\n success: false,\n reason: 'not-found',\n message: error.message,\n statusCode: 404,\n error\n };\n return failure;\n }\n\n if (apiError?.statusCode === 401 || apiError?.statusCode === 403) {\n return {\n success: false,\n reason: 'access-denied',\n message: error.message,\n statusCode: apiError.statusCode,\n error\n };\n }\n\n if (isNetworkFailure(error)) {\n return {\n success: false,\n reason: 'network',\n message: error.message,\n error\n };\n }\n\n return {\n success: false,\n reason: 'unknown',\n message: error.message,\n error\n };\n }\n\n return {\n success: false,\n reason: 'unknown',\n message: 'Unknown error occurred',\n error\n };\n}\n\n\n", "import { FILE_PATTERNS, PACKAGE_PATHS } from '../constants/index.js';\nimport { normalizePathForProcessing } from './path-normalization.js';\n\n/**\n * Normalize package-internal paths for consistent comparisons.\n * Strips leading slash and converts to forward slashes.\n */\nexport function normalizePackagePath(path: string): string {\n const trimmed = path.startsWith('/') ? path.slice(1) : path;\n return normalizePathForProcessing(trimmed);\n}\n\n/**\n * Determine if a path points to a package manifest (either bare or canonical).\n */\nexport function isManifestPath(path: string): boolean {\n const normalized = normalizePackagePath(path);\n return (\n normalized === FILE_PATTERNS.OPENPACKAGE_YML ||\n normalized === PACKAGE_PATHS.MANIFEST_RELATIVE\n );\n}\n\n", "import {\n FILE_PATTERNS\n} from '../../constants/index.js';\nimport { isRootCopyPath } from './platform-root-files.js';\nimport { normalizePathForProcessing } from '../../utils/path-normalization.js';\nimport { \n matchesUniversalPattern,\n isPlatformId \n} from '../platforms.js';\nimport { isManifestPath } from '../../utils/manifest-paths.js';\nimport { isPlatformRootFile } from './platform-utils.js';\n\nexport function normalizeRegistryPath(registryPath: string): string {\n return normalizePathForProcessing(registryPath);\n}\n\nexport function isRootRegistryPath(registryPath: string): boolean {\n const normalized = normalizeRegistryPath(registryPath);\n const fileName = normalized.split('/').pop();\n return !!fileName && isPlatformRootFile(fileName);\n}\n\nexport function isSkippableRegistryPath(registryPath: string, cwd?: string): boolean {\n const normalized = normalizeRegistryPath(registryPath);\n \n // Handle openpackage.yml at any level\n if (isManifestPath(normalized)) {\n return true;\n }\n\n // Check if it's a platform-specific YML file (e.g., rules.cursor.yml)\n if (!normalized.endsWith(FILE_PATTERNS.YML_FILE)) {\n return false;\n }\n\n const fileName = normalized.split('/').pop();\n if (!fileName) {\n return false;\n }\n\n const parts = fileName.split('.');\n if (parts.length < 3) {\n return false;\n }\n\n const possiblePlatform = parts[parts.length - 2];\n return isPlatformId(possiblePlatform);\n}\n\n/**\n * Check if a registry path is allowed to be included in a package.\n * Uses flow-based pattern matching to determine if a file is universal content.\n * \n * @param registryPath - Path to validate\n * @param cwd - Optional cwd for local platform config overrides\n * @returns true if path should be included in package\n */\nexport function isAllowedRegistryPath(registryPath: string, cwd?: string): boolean {\n const normalized = normalizeRegistryPath(registryPath);\n\n // Root-level platform files (AGENTS.md, CLAUDE.md, etc.) are allowed as package content.\n // They are mapped by platform flows during install/apply.\n if (isRootRegistryPath(normalized)) return true;\n \n // Exclude platform-specific YML files\n if (isSkippableRegistryPath(normalized, cwd)) return false;\n\n // Exclude copy-to-root entries (handled explicitly elsewhere)\n if (isRootCopyPath(normalized)) return false;\n\n // Flow-based validation: path must match at least one universal pattern\n return matchesUniversalPattern(normalized, cwd);\n}\n\n/**\n * Extract universal subdirectory info from a registry path if it starts with a known subdir.\n * Returns null for root-level files that match universal patterns.\n * \n * @param registryPath - Registry path to analyze\n * @param cwd - Optional cwd for local platform config overrides\n * @returns Subdirectory info or null\n * \n * @deprecated This function exists for backward compatibility with code that needs\n * to extract subdirectory information for path mapping. New code should use\n * matchesUniversalPattern() for validation.\n */\nexport function extractUniversalSubdirInfo(\n registryPath: string,\n cwd?: string\n): { universalSubdir: string; relPath: string } | null {\n const normalized = normalizeRegistryPath(registryPath);\n\n // Must match a universal pattern\n if (!matchesUniversalPattern(normalized, cwd)) {\n return null;\n }\n\n // Extract first path component\n const parts = normalized.split('/');\n const firstComponent = parts[0];\n \n // If first component contains a dot, it's a root-level file, not a subdir\n if (!firstComponent || firstComponent.includes('.')) {\n return null;\n }\n\n // First component is a directory\n const relPath = parts.slice(1).join('/');\n return {\n universalSubdir: firstComponent,\n relPath\n };\n}\n\n\n", "import * as yaml from 'js-yaml';\nimport { PackageFile, PackageYml } from '../types/index.js';\nimport { PACKAGE_PATHS } from '../constants/index.js';\nimport { normalizePathForProcessing } from './path-normalization.js';\nimport { serializePackageYml } from './package-yml.js';\n\nconst PACKAGE_INDEX = normalizePathForProcessing(PACKAGE_PATHS.INDEX_RELATIVE);\n\n/**\n * Merge two sets of package files:\n * - normalizes paths\n * - skips package index\n * - incoming wins on conflicts\n */\nexport function mergePackageFiles(base: PackageFile[], incoming: PackageFile[]): PackageFile[] {\n const byPath = new Map<string, PackageFile>();\n\n const addAll = (list: PackageFile[]) => {\n for (const file of list) {\n const normalized = normalizePathForProcessing(file.path) || file.path;\n if (normalized === PACKAGE_INDEX) continue; // never merge index\n byPath.set(normalized, { ...file, path: normalized });\n }\n };\n\n addAll(base);\n addAll(incoming);\n\n return Array.from(byPath.values());\n}\n\n/**\n * Remove partial: true from manifest content if present, re-serializing with existing helper.\n */\nexport function stripPartialFlag(files: PackageFile[], fallbackName?: string): PackageFile[] {\n return files.map(file => {\n const normalized = normalizePathForProcessing(file.path) || file.path;\n if (normalized !== PACKAGE_PATHS.MANIFEST_RELATIVE) {\n return file;\n }\n\n try {\n const parsed = (yaml.load(file.content) as PackageYml) || { name: fallbackName };\n if ((parsed as any).partial !== undefined) {\n delete (parsed as any).partial;\n return { ...file, content: serializePackageYml(parsed) };\n }\n return file;\n } catch {\n return file;\n }\n });\n}\n\n", "import { homedir } from 'os';\nimport { join } from 'path';\nimport { exists, ensureDir, readTextFile, writeTextFile } from '../utils/fs.js';\nimport { computeGitUrlHash } from '../utils/git-cache.js';\nimport { logger } from '../utils/logger.js';\nimport { getPackageVersionPath } from './directory.js';\n\nconst METADATA_TTL_MS = 10 * 60 * 1000; // 10 minutes\n\nexport interface CachedRefEntry {\n commit: string;\n fetchedAt: string;\n}\n\nexport interface GitRefCache {\n refs: Record<string, CachedRefEntry>;\n}\n\nexport interface CachedMetadata {\n versions: string[];\n fetchedAt: string;\n etag?: string;\n}\n\nexport interface CacheManager {\n getCachedCommitForRef(url: string, ref: string): Promise<string | null>;\n cacheRefCommit(url: string, ref: string, commit: string): Promise<void>;\n\n getLocalPackagePath(name: string, version: string): Promise<string | null>;\n hasLocalPackage(name: string, version: string): Promise<boolean>;\n\n getCachedMetadata(name: string): Promise<CachedMetadata | null>;\n cacheMetadata(name: string, versions: string[], etag?: string): Promise<void>;\n}\n\nfunction getGitRefsCacheDir(): string {\n return join(homedir(), '.openpackage', 'cache', 'git-refs');\n}\n\nfunction getMetadataCacheDir(): string {\n return join(homedir(), '.openpackage', 'cache', 'metadata');\n}\n\nfunction getGitRefCachePath(url: string): string {\n const urlHash = computeGitUrlHash(url);\n return join(getGitRefsCacheDir(), `${urlHash}.json`);\n}\n\nfunction getMetadataCachePath(name: string): string {\n const safeName = name.replace(/\\//g, '__');\n return join(getMetadataCacheDir(), `${safeName}.json`);\n}\n\nfunction isExpired(fetchedAt: string, ttlMs: number): boolean {\n const fetchedTime = new Date(fetchedAt).getTime();\n return Date.now() - fetchedTime > ttlMs;\n}\n\nasync function readJsonFile<T>(filePath: string): Promise<T | null> {\n if (!(await exists(filePath))) {\n return null;\n }\n\n try {\n const content = await readTextFile(filePath);\n return JSON.parse(content);\n } catch (error) {\n logger.warn(`Failed to read cache file at ${filePath}`, { error });\n return null;\n }\n}\n\nasync function writeJsonFile<T>(filePath: string, data: T): Promise<void> {\n const dir = join(filePath, '..');\n await ensureDir(dir);\n await writeTextFile(filePath, JSON.stringify(data, null, 2));\n}\n\nexport function createCacheManager(): CacheManager {\n return {\n async getCachedCommitForRef(url: string, ref: string): Promise<string | null> {\n const cachePath = getGitRefCachePath(url);\n const cache = await readJsonFile<GitRefCache>(cachePath);\n\n if (!cache?.refs?.[ref]) {\n return null;\n }\n\n // Return cached commit - caller decides whether to trust based on ref immutability\n // (git-clone.ts only uses this for immutable refs like semver tags)\n return cache.refs[ref].commit;\n },\n\n async cacheRefCommit(url: string, ref: string, commit: string): Promise<void> {\n const cachePath = getGitRefCachePath(url);\n let cache = await readJsonFile<GitRefCache>(cachePath);\n\n if (!cache) {\n cache = { refs: {} };\n }\n\n cache.refs[ref] = {\n commit,\n fetchedAt: new Date().toISOString(),\n };\n\n await writeJsonFile(cachePath, cache);\n logger.debug(`Cached git ref ${ref} -> ${commit.substring(0, 7)}`, { url });\n },\n\n async getLocalPackagePath(name: string, version: string): Promise<string | null> {\n const packagePath = getPackageVersionPath(name, version);\n\n if (await exists(packagePath)) {\n return packagePath;\n }\n\n return null;\n },\n\n async hasLocalPackage(name: string, version: string): Promise<boolean> {\n const packagePath = getPackageVersionPath(name, version);\n return await exists(packagePath);\n },\n\n async getCachedMetadata(name: string): Promise<CachedMetadata | null> {\n const cachePath = getMetadataCachePath(name);\n const cache = await readJsonFile<CachedMetadata>(cachePath);\n\n if (!cache) {\n return null;\n }\n\n if (isExpired(cache.fetchedAt, METADATA_TTL_MS)) {\n logger.debug(`Metadata cache expired for ${name}`, { fetchedAt: cache.fetchedAt });\n return null;\n }\n\n return cache;\n },\n\n async cacheMetadata(name: string, versions: string[], etag?: string): Promise<void> {\n const cachePath = getMetadataCachePath(name);\n\n const cache: CachedMetadata = {\n versions,\n fetchedAt: new Date().toISOString(),\n ...(etag && { etag }),\n };\n\n await writeJsonFile(cachePath, cache);\n logger.debug(`Cached metadata for ${name}`, { versionCount: versions.length });\n },\n };\n}\n", "import { createHash } from 'crypto';\nimport { join, basename } from 'path';\nimport { homedir } from 'os';\nimport { readdir } from 'fs/promises';\nimport { readTextFile, writeTextFile, exists, ensureDir } from './fs.js';\nimport { logger } from './logger.js';\nimport { normalizeGitUrl } from './git-url-parser.js';\n\n/**\n * Metadata stored at repository level.\n */\nexport interface GitRepoMetadata {\n url: string;\n normalized: string;\n lastFetched?: string;\n}\n\n/**\n * Metadata stored at commit level.\n */\nexport interface GitCommitMetadata {\n url: string;\n commit: string; // Full commit SHA\n ref?: string; // Branch/tag name if specified\n subdir?: string;\n clonedAt: string;\n lastAccessed: string;\n}\n\n/**\n * Cache entry information.\n */\nexport interface GitCacheEntry {\n urlHash: string;\n commitSha: string;\n path: string;\n metadata: GitCommitMetadata;\n}\n\n/**\n * Compute a hash of a Git URL for cache directory naming.\n * Uses 12 hex characters (48 bits) for short but collision-resistant paths.\n */\nexport function computeGitUrlHash(url: string): string {\n const normalized = normalizeGitUrl(url);\n const hash = createHash('sha256').update(normalized).digest('hex');\n \n // Use first 12 chars (48 bits)\n return hash.substring(0, 12);\n}\n\n/**\n * Get the base cache directory for Git repositories.\n * Returns: ~/.openpackage/cache/git/\n */\nexport function getGitCacheDir(): string {\n return join(homedir(), '.openpackage', 'cache', 'git');\n}\n\n/**\n * Get the cache directory path for a specific repository (by URL).\n * Returns: ~/.openpackage/cache/git/<url-hash>/\n */\nexport function getGitRepoCacheDir(url: string): string {\n const urlHash = computeGitUrlHash(url);\n const cacheDir = getGitCacheDir();\n return join(cacheDir, urlHash);\n}\n\n/**\n * Get the cache directory path for a specific commit.\n * Returns: ~/.openpackage/cache/git/<url-hash>/<commit-sha-7>/\n */\nexport function getGitCommitCacheDir(url: string, commitSha: string): string {\n const repoDir = getGitRepoCacheDir(url);\n const shortSha = commitSha.substring(0, 7);\n return join(repoDir, shortSha);\n}\n\n/**\n * Get the full cache path including subdirectory if specified.\n * Returns: ~/.openpackage/cache/git/<url-hash>/<commit-sha-7>/<subdirectory>/\n */\nexport function getGitCachePath(\n url: string,\n commitSha: string,\n subdirectory?: string\n): string {\n const commitDir = getGitCommitCacheDir(url, commitSha);\n \n if (subdirectory) {\n return join(commitDir, subdirectory);\n }\n \n return commitDir;\n}\n\n/**\n * Get metadata file path for a repository.\n */\nfunction getRepoMetadataPath(repoDir: string): string {\n return join(repoDir, '.opkg-repo.json');\n}\n\n/**\n * Get metadata file path for a commit.\n */\nfunction getCommitMetadataPath(commitDir: string): string {\n return join(commitDir, '.opkg-commit.json');\n}\n\n/**\n * Write repository metadata.\n */\nexport async function writeRepoMetadata(\n repoDir: string,\n metadata: GitRepoMetadata\n): Promise<void> {\n const metaPath = getRepoMetadataPath(repoDir);\n await ensureDir(repoDir);\n await writeTextFile(metaPath, JSON.stringify(metadata, null, 2));\n}\n\n/**\n * Read repository metadata.\n */\nexport async function readRepoMetadata(\n repoDir: string\n): Promise<GitRepoMetadata | null> {\n const metaPath = getRepoMetadataPath(repoDir);\n \n if (!(await exists(metaPath))) {\n return null;\n }\n \n try {\n const content = await readTextFile(metaPath);\n return JSON.parse(content);\n } catch (error) {\n logger.warn(`Failed to read repo metadata at ${metaPath}`, { error });\n return null;\n }\n}\n\n/**\n * Write commit metadata.\n */\nexport async function writeCommitMetadata(\n commitDir: string,\n metadata: GitCommitMetadata\n): Promise<void> {\n const metaPath = getCommitMetadataPath(commitDir);\n await ensureDir(commitDir);\n await writeTextFile(metaPath, JSON.stringify(metadata, null, 2));\n}\n\n/**\n * Read commit metadata.\n */\nexport async function readCommitMetadata(\n commitDir: string\n): Promise<GitCommitMetadata | null> {\n const metaPath = getCommitMetadataPath(commitDir);\n \n if (!(await exists(metaPath))) {\n return null;\n }\n \n try {\n const content = await readTextFile(metaPath);\n return JSON.parse(content);\n } catch (error) {\n logger.warn(`Failed to read commit metadata at ${metaPath}`, { error });\n return null;\n }\n}\n\n/**\n * Update last accessed time for a cached commit.\n */\nexport async function touchCacheEntry(commitDir: string): Promise<void> {\n const metadata = await readCommitMetadata(commitDir);\n \n if (metadata) {\n metadata.lastAccessed = new Date().toISOString();\n await writeCommitMetadata(commitDir, metadata);\n }\n}\n\n/**\n * Check if a commit is already cached.\n */\nexport async function isCommitCached(url: string, commitSha: string): Promise<boolean> {\n const commitDir = getGitCommitCacheDir(url, commitSha);\n return await exists(commitDir);\n}\n\n/**\n * List all cached commits for a repository.\n */\nexport async function listRepoCachedCommits(url: string): Promise<GitCacheEntry[]> {\n const repoDir = getGitRepoCacheDir(url);\n \n if (!(await exists(repoDir))) {\n return [];\n }\n \n const entries: GitCacheEntry[] = [];\n \n try {\n const items = await readdir(repoDir);\n \n for (const item of items) {\n // Skip metadata files\n if (item.startsWith('.opkg-')) {\n continue;\n }\n \n const commitDir = join(repoDir, item);\n const metadata = await readCommitMetadata(commitDir);\n \n if (metadata) {\n const urlHash = basename(repoDir);\n entries.push({\n urlHash,\n commitSha: item,\n path: commitDir,\n metadata\n });\n }\n }\n } catch (error) {\n logger.warn(`Failed to list cached commits for ${url}`, { error });\n }\n \n return entries;\n}\n\n/**\n * List all cached Git repositories.\n */\nexport async function listAllCachedRepos(): Promise<{\n urlHash: string;\n path: string;\n metadata: GitRepoMetadata | null;\n commits: GitCacheEntry[];\n}[]> {\n const cacheDir = getGitCacheDir();\n \n if (!(await exists(cacheDir))) {\n return [];\n }\n \n const repos: {\n urlHash: string;\n path: string;\n metadata: GitRepoMetadata | null;\n commits: GitCacheEntry[];\n }[] = [];\n \n try {\n const items = await readdir(cacheDir);\n \n for (const urlHash of items) {\n const repoDir = join(cacheDir, urlHash);\n const metadata = await readRepoMetadata(repoDir);\n \n // Get all commits for this repo\n const commits = metadata ? await listRepoCachedCommits(metadata.url) : [];\n \n repos.push({\n urlHash,\n path: repoDir,\n metadata,\n commits\n });\n }\n } catch (error) {\n logger.warn(`Failed to list cached repos`, { error });\n }\n \n return repos;\n}\n", "import { execFile } from 'child_process';\nimport { join } from 'path';\nimport { promisify } from 'util';\nimport { rm, rename } from 'fs/promises';\n\nimport { logger } from '../utils/logger.js';\nimport { ValidationError } from '../utils/errors.js';\nimport { exists, ensureDir } from '../utils/fs.js';\nimport { DIR_PATTERNS, FILE_PATTERNS } from '../constants/index.js';\n\n/**\n * Lightweight spinner for git operations.\n * Core package cannot depend on terminal-specific Spinner from CLI.\n * Uses simple console.log for progress indication.\n */\nclass GitSpinner {\n private message: string;\n constructor(message: string) { this.message = message; }\n start() { logger.debug(this.message); }\n update(text: string) { this.message = text; logger.debug(text); }\n stop() { /* no-op */ }\n}\n\nimport {\n getGitCommitCacheDir,\n getGitCachePath,\n getGitRepoCacheDir,\n writeRepoMetadata,\n writeCommitMetadata,\n readCommitMetadata,\n touchCacheEntry,\n isCommitCached\n} from '../utils/git-cache.js';\nimport { createCacheManager } from './cache-manager.js';\n\nconst execFileAsync = promisify(execFile);\nconst cacheManager = createCacheManager();\n\nexport interface GitCloneOptions {\n url: string;\n ref?: string; // branch/tag/sha\n subdir?: string; // subdir within repository\n skipCache?: boolean; // Force fresh clone, bypass ref cache (for --remote flag)\n}\n\nexport interface GitCloneResult {\n path: string; // Full path to clone (including subdir if specified)\n commitSha: string; // Resolved commit SHA (7 chars)\n repoPath: string; // Path to repository root\n}\n\nfunction isSha(ref: string): boolean {\n return /^[0-9a-f]{7,40}$/i.test(ref);\n}\n\nfunction isFullSha(ref: string): boolean {\n return /^[0-9a-f]{40}$/i.test(ref);\n}\n\nasync function runGit(args: string[], cwd?: string): Promise<string> {\n try {\n const result = await execFileAsync('git', args, { cwd });\n return result.stdout.trim();\n } catch (error: any) {\n const message = error?.stderr?.toString?.().trim?.() || error?.message || String(error);\n throw new ValidationError(`Git command failed: ${message}`);\n }\n}\n\n/**\n * Get the current commit SHA of a Git repository.\n */\nasync function getCurrentCommitSha(repoPath: string): Promise<string> {\n const fullSha = await runGit(['rev-parse', 'HEAD'], repoPath);\n return fullSha.substring(0, 7);\n}\n\n/**\n * Resolve a ref to a commit SHA using ls-remote (without cloning).\n * Returns the 7-char short SHA or null if resolution fails.\n * \n * When ref is undefined or 'HEAD', resolves the default branch.\n */\nasync function resolveRefWithLsRemote(url: string, ref?: string): Promise<string | null> {\n try {\n const targetRef = ref || 'HEAD';\n const output = await runGit(['ls-remote', url, targetRef]);\n if (!output) {\n return null;\n }\n const match = output.match(/^([0-9a-f]{40})\\s/i);\n return match ? match[1].substring(0, 7) : null;\n } catch {\n return null;\n }\n}\n\nconst SEMVER_TAG_PATTERN = /^v?\\d+\\.\\d+\\.\\d+(?:[-+].*)?$/;\n\n/**\n * Check if a ref is immutable (full SHA or semver tag).\n * Immutable refs never change, so we can trust cached mappings forever.\n */\nfunction isImmutableRef(ref: string): boolean {\n return isFullSha(ref) || SEMVER_TAG_PATTERN.test(ref);\n}\n\n/**\n * Clone a Git repository to the structured cache.\n * Uses shallow clones (--depth 1) for space efficiency.\n * \n * Cache structure:\n * ~/.openpackage/cache/git/<url-hash>/<commit-sha-7>/\n * \n * Returns the path to the cloned repository (or subdir if specified).\n */\nexport async function cloneRepoToCache(options: GitCloneOptions): Promise<GitCloneResult> {\n const { url, ref, subdir, skipCache } = options;\n \n // Format URL for display (extract repo name from URL)\n const getDisplayUrl = () => {\n const match = url.match(/([^/]+\\/[^/]+?)(?:\\.git)?$/);\n return match ? match[1] : url;\n };\n \n // Helper to check cache and return result if hit\n const tryCache = async (shortSha: string, source: string): Promise<GitCloneResult | null> => {\n if (await isCommitCached(url, shortSha)) {\n const commitDir = getGitCommitCacheDir(url, shortSha);\n await touchCacheEntry(commitDir);\n const finalPath = subdir ? join(commitDir, subdir) : commitDir;\n if (!subdir || await exists(finalPath)) {\n logger.debug(`Using cached commit (${source})`, { url, ref, commit: shortSha });\n // Show cache hit to user via OutputPort\n const refDisplay = ref ? `#${ref}` : '';\n const subdirDisplay = subdir ? `/${subdir}` : '';\n logger.info(`Using cached ${getDisplayUrl()}${refDisplay}${subdirDisplay} [${shortSha}]`);\n return { path: finalPath, commitSha: shortSha, repoPath: commitDir };\n }\n }\n return null;\n };\n \n // CACHE CHECK: Skip if skipCache is set (--remote flag forces fresh fetch)\n if (!skipCache) {\n // Case 1: Full SHA provided - check cache directly (no network needed)\n if (ref && isFullSha(ref)) {\n const shortSha = ref.substring(0, 7);\n const cached = await tryCache(shortSha, 'full SHA');\n if (cached) return cached;\n }\n \n // Case 2: Immutable ref (semver tag) - trust ref cache without TTL\n if (ref && isImmutableRef(ref) && !isFullSha(ref)) {\n const cachedCommit = await cacheManager.getCachedCommitForRef(url, ref);\n if (cachedCommit) {\n const cached = await tryCache(cachedCommit, 'immutable ref cache');\n if (cached) return cached;\n }\n }\n \n // Case 3: Mutable ref (branch) or no ref (default branch)\n // Always do ls-remote to get current SHA, then check cache\n // This is the key fix: we now handle ref === undefined\n const refDisplay = ref ? `#${ref}` : '';\n const spinner = new GitSpinner(`Checking ${getDisplayUrl()}${refDisplay}`);\n spinner.start();\n \n const resolvedSha = await resolveRefWithLsRemote(url, ref);\n spinner.stop();\n \n if (resolvedSha) {\n // Update ref cache for future lookups\n if (ref) {\n await cacheManager.cacheRefCommit(url, ref, resolvedSha);\n }\n \n const cached = await tryCache(resolvedSha, 'ls-remote');\n if (cached) return cached;\n \n // SHA resolved but not cached - will need to clone\n logger.debug('Commit not cached, will clone', { url, ref, resolvedSha });\n }\n }\n \n // Clone to a temporary commit directory (we'll get the actual SHA after cloning)\n const repoDir = getGitRepoCacheDir(url);\n await ensureDir(repoDir);\n \n // Write repo metadata\n await writeRepoMetadata(repoDir, {\n url,\n normalized: url.toLowerCase(),\n lastFetched: new Date().toISOString()\n });\n \n // Create a unique temporary clone location.\n // IMPORTANT: recursive dependency resolution may clone multiple resources from the same repo in parallel.\n // A fixed temp dir causes collisions (\"File exists\") and leaves partial clones behind.\n const tempClonePath = join(\n repoDir,\n `.temp-clone-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2, 10)}`\n );\n \n logger.debug(`Cloning repository to cache`, { url, ref, subdir });\n \n // Create spinner for git operations\n const refDisplay = ref ? `#${ref}` : '';\n const spinner = new GitSpinner(`Cloning repository from ${url}${refDisplay}`);\n spinner.start();\n \n try {\n // Clone repository\n if (ref && isSha(ref)) {\n // SHA: shallow clone default branch, then fetch the sha\n await runGit(['clone', '--depth', '1', url, tempClonePath]);\n spinner.update(`Fetching commit ${ref}`);\n await runGit(['fetch', '--depth', '1', 'origin', ref], tempClonePath);\n spinner.update(`Checking out commit ${ref}`);\n await runGit(['checkout', ref], tempClonePath);\n } else if (ref) {\n // Branch or tag\n await runGit(['clone', '--depth', '1', '--branch', ref, url, tempClonePath]);\n } else {\n // Default branch\n await runGit(['clone', '--depth', '1', url, tempClonePath]);\n }\n \n // Get the actual commit SHA\n spinner.update('Resolving commit SHA');\n const commitSha = await getCurrentCommitSha(tempClonePath);\n const commitDir = getGitCommitCacheDir(url, commitSha);\n \n // Check if this commit is already cached\n if (await isCommitCached(url, commitSha)) {\n logger.debug(`Commit already cached, using existing`, { commitSha, commitDir });\n \n spinner.stop();\n \n // Clean up temp clone\n await rm(tempClonePath, { recursive: true, force: true });\n \n // Update access time\n await touchCacheEntry(commitDir);\n \n // Validate subdir if specified\n const finalPath = subdir ? join(commitDir, subdir) : commitDir;\n if (subdir && !(await exists(finalPath))) {\n throw new ValidationError(\n `Subdirectory '${subdir}' does not exist in cached repository ${url}`\n );\n }\n \n return {\n path: finalPath,\n commitSha,\n repoPath: commitDir\n };\n }\n \n // Move temp clone to final location.\n // If another parallel clone won the race and created the commitDir, fall back to using the cached copy.\n try {\n await rename(tempClonePath, commitDir);\n } catch (error: any) {\n const code = error?.code as string | undefined;\n if (code === 'EEXIST' || code === 'ENOTEMPTY') {\n // Another process wrote this commit in parallel.\n await rm(tempClonePath, { recursive: true, force: true });\n } else {\n throw error;\n }\n }\n \n logger.debug(`Moved clone to final cache location`, { commitDir });\n \n // If a parallel clone created commitDir, ensure we treat it as cached from here on.\n if (await isCommitCached(url, commitSha)) {\n await touchCacheEntry(commitDir);\n }\n \n // Write commit metadata\n await writeCommitMetadata(commitDir, {\n url,\n commit: commitSha,\n ref,\n subdir,\n clonedAt: new Date().toISOString(),\n lastAccessed: new Date().toISOString()\n });\n \n // Cache the ref->commit mapping for future lookups\n if (ref) {\n await cacheManager.cacheRefCommit(url, ref, commitSha);\n }\n \n // Validate subdir if specified\n const finalPath = subdir ? join(commitDir, subdir) : commitDir;\n if (subdir && !(await exists(finalPath))) {\n throw new ValidationError(\n `Subdirectory '${subdir}' does not exist in cloned repository ${url}`\n );\n }\n \n // Validate that it's an OpenPackage or Claude Code plugin\n const manifestPath = join(finalPath, FILE_PATTERNS.OPENPACKAGE_YML);\n const hasManifest = await exists(manifestPath);\n \n const pluginManifestPath = join(finalPath, DIR_PATTERNS.CLAUDE_PLUGIN, FILE_PATTERNS.PLUGIN_JSON);\n const hasPluginManifest = await exists(pluginManifestPath);\n \n const marketplaceManifestPath = join(finalPath, DIR_PATTERNS.CLAUDE_PLUGIN, FILE_PATTERNS.MARKETPLACE_JSON);\n const hasMarketplaceManifest = await exists(marketplaceManifestPath);\n \n if (!hasManifest && !hasPluginManifest && !hasMarketplaceManifest) {\n throw new ValidationError(\n `Cloned repository is not an OpenPackage or Claude Code plugin ` +\n `(missing ${FILE_PATTERNS.OPENPACKAGE_YML}, ${DIR_PATTERNS.CLAUDE_PLUGIN}/${FILE_PATTERNS.PLUGIN_JSON}, or ${DIR_PATTERNS.CLAUDE_PLUGIN}/${FILE_PATTERNS.MARKETPLACE_JSON} ` +\n `at ${subdir ? `subdir '${subdir}'` : 'repository root'})`\n );\n }\n \n spinner.stop();\n \n const refPart = ref ? `#${ref}` : '';\n const subdirPart = subdir ? `&subdirectory=${subdir}` : '';\n logger.info(`Cloned git repository ${url}${refPart}${subdirPart} to cache [${commitSha}]`);\n \n return {\n path: finalPath,\n commitSha,\n repoPath: commitDir\n };\n \n } catch (error) {\n spinner.stop();\n // Clean up temp clone on error\n if (await exists(tempClonePath)) {\n await rm(tempClonePath, { recursive: true, force: true });\n }\n throw error;\n }\n}\n\n/**\n * Legacy alias for backward compatibility.\n * @deprecated Use cloneRepoToCache instead.\n */\nexport async function cloneRepoToTempDir(options: GitCloneOptions): Promise<string> {\n const result = await cloneRepoToCache(options);\n return result.path;\n}\n", "import { cloneRepoToCache } from '../git-clone.js';\nimport { loadPackageFromPath } from './path-package-loader.js';\nimport { detectPluginType } from './plugin-detector.js';\nimport type { Package } from '../../types/index.js';\n\nexport interface GitPackageLoadOptions {\n url: string;\n ref?: string;\n path?: string;\n resourcePath?: string;\n skipCache?: boolean; // Force fresh clone (for --remote flag)\n}\n\nexport interface GitPackageLoadResult {\n pkg: Package | null;\n sourcePath: string;\n repoPath: string;\n commitSha: string;\n isMarketplace: boolean;\n}\n\nexport async function loadPackageFromGit(options: GitPackageLoadOptions): Promise<GitPackageLoadResult> {\n const cloneResult = await cloneRepoToCache({ \n url: options.url, \n ref: options.ref,\n subdir: options.path,\n skipCache: options.skipCache\n });\n \n const { path: sourcePath, repoPath, commitSha } = cloneResult;\n \n // If the caller provided a resourcePath, we must NOT treat a repo-root marketplace\n // as \"install a marketplace\" yet. The upper layer will detect base from the resource path\n // and then load the specific plugin/package base (avoids marketplace selection prompt).\n if (options.resourcePath) {\n return {\n pkg: null,\n sourcePath,\n repoPath,\n commitSha,\n isMarketplace: false\n };\n }\n\n // Check if this is a marketplace first - marketplaces don't have openpackage.yml\n // and need to be handled differently\n const pluginDetection = await detectPluginType(sourcePath);\n if (pluginDetection.isPlugin && pluginDetection.type === 'marketplace') {\n return { \n pkg: null, \n sourcePath, \n repoPath,\n commitSha,\n isMarketplace: true \n };\n }\n \n // Not a marketplace, load as regular package or individual plugin\n // Pass GitHub context for scoped naming\n const pkg = await loadPackageFromPath(sourcePath, {\n gitUrl: options.url,\n path: options.path,\n resourcePath: options.resourcePath,\n repoPath\n });\n \n return { \n pkg, \n sourcePath, \n repoPath,\n commitSha,\n isMarketplace: false \n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["join", "join", "relative", "relative", "join", "basename", "join", "relative", "basename", "join", "relative", "join", "yaml", "homedir", "join", "join", "basename", "join", "join", "join", "homedir", "join", "join", "refDisplay", "spinner", "finalPath"]
|
|
7
|
+
}
|