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/core/list/view-metadata.ts", "../../core/src/core/list/list-printers.ts", "../../core/src/core/resources/resource-namespace.ts", "../../core/src/core/list/list-pipeline.ts", "../../core/src/utils/entity-detector.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Metadata extraction for view command output.\n * Separated to avoid circular dependencies between list-printers and remote-list-resolver.\n */\n\nimport type { PackageYml, PackageRepository } from '../../types/index.js';\n\nexport interface ViewMetadataEntry {\n key: string;\n value: string | boolean | string[];\n}\n\n/** Extract recognized manifest metadata for display (excludes dependencies) */\nexport function extractMetadataFromManifest(manifest: Partial<PackageYml>): ViewMetadataEntry[] {\n const entries: ViewMetadataEntry[] = [];\n const push = (key: string, value: unknown) => {\n if (value !== undefined && value !== null && value !== '') {\n entries.push({ key, value: value as string | boolean | string[] });\n }\n };\n push('name', manifest.name);\n push('version', manifest.version);\n push('description', manifest.description);\n push('keywords', manifest.keywords);\n push('author', manifest.author);\n push('license', manifest.license);\n push('homepage', manifest.homepage);\n if (manifest.repository) {\n const repo = manifest.repository as PackageRepository;\n const repoStr = repo.directory ? `${repo.url} (${repo.directory})` : repo.url;\n push('repository', repoStr);\n }\n if (manifest.private === true) push('private', true);\n if (manifest.partial === true) push('partial', true);\n return entries;\n}\n", "import type { ListPackageReport, ListTreeNode } from './list-pipeline.js';\nimport { flattenResourceGroups, renderFlatResourceList, getChildPrefix, type TreeRenderConfig, type EnhancedFileMapping, type EnhancedResourceGroup, type ResourceScope } from './list-tree-renderer.js';\nimport { formatScopeBadge } from '../../utils/formatters.js';\nimport type { ScopeResult, HeaderInfo } from './scope-data-collector.js';\nimport type { ViewMetadataEntry } from './view-metadata.js';\nimport type { OutputPort } from '../ports/output.js';\nimport { resolveOutput } from '../ports/resolve.js';\n\nexport type { ViewMetadataEntry } from './view-metadata.js';\nexport { extractMetadataFromManifest } from './view-metadata.js';\n\nexport function printMetadataSection(metadata: ViewMetadataEntry[], output?: OutputPort): void {\n const out = output ?? resolveOutput();\n out.info(sectionHeader('Metadata', metadata.length));\n metadata.forEach((entry) => {\n const valueStr = Array.isArray(entry.value)\n ? entry.value.join(', ')\n : String(entry.value);\n out.info(`${dim(entry.key + ':')} ${valueStr}`);\n });\n}\n\n// ---------------------------------------------------------------------------\n// ANSI helpers\n// ---------------------------------------------------------------------------\n\nconst DIM = '\\x1b[2m';\nconst RESET = '\\x1b[0m';\nconst RED = '\\x1b[31m';\nconst CYAN = '\\x1b[36m';\n\nexport function dim(text: string): string {\n return `${DIM}${text}${RESET}`;\n}\n\nexport function cyan(text: string): string {\n return `${CYAN}${text}${RESET}`;\n}\n\nfunction red(text: string): string {\n return `${RED}${text}${RESET}`;\n}\n\nexport function sectionHeader(title: string, count: number): string {\n return `${cyan(`[${title}]`)} ${dim(`(${count})`)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Formatting helpers\n// ---------------------------------------------------------------------------\n\nfunction formatPackageLine(pkg: ListPackageReport): string {\n const version = pkg.version && pkg.version !== '0.0.0' ? `@${pkg.version}` : '';\n\n let stateSuffix = '';\n if (pkg.state === 'missing') {\n stateSuffix = dim(' (missing)');\n }\n\n return `${pkg.name}${version}${stateSuffix}`;\n}\n\nfunction formatFilePath(file: EnhancedFileMapping): string {\n if (file.scope === 'global' && !file.target.startsWith('~')) {\n return `~/${file.target}`;\n }\n return file.target;\n}\n\n// ---------------------------------------------------------------------------\n// File and resource group printing\n// ---------------------------------------------------------------------------\n\nfunction printFileList(\n files: { source: string; target: string; exists: boolean }[],\n prefix: string,\n out: OutputPort\n): void {\n const sortedFiles = [...files].sort((a, b) => a.target.localeCompare(b.target));\n\n for (let i = 0; i < sortedFiles.length; i++) {\n const file = sortedFiles[i];\n const isLast = i === sortedFiles.length - 1;\n const connector = isLast ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 ';\n const label = file.exists\n ? dim(file.target)\n : `${dim(file.target)} ${red('[MISSING]')}`;\n out.info(`${prefix}${connector}${label}`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Deps view\n// ---------------------------------------------------------------------------\n\ninterface DepsPackageEntry {\n report: ListPackageReport;\n children: ListTreeNode[];\n scopes: Set<ResourceScope>;\n}\n\nfunction printDepTreeNode(\n node: ListTreeNode,\n prefix: string,\n isLast: boolean,\n showFiles: boolean,\n out: OutputPort\n): void {\n const hasChildren = node.children.length > 0;\n const hasFiles = showFiles && node.report.fileList && node.report.fileList.length > 0;\n const hasBranches = hasChildren || hasFiles;\n\n const connector = isLast\n ? (hasBranches ? '\u2514\u2500\u252C ' : '\u2514\u2500\u2500 ')\n : (hasBranches ? '\u251C\u2500\u252C ' : '\u251C\u2500\u2500 ');\n const childPrefix = getChildPrefix(prefix, isLast);\n\n out.info(`${prefix}${connector}${formatPackageLine(node.report)}`);\n\n if (hasFiles) {\n printFileList(node.report.fileList!, childPrefix, out);\n }\n\n node.children.forEach((child, index) => {\n const isLastChild = index === node.children.length - 1;\n printDepTreeNode(child, childPrefix, isLastChild, showFiles, out);\n });\n}\n\nexport function printDepsView(\n results: Array<{ scope: ResourceScope; result: ScopeResult }>,\n showFiles: boolean,\n headerInfo?: HeaderInfo,\n output?: OutputPort\n): void {\n const out = output ?? resolveOutput();\n const packageMap = new Map<string, DepsPackageEntry>();\n\n for (const { scope, result } of results) {\n for (const node of result.tree) {\n const key = node.report.name;\n if (packageMap.has(key)) {\n packageMap.get(key)!.scopes.add(scope);\n } else {\n packageMap.set(key, {\n report: node.report,\n children: node.children,\n scopes: new Set([scope])\n });\n }\n }\n }\n\n if (packageMap.size === 0) {\n out.info(dim('No packages installed.'));\n return;\n }\n\n // Option 1: When workspace is the header, exclude it from the tree to avoid duplication.\n // Its files are shown under the header when -f is used.\n let workspaceEntry: DepsPackageEntry | undefined;\n if (headerInfo?.type === 'workspace' && headerInfo.name) {\n workspaceEntry = packageMap.get(headerInfo.name);\n if (workspaceEntry) {\n packageMap.delete(headerInfo.name);\n }\n }\n\n // Print header showing workspace/package name and path\n if (headerInfo) {\n const version = headerInfo.version ? `@${headerInfo.version}` : '';\n const typeTag = dim(`[${headerInfo.type}]`);\n out.info(`${headerInfo.name}${version} ${dim(`(${headerInfo.path})`)} ${typeTag}`);\n } else if (results.length > 0) {\n const firstResult = results[0].result;\n const version = firstResult.headerVersion ? `@${firstResult.headerVersion}` : '';\n const typeTag = dim(`[${firstResult.headerType}]`);\n out.info(`${firstResult.headerName}${version} ${dim(`(${firstResult.headerPath})`)} ${typeTag}`);\n }\n\n const entries = Array.from(packageMap.values())\n .sort((a, b) => a.report.name.localeCompare(b.report.name));\n\n out.info(sectionHeader('Dependencies', entries.length));\n\n // If workspace was excluded, show its files under the header when -f is used.\n // Use empty prefix so workspace files appear as siblings of dep entries.\n if (workspaceEntry && showFiles && workspaceEntry.report.fileList && workspaceEntry.report.fileList.length > 0) {\n printFileList(workspaceEntry.report.fileList, '', out);\n }\n\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n const isLast = i === entries.length - 1;\n const hasChildren = entry.children.length > 0;\n const hasFiles = showFiles && entry.report.fileList && entry.report.fileList.length > 0;\n const hasBranches = hasChildren || hasFiles;\n\n const scopeBadge = dim(formatScopeBadge(entry.scopes));\n const connector = isLast\n ? (hasBranches ? '\u2514\u2500\u252C ' : '\u2514\u2500\u2500 ')\n : (hasBranches ? '\u251C\u2500\u252C ' : '\u251C\u2500\u2500 ');\n const childPrefix = getChildPrefix('', isLast);\n\n out.info(`${connector}${formatPackageLine(entry.report)} ${scopeBadge}`);\n\n // Show flat file list for the package when -f is requested\n if (hasFiles) {\n printFileList(entry.report.fileList!, childPrefix, out);\n }\n\n for (let ci = 0; ci < entry.children.length; ci++) {\n const child = entry.children[ci];\n const isLastChild = ci === entry.children.length - 1;\n printDepTreeNode(child, childPrefix, isLastChild, showFiles, out);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Resources view (default)\n// ---------------------------------------------------------------------------\n\nexport function printResourcesView(\n groups: EnhancedResourceGroup[],\n showFiles: boolean,\n headerInfo?: HeaderInfo,\n output?: OutputPort\n): void {\n const out = output ?? resolveOutput();\n // Print header showing workspace/package name and path if provided\n if (headerInfo) {\n const version = headerInfo.version ? `@${headerInfo.version}` : '';\n const typeTag = dim(`[${headerInfo.type}]`);\n out.info(`${headerInfo.name}${version} ${dim(`(${headerInfo.path})`)} ${typeTag}`);\n }\n\n // Show package label only when listing workspace (not a specific package).\n // Temporarily disabled behind feature flag; set OPKG_LIST_SHOW_PACKAGE_LABELS=true to enable.\n const showPackageLabels =\n headerInfo?.type !== 'package' &&\n process.env.OPKG_LIST_SHOW_PACKAGE_LABELS === 'true';\n\n const config: TreeRenderConfig<EnhancedFileMapping> = {\n formatPath: (file) => formatFilePath(file),\n isMissing: (file) => file.status === 'missing',\n sortFiles: (a, b) => formatFilePath(a).localeCompare(formatFilePath(b)),\n getResourceBadge: (scopes) => scopes ? dim(formatScopeBadge(scopes)) : '',\n ...(showPackageLabels && {\n getResourcePackageLabels: (packages) => {\n if (!packages || packages.size === 0) return [];\n return Array.from(packages)\n .sort()\n .map((pkg) => dim(`(${pkg})`));\n }\n })\n };\n\n const flatResources = flattenResourceGroups(groups);\n out.info(sectionHeader('Installed', flatResources.length));\n renderFlatResourceList(flatResources, '', showFiles, config);\n}\n", "/**\n * Resource Namespace Module\n *\n * Single source of truth for deriving category/namespace from paths.\n * Used by list pipeline, scope merger, and future consumers.\n */\n\nimport { stripExtension } from './resource-naming.js';\nimport { getResourceTypeDef, toPluralKey, type ResourceTypeId } from './resource-registry.js';\nimport { stripPlatformSuffixFromFilename } from '../flows/platform-suffix-handler.js';\n\n/**\n * Extract the path segment under a category directory from a full path.\n * Handles both source keys (rules/foo.mdc) and workspace paths (.cursor/rules/foo.mdc).\n *\n * @param path - Normalized path (source key, target, or workspace path)\n * @param categoryDir - The category directory (e.g., 'rules', 'agents')\n * @returns Path under category, or null if category not found\n */\nexport function getPathUnderCategory(path: string, categoryDir: string): string | null {\n const normalized = path.replace(/\\\\/g, '/').replace(/\\/$/, '');\n const parts = normalized.split('/');\n\n const idx = parts.indexOf(categoryDir);\n if (idx < 0) return null;\n\n const remaining = parts.slice(idx + 1);\n return remaining.length > 0 ? remaining.join('/') : '';\n}\n\n/**\n * Derive the namespace (path under category with extension stripped from last segment).\n * - File-based: \"basics/custom-rules.mdc\" \u2192 \"basics/custom-rules\"\n * - Skill: \"my-skill/readme.md\" \u2192 \"my-skill\" (first segment, directory-based)\n *\n * @param pathUnderCategory - Path under the category directory\n * @param resourceType - Singular type: rule, agent, skill, etc.\n */\nfunction deriveNamespace(pathUnderCategory: string, resourceType: ResourceTypeId): string {\n if (!pathUnderCategory || pathUnderCategory === '') return 'unnamed';\n\n const parts = pathUnderCategory.split('/');\n\n if (resourceType === 'skill') {\n return parts[0] || 'unnamed';\n }\n\n // Strip platform suffix (e.g. git-manager.opencode.md -> git-manager.md) so platform-specific\n // variants group under the same resource\n const pathStripped = stripPlatformSuffixFromFilename(pathUnderCategory);\n const strippedParts = pathStripped.split('/');\n const lastSegment = strippedParts[strippedParts.length - 1] ?? '';\n const nameWithoutExt = stripExtension(lastSegment);\n\n if (strippedParts.length === 1) {\n return nameWithoutExt || lastSegment;\n }\n\n const subpath = strippedParts.slice(0, -1).join('/');\n return subpath ? `${subpath}/${nameWithoutExt}` : nameWithoutExt;\n}\n\n/**\n * Derive the full resource identifier (category/namespace) from a path.\n *\n * @param path - Source key, target path, or workspace path\n * @param resourceType - Singular type: rule, agent, skill, command, hook, mcp, other\n * @returns Full name like \"rules/custom-rules\", \"rules/basics/custom-rules\", \"agents/agent-creator\"\n */\nexport function deriveResourceFullName(path: string, resourceType: ResourceTypeId): string {\n const normalizedType = resourceType as ResourceTypeId;\n\n if (normalizedType === 'mcp') {\n return 'mcps/configs';\n }\n\n if (normalizedType === 'other') {\n return 'other';\n }\n\n const def = getResourceTypeDef(normalizedType);\n const categoryDir = def.dirName;\n\n if (!categoryDir) {\n return `other/${deriveNamespace(path, 'other')}`;\n }\n\n const pathUnder = getPathUnderCategory(path, categoryDir);\n if (pathUnder === null) {\n const pluralKey = toPluralKey(normalizedType);\n const fallback = path.replace(/\\\\/g, '/').split('/').pop() ?? 'unnamed';\n return `${pluralKey}/${stripExtension(fallback)}`;\n }\n\n const namespace = deriveNamespace(pathUnder, normalizedType);\n const pluralKey = toPluralKey(normalizedType);\n return `${pluralKey}/${namespace}`;\n}\n", "import path from 'path';\n\nimport type { CommandResult, ExecutionContext } from '../../types/index.js';\nimport { ValidationError } from '../../utils/errors.js';\nimport { getLocalOpenPackageDir, getLocalPackageYmlPath } from '../../utils/paths.js';\nimport { readWorkspaceIndex } from '../../utils/workspace-index-yml.js';\nimport { resolveDeclaredPath } from '../../utils/path-resolution.js';\nimport { exists } from '../../utils/fs.js';\nimport type { WorkspaceIndexPackage } from '../../types/workspace-index.js';\nimport { logger } from '../../utils/logger.js';\nimport { getTargetPath } from '../../utils/workspace-index-helpers.js';\nimport { parsePackageYml } from '../../utils/package-yml.js';\nimport { arePackageNamesEquivalent } from '../../utils/package-name.js';\nimport { scanUntrackedFiles, type UntrackedScanResult } from './untracked-files-scanner.js';\nimport { getWorkspaceIndexPath } from '../../utils/workspace-index-yml.js';\nimport { isPlatformId, getAllPlatforms, getPlatformDefinition } from '../platforms.js';\nimport { normalizePlatforms } from '../platform/platform-mapper.js';\nimport { DIR_TO_TYPE, RESOURCE_TYPE_ORDER, toPluralKey, type ResourceTypeId } from '../resources/resource-registry.js';\nimport { classifySourceKey } from '../resources/source-key-classifier.js';\nimport { deriveResourceFullName } from '../resources/resource-namespace.js';\nexport { classifySourceKey } from '../resources/source-key-classifier.js';\n\nexport type PackageSyncState = 'synced' | 'partial' | 'missing';\n\nexport interface ListFileMapping {\n source: string;\n target: string;\n exists: boolean;\n}\n\n/**\n * A single resource within a package (e.g., one rule, one agent, one skill)\n */\nexport interface ListResourceInfo {\n /** Display name (filename sans .md for files, directory name for skills) */\n name: string;\n /** Resource type: agent, skill, command, rule, hook, mcp, or 'other' for unrecognized */\n resourceType: string;\n /** Files belonging to this resource */\n files: ListFileMapping[];\n}\n\n/**\n * Resources grouped by type within a package\n */\nexport interface ListResourceGroup {\n /** Resource type label (e.g., 'rules', 'agents', 'skills') */\n resourceType: string;\n /** Individual resources of this type */\n resources: ListResourceInfo[];\n}\n\nexport interface ListPackageReport {\n name: string;\n version?: string;\n path: string;\n state: PackageSyncState;\n totalFiles: number;\n existingFiles: number;\n fileList?: ListFileMapping[];\n resourceGroups?: ListResourceGroup[];\n dependencies?: string[];\n}\n\nexport interface ListTreeNode {\n report: ListPackageReport;\n children: ListTreeNode[];\n}\n\nexport interface ListPipelineOptions {\n /** Include full file list for each package */\n includeFiles?: boolean;\n /** Build full recursive dependency tree */\n all?: boolean;\n /** Filter to tracked view only */\n tracked?: boolean;\n /** Filter to untracked view only */\n untracked?: boolean;\n /** Filter by platform names */\n platforms?: string[];\n}\n\nexport interface ListPipelineResult {\n packages: ListPackageReport[];\n tree?: ListTreeNode[];\n rootPackageNames?: string[];\n /** When a specific package is targeted, this contains its info for the header */\n targetPackage?: ListPackageReport;\n /** Total tracked files that exist on disk */\n trackedCount: number;\n /** Total tracked files that are missing on disk */\n missingCount: number;\n /** Total untracked files found */\n untrackedCount: number;\n /** Untracked files scan result */\n untrackedFiles?: UntrackedScanResult;\n}\n\n\n/**\n * Extract the root directory prefix from a `to` pattern string.\n * e.g. \".cursor/agents/x.md\" -> \".cursor\", \".config/opencode/agents/x.md\" -> \".config/opencode\"\n * Returns null for patterns without a dot-prefixed root dir.\n */\nfunction extractRootPrefixFromToPattern(pattern: string): string | null {\n const parts = pattern.replace(/\\\\/g, '/').split('/');\n if (parts.length < 2 || !parts[0].startsWith('.')) return null;\n const nonGlobParts = [];\n for (const part of parts) {\n if (part.includes('*') || part.includes('{')) break;\n nonGlobParts.push(part);\n }\n if (nonGlobParts.length < 2) return nonGlobParts.length === 1 ? nonGlobParts[0] : null;\n // For paths like \".config/opencode/agents/foo.md\", the root prefix is everything\n // up to but not including known resource type dirs or the filename.\n const resourceDirs = new Set(Object.keys(DIR_TO_TYPE));\n const prefixParts = [];\n for (const part of nonGlobParts) {\n if (resourceDirs.has(part)) break;\n if (part.includes('.') && part !== nonGlobParts[0]) break;\n prefixParts.push(part);\n }\n return prefixParts.length > 0 ? prefixParts.join('/') : null;\n}\n\n/**\n * Collect all `to` pattern strings from a flow, including $switch cases.\n */\nfunction collectToPatternsFromFlow(toField: unknown): string[] {\n if (typeof toField === 'string') return [toField];\n\n if (typeof toField === 'object' && toField !== null) {\n if ('$switch' in toField) {\n const sw = (toField as any).$switch;\n const patterns: string[] = [];\n for (const c of sw?.cases ?? []) {\n const v = c.value;\n if (typeof v === 'string') patterns.push(v);\n else if (typeof v === 'object' && v && 'pattern' in v) patterns.push(v.pattern);\n }\n const d = sw?.default;\n if (typeof d === 'string') patterns.push(d);\n else if (typeof d === 'object' && d && 'pattern' in d) patterns.push(d.pattern);\n return patterns;\n }\n if ('pattern' in toField && typeof (toField as any).pattern === 'string') {\n return [(toField as any).pattern];\n }\n }\n return [];\n}\n\n/**\n * Build a mapping from root directory prefixes to platform IDs.\n * Collects all root prefixes from every export flow `to` pattern (including $switch cases).\n * Cached per targetDir to avoid recomputing on every file.\n */\nconst rootDirCacheMap = new Map<string, Map<string, string>>();\n\nfunction getRootDirToPlatformMap(targetDir: string): Map<string, string> {\n const cached = rootDirCacheMap.get(targetDir);\n if (cached) return cached;\n\n const map = new Map<string, string>();\n for (const platform of getAllPlatforms({ includeDisabled: true }, targetDir)) {\n const definition = getPlatformDefinition(platform, targetDir);\n if (!definition.export) continue;\n for (const flow of definition.export) {\n for (const pattern of collectToPatternsFromFlow(flow.to)) {\n const prefix = extractRootPrefixFromToPattern(pattern);\n if (prefix && !map.has(prefix)) {\n map.set(prefix, platform);\n }\n }\n }\n }\n rootDirCacheMap.set(targetDir, map);\n return map;\n}\n\n/**\n * Extract platform from a target path by matching its root directory against\n * known platform root directories derived from export flows.\n * Returns null if the file is universal (no platform).\n *\n * @param targetPath - Target path relative to workspace (e.g., \".cursor/agents/foo.md\")\n * @param targetDir - Target directory for context and flow resolution\n * @returns Platform ID or null if universal\n */\nfunction extractPlatformFromPath(targetPath: string, targetDir: string): string | null {\n const normalized = targetPath.replace(/\\\\/g, '/');\n\n // Check if the path starts with a known platform root directory\n // Sort by longest prefix first so more-specific prefixes match before shorter ones\n const rootDirMap = getRootDirToPlatformMap(targetDir);\n const sortedEntries = [...rootDirMap.entries()].sort((a, b) => b[0].length - a[0].length);\n for (const [rootDir, platform] of sortedEntries) {\n if (normalized === rootDir || normalized.startsWith(rootDir + '/')) {\n return platform;\n }\n }\n\n // Fallback: Check for platform suffix in filename (e.g., mcp.cursor.jsonc, rule.claude.md)\n const parts = normalized.split('/');\n const filename = parts[parts.length - 1];\n const nameParts = filename.split('.');\n\n // Need at least 3 parts: name.platform.ext\n if (nameParts.length >= 3) {\n const possiblePlatform = nameParts[nameParts.length - 2];\n if (isPlatformId(possiblePlatform, targetDir)) {\n return possiblePlatform;\n }\n }\n\n // No platform detected - this is a universal file\n return null;\n}\n\n/**\n * Group file mappings into resource groups by analyzing source keys.\n *\n * For skills, all files sharing the same skills/<name>/ prefix are grouped into one resource.\n * For other types, each source key maps to one resource.\n */\nexport function groupFilesIntoResources(fileList: ListFileMapping[]): ListResourceGroup[] {\n // First pass: classify each file and group by resource identity\n const resourceMap = new Map<string, ListResourceInfo>();\n\n for (const file of fileList) {\n const { resourceType } = classifySourceKey(file.source);\n const fullName = deriveResourceFullName(file.source, resourceType);\n const key = fullName;\n\n if (!resourceMap.has(key)) {\n resourceMap.set(key, {\n name: fullName,\n resourceType,\n files: []\n });\n }\n resourceMap.get(key)!.files.push(file);\n }\n\n // Second pass: group resources by type\n const typeGroupMap = new Map<string, ListResourceInfo[]>();\n\n for (const resource of resourceMap.values()) {\n if (!typeGroupMap.has(resource.resourceType)) {\n typeGroupMap.set(resource.resourceType, []);\n }\n typeGroupMap.get(resource.resourceType)!.push(resource);\n }\n\n // Build final groups, sorted by type then by resource name\n const typeOrder = RESOURCE_TYPE_ORDER;\n const groups: ListResourceGroup[] = [];\n\n for (const type of typeOrder) {\n const resources = typeGroupMap.get(type);\n if (!resources || resources.length === 0) continue;\n\n // Sort resources by name\n resources.sort((a, b) => a.name.localeCompare(b.name));\n\n // Sort files within each resource by target path\n for (const resource of resources) {\n resource.files.sort((a, b) => a.target.localeCompare(b.target));\n }\n\n // Use plural form for group label\n const pluralLabel = toPluralKey(type as ResourceTypeId);\n groups.push({ resourceType: pluralLabel, resources });\n }\n\n // Handle any types not in typeOrder\n for (const [type, resources] of typeGroupMap) {\n if ((typeOrder as readonly string[]).includes(type)) continue;\n resources.sort((a, b) => a.name.localeCompare(b.name));\n for (const resource of resources) {\n resource.files.sort((a, b) => a.target.localeCompare(b.target));\n }\n groups.push({ resourceType: `${type}s`, resources });\n }\n\n return groups;\n}\n\n/**\n * Check package list status by verifying file existence\n * Does not compare content - only checks if expected files exist\n */\nasync function checkPackageStatus(\n targetDir: string,\n pkgName: string,\n entry: WorkspaceIndexPackage,\n includeFileList: boolean = false,\n platformsFilter?: string[]\n): Promise<ListPackageReport> {\n const totalTargets = entry.files\n ? Object.values(entry.files).reduce((s, arr) => s + (Array.isArray(arr) ? arr.length : 0), 0)\n : 0;\n const resolved = resolveDeclaredPath(entry.path, targetDir);\n const sourceRoot = resolved.absolute;\n\n // Check if source path exists\n const sourceExists = await exists(sourceRoot);\n\n // When source path is gone but we have workspace file mappings, determine state from\n // workspace targets instead of marking the package missing (e.g. index.path was a temp dir).\n const canDeriveFromFiles = totalTargets > 0;\n if (!sourceExists && !canDeriveFromFiles) {\n return {\n name: pkgName,\n version: entry.version,\n path: entry.path,\n state: 'missing',\n totalFiles: 0,\n existingFiles: 0,\n fileList: includeFileList ? [] : undefined\n };\n }\n\n // Check workspace file existence\n let totalFiles = 0;\n let existingFiles = 0;\n const fileList: ListFileMapping[] = [];\n \n const filesMapping = entry.files || {};\n \n // Normalize platform filter\n const normalizedPlatforms = platformsFilter ? normalizePlatforms(platformsFilter) : null;\n\n for (const [sourceKey, targets] of Object.entries(filesMapping)) {\n if (!Array.isArray(targets) || targets.length === 0) continue;\n\n for (const mapping of targets) {\n const targetPath = getTargetPath(mapping);\n \n // Apply platform filter if specified\n if (normalizedPlatforms && normalizedPlatforms.length > 0) {\n const filePlatform = extractPlatformFromPath(targetPath, targetDir);\n \n // If the file has a platform, check if it matches the filter\n if (filePlatform) {\n if (!normalizedPlatforms.includes(filePlatform.toLowerCase())) {\n continue; // Skip this file - it doesn't match the platform filter\n }\n }\n // If the file has no platform (universal), include it in all platform filters\n }\n \n const absPath = path.join(targetDir, targetPath);\n totalFiles++;\n \n const fileExists = await exists(absPath);\n if (fileExists) {\n existingFiles++;\n }\n if (includeFileList) {\n fileList.push({\n source: sourceKey,\n target: targetPath,\n exists: fileExists\n });\n }\n }\n }\n\n // Classify package state\n const state: PackageSyncState = existingFiles === totalFiles ? 'synced' : 'partial';\n\n // Read dependencies from the package manifest (not workspace index)\n let dependencies: string[] | undefined = entry.dependencies;\n if (!dependencies || dependencies.length === 0) {\n try {\n const pkgManifestPath = path.join(sourceRoot, 'openpackage.yml');\n if (await exists(pkgManifestPath)) {\n const pkgManifest = await parsePackageYml(pkgManifestPath);\n const allDeps = [\n ...(pkgManifest.dependencies || []),\n ...(pkgManifest['dev-dependencies'] || [])\n ];\n dependencies = allDeps.map(dep => dep.name);\n }\n } catch (error) {\n logger.debug(`Failed to read package manifest for ${pkgName}: ${error}`);\n }\n }\n\n // Always compute resource groups from the file data we collected\n const allFilesForGrouping: ListFileMapping[] = includeFileList ? fileList : [];\n\n // If we didn't collect file details for the list, we still need them for resource grouping\n if (!includeFileList) {\n for (const [sourceKey, targets] of Object.entries(filesMapping)) {\n if (!Array.isArray(targets) || targets.length === 0) continue;\n for (const mapping of targets) {\n const targetPath = getTargetPath(mapping);\n \n // Apply platform filter if specified\n if (normalizedPlatforms && normalizedPlatforms.length > 0) {\n const filePlatform = extractPlatformFromPath(targetPath, targetDir);\n \n // If the file has a platform, check if it matches the filter\n if (filePlatform) {\n if (!normalizedPlatforms.includes(filePlatform.toLowerCase())) {\n continue; // Skip this file - it doesn't match the platform filter\n }\n }\n // If the file has no platform (universal), include it in all platform filters\n }\n \n allFilesForGrouping.push({\n source: sourceKey,\n target: targetPath,\n exists: true\n });\n }\n }\n }\n\n const resourceGroups = allFilesForGrouping.length > 0\n ? groupFilesIntoResources(allFilesForGrouping)\n : undefined;\n\n return {\n name: pkgName,\n version: entry.version,\n path: entry.path,\n state,\n totalFiles,\n existingFiles,\n fileList: includeFileList ? fileList : undefined,\n resourceGroups,\n dependencies\n };\n}\n\n/**\n * Build a dependency tree from package reports\n */\nfunction buildDependencyTree(\n rootNames: string[],\n reportMap: Map<string, ListPackageReport>,\n all: boolean\n): ListTreeNode[] {\n const visited = new Set<string>();\n\n function buildNode(pkgName: string, depth: number): ListTreeNode | null {\n const report = reportMap.get(pkgName);\n if (!report) return null;\n\n // Prevent infinite loops from circular dependencies\n if (visited.has(pkgName)) {\n return {\n report: { ...report, name: `${report.name} (circular)` },\n children: []\n };\n }\n\n visited.add(pkgName);\n\n let children: ListTreeNode[] = [];\n if (all && report.dependencies && report.dependencies.length > 0) {\n children = report.dependencies\n .map(depName => buildNode(depName, depth + 1))\n .filter((node): node is ListTreeNode => node !== null);\n }\n\n visited.delete(pkgName);\n\n return { report, children };\n }\n\n return rootNames\n .map(name => buildNode(name, 0))\n .filter((node): node is ListTreeNode => node !== null);\n}\n\nexport async function runListPipeline(\n packageName: string | undefined,\n execContext: ExecutionContext,\n options: ListPipelineOptions = {}\n): Promise<CommandResult<ListPipelineResult>> {\n const { includeFiles = false, all = false, tracked = false, untracked = false, platforms } = options;\n \n // Use targetDir for list operations\n const targetDir = execContext.targetDir;\n const indexPath = getWorkspaceIndexPath(targetDir);\n\n // Validate mutual exclusivity\n if (tracked && untracked) {\n throw new ValidationError('Cannot use --tracked and --untracked together.');\n }\n\n // For --untracked only, we just need the workspace index (not the full manifest)\n if (untracked) {\n if (!(await exists(indexPath))) {\n throw new ValidationError(\n `No workspace index found at ${indexPath}. Cannot scan for untracked files.`\n );\n }\n\n const untrackedFiles = await scanUntrackedFiles(targetDir, platforms);\n\n return {\n success: true,\n data: {\n packages: [],\n tree: [],\n rootPackageNames: [],\n trackedCount: 0,\n missingCount: 0,\n untrackedCount: untrackedFiles.totalFiles,\n untrackedFiles\n }\n };\n }\n\n // Regular list operation - require both index and manifest\n const openpkgDir = getLocalOpenPackageDir(targetDir);\n const manifestPath = getLocalPackageYmlPath(targetDir);\n\n if (!(await exists(openpkgDir)) || !(await exists(manifestPath))) {\n throw new ValidationError(\n `No .openpackage/openpackage.yml found in ${targetDir}.`\n );\n }\n\n const { index } = await readWorkspaceIndex(targetDir);\n const packages = index.packages || {};\n const reports: ListPackageReport[] = [];\n const reportMap = new Map<string, ListPackageReport>();\n\n // Get workspace config to find root packages\n let rootPackageNames: string[] = [];\n let workspacePackageName: string | undefined;\n try {\n const config = await parsePackageYml(manifestPath);\n workspacePackageName = config.name;\n // Root packages are those declared in dependencies/dev-dependencies\n const declaredDeps = [\n ...(config.dependencies || []),\n ...(config['dev-dependencies'] || [])\n ];\n rootPackageNames = declaredDeps.map(dep => dep.name);\n // Include workspace package in tree roots when it's in the index (so its resources are listed)\n if (workspacePackageName && packages[workspacePackageName]) {\n rootPackageNames = [workspacePackageName, ...rootPackageNames];\n }\n } catch (error) {\n logger.warn(`Failed to read workspace manifest: ${error}`);\n }\n\n // If specific package requested, that package becomes the \"root\" and we show its dependencies\n if (packageName) {\n const pkgEntry = packages[packageName];\n if (!pkgEntry) {\n return {\n success: true,\n data: { packages: [], rootPackageNames: [], trackedCount: 0, missingCount: 0, untrackedCount: 0 }\n };\n }\n\n let targetPackage: ListPackageReport;\n try {\n targetPackage = await checkPackageStatus(targetDir, packageName, pkgEntry, true, platforms);\n reports.push(targetPackage);\n reportMap.set(packageName, targetPackage);\n } catch (error) {\n logger.warn(`Failed to check package ${packageName}: ${error}`);\n targetPackage = {\n name: packageName,\n version: pkgEntry?.version,\n path: pkgEntry?.path ?? '',\n state: 'missing',\n totalFiles: 0,\n existingFiles: 0,\n fileList: [],\n dependencies: pkgEntry?.dependencies\n };\n reports.push(targetPackage);\n reportMap.set(packageName, targetPackage);\n }\n\n // Load the target package's dependencies as tree nodes\n const depNames = targetPackage.dependencies || [];\n for (const depName of depNames) {\n if (reportMap.has(depName)) continue;\n \n const depEntry = packages[depName];\n if (!depEntry) continue;\n \n try {\n const depReport = await checkPackageStatus(targetDir, depName, depEntry, includeFiles, platforms);\n reportMap.set(depName, depReport);\n } catch (error) {\n logger.debug(`Failed to load dependency ${depName}: ${error}`);\n }\n }\n\n // If full tree (deps view), recursively load nested dependencies\n if (all) {\n const loadNestedDeps = async (names: string[]) => {\n for (const name of names) {\n const report = reportMap.get(name);\n if (!report?.dependencies) continue;\n \n for (const nestedDepName of report.dependencies) {\n if (reportMap.has(nestedDepName)) continue;\n \n const nestedEntry = packages[nestedDepName];\n if (!nestedEntry) continue;\n \n try {\n const nestedReport = await checkPackageStatus(targetDir, nestedDepName, nestedEntry, includeFiles, platforms);\n reportMap.set(nestedDepName, nestedReport);\n \n if (nestedReport.dependencies && nestedReport.dependencies.length > 0) {\n await loadNestedDeps([nestedDepName]);\n }\n } catch (error) {\n logger.debug(`Failed to load nested dependency ${nestedDepName}: ${error}`);\n }\n }\n }\n };\n await loadNestedDeps(depNames);\n }\n\n // Build tree from the target package's dependencies (not the package itself)\n const tree = buildDependencyTree(depNames, reportMap, all);\n \n // When listing a specific package, also create a tree node for the target package itself\n // so its resources can be displayed\n const targetTreeNode: ListTreeNode = {\n report: targetPackage,\n children: tree\n };\n const treeWithTarget = [targetTreeNode];\n\n // Compute tracked/missing counts from reports\n const trackedCount = reports.reduce((sum, r) => sum + r.existingFiles, 0);\n const missingCount = reports.reduce((sum, r) => sum + (r.totalFiles - r.existingFiles), 0);\n\n // Scan untracked files unless --tracked flag is set\n let untrackedFiles: UntrackedScanResult | undefined;\n let untrackedCount = 0;\n if (!tracked) {\n untrackedFiles = await scanUntrackedFiles(targetDir, platforms);\n untrackedCount = untrackedFiles.totalFiles;\n }\n\n return {\n success: true,\n data: { packages: reports, tree: treeWithTarget, rootPackageNames: depNames, targetPackage, trackedCount, missingCount, untrackedCount, untrackedFiles }\n };\n }\n\n // Check all packages and build reports (include workspace package so its resources are listed)\n for (const [pkgName, pkgEntry] of Object.entries(packages)) {\n try {\n const report = await checkPackageStatus(targetDir, pkgName, pkgEntry, includeFiles, platforms);\n reports.push(report);\n reportMap.set(pkgName, report);\n } catch (error) {\n logger.warn(`Failed to check package ${pkgName}: ${error}`);\n const errorReport: ListPackageReport = {\n name: pkgName,\n version: pkgEntry?.version,\n path: pkgEntry?.path ?? '',\n state: 'missing',\n totalFiles: 0,\n existingFiles: 0,\n dependencies: pkgEntry?.dependencies\n };\n reports.push(errorReport);\n reportMap.set(pkgName, errorReport);\n }\n }\n\n // Build dependency tree from root packages\n const tree = buildDependencyTree(rootPackageNames, reportMap, all);\n\n // Compute tracked/missing counts from reports\n const trackedCount = reports.reduce((sum, r) => sum + r.existingFiles, 0);\n const missingCount = reports.reduce((sum, r) => sum + (r.totalFiles - r.existingFiles), 0);\n\n // Scan untracked files unless --tracked flag is set\n let untrackedFiles: UntrackedScanResult | undefined;\n let untrackedCount = 0;\n if (!tracked) {\n untrackedFiles = await scanUntrackedFiles(targetDir, platforms);\n untrackedCount = untrackedFiles.totalFiles;\n }\n\n return {\n success: true,\n data: { packages: reports, tree, rootPackageNames, trackedCount, missingCount, untrackedCount, untrackedFiles }\n };\n}\n", "/**\n * Entity Type Detection Utilities\n * \n * Determines whether a path represents a package, workspace, or generic resource.\n */\n\nimport { join } from 'path';\nimport { exists, isDirectory } from './fs.js';\n\n/**\n * Entity type classification\n */\nexport type EntityType = 'workspace' | 'package' | 'resource';\n\n/**\n * Detect the type of entity at a given path.\n * \n * Detection logic:\n * - workspace: Has .openpackage/openpackage.yml\n * - package: Has openpackage.yml, or has Claude plugin characteristics, or has standard package directories\n * - resource: Everything else (individual files, subdirectories without package markers)\n * \n * @param path - Absolute path to check\n * @returns Entity type\n */\nexport async function detectEntityType(path: string): Promise<EntityType> {\n // Check for workspace marker (.openpackage/openpackage.yml)\n const workspaceMarker = join(path, '.openpackage', 'openpackage.yml');\n if (await exists(workspaceMarker)) {\n return 'workspace';\n }\n\n // Check for package marker (openpackage.yml at root)\n const packageMarker = join(path, 'openpackage.yml');\n if (await exists(packageMarker)) {\n return 'package';\n }\n\n // Check for Claude plugin characteristics (.claude-plugin/plugin.json)\n const claudePluginMarker = join(path, '.claude-plugin', 'plugin.json');\n if (await exists(claudePluginMarker)) {\n return 'package';\n }\n\n // Check for standard package directories (agents/, skills/, commands/, rules/, hooks/)\n const packageDirs = ['agents', 'skills', 'commands', 'rules', 'hooks'];\n for (const dir of packageDirs) {\n const dirPath = join(path, dir);\n if (await exists(dirPath) && await isDirectory(dirPath)) {\n return 'package';\n }\n }\n\n // Default to resource for everything else\n return 'resource';\n}\n\n/**\n * Get the display name for an entity.\n * \n * For packages: reads name from openpackage.yml, falls back to directory name\n * For other types: uses the provided name\n * \n * @param path - Absolute path to the entity\n * @param fallbackName - Name to use if package name cannot be determined\n * @returns Display name\n */\nexport async function getEntityDisplayName(\n path: string,\n fallbackName: string\n): Promise<string> {\n const entityType = await detectEntityType(path);\n\n // For packages and workspaces, try to read the name from openpackage.yml\n if (entityType === 'package' || entityType === 'workspace') {\n try {\n const { parsePackageYml } = await import('./package-yml.js');\n const manifestPath = entityType === 'workspace'\n ? join(path, '.openpackage', 'openpackage.yml')\n : join(path, 'openpackage.yml');\n\n if (await exists(manifestPath)) {\n const manifest = await parsePackageYml(manifestPath);\n if (manifest.name) {\n return manifest.name;\n }\n }\n } catch (error) {\n // Fall through to use fallback name\n }\n }\n\n return fallbackName;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["path", "pluralKey", "untrackedFiles", "tree", "trackedCount", "missingCount", "untrackedCount", "path", "parsePackageYml"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
resolveOutput
|
|
4
|
+
} from "./chunk-RAKMX654.js";
|
|
5
|
+
|
|
6
|
+
// ../core/src/core/list/list-tree-renderer.ts
|
|
7
|
+
var DIM = "\x1B[2m", RESET = "\x1B[0m", RED = "\x1B[31m";
|
|
8
|
+
function dim(text) {
|
|
9
|
+
return `${DIM}${text}${RESET}`;
|
|
10
|
+
}
|
|
11
|
+
function red(text) {
|
|
12
|
+
return `${RED}${text}${RESET}`;
|
|
13
|
+
}
|
|
14
|
+
function getTreeConnector(isLast, hasBranches) {
|
|
15
|
+
return isLast ? hasBranches ? "\u2514\u2500\u252C " : "\u2514\u2500\u2500 " : hasBranches ? "\u251C\u2500\u252C " : "\u251C\u2500\u2500 ";
|
|
16
|
+
}
|
|
17
|
+
function getChildPrefix(parentPrefix, isLast) {
|
|
18
|
+
return parentPrefix + (isLast ? " " : "\u2502 ");
|
|
19
|
+
}
|
|
20
|
+
function formatFileLabel(file, config) {
|
|
21
|
+
let filePath = config.formatPath(file);
|
|
22
|
+
return config.isMissing(file) ? `${dim(filePath)} ${red("[MISSING]")}` : dim(filePath);
|
|
23
|
+
}
|
|
24
|
+
function renderFlatFileList(files, prefix, config, output) {
|
|
25
|
+
let out = output ?? resolveOutput();
|
|
26
|
+
for (let fi = 0; fi < files.length; fi++) {
|
|
27
|
+
let file = files[fi], isLastFile = fi === files.length - 1, fileConnector = getTreeConnector(isLastFile, !1), label = formatFileLabel(file, config);
|
|
28
|
+
out.message(`${prefix}${fileConnector}${label}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function renderResource(resource, prefix, isLast, showFiles, config, output) {
|
|
32
|
+
let out = output ?? resolveOutput(), enhanced = resource, packageLabels = config.getResourcePackageLabels?.(enhanced.packages) ?? [], hasFileBranches = showFiles && resource.files.length > 0, connector = getTreeConnector(isLast, hasFileBranches), childPrefix = getChildPrefix(prefix, isLast), packagePrefix = hasFileBranches ? childPrefix + "\u2502 " : childPrefix, badge = config.getResourceBadge?.(enhanced.scopes) ?? "";
|
|
33
|
+
out.message(`${prefix}${connector}${resource.name}${badge ? " " + badge : ""}`);
|
|
34
|
+
let packageSpacing = hasFileBranches ? "" : " ";
|
|
35
|
+
for (let label of packageLabels)
|
|
36
|
+
out.message(`${packagePrefix}${packageSpacing}${label}`);
|
|
37
|
+
if (hasFileBranches) {
|
|
38
|
+
let sortedFiles = [...resource.files].sort(config.sortFiles);
|
|
39
|
+
renderFlatFileList(sortedFiles, childPrefix, config, output);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function flattenResourceGroups(groups) {
|
|
43
|
+
let flat = [];
|
|
44
|
+
for (let group of groups)
|
|
45
|
+
flat.push(...group.resources);
|
|
46
|
+
return flat.sort((a, b) => a.name.localeCompare(b.name));
|
|
47
|
+
}
|
|
48
|
+
function renderFlatResourceList(resources, prefix, showFiles, config, hasMoreSiblings, output) {
|
|
49
|
+
for (let ri = 0; ri < resources.length; ri++) {
|
|
50
|
+
let resource = resources[ri], isNaturalLast = ri === resources.length - 1;
|
|
51
|
+
renderResource(resource, prefix, hasMoreSiblings ? !1 : isNaturalLast, showFiles, config, output);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export {
|
|
56
|
+
getTreeConnector,
|
|
57
|
+
getChildPrefix,
|
|
58
|
+
flattenResourceGroups,
|
|
59
|
+
renderFlatResourceList
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=chunk-ABFUD25D.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../core/src/core/list/list-tree-renderer.ts"],
|
|
4
|
+
"sourcesContent": ["import type { ListResourceGroup, ListResourceInfo, ListFileMapping } from './list-pipeline.js';\nimport type { ResourceScope } from '../resources/scope-traversal.js';\nimport type { OutputPort } from '../ports/output.js';\nimport { resolveOutput } from '../ports/resolve.js';\n\nexport type { ResourceScope } from '../resources/scope-traversal.js';\n\n/**\n * Enhanced file mapping with status and scope\n */\nexport interface EnhancedFileMapping extends ListFileMapping {\n status: 'tracked' | 'untracked' | 'missing';\n scope: ResourceScope;\n}\n\n/**\n * Enhanced resource info with status and scopes\n */\nexport interface EnhancedResourceInfo {\n name: string;\n resourceType: string;\n files: EnhancedFileMapping[];\n status: 'tracked' | 'partial' | 'untracked' | 'mixed';\n scopes: Set<ResourceScope>;\n /** Package(s) this resource belongs to (tracked resources only) */\n packages?: Set<string>;\n}\n\n/**\n * Enhanced resource group\n */\nexport interface EnhancedResourceGroup {\n resourceType: string;\n resources: EnhancedResourceInfo[];\n}\n\n/**\n * Configuration for tree rendering behavior\n */\nexport interface TreeRenderConfig<TFile> {\n /** Function to format file path for display */\n formatPath: (file: TFile) => string;\n /** Function to check if file is missing */\n isMissing: (file: TFile) => boolean;\n /** Function to sort files */\n sortFiles: (a: TFile, b: TFile) => number;\n /** Optional badge/suffix for resource names */\n getResourceBadge?: (scopes?: Set<ResourceScope>) => string;\n /** Optional dimmed package labels shown under resource name, one line per package (vertical bar, no connector) */\n getResourcePackageLabels?: (packages?: Set<string>) => string[];\n}\n\n// ANSI color codes\nconst DIM = '\\x1b[2m';\nconst RESET = '\\x1b[0m';\nconst RED = '\\x1b[31m';\n\nfunction dim(text: string): string {\n return `${DIM}${text}${RESET}`;\n}\n\nfunction red(text: string): string {\n return `${RED}${text}${RESET}`;\n}\n\n/**\n * Get tree connector character based on position\n */\nexport function getTreeConnector(isLast: boolean, hasBranches: boolean): string {\n if (isLast) {\n return hasBranches ? '\u2514\u2500\u252C ' : '\u2514\u2500\u2500 ';\n }\n return hasBranches ? '\u251C\u2500\u252C ' : '\u251C\u2500\u2500 ';\n}\n\n/**\n * Calculate child prefix based on parent prefix and position\n */\nexport function getChildPrefix(parentPrefix: string, isLast: boolean): string {\n return parentPrefix + (isLast ? ' ' : '\u2502 ');\n}\n\n/**\n * Format file label with missing indicator if needed\n */\nexport function formatFileLabel<TFile>(\n file: TFile,\n config: TreeRenderConfig<TFile>\n): string {\n const filePath = config.formatPath(file);\n const isMissing = config.isMissing(file);\n \n return isMissing\n ? `${dim(filePath)} ${red('[MISSING]')}`\n : dim(filePath);\n}\n\n/**\n * Collect and sort all files from a resource group\n */\nexport function collectGroupFiles<TFile>(\n group: ListResourceGroup | EnhancedResourceGroup,\n config: TreeRenderConfig<TFile>\n): TFile[] {\n const allFiles: TFile[] = [];\n for (const resource of group.resources) {\n allFiles.push(...(resource.files as TFile[]));\n }\n return allFiles.sort(config.sortFiles);\n}\n\n/**\n * Render files directly under a group (for 'other' type)\n */\nexport function renderFlatFileList<TFile>(\n files: TFile[],\n prefix: string,\n config: TreeRenderConfig<TFile>,\n output?: OutputPort\n): void {\n const out = output ?? resolveOutput();\n for (let fi = 0; fi < files.length; fi++) {\n const file = files[fi];\n const isLastFile = fi === files.length - 1;\n const fileConnector = getTreeConnector(isLastFile, false);\n const label = formatFileLabel(file, config);\n out.message(`${prefix}${fileConnector}${label}`);\n }\n}\n\n/**\n * Render a single resource with its files\n */\nexport function renderResource<TFile>(\n resource: ListResourceInfo | EnhancedResourceInfo,\n prefix: string,\n isLast: boolean,\n showFiles: boolean,\n config: TreeRenderConfig<TFile>,\n output?: OutputPort\n): void {\n const out = output ?? resolveOutput();\n const enhanced = resource as EnhancedResourceInfo;\n const packageLabels = config.getResourcePackageLabels?.(enhanced.packages) ?? [];\n\n // Single source of truth: file branches (\u251C\u2500\u252C/\u2514\u2500\u252C) only when -f and resource has files.\n // Package-only uses \u251C\u2500\u2500/\u2514\u2500\u2500; double \u2502 for package labels only when file branches exist.\n const hasFileBranches = showFiles && resource.files.length > 0;\n\n const connector = getTreeConnector(isLast, hasFileBranches);\n const childPrefix = getChildPrefix(prefix, isLast);\n const packagePrefix = hasFileBranches ? childPrefix + '\u2502 ' : childPrefix;\n\n // Resource name with optional badge\n const badge = config.getResourceBadge?.(enhanced.scopes) ?? '';\n out.message(`${prefix}${connector}${resource.name}${badge ? ' ' + badge : ''}`);\n\n // Package labels: dimmed (package) under resource name, one per package.\n // With -f: align (package) with resource name (no extra spacing); without -f: 2 spaces.\n const packageSpacing = hasFileBranches ? '' : ' ';\n for (const label of packageLabels) {\n out.message(`${packagePrefix}${packageSpacing}${label}`);\n }\n\n // Render files if requested\n if (hasFileBranches) {\n const sortedFiles = [...(resource.files as TFile[])].sort(config.sortFiles);\n renderFlatFileList(sortedFiles, childPrefix, config, output);\n }\n}\n\n/**\n * Flatten resource groups into a single sorted list of resources.\n * Shared by resources view, deps view, and remote package detail.\n */\nexport function flattenResourceGroups<T extends { name: string; files: unknown[] }>(\n groups: Array<{ resourceType: string; resources: T[] }>\n): T[] {\n const flat: T[] = [];\n for (const group of groups) {\n flat.push(...group.resources);\n }\n return flat.sort((a, b) => a.name.localeCompare(b.name));\n}\n\n/**\n * Render a flat list of resources (no category grouping).\n * Each resource is displayed as category/namespace with optional file children.\n * @param hasMoreSiblings - when true, the last resource uses \u251C instead of \u2514 (more siblings follow)\n */\nexport function renderFlatResourceList<TFile>(\n resources: (ListResourceInfo | EnhancedResourceInfo)[],\n prefix: string,\n showFiles: boolean,\n config: TreeRenderConfig<TFile>,\n hasMoreSiblings?: boolean,\n output?: OutputPort\n): void {\n for (let ri = 0; ri < resources.length; ri++) {\n const resource = resources[ri];\n const isNaturalLast = ri === resources.length - 1;\n const isLast = hasMoreSiblings ? false : isNaturalLast;\n renderResource(resource, prefix, isLast, showFiles, config, output);\n }\n}\n\n/**\n * Render a single resource group with all its resources.\n * Reserved for potential future hierarchical (grouped) display.\n * Currently unused; list/view use renderFlatResourceList.\n *\n * @deprecated Unused - kept for potential hierarchical view support\n */\nexport function renderResourceGroup<TFile>(\n group: ListResourceGroup | EnhancedResourceGroup,\n prefix: string,\n isLast: boolean,\n showFiles: boolean,\n config: TreeRenderConfig<TFile>,\n output?: OutputPort\n): void {\n const out = output ?? resolveOutput();\n const isOtherGroup = group.resourceType === 'other';\n \n if (isOtherGroup) {\n // Flatten: show files directly without resource subcategories\n const allFiles = collectGroupFiles<TFile>(group, config);\n const totalFileCount = allFiles.length;\n const hasFiles = showFiles && allFiles.length > 0;\n \n const connector = getTreeConnector(isLast, hasFiles);\n out.message(`${prefix}${connector}${group.resourceType}${dim(` (${totalFileCount})`)}`);\n \n if (hasFiles) {\n const childPrefix = getChildPrefix(prefix, isLast);\n renderFlatFileList(allFiles, childPrefix, config, output);\n }\n } else {\n // Normal: show resources as subcategories, then files\n const hasResources = group.resources.length > 0;\n const connector = getTreeConnector(isLast, hasResources);\n const childPrefix = getChildPrefix(prefix, isLast);\n \n out.message(`${prefix}${connector}${group.resourceType}${dim(` (${group.resources.length})`)}`);\n \n for (let ri = 0; ri < group.resources.length; ri++) {\n const resource = group.resources[ri];\n const isLastResource = ri === group.resources.length - 1;\n renderResource(resource, childPrefix, isLastResource, showFiles, config, output);\n }\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;AAqDA,IAAM,MAAM,WACN,QAAQ,WACR,MAAM;AAEZ,SAAS,IAAI,MAAsB;AACjC,SAAO,GAAG,GAAG,GAAG,IAAI,GAAG,KAAK;AAC9B;AAEA,SAAS,IAAI,MAAsB;AACjC,SAAO,GAAG,GAAG,GAAG,IAAI,GAAG,KAAK;AAC9B;AAKO,SAAS,iBAAiB,QAAiB,aAA8B;AAC9E,SAAI,SACK,cAAc,wBAAS,wBAEzB,cAAc,wBAAS;AAChC;AAKO,SAAS,eAAe,cAAsB,QAAyB;AAC5E,SAAO,gBAAgB,SAAS,OAAO;AACzC;AAKO,SAAS,gBACd,MACA,QACQ;AACR,MAAM,WAAW,OAAO,WAAW,IAAI;AAGvC,SAFkB,OAAO,UAAU,IAAI,IAGnC,GAAG,IAAI,QAAQ,CAAC,IAAI,IAAI,WAAW,CAAC,KACpC,IAAI,QAAQ;AAClB;AAmBO,SAAS,mBACd,OACA,QACA,QACA,QACM;AACN,MAAM,MAAM,UAAU,cAAc;AACpC,WAAS,KAAK,GAAG,KAAK,MAAM,QAAQ,MAAM;AACxC,QAAM,OAAO,MAAM,EAAE,GACf,aAAa,OAAO,MAAM,SAAS,GACnC,gBAAgB,iBAAiB,YAAY,EAAK,GAClD,QAAQ,gBAAgB,MAAM,MAAM;AAC1C,QAAI,QAAQ,GAAG,MAAM,GAAG,aAAa,GAAG,KAAK,EAAE;AAAA,EACjD;AACF;AAKO,SAAS,eACd,UACA,QACA,QACA,WACA,QACA,QACM;AACN,MAAM,MAAM,UAAU,cAAc,GAC9B,WAAW,UACX,gBAAgB,OAAO,2BAA2B,SAAS,QAAQ,KAAK,CAAC,GAIzE,kBAAkB,aAAa,SAAS,MAAM,SAAS,GAEvD,YAAY,iBAAiB,QAAQ,eAAe,GACpD,cAAc,eAAe,QAAQ,MAAM,GAC3C,gBAAgB,kBAAkB,cAAc,YAAO,aAGvD,QAAQ,OAAO,mBAAmB,SAAS,MAAM,KAAK;AAC5D,MAAI,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,IAAI,GAAG,QAAQ,MAAM,QAAQ,EAAE,EAAE;AAI9E,MAAM,iBAAiB,kBAAkB,KAAK;AAC9C,WAAW,SAAS;AAClB,QAAI,QAAQ,GAAG,aAAa,GAAG,cAAc,GAAG,KAAK,EAAE;AAIzD,MAAI,iBAAiB;AACnB,QAAM,cAAc,CAAC,GAAI,SAAS,KAAiB,EAAE,KAAK,OAAO,SAAS;AAC1E,uBAAmB,aAAa,aAAa,QAAQ,MAAM;AAAA,EAC7D;AACF;AAMO,SAAS,sBACd,QACK;AACL,MAAM,OAAY,CAAC;AACnB,WAAW,SAAS;AAClB,SAAK,KAAK,GAAG,MAAM,SAAS;AAE9B,SAAO,KAAK,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AACzD;AAOO,SAAS,uBACd,WACA,QACA,WACA,QACA,iBACA,QACM;AACN,WAAS,KAAK,GAAG,KAAK,UAAU,QAAQ,MAAM;AAC5C,QAAM,WAAW,UAAU,EAAE,GACvB,gBAAgB,OAAO,UAAU,SAAS;AAEhD,mBAAe,UAAU,QADV,kBAAkB,KAAQ,eACA,WAAW,QAAQ,MAAM;AAAA,EACpE;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
classifyPackageInput,
|
|
4
|
+
detectGitSource,
|
|
5
|
+
parseGitHubShorthand,
|
|
6
|
+
parseGitHubUrl
|
|
7
|
+
} from "./chunk-OUZRMGPV.js";
|
|
8
|
+
import {
|
|
9
|
+
detectPluginType
|
|
10
|
+
} from "./chunk-HYKYECAE.js";
|
|
11
|
+
import {
|
|
12
|
+
isValidPackageDirectory
|
|
13
|
+
} from "./chunk-GSWHZBT2.js";
|
|
14
|
+
import {
|
|
15
|
+
getPlatformRootFiles
|
|
16
|
+
} from "./chunk-N43IXOND.js";
|
|
17
|
+
import {
|
|
18
|
+
FILE_PATTERNS
|
|
19
|
+
} from "./chunk-IHVZ5AUJ.js";
|
|
20
|
+
import {
|
|
21
|
+
exists
|
|
22
|
+
} from "./chunk-S47F4OG4.js";
|
|
23
|
+
import {
|
|
24
|
+
ValidationError
|
|
25
|
+
} from "./chunk-ID4SVDQZ.js";
|
|
26
|
+
import {
|
|
27
|
+
logger
|
|
28
|
+
} from "./chunk-5EFWGD33.js";
|
|
29
|
+
|
|
30
|
+
// ../core/src/core/platform/platform-utils.ts
|
|
31
|
+
function getPlatformRootFiles2(cwd) {
|
|
32
|
+
let rootFiles = new Set(getPlatformRootFiles(cwd));
|
|
33
|
+
return rootFiles.add(FILE_PATTERNS.AGENTS_MD), rootFiles.add(FILE_PATTERNS.CLAUDE_MD), rootFiles.add(FILE_PATTERNS.GEMINI_MD), rootFiles.add(FILE_PATTERNS.QWEN_MD), rootFiles.add(FILE_PATTERNS.WARP_MD), rootFiles;
|
|
34
|
+
}
|
|
35
|
+
function isPlatformRootFile(fileName, cwd) {
|
|
36
|
+
return getPlatformRootFiles2(cwd).has(fileName);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// ../core/src/core/install/input-classifier-base.ts
|
|
40
|
+
import { resolve as resolve2, basename } from "path";
|
|
41
|
+
|
|
42
|
+
// ../core/src/utils/resource-arg-parser.ts
|
|
43
|
+
import { resolve, isAbsolute } from "path";
|
|
44
|
+
async function parseResourceArg(input, cwd = process.cwd()) {
|
|
45
|
+
if (!input || typeof input != "string")
|
|
46
|
+
throw new ValidationError("Resource argument cannot be empty");
|
|
47
|
+
if (input.startsWith("https://github.com/") || input.startsWith("http://github.com/"))
|
|
48
|
+
return parseGitHubUrlResource(input);
|
|
49
|
+
if (input.startsWith("gh@"))
|
|
50
|
+
return parseGitHubShorthandResource(input);
|
|
51
|
+
if (looksLikePath(input)) {
|
|
52
|
+
let resolved = isAbsolute(input) ? input : resolve(cwd, input);
|
|
53
|
+
if (await exists(resolved)) {
|
|
54
|
+
let stat = await import("fs/promises").then((m) => m.stat(resolved));
|
|
55
|
+
return {
|
|
56
|
+
type: "filepath",
|
|
57
|
+
absolutePath: resolved,
|
|
58
|
+
isDirectory: stat.isDirectory()
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
if (isUnambiguouslyPath(input))
|
|
62
|
+
throw new ValidationError(`Path not found: ${input}`);
|
|
63
|
+
}
|
|
64
|
+
return parseRegistryResource(input);
|
|
65
|
+
}
|
|
66
|
+
function parseGitHubUrlResource(input) {
|
|
67
|
+
let gitSpec = parseGitHubUrl(input);
|
|
68
|
+
if (!gitSpec)
|
|
69
|
+
throw new ValidationError(`Invalid GitHub URL: ${input}`);
|
|
70
|
+
let match = gitSpec.url.match(/github\.com[/:]([\w-]+)\/([\w-]+)(?:\.git)?$/);
|
|
71
|
+
if (!match)
|
|
72
|
+
throw new ValidationError(`Could not extract repository from URL: ${input}`);
|
|
73
|
+
let [, owner, repo] = match;
|
|
74
|
+
return logger.debug("Parsed GitHub URL resource", {
|
|
75
|
+
input,
|
|
76
|
+
repo: `${owner}/${repo}`,
|
|
77
|
+
ref: gitSpec.ref,
|
|
78
|
+
path: gitSpec.path
|
|
79
|
+
}), {
|
|
80
|
+
type: "github-url",
|
|
81
|
+
repo: `${owner}/${repo}`,
|
|
82
|
+
gitUrl: gitSpec.url,
|
|
83
|
+
ref: gitSpec.ref,
|
|
84
|
+
path: gitSpec.path
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function parseGitHubShorthandResource(input) {
|
|
88
|
+
let baseInput = input, version, segments = input.slice(3).split("/");
|
|
89
|
+
if (segments.length >= 2) {
|
|
90
|
+
let repoSegment = segments[1], atIndex = repoSegment.indexOf("@");
|
|
91
|
+
atIndex > 0 && (version = repoSegment.slice(atIndex + 1), segments[1] = repoSegment.slice(0, atIndex), baseInput = "gh@" + segments.join("/"));
|
|
92
|
+
}
|
|
93
|
+
let gitSpec = parseGitHubShorthand(baseInput);
|
|
94
|
+
if (!gitSpec)
|
|
95
|
+
throw new ValidationError(`Invalid GitHub shorthand: ${input}`);
|
|
96
|
+
let match = gitSpec.url.match(/github\.com[/:]([\w-]+)\/([\w-]+)(?:\.git)?$/);
|
|
97
|
+
if (!match)
|
|
98
|
+
throw new ValidationError(`Could not extract repository from shorthand: ${input}`);
|
|
99
|
+
let [, owner, repo] = match;
|
|
100
|
+
return logger.debug("Parsed GitHub shorthand resource", {
|
|
101
|
+
input,
|
|
102
|
+
repo: `${owner}/${repo}`,
|
|
103
|
+
ref: version || gitSpec.ref,
|
|
104
|
+
path: gitSpec.path
|
|
105
|
+
}), {
|
|
106
|
+
type: "github-shorthand",
|
|
107
|
+
repo: `${owner}/${repo}`,
|
|
108
|
+
gitUrl: gitSpec.url,
|
|
109
|
+
ref: version || gitSpec.ref,
|
|
110
|
+
path: gitSpec.path
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function parseRegistryResource(input) {
|
|
114
|
+
let name, version, path, atIndex = input.lastIndexOf("@");
|
|
115
|
+
if (atIndex > 0) {
|
|
116
|
+
let beforeAt = input.slice(0, atIndex);
|
|
117
|
+
if (version = input.slice(atIndex + 1), version.includes("/"))
|
|
118
|
+
throw new ValidationError(
|
|
119
|
+
`Version cannot be specified on sub-paths.
|
|
120
|
+
|
|
121
|
+
Got: ${input}
|
|
122
|
+
|
|
123
|
+
Valid format: package[@version][/path]
|
|
124
|
+
Example: my-package@1.0.0/agents/designer`
|
|
125
|
+
);
|
|
126
|
+
let segments = beforeAt.split("/");
|
|
127
|
+
if (beforeAt.startsWith("@")) {
|
|
128
|
+
if (segments.length < 2)
|
|
129
|
+
throw new ValidationError(`Invalid scoped package name: ${input}`);
|
|
130
|
+
name = segments.slice(0, 2).join("/"), path = segments.length > 2 ? segments.slice(2).join("/") : void 0;
|
|
131
|
+
} else
|
|
132
|
+
name = segments[0], path = segments.length > 1 ? segments.slice(1).join("/") : void 0;
|
|
133
|
+
} else {
|
|
134
|
+
let segments = input.split("/");
|
|
135
|
+
if (input.startsWith("@")) {
|
|
136
|
+
if (segments.length < 2)
|
|
137
|
+
throw new ValidationError(`Invalid scoped package name: ${input}`);
|
|
138
|
+
name = segments.slice(0, 2).join("/"), path = segments.length > 2 ? segments.slice(2).join("/") : void 0;
|
|
139
|
+
} else
|
|
140
|
+
name = segments[0], path = segments.length > 1 ? segments.slice(1).join("/") : void 0;
|
|
141
|
+
}
|
|
142
|
+
return logger.debug("Parsed registry resource", {
|
|
143
|
+
input,
|
|
144
|
+
name,
|
|
145
|
+
version,
|
|
146
|
+
path
|
|
147
|
+
}), {
|
|
148
|
+
type: "registry",
|
|
149
|
+
name,
|
|
150
|
+
version,
|
|
151
|
+
path
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function looksLikePath(input) {
|
|
155
|
+
return input.startsWith("/") || input.startsWith("./") || input.startsWith("../") || input.startsWith("~") || input === "." || // Dot-directory paths: .opencode/, .cursor/, .claude/, etc.
|
|
156
|
+
input.startsWith(".") && input.length > 1 && input.includes("/") || isAbsolute(input) && !input.includes("@");
|
|
157
|
+
}
|
|
158
|
+
function isUnambiguouslyPath(input) {
|
|
159
|
+
return input.startsWith("/") || input.startsWith("./") || input.startsWith("../") || input.startsWith("~") || input.startsWith(".") && input.length > 1 && input.includes("/");
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// ../core/src/core/install/input-classifier-base.ts
|
|
163
|
+
async function classifyInputBase(input, cwd, options) {
|
|
164
|
+
if (!input)
|
|
165
|
+
return { type: "bulk" };
|
|
166
|
+
if (!options?.skipGit) {
|
|
167
|
+
let gitSpec = detectGitSource(input);
|
|
168
|
+
if (gitSpec && !isGitHubInput(input))
|
|
169
|
+
return {
|
|
170
|
+
type: "git",
|
|
171
|
+
gitUrl: gitSpec.url,
|
|
172
|
+
gitRef: gitSpec.ref,
|
|
173
|
+
gitPath: gitSpec.path,
|
|
174
|
+
derivedName: deriveNameFromGitUrl(gitSpec.url)
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
if (input.endsWith(".tgz") || input.endsWith(".tar.gz")) {
|
|
178
|
+
let resolved = resolve2(cwd, input);
|
|
179
|
+
if (await exists(resolved))
|
|
180
|
+
return {
|
|
181
|
+
type: "local-path",
|
|
182
|
+
absolutePath: resolved,
|
|
183
|
+
isDirectory: !1
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
let spec = await parseResourceArg(input, cwd);
|
|
188
|
+
return await convertResourceSpec(spec, cwd, input);
|
|
189
|
+
} catch {
|
|
190
|
+
}
|
|
191
|
+
if (!options?.skipLegacy) {
|
|
192
|
+
let legacy = await classifyPackageInput(input, cwd);
|
|
193
|
+
return convertLegacyClassification(legacy);
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
type: "registry",
|
|
197
|
+
packageName: input
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
async function convertResourceSpec(spec, cwd, originalInput) {
|
|
201
|
+
switch (spec.type) {
|
|
202
|
+
case "github-url":
|
|
203
|
+
case "github-shorthand":
|
|
204
|
+
return {
|
|
205
|
+
type: "git",
|
|
206
|
+
gitUrl: spec.gitUrl,
|
|
207
|
+
gitRef: spec.ref,
|
|
208
|
+
gitPath: spec.path,
|
|
209
|
+
derivedName: originalInput ?? spec.repo
|
|
210
|
+
};
|
|
211
|
+
case "filepath": {
|
|
212
|
+
let isValid = await isValidPackageDirectory(spec.absolutePath), pluginResult = await detectPluginType(spec.absolutePath), packageName;
|
|
213
|
+
if (isValid || pluginResult.isPlugin)
|
|
214
|
+
try {
|
|
215
|
+
let { parsePackageYml } = await import("./package-yml-QWZIJDYU.js"), { join } = await import("path"), manifestPath = join(spec.absolutePath, "openpackage.yml");
|
|
216
|
+
await exists(manifestPath) && (packageName = (await parsePackageYml(manifestPath)).name ?? basename(spec.absolutePath));
|
|
217
|
+
} catch {
|
|
218
|
+
packageName = basename(spec.absolutePath);
|
|
219
|
+
}
|
|
220
|
+
return {
|
|
221
|
+
type: "local-path",
|
|
222
|
+
absolutePath: spec.absolutePath,
|
|
223
|
+
isDirectory: spec.isDirectory ?? !0,
|
|
224
|
+
packageName,
|
|
225
|
+
isValidPackage: isValid || pluginResult.isPlugin
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
case "registry":
|
|
229
|
+
return {
|
|
230
|
+
type: "registry",
|
|
231
|
+
packageName: spec.name,
|
|
232
|
+
version: spec.version,
|
|
233
|
+
registryPath: spec.path
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
function convertLegacyClassification(legacy) {
|
|
238
|
+
switch (legacy.type) {
|
|
239
|
+
case "git":
|
|
240
|
+
return {
|
|
241
|
+
type: "git",
|
|
242
|
+
gitUrl: legacy.gitUrl,
|
|
243
|
+
gitRef: legacy.gitRef,
|
|
244
|
+
gitPath: legacy.gitPath,
|
|
245
|
+
derivedName: deriveNameFromGitUrl(legacy.gitUrl)
|
|
246
|
+
};
|
|
247
|
+
case "directory":
|
|
248
|
+
case "tarball":
|
|
249
|
+
return {
|
|
250
|
+
type: "local-path",
|
|
251
|
+
absolutePath: legacy.resolvedPath,
|
|
252
|
+
isDirectory: legacy.type === "directory"
|
|
253
|
+
};
|
|
254
|
+
case "registry":
|
|
255
|
+
return {
|
|
256
|
+
type: "registry",
|
|
257
|
+
packageName: legacy.name,
|
|
258
|
+
version: legacy.version,
|
|
259
|
+
registryPath: legacy.registryPath
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
function isGitHubInput(input) {
|
|
264
|
+
return input.startsWith("gh@") || input.startsWith("https://github.com/") || input.startsWith("http://github.com/");
|
|
265
|
+
}
|
|
266
|
+
function deriveNameFromGitUrl(url) {
|
|
267
|
+
return url.match(/\/([^/]+?)(?:\.git)?$/)?.[1] ?? url;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export {
|
|
271
|
+
isPlatformRootFile,
|
|
272
|
+
classifyInputBase
|
|
273
|
+
};
|
|
274
|
+
//# sourceMappingURL=chunk-AR7GJCG6.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../core/src/core/platform/platform-utils.ts", "../../core/src/core/install/input-classifier-base.ts", "../../core/src/utils/resource-arg-parser.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Platform Utilities Module\n * Utility functions for platform management, detection, and file operations\n */\n\nimport { join } from 'path';\nimport { getPathLeaf } from '../../utils/path-normalization.js';\nimport { FILE_PATTERNS } from '../../constants/index.js';\nimport type { Platform, PlatformDetectionResult } from '../../types/platform.js';\nimport {\n getAllPlatforms,\n getPlatformRootFiles as getPlatformRootFileNames,\n getPlatformDefinition,\n getPlatformDirLookup,\n detectAllPlatforms\n} from '../platforms.js';\n\n/* Removed unused detectPlatformsWithDetails - use detectAllPlatforms directly for details */\n\n/**\n * Extract platform name from source directory path\n * Uses platform definitions for scalable platform detection\n * @param cwd - Optional cwd for local platform config overrides\n */\nexport function getPlatformNameFromSource(sourceDir: string, cwd?: string): string {\n // Quick lookup via dir map first\n const dirLookup = getPlatformDirLookup(cwd);\n const fromDir = dirLookup[sourceDir];\n if (fromDir) return fromDir;\n\n // Full scan for flow-based matches\n for (const platform of getAllPlatforms({ includeDisabled: true }, cwd)) {\n const definition = getPlatformDefinition(platform, cwd);\n \n // Check if sourceDir matches any export flow 'to' pattern directory (package \u2192 workspace)\n if (definition.export && definition.export.length > 0) {\n for (const flow of definition.export) {\n const toPattern = typeof flow.to === 'string' ? flow.to : Object.keys(flow.to)[0];\n if (toPattern) {\n // Extract directory from 'to' pattern\n const parts = toPattern.split('/');\n const subdirPath = parts.slice(0, -1).join('/');\n \n if (sourceDir.includes(subdirPath)) {\n return platform;\n }\n }\n }\n }\n }\n\n // Fallback: extract from path\n return getPathLeaf(sourceDir) || 'unknown';\n}\n\n/**\n * Get all platform directory names\n * Returns an array of all supported platform directory names\n * @param cwd - Optional cwd for local overrides\n */\nexport function getAllPlatformDirs(cwd?: string): string[] {\n return Object.keys(getPlatformDirLookup(cwd));\n}\n\n/**\n * Get all platform root files as a Set, including AGENTS.md universal file.\n * @param cwd - Optional cwd for local overrides\n */\nexport function getPlatformRootFiles(cwd?: string): Set<string> {\n const rootFiles = new Set(getPlatformRootFileNames(cwd)); // from platforms.ts, excludes AGENTS.md\n rootFiles.add(FILE_PATTERNS.AGENTS_MD);\n rootFiles.add(FILE_PATTERNS.CLAUDE_MD);\n rootFiles.add(FILE_PATTERNS.GEMINI_MD);\n rootFiles.add(FILE_PATTERNS.QWEN_MD);\n rootFiles.add(FILE_PATTERNS.WARP_MD);\n return rootFiles;\n}\n\nexport function isPlatformRootFile(fileName: string, cwd?: string): boolean {\n return getPlatformRootFiles(cwd).has(fileName);\n}\n\n\n\n", "import { resolve, basename } from 'path';\n\nimport { parseResourceArg, type ResourceSpec } from '../../utils/resource-arg-parser.js';\nimport { classifyPackageInput } from './package-input.js';\nimport { detectGitSource } from '../../utils/git-url-detection.js';\nimport { exists } from '../../utils/fs.js';\nimport { isValidPackageDirectory } from '../package-context.js';\nimport { detectPluginType } from './plugin-detector.js';\n\n/**\n * Base input classification result - represents parsed source information\n * WITHOUT command-specific context or features.\n */\nexport type BaseInputClassification =\n | GitInputSpec\n | RegistryInputSpec\n | LocalPathInputSpec\n | BulkInputSpec;\n\nexport interface GitInputSpec {\n type: 'git';\n gitUrl: string;\n gitRef?: string;\n gitPath?: string;\n /** Derived package name (from repo) */\n derivedName?: string;\n}\n\nexport interface RegistryInputSpec {\n type: 'registry';\n packageName: string;\n version?: string;\n registryPath?: string;\n}\n\nexport interface LocalPathInputSpec {\n type: 'local-path';\n absolutePath: string;\n isDirectory: boolean;\n /** Package name from manifest (if available) */\n packageName?: string;\n /** Whether it's a valid package or plugin */\n isValidPackage?: boolean;\n}\n\nexport interface BulkInputSpec {\n type: 'bulk';\n}\n\nexport interface BaseClassifierOptions {\n /** Skip git detection (for performance) */\n skipGit?: boolean;\n /** Skip legacy classifier fallback */\n skipLegacy?: boolean;\n}\n\n/**\n * Base classifier - Pure parsing logic without command-specific context.\n * \n * Extracts common input classification logic shared by install and add commands.\n * Parses user input to determine source type (git, registry, local path, bulk).\n * \n * @param input - User input string (undefined for bulk)\n * @param cwd - Current working directory\n * @param options - Optional parsing options\n * @returns Base classification with source type and metadata\n * \n * @example\n * // Git URL\n * const result = await classifyInputBase('gh@owner/repo', '/path/to/workspace');\n * // => { type: 'git', gitUrl: 'https://github.com/owner/repo', derivedName: 'repo' }\n * \n * @example\n * // Registry package\n * const result = await classifyInputBase('@scope/package@1.0.0', '/path/to/workspace');\n * // => { type: 'registry', packageName: '@scope/package', version: '1.0.0' }\n * \n * @example\n * // Local path\n * const result = await classifyInputBase('./my-package', '/path/to/workspace');\n * // => { type: 'local-path', absolutePath: '/path/to/workspace/my-package', isDirectory: true }\n */\nexport async function classifyInputBase(\n input: string | undefined,\n cwd: string,\n options?: BaseClassifierOptions\n): Promise<BaseInputClassification> {\n // No input = bulk\n if (!input) {\n return { type: 'bulk' };\n }\n\n // 1. Try git detection first (non-GitHub URLs)\n if (!options?.skipGit) {\n const gitSpec = detectGitSource(input);\n if (gitSpec && !isGitHubInput(input)) {\n return {\n type: 'git',\n gitUrl: gitSpec.url,\n gitRef: gitSpec.ref,\n gitPath: gitSpec.path,\n derivedName: deriveNameFromGitUrl(gitSpec.url)\n };\n }\n }\n\n // 2. Try tarball detection\n if (input.endsWith('.tgz') || input.endsWith('.tar.gz')) {\n const resolved = resolve(cwd, input);\n if (await exists(resolved)) {\n return {\n type: 'local-path',\n absolutePath: resolved,\n isDirectory: false\n };\n }\n }\n\n // 3. Try parseResourceArg (GitHub URLs, gh@, registry, paths)\n try {\n const spec = await parseResourceArg(input, cwd);\n return await convertResourceSpec(spec, cwd, input);\n } catch (error) {\n // Fall through to legacy\n }\n\n // 4. Fallback to legacy classifier\n if (!options?.skipLegacy) {\n const legacy = await classifyPackageInput(input, cwd);\n return convertLegacyClassification(legacy);\n }\n\n // Default to registry\n return {\n type: 'registry',\n packageName: input\n };\n}\n\n/**\n * Convert ResourceSpec to BaseInputClassification\n */\nasync function convertResourceSpec(\n spec: ResourceSpec,\n cwd: string,\n originalInput?: string\n): Promise<BaseInputClassification> {\n switch (spec.type) {\n case 'github-url':\n case 'github-shorthand':\n return {\n type: 'git',\n gitUrl: spec.gitUrl!,\n gitRef: spec.ref,\n gitPath: spec.path,\n derivedName: originalInput ?? spec.repo\n };\n\n case 'filepath': {\n // Check if it's a valid package\n const isValid = await isValidPackageDirectory(spec.absolutePath!);\n const pluginResult = await detectPluginType(spec.absolutePath!);\n \n let packageName: string | undefined;\n if (isValid || pluginResult.isPlugin) {\n try {\n // Try to load package name from manifest\n const { parsePackageYml } = await import('../../utils/package-yml.js');\n const { join } = await import('path');\n const manifestPath = join(spec.absolutePath!, 'openpackage.yml');\n if (await exists(manifestPath)) {\n const config = await parsePackageYml(manifestPath);\n packageName = config.name ?? basename(spec.absolutePath!);\n }\n } catch {\n packageName = basename(spec.absolutePath!);\n }\n }\n\n return {\n type: 'local-path',\n absolutePath: spec.absolutePath!,\n isDirectory: spec.isDirectory ?? true,\n packageName,\n isValidPackage: isValid || pluginResult.isPlugin\n };\n }\n\n case 'registry':\n return {\n type: 'registry',\n packageName: spec.name!,\n version: spec.version,\n registryPath: spec.path\n };\n }\n}\n\n/**\n * Convert legacy PackageInputClassification to BaseInputClassification\n */\nfunction convertLegacyClassification(\n legacy: Awaited<ReturnType<typeof classifyPackageInput>>\n): BaseInputClassification {\n switch (legacy.type) {\n case 'git':\n return {\n type: 'git',\n gitUrl: legacy.gitUrl!,\n gitRef: legacy.gitRef,\n gitPath: legacy.gitPath,\n derivedName: deriveNameFromGitUrl(legacy.gitUrl!)\n };\n\n case 'directory':\n case 'tarball':\n return {\n type: 'local-path',\n absolutePath: legacy.resolvedPath!,\n isDirectory: legacy.type === 'directory'\n };\n\n case 'registry':\n return {\n type: 'registry',\n packageName: legacy.name!,\n version: legacy.version,\n registryPath: legacy.registryPath\n };\n }\n}\n\n/** Helper: Check if input is GitHub-related */\nfunction isGitHubInput(input: string): boolean {\n return (\n input.startsWith('gh@') ||\n input.startsWith('https://github.com/') ||\n input.startsWith('http://github.com/')\n );\n}\n\n/** Helper: Derive package name from git URL */\nfunction deriveNameFromGitUrl(url: string): string {\n const match = url.match(/\\/([^/]+?)(?:\\.git)?$/);\n return match?.[1] ?? url;\n}\n", "/**\n * Unified resource argument parsing for the install command.\n * \n * Parses resource specifications in priority order:\n * 1. URL (GitHub URLs)\n * 2. Resource Name (with or without `@` symbol)\n * 3. Filepath (absolute or relative)\n * \n * Supports version specifications only at repo/package level, not on sub-paths.\n */\n\nimport { resolve, isAbsolute } from 'path';\nimport { exists } from './fs.js';\nimport { parseGitHubUrl, parseGitHubShorthand, isGitUrl } from './git-url-detection.js';\nimport { ValidationError } from './errors.js';\nimport { logger } from './logger.js';\n\n/**\n * Resource specification interface\n */\nexport interface ResourceSpec {\n /** How the resource was specified */\n type: 'github-url' | 'github-shorthand' | 'registry' | 'filepath';\n \n /** Repository identifier (for git sources) */\n repo?: string;\n \n /** Git URL (for git sources) */\n gitUrl?: string;\n \n /** Git ref/version (branch, tag, commit) */\n ref?: string;\n \n /** Path within repo/package to the resource */\n path?: string;\n \n /** Package name (for registry sources) */\n name?: string;\n \n /** Version constraint (for registry sources) */\n version?: string;\n \n /** Absolute path (for filepath sources) */\n absolutePath?: string;\n \n /** Whether path points to a directory */\n isDirectory?: boolean;\n}\n\n/**\n * Parse a resource argument string into a ResourceSpec.\n * \n * Resolution order:\n * 1. GitHub URL \u2192 Extract repo + path\n * 2. GitHub Shorthand (gh@) \u2192 Parse segments\n * 3. Filepath \u2192 Resolve and validate\n * 4. Registry Name \u2192 Parse name + version\n * \n * @param input - Raw user input\n * @param cwd - Current working directory for resolving relative paths\n * @returns Parsed ResourceSpec\n */\nexport async function parseResourceArg(\n input: string,\n cwd: string = process.cwd()\n): Promise<ResourceSpec> {\n if (!input || typeof input !== 'string') {\n throw new ValidationError('Resource argument cannot be empty');\n }\n\n // 1. GitHub URL\n if (input.startsWith('https://github.com/') || input.startsWith('http://github.com/')) {\n return parseGitHubUrlResource(input);\n }\n\n // 2. GitHub shorthand\n if (input.startsWith('gh@')) {\n return parseGitHubShorthandResource(input);\n }\n\n // 3. Filepath detection (before registry to avoid false positives)\n if (looksLikePath(input)) {\n const resolved = isAbsolute(input) ? input : resolve(cwd, input);\n \n if (await exists(resolved)) {\n const stat = await import('fs/promises').then(m => m.stat(resolved));\n return {\n type: 'filepath',\n absolutePath: resolved,\n isDirectory: stat.isDirectory()\n };\n }\n \n // Path syntax but doesn't exist - could still be registry\n // Only error if it's unambiguously a path\n if (isUnambiguouslyPath(input)) {\n throw new ValidationError(`Path not found: ${input}`);\n }\n }\n\n // 4. Registry resource name\n return parseRegistryResource(input);\n}\n\n/**\n * Parse a GitHub URL into a ResourceSpec.\n */\nfunction parseGitHubUrlResource(input: string): ResourceSpec {\n const gitSpec = parseGitHubUrl(input);\n \n if (!gitSpec) {\n throw new ValidationError(`Invalid GitHub URL: ${input}`);\n }\n\n // Extract owner/repo from the git URL\n const match = gitSpec.url.match(/github\\.com[/:]([\\w-]+)\\/([\\w-]+)(?:\\.git)?$/);\n if (!match) {\n throw new ValidationError(`Could not extract repository from URL: ${input}`);\n }\n\n const [, owner, repo] = match;\n\n logger.debug('Parsed GitHub URL resource', {\n input,\n repo: `${owner}/${repo}`,\n ref: gitSpec.ref,\n path: gitSpec.path\n });\n\n return {\n type: 'github-url',\n repo: `${owner}/${repo}`,\n gitUrl: gitSpec.url,\n ref: gitSpec.ref,\n path: gitSpec.path\n };\n}\n\n/**\n * Parse GitHub shorthand (gh@owner/repo[/path][@version]) into a ResourceSpec.\n */\nfunction parseGitHubShorthandResource(input: string): ResourceSpec {\n // Check for version at the end first\n let baseInput = input;\n let version: string | undefined;\n \n // Look for @version at the end (after repo identifier)\n // Format: gh@owner/repo[@version][/path]\n // We need to be careful: gh@owner/repo@v1.0/path vs gh@owner/repo/path\n const segments = input.slice(3).split('/'); // Remove 'gh@'\n \n if (segments.length >= 2) {\n // Check if second segment has @version\n const repoSegment = segments[1];\n const atIndex = repoSegment.indexOf('@');\n \n if (atIndex > 0) {\n version = repoSegment.slice(atIndex + 1);\n segments[1] = repoSegment.slice(0, atIndex);\n baseInput = 'gh@' + segments.join('/');\n }\n }\n\n const gitSpec = parseGitHubShorthand(baseInput);\n \n if (!gitSpec) {\n throw new ValidationError(`Invalid GitHub shorthand: ${input}`);\n }\n\n // Extract owner/repo from the git URL\n const match = gitSpec.url.match(/github\\.com[/:]([\\w-]+)\\/([\\w-]+)(?:\\.git)?$/);\n if (!match) {\n throw new ValidationError(`Could not extract repository from shorthand: ${input}`);\n }\n\n const [, owner, repo] = match;\n\n logger.debug('Parsed GitHub shorthand resource', {\n input,\n repo: `${owner}/${repo}`,\n ref: version || gitSpec.ref,\n path: gitSpec.path\n });\n\n return {\n type: 'github-shorthand',\n repo: `${owner}/${repo}`,\n gitUrl: gitSpec.url,\n ref: version || gitSpec.ref,\n path: gitSpec.path\n };\n}\n\n/**\n * Parse a registry/OpenPackage resource name.\n * \n * Format: [@scope/]name[/path][@version]\n */\nfunction parseRegistryResource(input: string): ResourceSpec {\n // Parse name[@version] and optional path\n // Examples:\n // @hyericlee/essentials\n // @hyericlee/essentials/agents/designer\n // my-package@1.0.0\n // hyericlee/essentials (could be path or registry)\n \n let name: string;\n let version: string | undefined;\n let path: string | undefined;\n \n // Check for version specification\n const atIndex = input.lastIndexOf('@');\n \n if (atIndex > 0) {\n // Has version\n const beforeAt = input.slice(0, atIndex);\n version = input.slice(atIndex + 1);\n \n // Check if version contains path separator (invalid)\n if (version.includes('/')) {\n throw new ValidationError(\n `Version cannot be specified on sub-paths.\\n\\n` +\n `Got: ${input}\\n\\n` +\n `Valid format: package[@version][/path]\\n` +\n `Example: my-package@1.0.0/agents/designer`\n );\n }\n \n // Parse name and path from beforeAt\n const segments = beforeAt.split('/');\n if (beforeAt.startsWith('@')) {\n // Scoped package: @scope/name[/path/...]\n if (segments.length < 2) {\n throw new ValidationError(`Invalid scoped package name: ${input}`);\n }\n name = segments.slice(0, 2).join('/');\n path = segments.length > 2 ? segments.slice(2).join('/') : undefined;\n } else {\n // Unscoped package: name[/path/...]\n name = segments[0];\n path = segments.length > 1 ? segments.slice(1).join('/') : undefined;\n }\n } else {\n // No version\n const segments = input.split('/');\n if (input.startsWith('@')) {\n // Scoped package\n if (segments.length < 2) {\n throw new ValidationError(`Invalid scoped package name: ${input}`);\n }\n name = segments.slice(0, 2).join('/');\n path = segments.length > 2 ? segments.slice(2).join('/') : undefined;\n } else {\n // Unscoped package\n name = segments[0];\n path = segments.length > 1 ? segments.slice(1).join('/') : undefined;\n }\n }\n\n logger.debug('Parsed registry resource', {\n input,\n name,\n version,\n path\n });\n\n return {\n type: 'registry',\n name,\n version,\n path\n };\n}\n\n/**\n * Check if input looks like a filesystem path.\n */\nfunction looksLikePath(input: string): boolean {\n return (\n input.startsWith('/') ||\n input.startsWith('./') ||\n input.startsWith('../') ||\n input.startsWith('~') ||\n input === '.' ||\n // Dot-directory paths: .opencode/, .cursor/, .claude/, etc.\n (input.startsWith('.') && input.length > 1 && input.includes('/')) ||\n (isAbsolute(input) && !input.includes('@'))\n );\n}\n\n/**\n * Check if input is unambiguously a path (not a registry name).\n */\nfunction isUnambiguouslyPath(input: string): boolean {\n return (\n input.startsWith('/') ||\n input.startsWith('./') ||\n input.startsWith('../') ||\n input.startsWith('~') ||\n (input.startsWith('.') && input.length > 1 && input.includes('/'))\n );\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoEO,SAASA,sBAAqB,KAA2B;AAC9D,MAAM,YAAY,IAAI,IAAI,qBAAyB,GAAG,CAAC;AACvD,mBAAU,IAAI,cAAc,SAAS,GACrC,UAAU,IAAI,cAAc,SAAS,GACrC,UAAU,IAAI,cAAc,SAAS,GACrC,UAAU,IAAI,cAAc,OAAO,GACnC,UAAU,IAAI,cAAc,OAAO,GAC5B;AACT;AAEO,SAAS,mBAAmB,UAAkB,KAAuB;AAC1E,SAAOA,sBAAqB,GAAG,EAAE,IAAI,QAAQ;AAC/C;;;AChFA,SAAS,WAAAC,UAAS,gBAAgB;;;ACWlC,SAAS,SAAS,kBAAkB;AAmDpC,eAAsB,iBACpB,OACA,MAAc,QAAQ,IAAI,GACH;AACvB,MAAI,CAAC,SAAS,OAAO,SAAU;AAC7B,UAAM,IAAI,gBAAgB,mCAAmC;AAI/D,MAAI,MAAM,WAAW,qBAAqB,KAAK,MAAM,WAAW,oBAAoB;AAClF,WAAO,uBAAuB,KAAK;AAIrC,MAAI,MAAM,WAAW,KAAK;AACxB,WAAO,6BAA6B,KAAK;AAI3C,MAAI,cAAc,KAAK,GAAG;AACxB,QAAM,WAAW,WAAW,KAAK,IAAI,QAAQ,QAAQ,KAAK,KAAK;AAE/D,QAAI,MAAM,OAAO,QAAQ,GAAG;AAC1B,UAAM,OAAO,MAAM,OAAO,aAAa,EAAE,KAAK,OAAK,EAAE,KAAK,QAAQ,CAAC;AACnE,aAAO;AAAA,QACL,MAAM;AAAA,QACN,cAAc;AAAA,QACd,aAAa,KAAK,YAAY;AAAA,MAChC;AAAA,IACF;AAIA,QAAI,oBAAoB,KAAK;AAC3B,YAAM,IAAI,gBAAgB,mBAAmB,KAAK,EAAE;AAAA,EAExD;AAGA,SAAO,sBAAsB,KAAK;AACpC;AAKA,SAAS,uBAAuB,OAA6B;AAC3D,MAAM,UAAU,eAAe,KAAK;AAEpC,MAAI,CAAC;AACH,UAAM,IAAI,gBAAgB,uBAAuB,KAAK,EAAE;AAI1D,MAAM,QAAQ,QAAQ,IAAI,MAAM,8CAA8C;AAC9E,MAAI,CAAC;AACH,UAAM,IAAI,gBAAgB,0CAA0C,KAAK,EAAE;AAG7E,MAAM,CAAC,EAAE,OAAO,IAAI,IAAI;AAExB,gBAAO,MAAM,8BAA8B;AAAA,IACzC;AAAA,IACA,MAAM,GAAG,KAAK,IAAI,IAAI;AAAA,IACtB,KAAK,QAAQ;AAAA,IACb,MAAM,QAAQ;AAAA,EAChB,CAAC,GAEM;AAAA,IACL,MAAM;AAAA,IACN,MAAM,GAAG,KAAK,IAAI,IAAI;AAAA,IACtB,QAAQ,QAAQ;AAAA,IAChB,KAAK,QAAQ;AAAA,IACb,MAAM,QAAQ;AAAA,EAChB;AACF;AAKA,SAAS,6BAA6B,OAA6B;AAEjE,MAAI,YAAY,OACZ,SAKE,WAAW,MAAM,MAAM,CAAC,EAAE,MAAM,GAAG;AAEzC,MAAI,SAAS,UAAU,GAAG;AAExB,QAAM,cAAc,SAAS,CAAC,GACxB,UAAU,YAAY,QAAQ,GAAG;AAEvC,IAAI,UAAU,MACZ,UAAU,YAAY,MAAM,UAAU,CAAC,GACvC,SAAS,CAAC,IAAI,YAAY,MAAM,GAAG,OAAO,GAC1C,YAAY,QAAQ,SAAS,KAAK,GAAG;AAAA,EAEzC;AAEA,MAAM,UAAU,qBAAqB,SAAS;AAE9C,MAAI,CAAC;AACH,UAAM,IAAI,gBAAgB,6BAA6B,KAAK,EAAE;AAIhE,MAAM,QAAQ,QAAQ,IAAI,MAAM,8CAA8C;AAC9E,MAAI,CAAC;AACH,UAAM,IAAI,gBAAgB,gDAAgD,KAAK,EAAE;AAGnF,MAAM,CAAC,EAAE,OAAO,IAAI,IAAI;AAExB,gBAAO,MAAM,oCAAoC;AAAA,IAC/C;AAAA,IACA,MAAM,GAAG,KAAK,IAAI,IAAI;AAAA,IACtB,KAAK,WAAW,QAAQ;AAAA,IACxB,MAAM,QAAQ;AAAA,EAChB,CAAC,GAEM;AAAA,IACL,MAAM;AAAA,IACN,MAAM,GAAG,KAAK,IAAI,IAAI;AAAA,IACtB,QAAQ,QAAQ;AAAA,IAChB,KAAK,WAAW,QAAQ;AAAA,IACxB,MAAM,QAAQ;AAAA,EAChB;AACF;AAOA,SAAS,sBAAsB,OAA6B;AAQ1D,MAAI,MACA,SACA,MAGE,UAAU,MAAM,YAAY,GAAG;AAErC,MAAI,UAAU,GAAG;AAEf,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO;AAIvC,QAHA,UAAU,MAAM,MAAM,UAAU,CAAC,GAG7B,QAAQ,SAAS,GAAG;AACtB,YAAM,IAAI;AAAA,QACR;AAAA;AAAA,OACQ,KAAK;AAAA;AAAA;AAAA;AAAA,MAGf;AAIF,QAAM,WAAW,SAAS,MAAM,GAAG;AACnC,QAAI,SAAS,WAAW,GAAG,GAAG;AAE5B,UAAI,SAAS,SAAS;AACpB,cAAM,IAAI,gBAAgB,gCAAgC,KAAK,EAAE;AAEnE,aAAO,SAAS,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,GACpC,OAAO,SAAS,SAAS,IAAI,SAAS,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI;AAAA,IAC7D;AAEE,aAAO,SAAS,CAAC,GACjB,OAAO,SAAS,SAAS,IAAI,SAAS,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI;AAAA,EAE/D,OAAO;AAEL,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,QAAI,MAAM,WAAW,GAAG,GAAG;AAEzB,UAAI,SAAS,SAAS;AACpB,cAAM,IAAI,gBAAgB,gCAAgC,KAAK,EAAE;AAEnE,aAAO,SAAS,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,GACpC,OAAO,SAAS,SAAS,IAAI,SAAS,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI;AAAA,IAC7D;AAEE,aAAO,SAAS,CAAC,GACjB,OAAO,SAAS,SAAS,IAAI,SAAS,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI;AAAA,EAE/D;AAEA,gBAAO,MAAM,4BAA4B;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,GAEM;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,SAAS,cAAc,OAAwB;AAC7C,SACE,MAAM,WAAW,GAAG,KACpB,MAAM,WAAW,IAAI,KACrB,MAAM,WAAW,KAAK,KACtB,MAAM,WAAW,GAAG,KACpB,UAAU;AAAA,EAET,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,KAAK,MAAM,SAAS,GAAG,KAC/D,WAAW,KAAK,KAAK,CAAC,MAAM,SAAS,GAAG;AAE7C;AAKA,SAAS,oBAAoB,OAAwB;AACnD,SACE,MAAM,WAAW,GAAG,KACpB,MAAM,WAAW,IAAI,KACrB,MAAM,WAAW,KAAK,KACtB,MAAM,WAAW,GAAG,KACnB,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,KAAK,MAAM,SAAS,GAAG;AAEpE;;;AD3NA,eAAsB,kBACpB,OACA,KACA,SACkC;AAElC,MAAI,CAAC;AACH,WAAO,EAAE,MAAM,OAAO;AAIxB,MAAI,CAAC,SAAS,SAAS;AACrB,QAAM,UAAU,gBAAgB,KAAK;AACrC,QAAI,WAAW,CAAC,cAAc,KAAK;AACjC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,QAAQ;AAAA,QAChB,QAAQ,QAAQ;AAAA,QAChB,SAAS,QAAQ;AAAA,QACjB,aAAa,qBAAqB,QAAQ,GAAG;AAAA,MAC/C;AAAA,EAEJ;AAGA,MAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,SAAS,GAAG;AACvD,QAAM,WAAWC,SAAQ,KAAK,KAAK;AACnC,QAAI,MAAM,OAAO,QAAQ;AACvB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,cAAc;AAAA,QACd,aAAa;AAAA,MACf;AAAA,EAEJ;AAGA,MAAI;AACF,QAAM,OAAO,MAAM,iBAAiB,OAAO,GAAG;AAC9C,WAAO,MAAM,oBAAoB,MAAM,KAAK,KAAK;AAAA,EACnD,QAAgB;AAAA,EAEhB;AAGA,MAAI,CAAC,SAAS,YAAY;AACxB,QAAM,SAAS,MAAM,qBAAqB,OAAO,GAAG;AACpD,WAAO,4BAA4B,MAAM;AAAA,EAC3C;AAGA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AACF;AAKA,eAAe,oBACb,MACA,KACA,eACkC;AAClC,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,aAAa,iBAAiB,KAAK;AAAA,MACrC;AAAA,IAEF,KAAK,YAAY;AAEf,UAAM,UAAU,MAAM,wBAAwB,KAAK,YAAa,GAC1D,eAAe,MAAM,iBAAiB,KAAK,YAAa,GAE1D;AACJ,UAAI,WAAW,aAAa;AAC1B,YAAI;AAEF,cAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,2BAA4B,GAC/D,EAAE,KAAK,IAAI,MAAM,OAAO,MAAM,GAC9B,eAAe,KAAK,KAAK,cAAe,iBAAiB;AAC/D,UAAI,MAAM,OAAO,YAAY,MAE3B,eADe,MAAM,gBAAgB,YAAY,GAC5B,QAAQ,SAAS,KAAK,YAAa;AAAA,QAE5D,QAAQ;AACN,wBAAc,SAAS,KAAK,YAAa;AAAA,QAC3C;AAGF,aAAO;AAAA,QACL,MAAM;AAAA,QACN,cAAc,KAAK;AAAA,QACnB,aAAa,KAAK,eAAe;AAAA,QACjC;AAAA,QACA,gBAAgB,WAAW,aAAa;AAAA,MAC1C;AAAA,IACF;AAAA,IAEA,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa,KAAK;AAAA,QAClB,SAAS,KAAK;AAAA,QACd,cAAc,KAAK;AAAA,MACrB;AAAA,EACJ;AACF;AAKA,SAAS,4BACP,QACyB;AACzB,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,OAAO;AAAA,QACf,QAAQ,OAAO;AAAA,QACf,SAAS,OAAO;AAAA,QAChB,aAAa,qBAAqB,OAAO,MAAO;AAAA,MAClD;AAAA,IAEF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,cAAc,OAAO;AAAA,QACrB,aAAa,OAAO,SAAS;AAAA,MAC/B;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa,OAAO;AAAA,QACpB,SAAS,OAAO;AAAA,QAChB,cAAc,OAAO;AAAA,MACvB;AAAA,EACJ;AACF;AAGA,SAAS,cAAc,OAAwB;AAC7C,SACE,MAAM,WAAW,KAAK,KACtB,MAAM,WAAW,qBAAqB,KACtC,MAAM,WAAW,oBAAoB;AAEzC;AAGA,SAAS,qBAAqB,KAAqB;AAEjD,SADc,IAAI,MAAM,uBAAuB,IAChC,CAAC,KAAK;AACvB;",
|
|
6
|
+
"names": ["getPlatformRootFiles", "resolve", "resolve"]
|
|
7
|
+
}
|