@skaile/workspaces 5.11.0 → 5.13.0
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/CHANGELOG.md +193 -0
- package/README.md +4 -4
- package/dist/{asset-feeds-CXGQIDFR.js → asset-feeds-ALMTHLPV.js} +26 -23
- package/dist/asset-feeds-ALMTHLPV.js.map +1 -0
- package/dist/asset-manager/catalog-deployer.js +10 -10
- package/dist/asset-manager/fragments.js +1 -1
- package/dist/asset-manager/index.js +18 -18
- package/dist/asset-manager/installer.js +13 -13
- package/dist/asset-manager/renderers.js +11 -11
- package/dist/asset-manager/src/fragments.d.ts +5 -0
- package/dist/asset-manager/src/fragments.d.ts.map +1 -1
- package/dist/asset-manager/src/index.d.ts +140 -12
- package/dist/asset-manager/src/index.d.ts.map +1 -1
- package/dist/asset-manager/src/install-agent.d.ts +9 -1
- package/dist/asset-manager/src/install-agent.d.ts.map +1 -1
- package/dist/asset-manager/src/installer.d.ts.map +1 -1
- package/dist/asset-manager/src/renderers.d.ts +5 -0
- package/dist/asset-manager/src/renderers.d.ts.map +1 -1
- package/dist/bridge/drivers/claude-sdk.js +21 -16
- package/dist/bridge/drivers/claude-sdk.js.map +1 -1
- package/dist/bridge/drivers/codex.js +101 -29
- package/dist/bridge/drivers/codex.js.map +1 -1
- package/dist/bridge/drivers/continue.js +12 -12
- package/dist/bridge/drivers/echo.js +2 -2
- package/dist/bridge/drivers/gemini.js +7 -7
- package/dist/bridge/drivers/goose.js +12 -12
- package/dist/bridge/drivers/omp.js +135 -33
- package/dist/bridge/drivers/omp.js.map +1 -1
- package/dist/bridge/drivers/opencode.js +12 -12
- package/dist/bridge/drivers/qwen.js +7 -7
- package/dist/bridge/index.js +14 -14
- package/dist/bridge/src/codex/config-toml.d.ts +16 -3
- package/dist/bridge/src/codex/config-toml.d.ts.map +1 -1
- package/dist/bridge/src/codex/managed-driver.d.ts.map +1 -1
- package/dist/bridge/src/drivers/claude-sdk.d.ts +1 -1
- package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
- package/dist/bridge/src/drivers/codex.d.ts +6 -0
- package/dist/bridge/src/drivers/codex.d.ts.map +1 -1
- package/dist/bridge/src/drivers/omp-models-yml.d.ts +32 -0
- package/dist/bridge/src/drivers/omp-models-yml.d.ts.map +1 -1
- package/dist/bridge/src/drivers/omp.d.ts +29 -6
- package/dist/bridge/src/drivers/omp.d.ts.map +1 -1
- package/dist/bridge/src/provider-materialize/credential-env.d.ts +15 -0
- package/dist/bridge/src/provider-materialize/credential-env.d.ts.map +1 -1
- package/dist/{chunk-T42WRQ4O.js → chunk-2BIESC6S.js} +3 -3
- package/dist/{chunk-T42WRQ4O.js.map → chunk-2BIESC6S.js.map} +1 -1
- package/dist/{chunk-CPWLNZGJ.js → chunk-4DLQESIY.js} +3 -3
- package/dist/{chunk-CPWLNZGJ.js.map → chunk-4DLQESIY.js.map} +1 -1
- package/dist/{chunk-HZXUXHIV.js → chunk-4L4R5LV3.js} +89 -12
- package/dist/chunk-4L4R5LV3.js.map +1 -0
- package/dist/{chunk-CAHB6MHA.js → chunk-4NJ3QQHZ.js} +5 -5
- package/dist/{chunk-CAHB6MHA.js.map → chunk-4NJ3QQHZ.js.map} +1 -1
- package/dist/{chunk-ZCAJZ4B2.js → chunk-57SF6W6E.js} +147 -4
- package/dist/chunk-57SF6W6E.js.map +1 -0
- package/dist/{chunk-FH7W6TJ4.js → chunk-5FYOM4RF.js} +106 -25
- package/dist/chunk-5FYOM4RF.js.map +1 -0
- package/dist/{chunk-R7NHYEJF.js → chunk-5SKVCMRC.js} +15 -7
- package/dist/chunk-5SKVCMRC.js.map +1 -0
- package/dist/{chunk-CJERAGFY.js → chunk-6GICC4RJ.js} +44 -13
- package/dist/chunk-6GICC4RJ.js.map +1 -0
- package/dist/{chunk-G4FFOV3N.js → chunk-6JKIOPT3.js} +4 -4
- package/dist/{chunk-G4FFOV3N.js.map → chunk-6JKIOPT3.js.map} +1 -1
- package/dist/{chunk-T7CTHHG7.js → chunk-6NQDDCIL.js} +3 -3
- package/dist/{chunk-T7CTHHG7.js.map → chunk-6NQDDCIL.js.map} +1 -1
- package/dist/{chunk-XUSALIEI.js → chunk-7SMP4GNW.js} +6 -6
- package/dist/{chunk-XUSALIEI.js.map → chunk-7SMP4GNW.js.map} +1 -1
- package/dist/{chunk-Y3HTGHJC.js → chunk-AHCI4V5L.js} +3 -3
- package/dist/{chunk-Y3HTGHJC.js.map → chunk-AHCI4V5L.js.map} +1 -1
- package/dist/{chunk-M3B6EIJD.js → chunk-B7CZYFB2.js} +4 -4
- package/dist/{chunk-M3B6EIJD.js.map → chunk-B7CZYFB2.js.map} +1 -1
- package/dist/{chunk-PBBPZYVG.js → chunk-BF422IDP.js} +112 -46
- package/dist/chunk-BF422IDP.js.map +1 -0
- package/dist/{chunk-47U4GZ4M.js → chunk-BVJU2GKE.js} +20 -3
- package/dist/chunk-BVJU2GKE.js.map +1 -0
- package/dist/{chunk-PMECEZK3.js → chunk-D54T2F54.js} +5 -4
- package/dist/chunk-D54T2F54.js.map +1 -0
- package/dist/{chunk-2F5AWQX5.js → chunk-DKGEV6SQ.js} +192 -42
- package/dist/chunk-DKGEV6SQ.js.map +1 -0
- package/dist/{chunk-DALV4HHP.js → chunk-DKXNKFKP.js} +3 -2
- package/dist/{chunk-DALV4HHP.js.map → chunk-DKXNKFKP.js.map} +1 -1
- package/dist/chunk-FB3NREF7.js +649 -0
- package/dist/chunk-FB3NREF7.js.map +1 -0
- package/dist/{chunk-QZNJOHN6.js → chunk-FHDK3BFD.js} +3 -3
- package/dist/{chunk-QZNJOHN6.js.map → chunk-FHDK3BFD.js.map} +1 -1
- package/dist/{chunk-3SM2DL2T.js → chunk-GMDSRSGI.js} +21 -11
- package/dist/chunk-GMDSRSGI.js.map +1 -0
- package/dist/chunk-H5U7LNTJ.js +122 -0
- package/dist/chunk-H5U7LNTJ.js.map +1 -0
- package/dist/{chunk-VLTQGE2E.js → chunk-HBZD3MIW.js} +269 -81
- package/dist/chunk-HBZD3MIW.js.map +1 -0
- package/dist/{chunk-S3O3GKB7.js → chunk-HWGYJMME.js} +4 -4
- package/dist/{chunk-S3O3GKB7.js.map → chunk-HWGYJMME.js.map} +1 -1
- package/dist/{chunk-CPSIPIX7.js → chunk-IG5LZ3WU.js} +8 -6
- package/dist/chunk-IG5LZ3WU.js.map +1 -0
- package/dist/{chunk-ZPWTOUTK.js → chunk-IY5E7Y5W.js} +61 -8
- package/dist/chunk-IY5E7Y5W.js.map +1 -0
- package/dist/{chunk-6O2X3GPW.js → chunk-J4DB5G36.js} +7 -5
- package/dist/chunk-J4DB5G36.js.map +1 -0
- package/dist/{chunk-BNMZVPYA.js → chunk-J4OYIYFQ.js} +2 -2
- package/dist/{chunk-BNMZVPYA.js.map → chunk-J4OYIYFQ.js.map} +1 -1
- package/dist/{chunk-ALEYHUC5.js → chunk-L3ZGYSWY.js} +182 -41
- package/dist/chunk-L3ZGYSWY.js.map +1 -0
- package/dist/{chunk-SBSA3IQA.js → chunk-M3P4BYRK.js} +49 -14
- package/dist/chunk-M3P4BYRK.js.map +1 -0
- package/dist/{chunk-IER3KIPH.js → chunk-NDUYFYJB.js} +5 -5
- package/dist/{chunk-IER3KIPH.js.map → chunk-NDUYFYJB.js.map} +1 -1
- package/dist/{chunk-CGYEHQOX.js → chunk-NOA6EJXE.js} +11 -2
- package/dist/chunk-NOA6EJXE.js.map +1 -0
- package/dist/{chunk-J4RBUFGM.js → chunk-NVO6WECE.js} +9 -8
- package/dist/chunk-NVO6WECE.js.map +1 -0
- package/dist/{chunk-OBYKJB4U.js → chunk-O2SYFJWP.js} +79 -5
- package/dist/chunk-O2SYFJWP.js.map +1 -0
- package/dist/{chunk-5LKOAX7I.js → chunk-OQ5MKDS3.js} +21 -5
- package/dist/chunk-OQ5MKDS3.js.map +1 -0
- package/dist/{chunk-NWDSLXOX.js → chunk-PHRNUTSG.js} +118 -118
- package/dist/chunk-PHRNUTSG.js.map +1 -0
- package/dist/chunk-PN44DOGP.js +345 -0
- package/dist/chunk-PN44DOGP.js.map +1 -0
- package/dist/{chunk-COH6FQAG.js → chunk-PXDWTJ3P.js} +5 -5
- package/dist/{chunk-COH6FQAG.js.map → chunk-PXDWTJ3P.js.map} +1 -1
- package/dist/{chunk-GV4DZ6MT.js → chunk-PYTTF754.js} +22 -6
- package/dist/chunk-PYTTF754.js.map +1 -0
- package/dist/chunk-PZOO7L26.js +64 -0
- package/dist/chunk-PZOO7L26.js.map +1 -0
- package/dist/{chunk-EDYHEMJA.js → chunk-QO7CR3KB.js} +10 -5
- package/dist/chunk-QO7CR3KB.js.map +1 -0
- package/dist/{chunk-XDKH7XSA.js → chunk-R6QHJEHE.js} +5 -5
- package/dist/{chunk-XDKH7XSA.js.map → chunk-R6QHJEHE.js.map} +1 -1
- package/dist/chunk-U27JRO5L.js +13 -0
- package/dist/chunk-U27JRO5L.js.map +1 -0
- package/dist/{chunk-X77SUM4P.js → chunk-USHB5KEY.js} +3 -3
- package/dist/{chunk-X77SUM4P.js.map → chunk-USHB5KEY.js.map} +1 -1
- package/dist/{chunk-QVFAS5IO.js → chunk-V5JHD4I2.js} +3 -3
- package/dist/{chunk-QVFAS5IO.js.map → chunk-V5JHD4I2.js.map} +1 -1
- package/dist/{chunk-PQFHMQHQ.js → chunk-VLBIME5L.js} +6 -6
- package/dist/{chunk-PQFHMQHQ.js.map → chunk-VLBIME5L.js.map} +1 -1
- package/dist/{chunk-D3B36CYC.js → chunk-X3RMRJNR.js} +4 -3
- package/dist/chunk-X3RMRJNR.js.map +1 -0
- package/dist/{chunk-TCHRMVTO.js → chunk-XBYSURMK.js} +4 -4
- package/dist/{chunk-TCHRMVTO.js.map → chunk-XBYSURMK.js.map} +1 -1
- package/dist/{chunk-MZG34MBZ.js → chunk-XJYBCDY2.js} +3 -3
- package/dist/{chunk-MZG34MBZ.js.map → chunk-XJYBCDY2.js.map} +1 -1
- package/dist/{chunk-4A4OD24G.js → chunk-Y4Z7LGSH.js} +9 -9
- package/dist/{chunk-4A4OD24G.js.map → chunk-Y4Z7LGSH.js.map} +1 -1
- package/dist/{chunk-DZMNFCWB.js → chunk-Y7WKXPWS.js} +816 -143
- package/dist/chunk-Y7WKXPWS.js.map +1 -0
- package/dist/{chunk-HCEVNYSH.js → chunk-YTZFSKWL.js} +3 -3
- package/dist/{chunk-HCEVNYSH.js.map → chunk-YTZFSKWL.js.map} +1 -1
- package/dist/{chunk-WSBKB4CJ.js → chunk-ZSMMX3JD.js} +167 -25
- package/dist/chunk-ZSMMX3JD.js.map +1 -0
- package/dist/{chunk-GCHPUTA3.js → chunk-ZU24LWBI.js} +3 -3
- package/dist/{chunk-GCHPUTA3.js.map → chunk-ZU24LWBI.js.map} +1 -1
- package/dist/cli/index.js +1427 -605
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/src/agent-checks.d.ts +40 -0
- package/dist/cli/src/agent-checks.d.ts.map +1 -0
- package/dist/cli/src/asset-feeds.d.ts.map +1 -1
- package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
- package/dist/cli/src/commands/catalog-cmd.d.ts.map +1 -1
- package/dist/cli/src/commands/catalog.d.ts +26 -0
- package/dist/cli/src/commands/catalog.d.ts.map +1 -1
- package/dist/cli/src/commands/config.d.ts.map +1 -1
- package/dist/cli/src/commands/diff.d.ts +1 -1
- package/dist/cli/src/commands/diff.d.ts.map +1 -1
- package/dist/cli/src/commands/integration.d.ts.map +1 -1
- package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
- package/dist/cli/src/commands/library-index.d.ts +10 -0
- package/dist/cli/src/commands/library-index.d.ts.map +1 -1
- package/dist/cli/src/commands/library-publish.d.ts.map +1 -1
- package/dist/cli/src/commands/mcp-server.d.ts +1 -1
- package/dist/cli/src/commands/migrate-assets.d.ts +2 -1
- package/dist/cli/src/commands/migrate-assets.d.ts.map +1 -1
- package/dist/cli/src/commands/migrate.d.ts.map +1 -1
- package/dist/cli/src/commands/plugin/claude-code.d.ts +1 -1
- package/dist/cli/src/commands/plugin/claude-code.d.ts.map +1 -1
- package/dist/cli/src/commands/plugin/types.d.ts +3 -1
- package/dist/cli/src/commands/plugin/types.d.ts.map +1 -1
- package/dist/cli/src/commands/plugin-registry-cmd.d.ts.map +1 -1
- package/dist/cli/src/commands/preset-apply.d.ts.map +1 -1
- package/dist/cli/src/commands/project.d.ts +8 -0
- package/dist/cli/src/commands/project.d.ts.map +1 -1
- package/dist/cli/src/commands/publish-core.d.ts +5 -0
- package/dist/cli/src/commands/publish-core.d.ts.map +1 -1
- package/dist/cli/src/commands/run.d.ts +11 -1
- package/dist/cli/src/commands/run.d.ts.map +1 -1
- package/dist/cli/src/commands/serve-preflight.d.ts +23 -0
- package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -0
- package/dist/cli/src/commands/serve.d.ts.map +1 -1
- package/dist/cli/src/commands/source-manifest-publish.d.ts.map +1 -1
- package/dist/cli/src/commands/source-manifest.d.ts +1 -0
- package/dist/cli/src/commands/source-manifest.d.ts.map +1 -1
- package/dist/cli/src/commands/source.d.ts +9 -1
- package/dist/cli/src/commands/source.d.ts.map +1 -1
- package/dist/cli/src/commands/store.d.ts.map +1 -1
- package/dist/cli/src/commands/tree.d.ts.map +1 -1
- package/dist/cli/src/commands/update.d.ts.map +1 -1
- package/dist/cli/src/commands/validate-instances.d.ts.map +1 -1
- package/dist/cli/src/commands/validate.d.ts +3 -2
- package/dist/cli/src/commands/validate.d.ts.map +1 -1
- package/dist/cli/src/commands/why.d.ts.map +1 -1
- package/dist/cli/src/curated-manifests.d.ts +21 -0
- package/dist/cli/src/curated-manifests.d.ts.map +1 -0
- package/dist/cli/src/driver-error.d.ts +7 -0
- package/dist/cli/src/driver-error.d.ts.map +1 -1
- package/dist/cli/src/helpers.d.ts +6 -0
- package/dist/cli/src/helpers.d.ts.map +1 -1
- package/dist/cli/src/index-busy.d.ts +8 -0
- package/dist/cli/src/index-busy.d.ts.map +1 -0
- package/dist/cli/src/plugin-store/index.d.ts +1 -1
- package/dist/cli/src/plugin-store/index.d.ts.map +1 -1
- package/dist/cli/src/plugin-store/paths.d.ts +7 -3
- package/dist/cli/src/plugin-store/paths.d.ts.map +1 -1
- package/dist/cli/src/plugin-store/reconcile.d.ts +24 -4
- package/dist/cli/src/plugin-store/reconcile.d.ts.map +1 -1
- package/dist/cli/src/skill-checks.d.ts +27 -3
- package/dist/cli/src/skill-checks.d.ts.map +1 -1
- package/dist/cli/src/store-addable.d.ts +17 -0
- package/dist/cli/src/store-addable.d.ts.map +1 -0
- package/dist/connectors/config.js +6 -6
- package/dist/connectors/index.js +18 -18
- package/dist/connectors/src/config.d.ts.map +1 -1
- package/dist/{connectors-4QWAKPHB.js → connectors-GFKMKAXV.js} +21 -21
- package/dist/{connectors-4QWAKPHB.js.map → connectors-GFKMKAXV.js.map} +1 -1
- package/dist/core/driver-targets.js +1 -1
- package/dist/core/index.js +9 -9
- package/dist/core/logging.js +1 -1
- package/dist/core/manifest.js +2 -2
- package/dist/core/models.js +1 -1
- package/dist/core/publish-manifest.js +4 -2
- package/dist/core/ref.js +1 -1
- package/dist/core/runtime-assets.js +6 -6
- package/dist/core/src/agent-instances.d.ts +5 -0
- package/dist/core/src/agent-instances.d.ts.map +1 -1
- package/dist/core/src/driver-targets.d.ts.map +1 -1
- package/dist/core/src/index.d.ts +6 -5
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/lock.d.ts +15 -5
- package/dist/core/src/lock.d.ts.map +1 -1
- package/dist/core/src/logging/sinks/sqlite-sink.d.ts.map +1 -1
- package/dist/core/src/manifest.d.ts +14 -3
- package/dist/core/src/manifest.d.ts.map +1 -1
- package/dist/core/src/models.d.ts +11 -3
- package/dist/core/src/models.d.ts.map +1 -1
- package/dist/core/src/package-manager.d.ts +19 -0
- package/dist/core/src/package-manager.d.ts.map +1 -0
- package/dist/core/src/publish-manifest.d.ts +38 -1
- package/dist/core/src/publish-manifest.d.ts.map +1 -1
- package/dist/core/src/repo-manager.d.ts +19 -3
- package/dist/core/src/repo-manager.d.ts.map +1 -1
- package/dist/core/src/runtime-assets.d.ts.map +1 -1
- package/dist/core/src/settings.d.ts +26 -6
- package/dist/core/src/settings.d.ts.map +1 -1
- package/dist/core/src/store.d.ts +4 -0
- package/dist/core/src/store.d.ts.map +1 -1
- package/dist/core/src/walker.d.ts +8 -1
- package/dist/core/src/walker.d.ts.map +1 -1
- package/dist/core/src/workspace-config.d.ts +24 -2
- package/dist/core/src/workspace-config.d.ts.map +1 -1
- package/dist/core/store.js +2 -2
- package/dist/core/workspace-config.js +5 -5
- package/dist/deploy/index.js +9 -9
- package/dist/discovery/index.js +5 -5
- package/dist/discovery/src/parse-manifest.d.ts.map +1 -1
- package/dist/discovery/src/source-config.d.ts +5 -3
- package/dist/discovery/src/source-config.d.ts.map +1 -1
- package/dist/{ensure-sources-2RONZKCU.js → ensure-sources-VUKHL65L.js} +21 -21
- package/dist/{ensure-sources-2RONZKCU.js.map → ensure-sources-VUKHL65L.js.map} +1 -1
- package/dist/factory-assets/README.md +1 -1
- package/dist/factory-assets/connectors/box.js +18 -18
- package/dist/factory-assets/connectors/deploy.js +18 -18
- package/dist/factory-assets/connectors/devserver.js +18 -18
- package/dist/factory-assets/connectors/flow/adapter.js +18 -18
- package/dist/factory-assets/connectors/flow/contract/normalize.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/contract.js +1 -1
- package/dist/factory-assets/connectors/flow/engine.js +11 -11
- package/dist/factory-assets/connectors/flow/run-flow.d.ts.map +1 -1
- package/dist/factory-assets/connectors/flow/run-flow.js +20 -20
- package/dist/factory-assets/connectors/flow.js +18 -18
- package/dist/factory-assets/connectors/git.js +18 -18
- package/dist/factory-assets/connectors/gmail.js +18 -18
- package/dist/factory-assets/connectors/googledrive.js +18 -18
- package/dist/factory-assets/connectors/local.js +18 -18
- package/dist/factory-assets/connectors/mattermost.js +18 -18
- package/dist/factory-assets/connectors/memory.js +18 -18
- package/dist/factory-assets/connectors/minio.js +18 -18
- package/dist/factory-assets/connectors/postgres.js +18 -18
- package/dist/factory-assets/connectors/s3.js +18 -18
- package/dist/factory-assets/connectors/sharepoint.js +18 -18
- package/dist/factory-assets/connectors/sqlite.js +18 -18
- package/dist/factory-assets/connectors/static-server.js +18 -18
- package/dist/factory-assets/connectors/tunnel.js +18 -18
- package/dist/factory-assets/connectors/webdav.js +18 -18
- package/dist/factory-assets/connectors/xstate-store.js +18 -18
- package/dist/factory-assets/connectors/xstate.js +18 -18
- package/dist/factory-assets/skills/authoring-skaile-assets/SKILL.md +10 -8
- package/dist/factory-assets/skills/authoring-skaile-manifests/SKILL.md +15 -11
- package/dist/factory-assets/skills/authoring-skaile-manifests/references/dependency-standard.md +12 -9
- package/dist/factory-assets/skills/skaile-author-asset/SKILL.md +2 -2
- package/dist/flows-A4YALSZY.js +26 -0
- package/dist/{flows-EQF2CH4U.js.map → flows-A4YALSZY.js.map} +1 -1
- package/dist/helpers-53XZW7KF.js +34 -0
- package/dist/{helpers-CFK6YP6R.js.map → helpers-53XZW7KF.js.map} +1 -1
- package/dist/library/index.js +14 -14
- package/dist/library/install.js +6 -4
- package/dist/library/src/index.d.ts +2 -2
- package/dist/library/src/index.d.ts.map +1 -1
- package/dist/library/src/install/source-fetch-github.d.ts.map +1 -1
- package/dist/library/src/local/db.d.ts +2 -0
- package/dist/library/src/local/db.d.ts.map +1 -1
- package/dist/library/src/local/library-manager.d.ts +5 -0
- package/dist/library/src/local/library-manager.d.ts.map +1 -1
- package/dist/library/src/local/library.d.ts +5 -3
- package/dist/library/src/local/library.d.ts.map +1 -1
- package/dist/library/src/local/local-catalog-source.d.ts +6 -0
- package/dist/library/src/local/local-catalog-source.d.ts.map +1 -1
- package/dist/library/src/local/store-paths.d.ts +9 -0
- package/dist/library/src/local/store-paths.d.ts.map +1 -1
- package/dist/library/src/manifest-writer.d.ts +1 -1
- package/dist/library/src/manifest-writer.d.ts.map +1 -1
- package/dist/library/src/remote/index.d.ts +1 -1
- package/dist/library/src/remote/index.d.ts.map +1 -1
- package/dist/library/src/remote/remote-catalog-source.d.ts +17 -0
- package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
- package/dist/library/src/sync/git-driver.d.ts.map +1 -1
- package/dist/library/src/user-library.d.ts +2 -0
- package/dist/library/src/user-library.d.ts.map +1 -1
- package/dist/{library-publish-53UTB3MB.js → library-publish-FFIPWIRM.js} +50 -39
- package/dist/library-publish-FFIPWIRM.js.map +1 -0
- package/dist/open-library-PZAT3TJA.js +40 -0
- package/dist/{open-library-BOSPJVID.js.map → open-library-PZAT3TJA.js.map} +1 -1
- package/dist/open-registry-W46UXZ3I.js +32 -0
- package/dist/{open-registry-4FI7HKET.js.map → open-registry-W46UXZ3I.js.map} +1 -1
- package/dist/paths-KKY3NSBZ.js +22 -0
- package/dist/{paths-SUS4S4YT.js.map → paths-KKY3NSBZ.js.map} +1 -1
- package/dist/plugin-store-CK7YWRIC.js +227 -0
- package/dist/plugin-store-CK7YWRIC.js.map +1 -0
- package/dist/plugins/src/catalog-source.d.ts +6 -0
- package/dist/plugins/src/catalog-source.d.ts.map +1 -1
- package/dist/project-EZUH7PUJ.js +79 -0
- package/dist/{project-I55A4O2T.js.map → project-EZUH7PUJ.js.map} +1 -1
- package/dist/resolver/index.js +10 -10
- package/dist/runner/index.js +35 -35
- package/dist/runner/src/agent.d.ts.map +1 -1
- package/dist/runner/src/agents/in-process-host.d.ts.map +1 -1
- package/dist/runner/src/composition/index.d.ts +2 -1
- package/dist/runner/src/composition/index.d.ts.map +1 -1
- package/dist/runner/src/composition/prompt-sections.d.ts +20 -5
- package/dist/runner/src/composition/prompt-sections.d.ts.map +1 -1
- package/dist/runner/src/composition/resolve.d.ts +10 -1
- package/dist/runner/src/composition/resolve.d.ts.map +1 -1
- package/dist/runner/src/composition/verify.d.ts +29 -0
- package/dist/runner/src/composition/verify.d.ts.map +1 -0
- package/dist/runner/src/credential-notice.d.ts +14 -0
- package/dist/runner/src/credential-notice.d.ts.map +1 -0
- package/dist/runner/src/environment.d.ts.map +1 -1
- package/dist/runner/src/final-text.d.ts +17 -0
- package/dist/runner/src/final-text.d.ts.map +1 -0
- package/dist/runner/src/index.d.ts +2 -0
- package/dist/runner/src/index.d.ts.map +1 -1
- package/dist/runner/src/resource-handler.d.ts.map +1 -1
- package/dist/runner/src/serve.d.ts +13 -0
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/runner/src/session-builder.d.ts.map +1 -1
- package/dist/runner/src/session.d.ts +2 -0
- package/dist/runner/src/session.d.ts.map +1 -1
- package/dist/runner/src/ws-auth-warning.d.ts +17 -0
- package/dist/runner/src/ws-auth-warning.d.ts.map +1 -0
- package/dist/sdk/asset-manager.js +18 -18
- package/dist/sdk/bridge.js +14 -14
- package/dist/sdk/core.js +9 -9
- package/dist/sdk/flow.js +11 -11
- package/dist/sdk/index.js +38 -36
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/resolver.js +10 -10
- package/dist/sdk/runner.js +35 -35
- package/dist/sdk/src/local-runtime.d.ts.map +1 -1
- package/dist/sdk/transport/ws/client.js +1 -1
- package/dist/sdk/transport/ws/server.js +1 -1
- package/dist/sdk/transport/ws.js +2 -2
- package/dist/sdk/transport.js +2 -2
- package/dist/serve-preflight-F7MYF747.js +64 -0
- package/dist/serve-preflight-F7MYF747.js.map +1 -0
- package/dist/{setup-7DQJKHUI.js → setup-L632QIHV.js} +26 -26
- package/dist/{setup-7DQJKHUI.js.map → setup-L632QIHV.js.map} +1 -1
- package/dist/skills-OY3Y5GKA.js +26 -0
- package/dist/{skills-NUEN5NDX.js.map → skills-OY3Y5GKA.js.map} +1 -1
- package/dist/source-36FHMN5V.js +42 -0
- package/dist/{source-G2LV5LVD.js.map → source-36FHMN5V.js.map} +1 -1
- package/dist/source-fetch-github-PIO6EMMF.js +4 -0
- package/dist/{source-fetch-github-QN4LLTL5.js.map → source-fetch-github-PIO6EMMF.js.map} +1 -1
- package/dist/{source-manifest-publish-6RM7SWLZ.js → source-manifest-publish-NIXJSJ22.js} +30 -28
- package/dist/source-manifest-publish-NIXJSJ22.js.map +1 -0
- package/dist/transport/index.js +2 -2
- package/dist/transport/src/ws/client.d.ts +6 -0
- package/dist/transport/src/ws/client.d.ts.map +1 -1
- package/dist/transport/src/ws/server.d.ts +4 -0
- package/dist/transport/src/ws/server.d.ts.map +1 -1
- package/dist/transport/ws/client.js +1 -1
- package/dist/transport/ws/server.js +1 -1
- package/dist/transport/ws.js +2 -2
- package/dist/tui/index.js +77 -50
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/src/repl-session.d.ts +1 -1
- package/dist/tui/src/repl-session.d.ts.map +1 -1
- package/dist/tui/src/repl.d.ts +3 -0
- package/dist/tui/src/repl.d.ts.map +1 -1
- package/dist/types/manifests.js +1 -1
- package/dist/types/src/lifecycle.d.ts +2 -1
- package/dist/types/src/lifecycle.d.ts.map +1 -1
- package/dist/types/src/manifests/agent-composition.d.ts +20 -0
- package/dist/types/src/manifests/agent-composition.d.ts.map +1 -1
- package/dist/types/src/manifests/agent.d.ts.map +1 -1
- package/dist/types/src/manifests/cron.d.ts +15 -0
- package/dist/types/src/manifests/cron.d.ts.map +1 -0
- package/dist/types/src/manifests/index.d.ts +3 -2
- package/dist/types/src/manifests/index.d.ts.map +1 -1
- package/dist/types/src/manifests/preset.d.ts +6 -1
- package/dist/types/src/manifests/preset.d.ts.map +1 -1
- package/dist/workspace-plugin/adapters/mcp.js +25 -25
- package/dist/workspace-plugin/adapters/omp.js +106 -51
- package/dist/workspace-plugin/adapters/omp.js.map +1 -1
- package/dist/workspace-plugin/index.js +2 -2
- package/dist/workspace-plugin/src/adapters/claude-code.d.ts.map +1 -1
- package/dist/workspace-plugin/src/adapters/omp.d.ts +11 -2
- package/dist/workspace-plugin/src/adapters/omp.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/asset-feeds-CXGQIDFR.js.map +0 -1
- package/dist/chunk-2F5AWQX5.js.map +0 -1
- package/dist/chunk-3SM2DL2T.js.map +0 -1
- package/dist/chunk-47U4GZ4M.js.map +0 -1
- package/dist/chunk-5LKOAX7I.js.map +0 -1
- package/dist/chunk-6O2X3GPW.js.map +0 -1
- package/dist/chunk-ALEYHUC5.js.map +0 -1
- package/dist/chunk-CGYEHQOX.js.map +0 -1
- package/dist/chunk-CJERAGFY.js.map +0 -1
- package/dist/chunk-CPSIPIX7.js.map +0 -1
- package/dist/chunk-D3B36CYC.js.map +0 -1
- package/dist/chunk-DZMNFCWB.js.map +0 -1
- package/dist/chunk-EDYHEMJA.js.map +0 -1
- package/dist/chunk-FH7W6TJ4.js.map +0 -1
- package/dist/chunk-GV4DZ6MT.js.map +0 -1
- package/dist/chunk-HZXUXHIV.js.map +0 -1
- package/dist/chunk-J4RBUFGM.js.map +0 -1
- package/dist/chunk-NWDSLXOX.js.map +0 -1
- package/dist/chunk-OBYKJB4U.js.map +0 -1
- package/dist/chunk-PBBPZYVG.js.map +0 -1
- package/dist/chunk-PMECEZK3.js.map +0 -1
- package/dist/chunk-R7FOF242.js +0 -59
- package/dist/chunk-R7FOF242.js.map +0 -1
- package/dist/chunk-R7NHYEJF.js.map +0 -1
- package/dist/chunk-RYYLMBA2.js +0 -392
- package/dist/chunk-RYYLMBA2.js.map +0 -1
- package/dist/chunk-SBSA3IQA.js.map +0 -1
- package/dist/chunk-VLTQGE2E.js.map +0 -1
- package/dist/chunk-WSBKB4CJ.js.map +0 -1
- package/dist/chunk-YOH2L76X.js +0 -505
- package/dist/chunk-YOH2L76X.js.map +0 -1
- package/dist/chunk-ZCAJZ4B2.js.map +0 -1
- package/dist/chunk-ZPWTOUTK.js.map +0 -1
- package/dist/flows-EQF2CH4U.js +0 -26
- package/dist/helpers-CFK6YP6R.js +0 -34
- package/dist/library-publish-53UTB3MB.js.map +0 -1
- package/dist/open-library-BOSPJVID.js +0 -40
- package/dist/open-registry-4FI7HKET.js +0 -32
- package/dist/paths-SUS4S4YT.js +0 -22
- package/dist/plugin-store-AGQDMING.js +0 -149
- package/dist/plugin-store-AGQDMING.js.map +0 -1
- package/dist/project-I55A4O2T.js +0 -41
- package/dist/skills-NUEN5NDX.js +0 -26
- package/dist/source-G2LV5LVD.js +0 -41
- package/dist/source-fetch-github-QN4LLTL5.js +0 -4
- package/dist/source-manifest-publish-6RM7SWLZ.js.map +0 -1
package/dist/chunk-YOH2L76X.js
DELETED
|
@@ -1,505 +0,0 @@
|
|
|
1
|
-
import { getStoreIdentity, refFor } from './chunk-RYYLMBA2.js';
|
|
2
|
-
import { openLibrary } from './chunk-PQFHMQHQ.js';
|
|
3
|
-
import { logErr, logWarn } from './chunk-GV4DZ6MT.js';
|
|
4
|
-
import { getKindRegistry } from './chunk-CAHB6MHA.js';
|
|
5
|
-
import { parseFlowDefinition } from './chunk-D3B36CYC.js';
|
|
6
|
-
import { stampManifestPublisher, upsertManifestAsset, resolveIndexPath, LocalIndex } from './chunk-2F5AWQX5.js';
|
|
7
|
-
import { requiresSyntaxErrors, SEMVER_RE, parseManifestFile } from './chunk-J4RBUFGM.js';
|
|
8
|
-
import { SKILL_DESCRIPTION_PLACEHOLDER_PREFIX, PRESET_DESCRIPTION_PLACEHOLDER, PRESET_ITEM_PLACEHOLDER_REF, SKILL_BODY_PLACEHOLDER, CONTRACT_BODY_PLACEHOLDER, PROMPT_BODY_PLACEHOLDER, AGENT_BODY_PLACEHOLDER } from './chunk-ZCAJZ4B2.js';
|
|
9
|
-
import { checkAgentSkillConformance } from './chunk-PBBPZYVG.js';
|
|
10
|
-
import { matchPin } from './chunk-ALEYHUC5.js';
|
|
11
|
-
import { SKAILE_MANIFEST_FILENAME, loadSkPublishManifest } from './chunk-ZPWTOUTK.js';
|
|
12
|
-
import { parseFrontmatter } from './chunk-SBSA3IQA.js';
|
|
13
|
-
import { parseDep, isValidPublisher, slugifyAssetName, PUBLISHER_HINT, parseAssetRef, isValidAssetName, ASSET_NAME_HINT } from './chunk-BNMZVPYA.js';
|
|
14
|
-
import * as fs from 'fs';
|
|
15
|
-
import * as path from 'path';
|
|
16
|
-
import { Option } from 'commander';
|
|
17
|
-
import { parse, stringify } from 'yaml';
|
|
18
|
-
|
|
19
|
-
function manifestRequiresProblems(dir) {
|
|
20
|
-
const file = path.join(dir, "skaile.manifest.yaml");
|
|
21
|
-
let doc;
|
|
22
|
-
try {
|
|
23
|
-
doc = parse(fs.readFileSync(file, "utf-8"));
|
|
24
|
-
} catch {
|
|
25
|
-
return [];
|
|
26
|
-
}
|
|
27
|
-
const assets = doc?.assets;
|
|
28
|
-
if (!Array.isArray(assets)) return [];
|
|
29
|
-
const problems = [];
|
|
30
|
-
for (const a of assets) {
|
|
31
|
-
if (!a || typeof a !== "object") continue;
|
|
32
|
-
const { kind, name, dependencies } = a;
|
|
33
|
-
if (!Array.isArray(dependencies)) continue;
|
|
34
|
-
const entries = dependencies.map((d) => typeof d === "string" ? d : String(d));
|
|
35
|
-
for (const message of requiresSyntaxErrors(entries)) {
|
|
36
|
-
problems.push({
|
|
37
|
-
asset: `${String(kind)}:${String(name)}`,
|
|
38
|
-
message: `ManifestRequiresError: ${message}`
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return problems;
|
|
43
|
-
}
|
|
44
|
-
async function knownAssetVersions(dir) {
|
|
45
|
-
const known = {};
|
|
46
|
-
const add = (publisher, kind, name, version) => {
|
|
47
|
-
if (!publisher) return;
|
|
48
|
-
const key = `${publisher.replace(/^@/, "")}/${kind}:${name}`;
|
|
49
|
-
const versions = known[key] ?? [];
|
|
50
|
-
if (version && !versions.includes(version)) versions.push(version);
|
|
51
|
-
known[key] = versions;
|
|
52
|
-
};
|
|
53
|
-
const addManifest = (libPath) => {
|
|
54
|
-
const manifest = loadSkPublishManifest(libPath);
|
|
55
|
-
for (const a of manifest?.assets ?? []) {
|
|
56
|
-
add(a.publisher ?? manifest?.publisher, a.kind, a.name, a.version);
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
addManifest(dir);
|
|
60
|
-
const indexPath = resolveIndexPath();
|
|
61
|
-
if (!fs.existsSync(indexPath)) return known;
|
|
62
|
-
const index = new LocalIndex({ indexPath, kindRegistry: getKindRegistry() });
|
|
63
|
-
try {
|
|
64
|
-
for (const def of await index.listAssetDefs())
|
|
65
|
-
add(def.publisher, def.kind, def.name, def.version);
|
|
66
|
-
for (const lib of await index.listSources()) {
|
|
67
|
-
if (path.resolve(lib.path) !== path.resolve(dir) && fs.existsSync(lib.path)) {
|
|
68
|
-
addManifest(lib.path);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
} catch {
|
|
72
|
-
} finally {
|
|
73
|
-
index.close();
|
|
74
|
-
}
|
|
75
|
-
return known;
|
|
76
|
-
}
|
|
77
|
-
async function unresolvedManifestDependencies(dir) {
|
|
78
|
-
let doc;
|
|
79
|
-
try {
|
|
80
|
-
doc = parse(fs.readFileSync(path.join(dir, SKAILE_MANIFEST_FILENAME), "utf-8"));
|
|
81
|
-
} catch {
|
|
82
|
-
return [];
|
|
83
|
-
}
|
|
84
|
-
const assets = doc?.assets;
|
|
85
|
-
if (!Array.isArray(assets)) return [];
|
|
86
|
-
const wanted = [];
|
|
87
|
-
for (const a of assets) {
|
|
88
|
-
if (!a || typeof a !== "object") continue;
|
|
89
|
-
const { kind, name, dependencies } = a;
|
|
90
|
-
if (!Array.isArray(dependencies)) continue;
|
|
91
|
-
for (const d of dependencies) {
|
|
92
|
-
const entry = typeof d === "string" ? d : String(d);
|
|
93
|
-
if (requiresSyntaxErrors([entry]).length === 0) {
|
|
94
|
-
wanted.push({ asset: `${String(kind)}:${String(name)}`, entry });
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
if (wanted.length === 0) return [];
|
|
99
|
-
const known = await knownAssetVersions(dir);
|
|
100
|
-
const out = [];
|
|
101
|
-
for (const { asset, entry } of wanted) {
|
|
102
|
-
const dep = parseDep(entry);
|
|
103
|
-
if (!dep.publisher) continue;
|
|
104
|
-
const versions = known[`${dep.publisher}/${dep.kind}:${dep.name}`];
|
|
105
|
-
const prefix = `${SKAILE_MANIFEST_FILENAME} [assets] \u2014 ${asset}: dependency "${entry}"`;
|
|
106
|
-
if (!versions) {
|
|
107
|
-
out.push(
|
|
108
|
-
`${prefix} is not held by any registered library (checked offline: this library and the local index; the store was not asked).`
|
|
109
|
-
);
|
|
110
|
-
} else if (dep.pin && versions.length > 0 && !versions.some((v) => matchPin(dep.pin, v))) {
|
|
111
|
-
out.push(
|
|
112
|
-
`${prefix} has no version matching "${dep.pin}" in any registered library (held: ${versions.join(", ")}).`
|
|
113
|
-
);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
return out;
|
|
117
|
-
}
|
|
118
|
-
function invalidPublisherMessage(raw) {
|
|
119
|
-
return `Invalid publisher "${raw}": ${PUBLISHER_HINT}.`;
|
|
120
|
-
}
|
|
121
|
-
function requireValidPublisherOrExit(raw) {
|
|
122
|
-
const bare = raw.trim().replace(/^@/, "");
|
|
123
|
-
if (!isValidPublisher(bare)) {
|
|
124
|
-
logErr(invalidPublisherMessage(raw));
|
|
125
|
-
process.exit(1);
|
|
126
|
-
}
|
|
127
|
-
return bare;
|
|
128
|
-
}
|
|
129
|
-
function manifestPublisherProblems(dir) {
|
|
130
|
-
let doc;
|
|
131
|
-
try {
|
|
132
|
-
doc = parse(fs.readFileSync(path.join(dir, SKAILE_MANIFEST_FILENAME), "utf-8"));
|
|
133
|
-
} catch {
|
|
134
|
-
return [];
|
|
135
|
-
}
|
|
136
|
-
if (!doc || typeof doc !== "object") return [];
|
|
137
|
-
const { publisher, assets } = doc;
|
|
138
|
-
const problems = [];
|
|
139
|
-
const check = (value, where) => {
|
|
140
|
-
if (typeof value !== "string") return;
|
|
141
|
-
if (!isValidPublisher(value.trim().replace(/^@/, ""))) {
|
|
142
|
-
problems.push(`${SKAILE_MANIFEST_FILENAME} ${where} \u2014 ${invalidPublisherMessage(value)}`);
|
|
143
|
-
}
|
|
144
|
-
};
|
|
145
|
-
check(publisher, "[publisher]");
|
|
146
|
-
if (Array.isArray(assets)) {
|
|
147
|
-
for (const a of assets) {
|
|
148
|
-
if (!a || typeof a !== "object") continue;
|
|
149
|
-
const { kind, name, publisher: assetPublisher } = a;
|
|
150
|
-
check(assetPublisher, `[assets] ${String(kind)}:${String(name)}`);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
return problems;
|
|
154
|
-
}
|
|
155
|
-
function exitOnManifestPublisherProblems(dir, libName) {
|
|
156
|
-
const problems = manifestPublisherProblems(dir);
|
|
157
|
-
if (problems.length === 0) return;
|
|
158
|
-
for (const message of problems) logErr(message);
|
|
159
|
-
logErr(
|
|
160
|
-
`Fix the publisher in ${SKAILE_MANIFEST_FILENAME} (\`skaile library set ${libName} publisher=<name>\` rewrites the library's own), then re-run.`
|
|
161
|
-
);
|
|
162
|
-
process.exit(1);
|
|
163
|
-
}
|
|
164
|
-
async function indexLibrary(lib, index, opts = {}) {
|
|
165
|
-
const { LocalCatalogSource } = await import('./library/index.js');
|
|
166
|
-
const own = index ?? await openLibrary();
|
|
167
|
-
try {
|
|
168
|
-
const source = new LocalCatalogSource(own, lib.id, lib.path, getKindRegistry());
|
|
169
|
-
const res = await source.sync({ exclude: opts.exclude });
|
|
170
|
-
if (res.pruned.length > 0) {
|
|
171
|
-
const lost = new Set(res.pruned);
|
|
172
|
-
for (const other of await own.listSources()) {
|
|
173
|
-
if (other.id === lib.id || other.backend !== "local" || !other.path) continue;
|
|
174
|
-
if (!fs.existsSync(other.path)) continue;
|
|
175
|
-
await new LocalCatalogSource(own, other.id, other.path, getKindRegistry()).sync({
|
|
176
|
-
only: lost
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
return {
|
|
181
|
-
assetsFound: res.assetsFound,
|
|
182
|
-
assetsUpdated: res.assetsUpdated,
|
|
183
|
-
errors: res.errors
|
|
184
|
-
};
|
|
185
|
-
} finally {
|
|
186
|
-
if (!index) own.close();
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
function resolveLibraryPublisherDetailed(lib, opts, storeIdentity) {
|
|
190
|
-
const bare = (p) => p.startsWith("@") ? p.slice(1) : p;
|
|
191
|
-
if (opts.publisher?.trim()) return { publisher: bare(opts.publisher.trim()), source: "flag" };
|
|
192
|
-
const declared = loadSkPublishManifest(lib.path)?.publisher?.trim();
|
|
193
|
-
if (declared) return { publisher: bare(declared), source: "manifest" };
|
|
194
|
-
const identity = (storeIdentity?.githubLogin ?? storeIdentity?.username)?.trim().toLowerCase();
|
|
195
|
-
if (identity && isValidPublisher(identity)) return { publisher: identity, source: "identity" };
|
|
196
|
-
try {
|
|
197
|
-
const slug = slugifyAssetName(lib.name).slice(0, 39).replace(/-+$/, "");
|
|
198
|
-
return { publisher: slug, source: "library-name" };
|
|
199
|
-
} catch {
|
|
200
|
-
return { publisher: "library", source: "library-name" };
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
function warnLibraryNameFallback(libName, resolved, hasPublisherFlag = false) {
|
|
204
|
-
if (resolved.source !== "library-name") return;
|
|
205
|
-
const setLater = `\`skaile library set ${libName} publisher=<name>\``;
|
|
206
|
-
logWarn(
|
|
207
|
-
`No publisher given and not signed in \u2014 using the library name "${resolved.publisher}" as the publisher. ` + (hasPublisherFlag ? `Pass --publisher <name> or run \`skaile store login\`; change it later with ${setLater}.` : `Run \`skaile store login\`, or change it later with ${setLater}.`)
|
|
208
|
-
);
|
|
209
|
-
}
|
|
210
|
-
function normalizeAssetFrontmatter(assetDir) {
|
|
211
|
-
let markerFile = ["SKILL.md", "AGENT.md", "CONTRACT.md"].map((m) => path.join(assetDir, m)).find((f) => fs.existsSync(f));
|
|
212
|
-
if (!markerFile) {
|
|
213
|
-
const promptMd = fs.readdirSync(assetDir).find((f) => f.endsWith(".prompt.md"));
|
|
214
|
-
if (promptMd) markerFile = path.join(assetDir, promptMd);
|
|
215
|
-
}
|
|
216
|
-
if (!markerFile) return;
|
|
217
|
-
try {
|
|
218
|
-
const { data, body } = parseFrontmatter(fs.readFileSync(markerFile, "utf8"));
|
|
219
|
-
const fm = stringify(data).trimEnd();
|
|
220
|
-
fs.writeFileSync(markerFile, `---
|
|
221
|
-
${fm}
|
|
222
|
-
---
|
|
223
|
-
|
|
224
|
-
${body}
|
|
225
|
-
`, "utf8");
|
|
226
|
-
} catch {
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
async function registerLibraryAsset(lib, index, input) {
|
|
230
|
-
const { publisher, source } = resolveLibraryPublisherDetailed(
|
|
231
|
-
lib,
|
|
232
|
-
{ publisher: input.publisher },
|
|
233
|
-
getStoreIdentity()
|
|
234
|
-
);
|
|
235
|
-
warnLibraryNameFallback(lib.name, { publisher, source }, true);
|
|
236
|
-
normalizeAssetFrontmatter(input.assetDir);
|
|
237
|
-
stampManifestPublisher(lib.path, publisher);
|
|
238
|
-
upsertManifestAsset(lib.path, {
|
|
239
|
-
kind: input.kind,
|
|
240
|
-
name: input.name,
|
|
241
|
-
root: path.relative(lib.path, input.assetDir) || input.name,
|
|
242
|
-
version: input.version,
|
|
243
|
-
publisher
|
|
244
|
-
});
|
|
245
|
-
const idx = await indexLibrary(lib, index);
|
|
246
|
-
for (const e of idx.errors) logWarn(e);
|
|
247
|
-
return { publisher, ref: refFor(input.kind, publisher, input.name, input.version) };
|
|
248
|
-
}
|
|
249
|
-
var LIBRARY_UPGRADE_DOCS = "https://github.com/skaile-ai/workspaces/blob/main/docs/sections/cli/commands/library.md#upgrading-a-4x-library";
|
|
250
|
-
var DOMAIN_REMOVED_HINT = `Domains were removed in 5.0 \u2014 delete DOMAIN.md files; group assets with .claude-plugin/marketplace.json. See ${LIBRARY_UPGRADE_DOCS}`;
|
|
251
|
-
function removedDomainOption() {
|
|
252
|
-
return new Option("--domain <domain>", "Removed in 5.0").hideHelp();
|
|
253
|
-
}
|
|
254
|
-
function rejectRemovedDomainOption(opts) {
|
|
255
|
-
if (opts.domain === void 0) return;
|
|
256
|
-
logErr(DOMAIN_REMOVED_HINT);
|
|
257
|
-
process.exit(1);
|
|
258
|
-
}
|
|
259
|
-
function findFiles(root, match) {
|
|
260
|
-
const found = [];
|
|
261
|
-
const walk = (dir) => {
|
|
262
|
-
let entries;
|
|
263
|
-
try {
|
|
264
|
-
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
265
|
-
} catch {
|
|
266
|
-
return;
|
|
267
|
-
}
|
|
268
|
-
for (const entry of entries) {
|
|
269
|
-
if (entry.isDirectory()) {
|
|
270
|
-
if (!entry.name.startsWith(".") && entry.name !== "node_modules") {
|
|
271
|
-
walk(path.join(dir, entry.name));
|
|
272
|
-
}
|
|
273
|
-
} else if (match(entry.name)) {
|
|
274
|
-
found.push(path.join(dir, entry.name));
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
};
|
|
278
|
-
walk(root);
|
|
279
|
-
return found;
|
|
280
|
-
}
|
|
281
|
-
function countDomainFiles(root) {
|
|
282
|
-
return findFiles(root, (name) => name === "DOMAIN.md").length;
|
|
283
|
-
}
|
|
284
|
-
function warnIgnoredDomainFiles(root) {
|
|
285
|
-
const count = countDomainFiles(root);
|
|
286
|
-
if (count > 0) {
|
|
287
|
-
logWarn(
|
|
288
|
-
`${count} DOMAIN.md file(s) are ignored since 5.0 (domains were removed) \u2014 delete them; group assets with .claude-plugin/marketplace.json. See ${LIBRARY_UPGRADE_DOCS}`
|
|
289
|
-
);
|
|
290
|
-
}
|
|
291
|
-
return count;
|
|
292
|
-
}
|
|
293
|
-
function warnLegacyBundleFiles(root) {
|
|
294
|
-
const files = findFiles(root, (name) => name.endsWith(".bundle.yaml"));
|
|
295
|
-
if (files.length > 0) {
|
|
296
|
-
const shown = files.slice(0, 5).map((f) => path.relative(root, f) || f);
|
|
297
|
-
const more = files.length > shown.length ? `, +${files.length - shown.length} more` : "";
|
|
298
|
-
logWarn(
|
|
299
|
-
`${files.length} *.bundle.yaml file(s) are not scanned (the bundle kind became preset): ${shown.join(", ")}${more}. Run \`skaile migrate assets ${root} --write\` to rename them to *.preset.yaml. See ${LIBRARY_UPGRADE_DOCS}`
|
|
300
|
-
);
|
|
301
|
-
}
|
|
302
|
-
return files.length;
|
|
303
|
-
}
|
|
304
|
-
var BODY_PLACEHOLDER_BY_KIND = {
|
|
305
|
-
skill: SKILL_BODY_PLACEHOLDER,
|
|
306
|
-
agent: AGENT_BODY_PLACEHOLDER,
|
|
307
|
-
prompt: PROMPT_BODY_PLACEHOLDER,
|
|
308
|
-
contract: CONTRACT_BODY_PLACEHOLDER
|
|
309
|
-
};
|
|
310
|
-
var MARKDOWN_SCAFFOLD_KINDS = {
|
|
311
|
-
skill: true,
|
|
312
|
-
agent: true,
|
|
313
|
-
prompt: true,
|
|
314
|
-
contract: true
|
|
315
|
-
};
|
|
316
|
-
var FLOW_DESCRIPTION_PLACEHOLDER = "Flow description";
|
|
317
|
-
function checkAssetManifest(kind, parsed, body, dirName) {
|
|
318
|
-
const out = [];
|
|
319
|
-
if (kind === "skill") {
|
|
320
|
-
for (const f of checkAgentSkillConformance(parsed, { dirName })) {
|
|
321
|
-
out.push({ tag: "skill conformance", text: `${f.field}: ${f.message}`, conformance: true });
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
if (MARKDOWN_SCAFFOLD_KINDS[kind]) {
|
|
325
|
-
const bodyText = body?.replace(/^#[^\n]*\n+/, "");
|
|
326
|
-
const isPlaceholder = bodyText === SKILL_BODY_PLACEHOLDER || bodyText === BODY_PLACEHOLDER_BY_KIND[kind];
|
|
327
|
-
if (isPlaceholder) {
|
|
328
|
-
const noun = kind === "skill" ? "skill prompt" : kind;
|
|
329
|
-
out.push({
|
|
330
|
-
tag: kind,
|
|
331
|
-
text: `body is still the scaffold placeholder; write the ${noun}`,
|
|
332
|
-
conformance: false
|
|
333
|
-
});
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
return out;
|
|
337
|
-
}
|
|
338
|
-
function declaredVersion(parsed) {
|
|
339
|
-
const scalar = (v) => typeof v === "string" ? v : typeof v === "number" ? String(v) : void 0;
|
|
340
|
-
const meta = parsed.metadata;
|
|
341
|
-
const nested = meta !== null && typeof meta === "object" ? scalar(meta.version) : void 0;
|
|
342
|
-
return scalar(parsed.version) ?? nested;
|
|
343
|
-
}
|
|
344
|
-
function invalidSemverText(version) {
|
|
345
|
-
return SEMVER_RE.test(version) ? void 0 : `version "${version}" is not valid semver`;
|
|
346
|
-
}
|
|
347
|
-
function duplicateAssetMessage(kind, name, dir, detail, library) {
|
|
348
|
-
return `${kind}:${name} found in ${dir} but ${detail}. Rename or delete one of the two directories, then re-run \`skaile library index ${library}\`.`;
|
|
349
|
-
}
|
|
350
|
-
var DEFAULT_VERSION = "0.1.0";
|
|
351
|
-
var SCAFFOLD_KINDS = {
|
|
352
|
-
skill: true,
|
|
353
|
-
agent: true,
|
|
354
|
-
prompt: true,
|
|
355
|
-
contract: true,
|
|
356
|
-
flow: true,
|
|
357
|
-
preset: true
|
|
358
|
-
};
|
|
359
|
-
function withManifestDefaults(kind, parsed) {
|
|
360
|
-
if (!SCAFFOLD_KINDS[kind]) return parsed;
|
|
361
|
-
const out = { ...parsed };
|
|
362
|
-
if (out.metadata === null) delete out.metadata;
|
|
363
|
-
const meta = out.metadata;
|
|
364
|
-
const nested = typeof meta === "object" && meta !== null && "version" in meta ? meta.version : void 0;
|
|
365
|
-
if (out.version == null && nested == null) out.version = DEFAULT_VERSION;
|
|
366
|
-
return out;
|
|
367
|
-
}
|
|
368
|
-
function manifestIdentityError(kind, parsed) {
|
|
369
|
-
const identity = kind === "flow" ? parsed.id : parsed.name;
|
|
370
|
-
if (typeof identity !== "string" || identity.length === 0) return void 0;
|
|
371
|
-
const publisher = typeof parsed.publisher === "string" ? parsed.publisher : void 0;
|
|
372
|
-
if (publisher !== void 0) {
|
|
373
|
-
try {
|
|
374
|
-
parseAssetRef(`${kind}:@${publisher}/${identity}`);
|
|
375
|
-
return void 0;
|
|
376
|
-
} catch (e) {
|
|
377
|
-
return e instanceof Error ? e.message : String(e);
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
if (!isValidAssetName(identity)) {
|
|
381
|
-
return `invalid asset ${kind === "flow" ? "id" : "name"} "${identity}" \u2014 ${ASSET_NAME_HINT}`;
|
|
382
|
-
}
|
|
383
|
-
return void 0;
|
|
384
|
-
}
|
|
385
|
-
function scaffoldDefinitionErrors(kind, parsed) {
|
|
386
|
-
const out = [];
|
|
387
|
-
if (kind === "flow") {
|
|
388
|
-
if (parsed.description === FLOW_DESCRIPTION_PLACEHOLDER) {
|
|
389
|
-
out.push("description is still the scaffold placeholder; say what the flow does");
|
|
390
|
-
}
|
|
391
|
-
if (Array.isArray(parsed.nodes) && parsed.nodes.length === 0) {
|
|
392
|
-
out.push("nodes is still the scaffold placeholder (nodes: []); add the flow's nodes");
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
if (kind === "preset") {
|
|
396
|
-
if (parsed.description === PRESET_DESCRIPTION_PLACEHOLDER) {
|
|
397
|
-
out.push(
|
|
398
|
-
`description is still the scaffold placeholder ("${PRESET_DESCRIPTION_PLACEHOLDER}"); say what the preset does`
|
|
399
|
-
);
|
|
400
|
-
}
|
|
401
|
-
const items = Array.isArray(parsed.items) ? parsed.items : [];
|
|
402
|
-
const placeholderItem = items.some((item) => {
|
|
403
|
-
const ref = typeof item === "string" ? item : item?.ref;
|
|
404
|
-
return typeof ref === "string" && ref.trim() === PRESET_ITEM_PLACEHOLDER_REF;
|
|
405
|
-
});
|
|
406
|
-
if (placeholderItem) {
|
|
407
|
-
out.push(
|
|
408
|
-
`item ${PRESET_ITEM_PLACEHOLDER_REF} is still the scaffold placeholder; replace it with the preset's real items`
|
|
409
|
-
);
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
return out;
|
|
413
|
-
}
|
|
414
|
-
function checkAsset(kind, parsed, body, dirName, registry) {
|
|
415
|
-
const errors = [];
|
|
416
|
-
const error = (text) => {
|
|
417
|
-
errors.push({ tag: kind, text, conformance: false });
|
|
418
|
-
};
|
|
419
|
-
const identity = manifestIdentityError(kind, parsed);
|
|
420
|
-
if (identity) error(identity);
|
|
421
|
-
const version = declaredVersion(parsed);
|
|
422
|
-
const semver = version === void 0 ? void 0 : invalidSemverText(version);
|
|
423
|
-
if (semver) error(semver);
|
|
424
|
-
const effective = withManifestDefaults(kind, parsed);
|
|
425
|
-
const versionKey = ["skill", "prompt", "contract"].includes(kind) ? "metadata.version" : "version";
|
|
426
|
-
const provider = registry.getProvider(kind);
|
|
427
|
-
if (!provider) {
|
|
428
|
-
error(`unknown_asset_kind: kind "${kind}" is not registered`);
|
|
429
|
-
} else {
|
|
430
|
-
const result = provider.validateManifest(effective);
|
|
431
|
-
if (!result.ok) {
|
|
432
|
-
for (const e of result.errors) {
|
|
433
|
-
if (e.path === "version" || e.path === "metadata.version") {
|
|
434
|
-
if (!semver) {
|
|
435
|
-
error(`${e.path}: must be a semver string \u2014 set ${versionKey}: ${DEFAULT_VERSION}`);
|
|
436
|
-
}
|
|
437
|
-
continue;
|
|
438
|
-
}
|
|
439
|
-
error(`${e.path ? `${e.path}: ` : ""}${e.message}`);
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
const description = parsed.description;
|
|
444
|
-
if (kind !== "skill" && typeof description === "string" && description.trim().startsWith(SKILL_DESCRIPTION_PLACEHOLDER_PREFIX)) {
|
|
445
|
-
error(
|
|
446
|
-
`description: description is still the scaffold placeholder (${SKILL_DESCRIPTION_PLACEHOLDER_PREFIX} \u2026) \u2014 say what the ${kind} does and when to use it`
|
|
447
|
-
);
|
|
448
|
-
}
|
|
449
|
-
for (const text of scaffoldDefinitionErrors(kind, parsed)) error(text);
|
|
450
|
-
if (kind === "flow") {
|
|
451
|
-
const flow = parseFlowDefinition(effective);
|
|
452
|
-
if (!flow.ok) {
|
|
453
|
-
for (const e of flow.errors) {
|
|
454
|
-
error(`invalid flow definition: ${e.path || "<root>"}: ${e.message}`);
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
return { errors, advisories: checkAssetManifest(kind, parsed, body, dirName) };
|
|
459
|
-
}
|
|
460
|
-
function findAssetManifestFile(dir, kind, name) {
|
|
461
|
-
const candidates = [];
|
|
462
|
-
if (kind === "skill") candidates.push("SKILL.md");
|
|
463
|
-
else if (kind === "agent") candidates.push("agent.yaml", "AGENT.md");
|
|
464
|
-
else if (kind === "contract") candidates.push("CONTRACT.md");
|
|
465
|
-
else if (kind === "prompt") candidates.push(`${name}.prompt.md`);
|
|
466
|
-
else if (kind === "flow") candidates.push(`${name}.flow.yaml`, `${name}.flow.json`);
|
|
467
|
-
else if (kind === "preset") candidates.push(`${name}.preset.yaml`);
|
|
468
|
-
for (const c of candidates) {
|
|
469
|
-
const file = path.join(dir, c);
|
|
470
|
-
if (fs.existsSync(file)) return file;
|
|
471
|
-
}
|
|
472
|
-
const suffix = kind === "prompt" ? ".prompt.md" : kind === "flow" ? ".flow.yaml" : kind === "preset" ? ".preset.yaml" : null;
|
|
473
|
-
if (suffix && fs.existsSync(dir)) {
|
|
474
|
-
const matches = fs.readdirSync(dir).filter((f) => f.endsWith(suffix));
|
|
475
|
-
if (matches.length === 1) return path.join(dir, matches[0]);
|
|
476
|
-
}
|
|
477
|
-
return null;
|
|
478
|
-
}
|
|
479
|
-
function readAssetBody(file, text) {
|
|
480
|
-
if (file.endsWith(".md")) return parseFrontmatter(text).body;
|
|
481
|
-
if (path.basename(file) !== "agent.yaml") return void 0;
|
|
482
|
-
const soul = path.join(path.dirname(file), "SOUL.md");
|
|
483
|
-
return fs.existsSync(soul) ? fs.readFileSync(soul, "utf8").trim() : void 0;
|
|
484
|
-
}
|
|
485
|
-
function checkAssetFile(file, kind, registry) {
|
|
486
|
-
let text;
|
|
487
|
-
try {
|
|
488
|
-
text = fs.readFileSync(file, "utf8");
|
|
489
|
-
} catch {
|
|
490
|
-
return [];
|
|
491
|
-
}
|
|
492
|
-
const res = parseManifestFile(file, text);
|
|
493
|
-
if (!res.ok) return [];
|
|
494
|
-
return checkAsset(
|
|
495
|
-
kind,
|
|
496
|
-
res.data,
|
|
497
|
-
readAssetBody(file, text),
|
|
498
|
-
path.basename(path.dirname(file)),
|
|
499
|
-
registry
|
|
500
|
-
).errors;
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
export { DOMAIN_REMOVED_HINT, checkAsset, checkAssetFile, declaredVersion, duplicateAssetMessage, exitOnManifestPublisherProblems, findAssetManifestFile, indexLibrary, invalidSemverText, manifestPublisherProblems, manifestRequiresProblems, readAssetBody, registerLibraryAsset, rejectRemovedDomainOption, removedDomainOption, requireValidPublisherOrExit, resolveLibraryPublisherDetailed, unresolvedManifestDependencies, warnIgnoredDomainFiles, warnLegacyBundleFiles, warnLibraryNameFallback };
|
|
504
|
-
//# sourceMappingURL=chunk-YOH2L76X.js.map
|
|
505
|
-
//# sourceMappingURL=chunk-YOH2L76X.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../cli/src/commands/library-index.ts","../cli/src/skill-checks.ts"],"names":["parseYaml","stringifyYaml","path2","fs2"],"mappings":"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","file":"chunk-YOH2L76X.js","sourcesContent":["/**\n * library-index.ts — index a user library's on-disk assets into the shared\n * `asset_definitions` index so `add` / `asset install` / `search --local` can\n * resolve them, plus publisher resolution for a freshly-created asset.\n *\n * A `library create`d asset is bytes on disk only until it is indexed; the\n * index is what every resolution path reads. Indexing reuses the same\n * `LocalCatalogSource.sync()` engine `source add`/`sync` run — a library is\n * scanned + upserted keyed by `library_id = lib.id`.\n *\n * @docLink cli/commands/library\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport {\n isValidPublisher,\n loadSkPublishManifest,\n matchPin,\n parseDep,\n parseFrontmatter,\n PUBLISHER_HINT,\n SKAILE_MANIFEST_FILENAME,\n slugifyAssetName,\n} from \"@skaile/workspaces/core\";\nimport { type DiscoveredAsset, requiresSyntaxErrors } from \"@skaile/workspaces/discovery\";\nimport {\n type Library,\n LocalIndex,\n resolveIndexPath,\n stampManifestPublisher,\n upsertManifestAsset,\n} from \"@skaile/workspaces/library\";\nimport { Option } from \"commander\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { logErr, logWarn } from \"../helpers.ts\";\nimport { openLibrary } from \"../open-library.ts\";\nimport { getKindRegistry } from \"../open-registry.ts\";\nimport { getStoreIdentity } from \"../store-auth.ts\";\nimport { refFor } from \"./publish-core.ts\";\n\n/** One malformed `assets[].dependencies` entry of a library's `skaile.manifest.yaml`. */\nexport interface ManifestRequiresProblem {\n /** `kind:name` of the manifest asset that declares the entry. */\n asset: string;\n /** `ManifestRequiresError: invalid requires entry \"<entry>\"` — the text discovery reports. */\n message: string;\n}\n\n/**\n * Check every `assets[].dependencies` entry of `<dir>/skaile.manifest.yaml` with\n * the discovery syntax rule. Reads the raw YAML on purpose: `decodeSkaileManifest`\n * drops a malformed dependency (with a warning) before discovery or the index ever\n * sees it, so only the raw text can say which entry is wrong. Shared by\n * `skaile validate` and `skaile library index`, so both fail with the same message.\n */\nexport function manifestRequiresProblems(dir: string): ManifestRequiresProblem[] {\n const file = path.join(dir, \"skaile.manifest.yaml\");\n let doc: unknown;\n try {\n doc = parseYaml(fs.readFileSync(file, \"utf-8\"));\n } catch {\n return []; // absent / unparsable: reported by the loaders that own that failure\n }\n const assets = (doc as { assets?: unknown } | null)?.assets;\n if (!Array.isArray(assets)) return [];\n const problems: ManifestRequiresProblem[] = [];\n for (const a of assets) {\n if (!a || typeof a !== \"object\") continue;\n const { kind, name, dependencies } = a as Record<string, unknown>;\n if (!Array.isArray(dependencies)) continue;\n const entries = dependencies.map((d) => (typeof d === \"string\" ? d : String(d)));\n for (const message of requiresSyntaxErrors(entries)) {\n problems.push({\n asset: `${String(kind)}:${String(name)}`,\n message: `ManifestRequiresError: ${message}`,\n });\n }\n }\n return problems;\n}\n\n/**\n * `publisher/kind:name` → the versions registered libraries hold, read offline: the library\n * at `dir` itself (its manifest), the assets in the local index (`index.db`) and the manifest\n * of every library the index lists. The index never gets created for this: no `index.db`\n * means only `dir` counts.\n */\nasync function knownAssetVersions(dir: string): Promise<Record<string, string[]>> {\n const known: Record<string, string[]> = {};\n const add = (publisher: string | undefined, kind: string, name: string, version?: string) => {\n if (!publisher) return;\n const key = `${publisher.replace(/^@/, \"\")}/${kind}:${name}`;\n const versions = known[key] ?? [];\n if (version && !versions.includes(version)) versions.push(version);\n known[key] = versions;\n };\n const addManifest = (libPath: string): void => {\n const manifest = loadSkPublishManifest(libPath);\n for (const a of manifest?.assets ?? []) {\n add(a.publisher ?? manifest?.publisher, a.kind, a.name, a.version);\n }\n };\n addManifest(dir);\n const indexPath = resolveIndexPath();\n if (!fs.existsSync(indexPath)) return known;\n const index = new LocalIndex({ indexPath, kindRegistry: getKindRegistry() });\n try {\n for (const def of await index.listAssetDefs())\n add(def.publisher, def.kind, def.name, def.version);\n for (const lib of await index.listSources()) {\n if (path.resolve(lib.path) !== path.resolve(dir) && fs.existsSync(lib.path)) {\n addManifest(lib.path);\n }\n }\n } catch {\n // An unreadable index only narrows what counts as known.\n } finally {\n index.close();\n }\n return known;\n}\n\n/**\n * One warning line per `assets[].dependencies` entry of `<dir>/skaile.manifest.yaml` that no\n * registered library (nor the library itself) holds, or whose `#version` pin matches none of\n * the versions held. Offline: it never asks the store, so a store-only dependency is\n * reported too — the line says what was checked. Entries with invalid syntax are\n * {@link manifestRequiresProblems}' to report. Shared by `skaile validate` and `skaile library index`.\n */\nexport async function unresolvedManifestDependencies(dir: string): Promise<string[]> {\n let doc: unknown;\n try {\n doc = parseYaml(fs.readFileSync(path.join(dir, SKAILE_MANIFEST_FILENAME), \"utf-8\"));\n } catch {\n return [];\n }\n const assets = (doc as { assets?: unknown } | null)?.assets;\n if (!Array.isArray(assets)) return [];\n const wanted: Array<{ asset: string; entry: string }> = [];\n for (const a of assets) {\n if (!a || typeof a !== \"object\") continue;\n const { kind, name, dependencies } = a as Record<string, unknown>;\n if (!Array.isArray(dependencies)) continue;\n for (const d of dependencies) {\n const entry = typeof d === \"string\" ? d : String(d);\n if (requiresSyntaxErrors([entry]).length === 0) {\n wanted.push({ asset: `${String(kind)}:${String(name)}`, entry });\n }\n }\n }\n if (wanted.length === 0) return [];\n const known = await knownAssetVersions(dir);\n const out: string[] = [];\n for (const { asset, entry } of wanted) {\n const dep = parseDep(entry);\n if (!dep.publisher) continue; // the syntax check reports a publisher-less entry\n const versions = known[`${dep.publisher}/${dep.kind}:${dep.name}`];\n const prefix = `${SKAILE_MANIFEST_FILENAME} [assets] — ${asset}: dependency \"${entry}\"`;\n if (!versions) {\n out.push(\n `${prefix} is not held by any registered library (checked offline: this library and the local index; the store was not asked).`,\n );\n } else if (dep.pin && versions.length > 0 && !versions.some((v) => matchPin(dep.pin, v))) {\n out.push(\n `${prefix} has no version matching \"${dep.pin}\" in any registered library (held: ${versions.join(\", \")}).`,\n );\n }\n }\n return out;\n}\n\n/** The one refusal text for a publisher that fails {@link isValidPublisher}. */\nexport function invalidPublisherMessage(raw: string): string {\n return `Invalid publisher \"${raw}\": ${PUBLISHER_HINT}.`;\n}\n\n/**\n * Validate a publisher typed on the command line (`--publisher`, `library set\n * <lib> publisher=`): strip a leading `@`, and exit 1 with {@link invalidPublisherMessage}\n * when it is not a valid slug. Returns the bare publisher.\n */\nexport function requireValidPublisherOrExit(raw: string): string {\n const bare = raw.trim().replace(/^@/, \"\");\n if (!isValidPublisher(bare)) {\n logErr(invalidPublisherMessage(raw));\n process.exit(1);\n }\n return bare;\n}\n\n/**\n * Every publisher in `<dir>/skaile.manifest.yaml` (top-level and `assets[].publisher`)\n * that is not a valid slug, one message each. Reads the raw YAML like\n * {@link manifestRequiresProblems}. Shared by `skaile validate`, `skaile library index`\n * and the publish plan, so all three refuse a publisher with the same text.\n */\nexport function manifestPublisherProblems(dir: string): string[] {\n let doc: unknown;\n try {\n doc = parseYaml(fs.readFileSync(path.join(dir, SKAILE_MANIFEST_FILENAME), \"utf-8\"));\n } catch {\n return []; // absent / unparsable: reported by the loaders that own that failure\n }\n if (!doc || typeof doc !== \"object\") return [];\n const { publisher, assets } = doc as { publisher?: unknown; assets?: unknown };\n const problems: string[] = [];\n const check = (value: unknown, where: string): void => {\n if (typeof value !== \"string\") return;\n if (!isValidPublisher(value.trim().replace(/^@/, \"\"))) {\n problems.push(`${SKAILE_MANIFEST_FILENAME} ${where} — ${invalidPublisherMessage(value)}`);\n }\n };\n check(publisher, \"[publisher]\");\n if (Array.isArray(assets)) {\n for (const a of assets) {\n if (!a || typeof a !== \"object\") continue;\n const { kind, name, publisher: assetPublisher } = a as Record<string, unknown>;\n check(assetPublisher, `[assets] ${String(kind)}:${String(name)}`);\n }\n }\n return problems;\n}\n\n/**\n * Exit 1 when `<dir>/skaile.manifest.yaml` names a publisher that is not a valid slug\n * ({@link manifestPublisherProblems}); the refusal `library create`, `asset import`,\n * `library index` and the publish plan share. `libName` is the registered library.\n */\nexport function exitOnManifestPublisherProblems(dir: string, libName: string): void {\n const problems = manifestPublisherProblems(dir);\n if (problems.length === 0) return;\n for (const message of problems) logErr(message);\n logErr(\n `Fix the publisher in ${SKAILE_MANIFEST_FILENAME} (\\`skaile library set ${libName} publisher=<name>\\` rewrites the library's own), then re-run.`,\n );\n process.exit(1);\n}\n\n/** Discovery result surfaced by {@link indexLibrary}. */\nexport interface IndexLibraryResult {\n /** Assets discovered on disk under the library root. */\n assetsFound: number;\n /** Assets upserted into `asset_definitions`. */\n assetsUpdated: number;\n /** Fatal per-asset errors (never advisories). */\n errors: string[];\n}\n\n/**\n * Index a library's assets into the shared `asset_definitions` index.\n *\n * Runs `LocalCatalogSource.sync()` against the library's `path` keyed by\n * `library_id = lib.id`. Pass an already-open {@link LocalIndex} (e.g. the one\n * `openLibraryManager()` holds) to reuse the single connection — the caller then\n * owns closing it. With no `index` a fresh handle is opened and closed here.\n * `exclude` leaves matching discovered assets out of the index (`library index`\n * uses it for assets it refused to write into the manifest).\n * Returns the sync counters so a caller can report `Indexed N asset(s)`.\n */\nexport async function indexLibrary(\n lib: Library,\n index?: LocalIndex,\n opts: { exclude?: (asset: DiscoveredAsset) => boolean } = {},\n): Promise<IndexLibraryResult> {\n const { LocalCatalogSource } = await import(\"@skaile/workspaces/library\");\n const own = index ?? (await openLibrary());\n try {\n const source = new LocalCatalogSource(own, lib.id, lib.path, getKindRegistry());\n const res = await source.sync({ exclude: opts.exclude });\n if (res.pruned.length > 0) {\n // The index keeps one row per ref, so the rows this sync removed may be the\n // copy another library still holds (a library re-published a ref under a new\n // publisher). Put them back from that library's own directory.\n const lost = new Set(res.pruned);\n for (const other of await own.listSources()) {\n if (other.id === lib.id || other.backend !== \"local\" || !other.path) continue;\n if (!fs.existsSync(other.path)) continue;\n await new LocalCatalogSource(own, other.id, other.path, getKindRegistry()).sync({\n only: lost,\n });\n }\n }\n return {\n assetsFound: res.assetsFound,\n assetsUpdated: res.assetsUpdated,\n errors: res.errors,\n };\n } finally {\n if (!index) own.close();\n }\n}\n\n/** Where {@link resolveLibraryPublisherDetailed} found the publisher. */\nexport type LibraryPublisherSource = \"flag\" | \"manifest\" | \"identity\" | \"library-name\";\n\n/**\n * Resolve the publisher for an asset created inside a library. Never throws.\n *\n * Fallback chain (first hit wins):\n * 1. `opts.publisher` (an explicit `--publisher`),\n * 2. the library manifest's top-level `publisher` (`skaile.manifest.yaml`),\n * 3. the author's verified store identity (`githubLogin`, else `username`)\n * when signed in — the publisher they can actually publish under,\n * 4. the kebab-cased library name (e.g. `My Lib` → `my-lib`) as a last resort.\n *\n * The publisher is never derived from where the asset sits in the library:\n * every asset inherits the library's publisher unless it sets its own.\n *\n * Identity beats the library name because the library name is almost never a\n * namespace the author can publish; stamping it led to publishes that only\n * failed at the store. Passed in (not read here) to keep this pure + testable.\n *\n * @param lib - The target library.\n * @param opts - Optional explicit `--publisher`.\n * @param storeIdentity - The author's decoded store identity, or null when signed out.\n * @returns The bare publisher and which link of the chain supplied it.\n */\nexport function resolveLibraryPublisherDetailed(\n lib: Pick<Library, \"name\" | \"path\">,\n opts: { publisher?: string },\n storeIdentity?: { username?: string; githubLogin?: string } | null,\n): { publisher: string; source: LibraryPublisherSource } {\n const bare = (p: string) => (p.startsWith(\"@\") ? p.slice(1) : p);\n if (opts.publisher?.trim()) return { publisher: bare(opts.publisher.trim()), source: \"flag\" };\n const declared = loadSkPublishManifest(lib.path)?.publisher?.trim();\n if (declared) return { publisher: bare(declared), source: \"manifest\" };\n // A login is case-insensitive on GitHub, so fold it to the lowercase slug; one that\n // still fails the slug rule falls through to the library name.\n const identity = (storeIdentity?.githubLogin ?? storeIdentity?.username)?.trim().toLowerCase();\n if (identity && isValidPublisher(identity)) return { publisher: identity, source: \"identity\" };\n // slugifyAssetName throws on a name with no [a-z0-9] — keep the chain total. The slug is\n // cut to 39 characters so the fallback always passes the publisher rule.\n try {\n const slug = slugifyAssetName(lib.name).slice(0, 39).replace(/-+$/, \"\");\n return { publisher: slug, source: \"library-name\" };\n } catch {\n return { publisher: \"library\", source: \"library-name\" };\n }\n}\n\n/** {@link resolveLibraryPublisherDetailed} without the provenance. */\nexport function resolveLibraryPublisher(\n lib: Pick<Library, \"name\" | \"path\">,\n opts: { publisher?: string },\n storeIdentity?: { username?: string; githubLogin?: string } | null,\n): string {\n return resolveLibraryPublisherDetailed(lib, opts, storeIdentity).publisher;\n}\n\n/**\n * Warn that an asset's publisher fell back to the library name — the one text\n * `library create`, `asset import`, `library index` and the `init` adopt path\n * share. Prints nothing for any other {@link LibraryPublisherSource}.\n *\n * `hasPublisherFlag` is true for the commands that take `--publisher` (`create`,\n * `asset import`); `init` and `index` do not, so they must not advise it.\n */\nexport function warnLibraryNameFallback(\n libName: string,\n resolved: { publisher: string; source: LibraryPublisherSource },\n hasPublisherFlag = false,\n): void {\n if (resolved.source !== \"library-name\") return;\n const setLater = `\\`skaile library set ${libName} publisher=<name>\\``;\n logWarn(\n `No publisher given and not signed in — using the library name \"${resolved.publisher}\" as the publisher. ` +\n (hasPublisherFlag\n ? `Pass --publisher <name> or run \\`skaile store login\\`; change it later with ${setLater}.`\n : `Run \\`skaile store login\\`, or change it later with ${setLater}.`),\n );\n}\n\n/**\n * Re-serialise a freshly written asset's markdown marker (SKILL.md / AGENT.md /\n * CONTRACT.md / `*.prompt.md`) so `library create` and `asset import` leave the\n * same canonical frontmatter (`version: 0.1.0`, not the scaffold's quoted\n * `version: \"0.1.0\"`). Never adds or changes a key — the publisher lives in the\n * manifest only. A YAML marker (flow / preset) or an unparsable file is left\n * untouched.\n */\nfunction normalizeAssetFrontmatter(assetDir: string): void {\n let markerFile = [\"SKILL.md\", \"AGENT.md\", \"CONTRACT.md\"]\n .map((m) => path.join(assetDir, m))\n .find((f) => fs.existsSync(f));\n if (!markerFile) {\n // Only a `.prompt.md` marker carries asset frontmatter — never a bare `.md`\n // catch-all, which would rewrite (and corrupt) a template's README/CHANGELOG.\n const promptMd = fs.readdirSync(assetDir).find((f) => f.endsWith(\".prompt.md\"));\n if (promptMd) markerFile = path.join(assetDir, promptMd);\n }\n if (!markerFile) return;\n try {\n const { data, body } = parseFrontmatter(fs.readFileSync(markerFile, \"utf8\"));\n const fm = stringifyYaml(data).trimEnd();\n fs.writeFileSync(markerFile, `---\\n${fm}\\n---\\n\\n${body}\\n`, \"utf8\");\n } catch {\n // Non-fatal — the file stays as written.\n }\n}\n\n/** What {@link registerLibraryAsset} needs to know about the asset that just landed in a library. */\nexport interface RegisterLibraryAssetInput {\n kind: string;\n name: string;\n /** Absolute directory of the asset inside the library. */\n assetDir: string;\n /** Version written to the manifest entry and the printed ref. */\n version: string;\n /** Explicit `--publisher`. */\n publisher?: string;\n}\n\n/**\n * Make an asset that was just written into a library consumable — the shared\n * tail of `library create` and `asset import`, so both produce the same\n * manifest entry, frontmatter shape and index rows:\n * 1. resolve the publisher ({@link resolveLibraryPublisherDetailed}); when it\n * came from the library-name fallback, warn once how to set a real one,\n * 2. stamp it into the manifest's top-level `publisher` (first writer wins) —\n * the manifest is the only place a publisher lives; the asset file is\n * left untouched,\n * 3. upsert the manifest `assets[]` entry (`library publish` ships only that\n * inventory),\n * 4. index the library so `add` / `search --local` find the asset at once.\n *\n * @returns the bare publisher and the canonical ref (`kind:@pub/name#version`).\n */\nexport async function registerLibraryAsset(\n lib: Library,\n index: LocalIndex,\n input: RegisterLibraryAssetInput,\n): Promise<{ publisher: string; ref: string }> {\n const { publisher, source } = resolveLibraryPublisherDetailed(\n lib,\n { publisher: input.publisher },\n getStoreIdentity(),\n );\n warnLibraryNameFallback(lib.name, { publisher, source }, true);\n normalizeAssetFrontmatter(input.assetDir);\n stampManifestPublisher(lib.path, publisher);\n upsertManifestAsset(lib.path, {\n kind: input.kind,\n name: input.name,\n root: path.relative(lib.path, input.assetDir) || input.name,\n version: input.version,\n publisher,\n });\n const idx = await indexLibrary(lib, index);\n for (const e of idx.errors) logWarn(e);\n return { publisher, ref: refFor(input.kind, publisher, input.name, input.version) };\n}\n\n/** Where an npm user reads the 4.x → 5.x library upgrade (MIGRATION.md is not in the package). */\nexport const LIBRARY_UPGRADE_DOCS =\n \"https://github.com/skaile-ai/workspaces/blob/main/docs/sections/cli/commands/library.md#upgrading-a-4x-library\";\n\n/** What replaced `DOMAIN.md`: 5.0 removed domains. */\nexport const DOMAIN_REMOVED_HINT = `Domains were removed in 5.0 — delete DOMAIN.md files; group assets with .claude-plugin/marketplace.json. See ${LIBRARY_UPGRADE_DOCS}`;\n\n/** Hidden `--domain <domain>` option: 4.x muscle memory gets {@link DOMAIN_REMOVED_HINT}, not \"unknown option\". */\nexport function removedDomainOption(): Option {\n return new Option(\"--domain <domain>\", \"Removed in 5.0\").hideHelp();\n}\n\n/** Exit 1 with {@link DOMAIN_REMOVED_HINT} when the removed `--domain` option was passed. */\nexport function rejectRemovedDomainOption(opts: { domain?: unknown }): void {\n if (opts.domain === undefined) return;\n logErr(DOMAIN_REMOVED_HINT);\n process.exit(1);\n}\n\n/** Collect the files below `root` whose name satisfies `match`, skipping dot-dirs and `node_modules`. */\nfunction findFiles(root: string, match: (name: string) => boolean): string[] {\n const found: string[] = [];\n const walk = (dir: string): void => {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (!entry.name.startsWith(\".\") && entry.name !== \"node_modules\") {\n walk(path.join(dir, entry.name));\n }\n } else if (match(entry.name)) {\n found.push(path.join(dir, entry.name));\n }\n }\n };\n walk(root);\n return found;\n}\n\n/** Count `DOMAIN.md` files below `root`, skipping dot-dirs and `node_modules`. */\nexport function countDomainFiles(root: string): number {\n return findFiles(root, (name) => name === \"DOMAIN.md\").length;\n}\n\n/**\n * Print ONE warning when `root` still holds `DOMAIN.md` files: since 5.0 they\n * are ignored silently, so without this an author never learns why grouping\n * stopped working. Warning only - never changes an exit code.\n *\n * @returns the number of `DOMAIN.md` files found.\n */\nexport function warnIgnoredDomainFiles(root: string): number {\n const count = countDomainFiles(root);\n if (count > 0) {\n logWarn(\n `${count} DOMAIN.md file(s) are ignored since 5.0 (domains were removed) — delete them; ` +\n `group assets with .claude-plugin/marketplace.json. See ${LIBRARY_UPGRADE_DOCS}`,\n );\n }\n return count;\n}\n\n/**\n * Print ONE warning when `root` still holds `*.bundle.yaml` files: the `bundle`\n * kind is gone (now `preset`), so neither `index` nor `validate` scans them.\n * Warning only - never changes an exit code.\n *\n * @returns the number of `*.bundle.yaml` files found.\n */\nexport function warnLegacyBundleFiles(root: string): number {\n const files = findFiles(root, (name) => name.endsWith(\".bundle.yaml\"));\n if (files.length > 0) {\n const shown = files.slice(0, 5).map((f) => path.relative(root, f) || f);\n const more = files.length > shown.length ? `, +${files.length - shown.length} more` : \"\";\n logWarn(\n `${files.length} *.bundle.yaml file(s) are not scanned (the bundle kind became preset): ${shown.join(\", \")}${more}. ` +\n `Run \\`skaile migrate assets ${root} --write\\` to rename them to *.preset.yaml. See ${LIBRARY_UPGRADE_DOCS}`,\n );\n }\n return files.length;\n}\n","/**\n * Per-asset checks shared by `skaile validate`, `skaile library index` and the\n * `library publish` plan, so all three give the same verdict for the same asset\n * file: {@link checkAsset} returns the errors (semver, kind schema, flow\n * definition) and the advisories (agentskills.io conformance, untouched scaffold).\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport {\n ASSET_NAME_HINT,\n checkAgentSkillConformance,\n isValidAssetName,\n parseAssetRef,\n parseFrontmatter,\n} from \"@skaile/workspaces/core\";\nimport { parseManifestFile, SEMVER_RE } from \"@skaile/workspaces/discovery\";\nimport { parseFlowDefinition } from \"@skaile/workspaces/factory-assets/connectors/flow/contract\";\nimport type { IAssetKindRegistry } from \"@skaile/workspaces/plugins\";\nimport {\n AGENT_BODY_PLACEHOLDER,\n CONTRACT_BODY_PLACEHOLDER,\n PRESET_DESCRIPTION_PLACEHOLDER,\n PRESET_ITEM_PLACEHOLDER_REF,\n PROMPT_BODY_PLACEHOLDER,\n SKILL_BODY_PLACEHOLDER,\n SKILL_DESCRIPTION_PLACEHOLDER_PREFIX,\n} from \"@skaile/workspaces/types/manifests\";\n\n/** One advisory finding, printed as `<file> [<tag>] — <text>`. */\nexport interface AssetFinding {\n /** `skill conformance` for agentskills.io findings, else the asset kind. */\n tag: string;\n text: string;\n /** `true` for an agentskills.io conformance finding (`--strict-conformance` escalates these). */\n conformance: boolean;\n}\n\n/** The body `library create` writes per markdown kind (the skill wording is the legacy fallback). */\nconst BODY_PLACEHOLDER_BY_KIND: Record<string, string> = {\n skill: SKILL_BODY_PLACEHOLDER,\n agent: AGENT_BODY_PLACEHOLDER,\n prompt: PROMPT_BODY_PLACEHOLDER,\n contract: CONTRACT_BODY_PLACEHOLDER,\n};\n\n/** Kinds whose `library create` scaffold is `---frontmatter--- + # <name> + placeholder body`. */\nconst MARKDOWN_SCAFFOLD_KINDS: Record<string, true> = {\n skill: true,\n agent: true,\n prompt: true,\n contract: true,\n};\n\n/** The `description:` `library create flow` writes when `--description` is omitted. */\nconst FLOW_DESCRIPTION_PLACEHOLDER = \"Flow description\";\n\n/**\n * Run the advisory checks for one parsed asset manifest: agentskills.io conformance\n * (skills only) and the untouched `library create` body (skill, agent, prompt, contract).\n * The flow and preset scaffolds are errors, see {@link checkAsset}. Other kinds yield no findings.\n *\n * @param kind Asset kind of the manifest.\n * @param parsed Parsed manifest (frontmatter for markdown kinds, the document for YAML).\n * @param body The markdown body after the frontmatter (`undefined` for YAML kinds).\n * @param dirName The manifest's parent folder name (enables the skill name==dir rule).\n */\nexport function checkAssetManifest(\n kind: string,\n parsed: Record<string, unknown>,\n body: string | undefined,\n dirName: string,\n): AssetFinding[] {\n const out: AssetFinding[] = [];\n if (kind === \"skill\") {\n for (const f of checkAgentSkillConformance(parsed, { dirName })) {\n out.push({ tag: \"skill conformance\", text: `${f.field}: ${f.message}`, conformance: true });\n }\n }\n if (MARKDOWN_SCAFFOLD_KINDS[kind]) {\n // `library create` writes a placeholder body under a `# <name>` heading;\n // shipping it untouched is never intended.\n const bodyText = body?.replace(/^#[^\\n]*\\n+/, \"\");\n // A prompt, contract or agent scaffolded by an older CLI carries the skill wording; it is\n // the same untouched scaffold.\n const isPlaceholder =\n bodyText === SKILL_BODY_PLACEHOLDER || bodyText === BODY_PLACEHOLDER_BY_KIND[kind];\n if (isPlaceholder) {\n const noun = kind === \"skill\" ? \"skill prompt\" : kind;\n out.push({\n tag: kind,\n text: `body is still the scaffold placeholder; write the ${noun}`,\n conformance: false,\n });\n }\n }\n return out;\n}\n\n/** The version `library index` records for a parsed manifest: top-level `version`, else `metadata.version`. */\nexport function declaredVersion(parsed: Record<string, unknown>): string | undefined {\n const scalar = (v: unknown): string | undefined =>\n typeof v === \"string\" ? v : typeof v === \"number\" ? String(v) : undefined;\n const meta = parsed.metadata;\n const nested =\n meta !== null && typeof meta === \"object\"\n ? scalar((meta as Record<string, unknown>).version)\n : undefined;\n return scalar(parsed.version) ?? nested;\n}\n\n/** The refusal text for a version that is not semver, `undefined` when it is. */\nexport function invalidSemverText(version: string): string | undefined {\n return SEMVER_RE.test(version) ? undefined : `version \"${version}\" is not valid semver`;\n}\n\n/**\n * The refusal for a directory that holds a kind + name another directory already holds.\n * `library index` and the publish plan print it, so both name the directory and the fix alike.\n *\n * @param dir The duplicate directory, relative to the library root.\n * @param detail Why it is a duplicate, e.g. `already registered at \"fun/skills/x\"`.\n * @param library The registered library name, for the re-run hint.\n */\nexport function duplicateAssetMessage(\n kind: string,\n name: string,\n dir: string,\n detail: string,\n library: string,\n): string {\n return `${kind}:${name} found in ${dir} but ${detail}. Rename or delete one of the two directories, then re-run \\`skaile library index ${library}\\`.`;\n}\n\n/** Result of {@link checkAsset}: what fails the asset, and what only warns. */\nexport interface AssetCheckResult {\n /** Findings that fail `validate`, make `library index` exit 1 and the publish plan refuse the asset. */\n errors: AssetFinding[];\n /** Advisories ({@link checkAssetManifest}): printed as warnings, exit code unchanged. */\n advisories: AssetFinding[];\n}\n\n/** The version a manifest without one is read at: the default `library index` records. */\nconst DEFAULT_VERSION = \"0.1.0\";\n\n/** The kinds `library create` scaffolds; a missing version and an empty `metadata:` are handled alike for all. */\nconst SCAFFOLD_KINDS: Record<string, true> = {\n skill: true,\n agent: true,\n prompt: true,\n contract: true,\n flow: true,\n preset: true,\n};\n\n/**\n * The manifest the kind schema and the flow parser see: a missing version reads as\n * {@link DEFAULT_VERSION} and an empty `metadata:` as absent, for every scaffolded kind, so no\n * kind refuses what another accepts.\n */\nfunction withManifestDefaults(\n kind: string,\n parsed: Record<string, unknown>,\n): Record<string, unknown> {\n if (!SCAFFOLD_KINDS[kind]) return parsed;\n const out = { ...parsed };\n if (out.metadata === null) delete out.metadata;\n // Only an absent version is defaulted; a present but wrong one (an object, a list) stays an error.\n const meta = out.metadata;\n const nested =\n typeof meta === \"object\" && meta !== null && \"version\" in meta ? meta.version : undefined;\n if (out.version == null && nested == null) out.version = DEFAULT_VERSION;\n return out;\n}\n\n/**\n * The refusal for an asset name or id that breaks the canonical rule (lowercase kebab-case,\n * at most 64 characters), `undefined` when the identity is absent (the schema owns that) or valid.\n * An explicit `publisher:` in the manifest is checked as part of the ref it forms.\n */\nexport function manifestIdentityError(\n kind: string,\n parsed: Record<string, unknown>,\n): string | undefined {\n const identity = kind === \"flow\" ? parsed.id : parsed.name;\n if (typeof identity !== \"string\" || identity.length === 0) return undefined;\n\n const publisher = typeof parsed.publisher === \"string\" ? parsed.publisher : undefined;\n if (publisher !== undefined) {\n try {\n parseAssetRef(`${kind}:@${publisher}/${identity}`);\n return undefined;\n } catch (e) {\n return e instanceof Error ? e.message : String(e);\n }\n }\n if (!isValidAssetName(identity)) {\n return `invalid asset ${kind === \"flow\" ? \"id\" : \"name\"} \"${identity}\" — ${ASSET_NAME_HINT}`;\n }\n return undefined;\n}\n\n/**\n * The untouched `library create flow` / `library create preset` content: a flow with no nodes\n * and the example preset item can never be consumed, so they fail like the `TODO:` description\n * of every other kind. Also matches the generic descriptions older releases scaffolded.\n */\nfunction scaffoldDefinitionErrors(kind: string, parsed: Record<string, unknown>): string[] {\n const out: string[] = [];\n if (kind === \"flow\") {\n if (parsed.description === FLOW_DESCRIPTION_PLACEHOLDER) {\n out.push(\"description is still the scaffold placeholder; say what the flow does\");\n }\n if (Array.isArray(parsed.nodes) && parsed.nodes.length === 0) {\n out.push(\"nodes is still the scaffold placeholder (nodes: []); add the flow's nodes\");\n }\n }\n if (kind === \"preset\") {\n if (parsed.description === PRESET_DESCRIPTION_PLACEHOLDER) {\n out.push(\n `description is still the scaffold placeholder (\"${PRESET_DESCRIPTION_PLACEHOLDER}\"); say what the preset does`,\n );\n }\n const items = Array.isArray(parsed.items) ? parsed.items : [];\n const placeholderItem = items.some((item) => {\n const ref = typeof item === \"string\" ? item : (item as { ref?: unknown } | null)?.ref;\n return typeof ref === \"string\" && ref.trim() === PRESET_ITEM_PLACEHOLDER_REF;\n });\n if (placeholderItem) {\n out.push(\n `item ${PRESET_ITEM_PLACEHOLDER_REF} is still the scaffold placeholder; replace it with the preset's real items`,\n );\n }\n }\n return out;\n}\n\n/**\n * The one per-asset check list behind `skaile validate`, `skaile library index`\n * and `skaile library publish`. Errors: an asset name that is not canonical (kebab-case,\n * at most 64 characters), a declared version that is not semver, the kind's manifest schema,\n * a `TODO:` scaffold description (every kind; the skill schema already refuses it), the\n * untouched flow/preset scaffold, and for flows the flow engine's own definition parser —\n * a flow the engine cannot load is no flow. A missing version reads as 0.1.0 and an empty\n * `metadata:` as absent for every scaffolded kind. Advisories: {@link checkAssetManifest}.\n *\n * @param kind Asset kind of the manifest.\n * @param parsed Parsed manifest (frontmatter for markdown kinds, the document for YAML).\n * @param body The markdown body after the frontmatter (`undefined` for YAML kinds).\n * @param dirName The manifest's parent folder name (enables the skill name==dir rule).\n * @param registry The kind registry that owns each kind's manifest schema.\n */\nexport function checkAsset(\n kind: string,\n parsed: Record<string, unknown>,\n body: string | undefined,\n dirName: string,\n registry: IAssetKindRegistry,\n): AssetCheckResult {\n const errors: AssetFinding[] = [];\n const error = (text: string): void => {\n errors.push({ tag: kind, text, conformance: false });\n };\n\n const identity = manifestIdentityError(kind, parsed);\n if (identity) error(identity);\n\n const version = declaredVersion(parsed);\n const semver = version === undefined ? undefined : invalidSemverText(version);\n if (semver) error(semver);\n\n const effective = withManifestDefaults(kind, parsed);\n // A markdown kind carries its version in the `metadata:` block, every other kind at the top level.\n const versionKey = [\"skill\", \"prompt\", \"contract\"].includes(kind)\n ? \"metadata.version\"\n : \"version\";\n const provider = registry.getProvider(kind);\n if (!provider) {\n error(`unknown_asset_kind: kind \"${kind}\" is not registered`);\n } else {\n const result = provider.validateManifest(effective);\n if (!result.ok) {\n for (const e of result.errors) {\n if (e.path === \"version\" || e.path === \"metadata.version\") {\n // The semver text above already names a version that is present but wrong.\n if (!semver) {\n error(`${e.path}: must be a semver string — set ${versionKey}: ${DEFAULT_VERSION}`);\n }\n continue;\n }\n error(`${e.path ? `${e.path}: ` : \"\"}${e.message}`);\n }\n }\n }\n\n // The skill schema refuses the scaffold description itself; every other kind says so here,\n // in the same words, so no kind ships `TODO: describe this …`.\n const description = parsed.description;\n if (\n kind !== \"skill\" &&\n typeof description === \"string\" &&\n description.trim().startsWith(SKILL_DESCRIPTION_PLACEHOLDER_PREFIX)\n ) {\n error(\n `description: description is still the scaffold placeholder (${SKILL_DESCRIPTION_PLACEHOLDER_PREFIX} …) — say what the ${kind} does and when to use it`,\n );\n }\n for (const text of scaffoldDefinitionErrors(kind, parsed)) error(text);\n\n if (kind === \"flow\") {\n const flow = parseFlowDefinition(effective);\n if (!flow.ok) {\n for (const e of flow.errors) {\n error(`invalid flow definition: ${e.path || \"<root>\"}: ${e.message}`);\n }\n }\n }\n\n return { errors, advisories: checkAssetManifest(kind, parsed, body, dirName) };\n}\n\n/**\n * Locate the manifest file of a first-party asset inside its `root` directory:\n * `SKILL.md`, `agent.yaml` / `AGENT.md`, `CONTRACT.md`, `<name>.prompt.md`,\n * `<name>.flow.yaml` / `.flow.json` or `<name>.preset.yaml`. `null` when none exists.\n */\nexport function findAssetManifestFile(dir: string, kind: string, name: string): string | null {\n const candidates: string[] = [];\n if (kind === \"skill\") candidates.push(\"SKILL.md\");\n else if (kind === \"agent\") candidates.push(\"agent.yaml\", \"AGENT.md\");\n else if (kind === \"contract\") candidates.push(\"CONTRACT.md\");\n else if (kind === \"prompt\") candidates.push(`${name}.prompt.md`);\n else if (kind === \"flow\") candidates.push(`${name}.flow.yaml`, `${name}.flow.json`);\n else if (kind === \"preset\") candidates.push(`${name}.preset.yaml`);\n for (const c of candidates) {\n const file = path.join(dir, c);\n if (fs.existsSync(file)) return file;\n }\n // A single prompt/flow/preset file whose name differs from the entry name.\n const suffix =\n kind === \"prompt\"\n ? \".prompt.md\"\n : kind === \"flow\"\n ? \".flow.yaml\"\n : kind === \"preset\"\n ? \".preset.yaml\"\n : null;\n if (suffix && fs.existsSync(dir)) {\n const matches = fs.readdirSync(dir).filter((f) => f.endsWith(suffix));\n if (matches.length === 1) return path.join(dir, matches[0]);\n }\n return null;\n}\n\n/**\n * The prompt text of a manifest file, as {@link checkAssetManifest} wants it: the\n * markdown body of a `.md` marker (`SKILL.md`, `AGENT.md`, …), the `SOUL.md` next to\n * an `agent.yaml` agent, `undefined` for every other YAML manifest.\n *\n * @param file Absolute path of the manifest file.\n * @param text The file's content.\n */\nexport function readAssetBody(file: string, text: string): string | undefined {\n if (file.endsWith(\".md\")) return parseFrontmatter(text).body;\n if (path.basename(file) !== \"agent.yaml\") return undefined;\n const soul = path.join(path.dirname(file), \"SOUL.md\");\n return fs.existsSync(soul) ? fs.readFileSync(soul, \"utf8\").trim() : undefined;\n}\n\n/**\n * The {@link checkAsset} errors of one manifest file on disk — what `library index`\n * asks of each asset before it writes it into the manifest. A file that cannot be\n * read or parsed yields none: the parse failure is reported by whoever owns it.\n *\n * @param file Absolute path of the manifest file.\n * @param kind Asset kind of the manifest.\n * @param registry The kind registry that owns each kind's manifest schema.\n */\nexport function checkAssetFile(\n file: string,\n kind: string,\n registry: IAssetKindRegistry,\n): AssetFinding[] {\n let text: string;\n try {\n text = fs.readFileSync(file, \"utf8\");\n } catch {\n return [];\n }\n const res = parseManifestFile(file, text);\n if (!res.ok) return [];\n return checkAsset(\n kind,\n res.data,\n readAssetBody(file, text),\n path.basename(path.dirname(file)),\n registry,\n ).errors;\n}\n"]}
|