@skaile/workspaces 0.24.0 → 0.26.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 +276 -0
- package/README.md +2 -2
- package/dist/{asset-feeds-WKIKSZ6Z.js → asset-feeds-WMVTI7KW.js} +11 -10
- package/dist/asset-feeds-WMVTI7KW.js.map +1 -0
- package/dist/asset-manager/index.js +11 -10
- package/dist/asset-manager/installer.js +10 -9
- package/dist/asset-manager/renderers.js +2 -2
- package/dist/asset-manager/src/index.d.ts +6 -7
- package/dist/asset-manager/src/index.d.ts.map +1 -1
- package/dist/asset-manager/src/installer.d.ts.map +1 -1
- package/dist/bridge/drivers/claude-sdk.js +14 -7
- package/dist/bridge/drivers/claude-sdk.js.map +1 -1
- package/dist/bridge/drivers/codex.js +8 -34
- package/dist/bridge/drivers/codex.js.map +1 -1
- package/dist/bridge/drivers/echo.js +1 -1
- package/dist/bridge/drivers/omp.js +64 -50
- package/dist/bridge/drivers/omp.js.map +1 -1
- package/dist/bridge/index.js +4 -4
- package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
- package/dist/bridge/src/drivers/codex.d.ts.map +1 -1
- package/dist/bridge/src/drivers/omp.d.ts +20 -4
- package/dist/bridge/src/drivers/omp.d.ts.map +1 -1
- package/dist/bridge/src/error-classifier.d.ts +17 -0
- package/dist/bridge/src/error-classifier.d.ts.map +1 -1
- package/dist/bridge/src/models.d.ts +1 -1
- package/dist/bridge/src/models.d.ts.map +1 -1
- package/dist/bridge/src/provider-endpoints.d.ts +16 -0
- package/dist/bridge/src/provider-endpoints.d.ts.map +1 -0
- package/dist/bridge/src/validation.d.ts +1 -1
- package/dist/bridge/src/validation.d.ts.map +1 -1
- package/dist/{chunk-M5TE6YI5.js → chunk-23M4XZQW.js} +10 -52
- package/dist/chunk-23M4XZQW.js.map +1 -0
- package/dist/{chunk-DH4N5AW4.js → chunk-2FS4FPZ7.js} +3 -3
- package/dist/{chunk-DH4N5AW4.js.map → chunk-2FS4FPZ7.js.map} +1 -1
- package/dist/{chunk-6VTG73UY.js → chunk-45H3UO2R.js} +2 -2
- package/dist/{chunk-6VTG73UY.js.map → chunk-45H3UO2R.js.map} +1 -1
- package/dist/chunk-4SQ6Y6U7.js +28 -0
- package/dist/chunk-4SQ6Y6U7.js.map +1 -0
- package/dist/{chunk-LSGAYQ2E.js → chunk-5YO3H5Q4.js} +3 -3
- package/dist/{chunk-LSGAYQ2E.js.map → chunk-5YO3H5Q4.js.map} +1 -1
- package/dist/{chunk-JDX54X4Y.js → chunk-7GWYRVAX.js} +12 -9
- package/dist/chunk-7GWYRVAX.js.map +1 -0
- package/dist/{chunk-46COM7M5.js → chunk-7OBGSR7O.js} +5 -5
- package/dist/chunk-7OBGSR7O.js.map +1 -0
- package/dist/{chunk-2RFOFHSM.js → chunk-BKF3UFF4.js} +21 -9
- package/dist/chunk-BKF3UFF4.js.map +1 -0
- package/dist/{chunk-KOVLSBXK.js → chunk-BMQKMOQY.js} +81 -79
- package/dist/chunk-BMQKMOQY.js.map +1 -0
- package/dist/{chunk-J2TITSXF.js → chunk-BQRRBGDE.js} +2 -2
- package/dist/{chunk-J2TITSXF.js.map → chunk-BQRRBGDE.js.map} +1 -1
- package/dist/{chunk-5ESCS2OS.js → chunk-C32BRO2W.js} +67 -35
- package/dist/chunk-C32BRO2W.js.map +1 -0
- package/dist/{chunk-GZWJGNNN.js → chunk-DEYYRFQU.js} +3 -3
- package/dist/chunk-DEYYRFQU.js.map +1 -0
- package/dist/{chunk-YX3UWPJ5.js → chunk-IEJ5IOC3.js} +27 -49
- package/dist/chunk-IEJ5IOC3.js.map +1 -0
- package/dist/chunk-IERB3UXJ.js +215 -0
- package/dist/chunk-IERB3UXJ.js.map +1 -0
- package/dist/{chunk-FVTV7M76.js → chunk-IFGTRL2I.js} +3 -3
- package/dist/chunk-IFGTRL2I.js.map +1 -0
- package/dist/{chunk-LJ52ZKIU.js → chunk-JIQLLZ65.js} +203 -39
- package/dist/chunk-JIQLLZ65.js.map +1 -0
- package/dist/{chunk-Z3M5K67G.js → chunk-KL2MQ6WI.js} +114 -63
- package/dist/chunk-KL2MQ6WI.js.map +1 -0
- package/dist/{chunk-6FNCZYJY.js → chunk-MBOR7D65.js} +3 -3
- package/dist/{chunk-6FNCZYJY.js.map → chunk-MBOR7D65.js.map} +1 -1
- package/dist/{chunk-QAVZOJCV.js → chunk-OVRSNIKJ.js} +2 -2
- package/dist/chunk-OVRSNIKJ.js.map +1 -0
- package/dist/{chunk-DQWREFRQ.js → chunk-PAYAFNXG.js} +22 -3
- package/dist/chunk-PAYAFNXG.js.map +1 -0
- package/dist/{chunk-D3VO6WNC.js → chunk-PRLD7EXG.js} +3 -3
- package/dist/chunk-PRLD7EXG.js.map +1 -0
- package/dist/{chunk-N6TA6RSH.js → chunk-PY7AQRGH.js} +59 -13
- package/dist/chunk-PY7AQRGH.js.map +1 -0
- package/dist/{chunk-NELZIQ2E.js → chunk-QDJKE557.js} +20 -3
- package/dist/chunk-QDJKE557.js.map +1 -0
- package/dist/{chunk-OYRW5RCM.js → chunk-QHXS3YDV.js} +9 -9
- package/dist/chunk-QHXS3YDV.js.map +1 -0
- package/dist/{chunk-2F3RUZXC.js → chunk-RTAIGPTF.js} +161 -106
- package/dist/chunk-RTAIGPTF.js.map +1 -0
- package/dist/{chunk-IPUYL6TD.js → chunk-TV72ZJYN.js} +8 -5
- package/dist/{chunk-IPUYL6TD.js.map → chunk-TV72ZJYN.js.map} +1 -1
- package/dist/{chunk-ICS76R4T.js → chunk-W7W66MDZ.js} +10 -8
- package/dist/chunk-W7W66MDZ.js.map +1 -0
- package/dist/{chunk-JQBHCJ6N.js → chunk-WD4LP66U.js} +329 -121
- package/dist/chunk-WD4LP66U.js.map +1 -0
- package/dist/{chunk-AFLH7B64.js → chunk-XGLGS5B4.js} +3 -3
- package/dist/{chunk-AFLH7B64.js.map → chunk-XGLGS5B4.js.map} +1 -1
- package/dist/{chunk-HIIARTRZ.js → chunk-YDTW4GT6.js} +450 -207
- package/dist/chunk-YDTW4GT6.js.map +1 -0
- package/dist/{chunk-2XY6732A.js → chunk-YRU4WB6Y.js} +5 -5
- package/dist/chunk-YRU4WB6Y.js.map +1 -0
- package/dist/{chunk-542K7SR6.js → chunk-Z5DI7PDG.js} +173 -90
- package/dist/chunk-Z5DI7PDG.js.map +1 -0
- package/dist/{chunk-KLNL7QHN.js → chunk-ZAP2BDHG.js} +30 -5
- package/dist/chunk-ZAP2BDHG.js.map +1 -0
- package/dist/{chunk-GCJXPUHG.js → chunk-ZONCCO5N.js} +9 -4
- package/dist/chunk-ZONCCO5N.js.map +1 -0
- package/dist/{chunk-ODPII24X.js → chunk-ZYDE52WE.js} +3 -3
- package/dist/{chunk-ODPII24X.js.map → chunk-ZYDE52WE.js.map} +1 -1
- package/dist/cli/index.js +566 -425
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/src/commands/complete-resolvers.d.ts.map +1 -1
- package/dist/cli/src/commands/config.d.ts.map +1 -1
- package/dist/cli/src/commands/connector.d.ts +7 -0
- package/dist/cli/src/commands/connector.d.ts.map +1 -1
- package/dist/cli/src/commands/flow.d.ts +3 -2
- package/dist/cli/src/commands/flow.d.ts.map +1 -1
- package/dist/cli/src/commands/npx.d.ts.map +1 -1
- package/dist/cli/src/commands/project.d.ts.map +1 -1
- package/dist/cli/src/commands/run.d.ts.map +1 -1
- package/dist/cli/src/commands/validate.d.ts.map +1 -1
- package/dist/cli/src/flow-discovery.d.ts +24 -0
- package/dist/cli/src/flow-discovery.d.ts.map +1 -0
- package/dist/cli/src/open-registry.d.ts +2 -2
- package/dist/cli/src/paths.d.ts +26 -9
- package/dist/cli/src/paths.d.ts.map +1 -1
- package/dist/cli/src/skill-walker.d.ts +9 -5
- package/dist/cli/src/skill-walker.d.ts.map +1 -1
- package/dist/connectors/config.js +8 -7
- package/dist/connectors/index.js +13 -12
- package/dist/connectors/rclone-config.js +1 -1
- package/dist/connectors/src/connector-manager.d.ts +24 -2
- package/dist/connectors/src/connector-manager.d.ts.map +1 -1
- package/dist/connectors/src/connector-prompt.d.ts.map +1 -1
- package/dist/connectors/src/connector-registry.d.ts +3 -3
- package/dist/connectors/src/credential-helper-script.d.ts.map +1 -1
- package/dist/connectors/src/index.d.ts +4 -2
- package/dist/connectors/src/index.d.ts.map +1 -1
- package/dist/connectors/src/managed-gitconfig.d.ts.map +1 -1
- package/dist/connectors/src/mount-placeholder.d.ts +68 -0
- package/dist/connectors/src/mount-placeholder.d.ts.map +1 -0
- package/dist/connectors/src/rclone-config/googledrive.d.ts +1 -1
- package/dist/core/discovery.js +1 -1
- package/dist/core/index.js +7 -6
- package/dist/core/manifest.js +2 -2
- package/dist/core/models.js +1 -1
- package/dist/core/publish-manifest.d.ts +2 -0
- package/dist/core/publish-manifest.js +5 -0
- package/dist/core/publish-manifest.js.map +1 -0
- package/dist/core/runtime-assets.js +5 -4
- package/dist/core/src/discovery.d.ts +27 -0
- package/dist/core/src/discovery.d.ts.map +1 -1
- package/dist/core/src/index.d.ts +9 -6
- package/dist/core/src/index.d.ts.map +1 -1
- package/dist/core/src/lock.d.ts.map +1 -1
- package/dist/core/src/manifest-yaml-editor.d.ts +62 -0
- package/dist/core/src/manifest-yaml-editor.d.ts.map +1 -0
- package/dist/core/src/models.d.ts +16 -3
- package/dist/core/src/models.d.ts.map +1 -1
- package/dist/core/src/publish-manifest.d.ts +160 -0
- package/dist/core/src/publish-manifest.d.ts.map +1 -0
- package/dist/core/src/repo-manager.d.ts +9 -1
- package/dist/core/src/repo-manager.d.ts.map +1 -1
- package/dist/core/src/runtime-assets.d.ts +80 -29
- package/dist/core/src/runtime-assets.d.ts.map +1 -1
- package/dist/core/src/walker.d.ts +19 -6
- package/dist/core/src/walker.d.ts.map +1 -1
- package/dist/core/src/workspace-config.d.ts +30 -36
- package/dist/core/src/workspace-config.d.ts.map +1 -1
- package/dist/core/src/workspace-yaml-editor.d.ts +1 -15
- package/dist/core/src/workspace-yaml-editor.d.ts.map +1 -1
- package/dist/core/workspace-config.js +4 -3
- package/dist/deploy/index.js +50 -79
- package/dist/deploy/index.js.map +1 -1
- package/dist/deploy/src/targets/container-runtime.d.ts +1 -1
- package/dist/deploy/src/targets/container-runtime.d.ts.map +1 -1
- package/dist/deploy/src/targets/local.d.ts.map +1 -1
- package/dist/deploy/src/targets/nix.d.ts.map +1 -1
- package/dist/deploy/src/targets/process-handle.d.ts +7 -5
- package/dist/deploy/src/targets/process-handle.d.ts.map +1 -1
- package/dist/discovery/index.js +5 -4
- package/dist/discovery/src/discover-manifest.d.ts +3 -2
- package/dist/discovery/src/discover-manifest.d.ts.map +1 -1
- package/dist/discovery/src/discover.d.ts +2 -2
- package/dist/discovery/src/discover.d.ts.map +1 -1
- package/dist/discovery/src/index.d.ts +1 -1
- package/dist/discovery/src/index.d.ts.map +1 -1
- package/dist/discovery/src/source-config.d.ts +53 -12
- package/dist/discovery/src/source-config.d.ts.map +1 -1
- package/dist/discovery/src/tree-entries.d.ts +2 -2
- package/dist/discovery/src/tree-entries.d.ts.map +1 -1
- package/dist/{ensure-sources-OJUBGX6Z.js → ensure-sources-CVULUVH4.js} +12 -11
- package/dist/ensure-sources-CVULUVH4.js.map +1 -0
- package/dist/factory-assets/.skaile-source.yaml +6 -0
- package/dist/factory-assets/README.md +36 -0
- package/dist/factory-assets/bundles/workspaces-authoring/workspaces-authoring.bundle.yaml +9 -0
- package/dist/factory-assets/connectors/deploy/CONNECTOR.md +41 -0
- package/dist/{base-assets → factory-assets}/connectors/deploy/adapter.d.ts +2 -2
- package/dist/factory-assets/connectors/deploy/adapter.d.ts.map +1 -0
- package/dist/factory-assets/connectors/deploy.js +22 -0
- package/dist/factory-assets/connectors/devserver/CONNECTOR.md +44 -0
- package/dist/{base-assets → factory-assets}/connectors/devserver/adapter.d.ts +2 -2
- package/dist/factory-assets/connectors/devserver/adapter.d.ts.map +1 -0
- package/dist/factory-assets/connectors/devserver.js +22 -0
- package/dist/factory-assets/connectors/flow/CONNECTOR.md +47 -0
- package/dist/{base-assets → factory-assets}/connectors/flow/adapter.d.ts +2 -2
- package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -0
- package/dist/factory-assets/connectors/flow/adapter.js +22 -0
- package/dist/factory-assets/connectors/flow/engine/engine.d.ts.map +1 -0
- package/dist/{base-assets → factory-assets}/connectors/flow/engine/flow-kind-provider.d.ts +1 -1
- package/dist/factory-assets/connectors/flow/engine/flow-kind-provider.d.ts.map +1 -0
- package/dist/factory-assets/connectors/flow/engine/flow-manifest.d.ts.map +1 -0
- package/dist/factory-assets/connectors/flow/engine/index.d.ts.map +1 -0
- package/dist/factory-assets/connectors/flow/engine/loader.d.ts.map +1 -0
- package/dist/factory-assets/connectors/flow/engine/types.d.ts.map +1 -0
- package/dist/factory-assets/connectors/flow/engine.js +15 -0
- package/dist/factory-assets/connectors/flow/index.d.ts.map +1 -0
- package/dist/{base-assets → factory-assets}/connectors/flow/prompt-fragments.d.ts +5 -5
- package/dist/factory-assets/connectors/flow/prompt-fragments.d.ts.map +1 -0
- package/dist/{base-assets → factory-assets}/connectors/flow/prompt-fragments.js +1 -1
- package/dist/{base-assets → factory-assets}/connectors/flow/run-flow.d.ts +8 -8
- package/dist/factory-assets/connectors/flow/run-flow.d.ts.map +1 -0
- package/dist/factory-assets/connectors/flow/run-flow.js +25 -0
- package/dist/{base-assets → factory-assets}/connectors/flow/stimulus-driver.d.ts +2 -2
- package/dist/factory-assets/connectors/flow/stimulus-driver.d.ts.map +1 -0
- package/dist/factory-assets/connectors/flow/stimulus-driver.js +4 -0
- package/dist/factory-assets/connectors/flow.js +22 -0
- package/dist/factory-assets/connectors/git/CONNECTOR.md +145 -0
- package/dist/{base-assets → factory-assets}/connectors/git/driver.d.ts +2 -2
- package/dist/factory-assets/connectors/git/driver.d.ts.map +1 -0
- package/dist/factory-assets/connectors/git.js +22 -0
- package/dist/factory-assets/connectors/gmail/CONNECTOR.md +50 -0
- package/dist/{base-assets → factory-assets}/connectors/gmail/adapter.d.ts +2 -2
- package/dist/factory-assets/connectors/gmail/adapter.d.ts.map +1 -0
- package/dist/factory-assets/connectors/gmail.js +22 -0
- package/dist/factory-assets/connectors/googledrive/CONNECTOR.md +150 -0
- package/dist/{base-assets → factory-assets}/connectors/googledrive/driver.d.ts +2 -2
- package/dist/factory-assets/connectors/googledrive/driver.d.ts.map +1 -0
- package/dist/factory-assets/connectors/googledrive.js +22 -0
- package/dist/factory-assets/connectors/local/CONNECTOR.md +40 -0
- package/dist/{base-assets → factory-assets}/connectors/local/driver.d.ts +2 -2
- package/dist/factory-assets/connectors/local/driver.d.ts.map +1 -0
- package/dist/factory-assets/connectors/local.js +22 -0
- package/dist/factory-assets/connectors/mattermost/CONNECTOR.md +65 -0
- package/dist/{base-assets → factory-assets}/connectors/mattermost/adapter.d.ts +2 -2
- package/dist/factory-assets/connectors/mattermost/adapter.d.ts.map +1 -0
- package/dist/factory-assets/connectors/mattermost.js +22 -0
- package/dist/factory-assets/connectors/memory/CONNECTOR.md +40 -0
- package/dist/{base-assets → factory-assets}/connectors/memory/adapter.d.ts +2 -2
- package/dist/factory-assets/connectors/memory/adapter.d.ts.map +1 -0
- package/dist/factory-assets/connectors/memory.js +22 -0
- package/dist/factory-assets/connectors/minio/CONNECTOR.md +68 -0
- package/dist/{base-assets → factory-assets}/connectors/minio/adapter.d.ts +2 -2
- package/dist/factory-assets/connectors/minio/adapter.d.ts.map +1 -0
- package/dist/factory-assets/connectors/minio.js +22 -0
- package/dist/factory-assets/connectors/postgres/CONNECTOR.md +46 -0
- package/dist/{base-assets → factory-assets}/connectors/postgres/adapter.d.ts +2 -2
- package/dist/factory-assets/connectors/postgres/adapter.d.ts.map +1 -0
- package/dist/factory-assets/connectors/postgres.js +22 -0
- package/dist/factory-assets/connectors/s3/CONNECTOR.md +76 -0
- package/dist/{base-assets → factory-assets}/connectors/s3/driver.d.ts +2 -2
- package/dist/factory-assets/connectors/s3/driver.d.ts.map +1 -0
- package/dist/factory-assets/connectors/s3.js +22 -0
- package/dist/factory-assets/connectors/sharepoint/CONNECTOR.md +181 -0
- package/dist/{base-assets → factory-assets}/connectors/sharepoint/driver.d.ts +2 -2
- package/dist/factory-assets/connectors/sharepoint/driver.d.ts.map +1 -0
- package/dist/factory-assets/connectors/sharepoint.js +22 -0
- package/dist/factory-assets/connectors/sqlite/CONNECTOR.md +44 -0
- package/dist/{base-assets → factory-assets}/connectors/sqlite/adapter.d.ts +2 -2
- package/dist/factory-assets/connectors/sqlite/adapter.d.ts.map +1 -0
- package/dist/factory-assets/connectors/sqlite.js +22 -0
- package/dist/factory-assets/connectors/static-server/CONNECTOR.md +41 -0
- package/dist/{base-assets → factory-assets}/connectors/static-server/adapter.d.ts +2 -2
- package/dist/factory-assets/connectors/static-server/adapter.d.ts.map +1 -0
- package/dist/factory-assets/connectors/static-server.js +22 -0
- package/dist/factory-assets/connectors/tunnel/CONNECTOR.md +40 -0
- package/dist/{base-assets → factory-assets}/connectors/tunnel/adapter.d.ts +2 -2
- package/dist/factory-assets/connectors/tunnel/adapter.d.ts.map +1 -0
- package/dist/factory-assets/connectors/tunnel.js +22 -0
- package/dist/factory-assets/connectors/webdav/CONNECTOR.md +139 -0
- package/dist/{base-assets → factory-assets}/connectors/webdav/driver.d.ts +2 -2
- package/dist/factory-assets/connectors/webdav/driver.d.ts.map +1 -0
- package/dist/factory-assets/connectors/webdav.js +22 -0
- package/dist/factory-assets/connectors/xstate/CONNECTOR.md +57 -0
- package/dist/{base-assets → factory-assets}/connectors/xstate/adapter.d.ts +2 -2
- package/dist/factory-assets/connectors/xstate/adapter.d.ts.map +1 -0
- package/dist/factory-assets/connectors/xstate-store/CONNECTOR.md +48 -0
- package/dist/{base-assets → factory-assets}/connectors/xstate-store/adapter.d.ts +2 -2
- package/dist/factory-assets/connectors/xstate-store/adapter.d.ts.map +1 -0
- package/dist/factory-assets/connectors/xstate-store.js +22 -0
- package/dist/factory-assets/connectors/xstate.js +22 -0
- package/dist/{base-assets → factory-assets}/index.d.ts +1 -1
- package/dist/factory-assets/index.d.ts.map +1 -0
- package/dist/{base-assets → factory-assets}/index.js +1 -1
- package/dist/factory-assets/index.js.map +1 -0
- package/dist/factory-assets/skaile.manifest.yaml +25 -0
- package/dist/factory-assets/skills/authoring-skaile-assets/SKILL.md +176 -0
- package/dist/factory-assets/skills/authoring-skaile-manifests/SKILL.md +243 -0
- package/dist/factory-assets/skills/authoring-skaile-manifests/references/dependency-standard.md +197 -0
- package/dist/factory-assets/skills/manifest-compliance/SKILL.md +140 -0
- package/dist/factory-assets/skills/skaile-author-asset/SKILL.md +239 -0
- package/dist/factory-assets/skills/skaile-manage-workspace/SKILL.md +168 -0
- package/dist/{flows-DYFTPCPM.js → flows-JZFJD5IN.js} +3 -3
- package/dist/{flows-DYFTPCPM.js.map → flows-JZFJD5IN.js.map} +1 -1
- package/dist/library/index.js +14 -5
- package/dist/library/src/install/install-from-manifest.d.ts.map +1 -1
- package/dist/library/src/library.d.ts +2 -0
- package/dist/library/src/library.d.ts.map +1 -1
- package/dist/library/src/local/library.d.ts +2 -0
- package/dist/library/src/local/library.d.ts.map +1 -1
- package/dist/library/src/local/local-catalog-source.d.ts +2 -1
- package/dist/library/src/local/local-catalog-source.d.ts.map +1 -1
- package/dist/library/src/local/sidecar-paths.d.ts +4 -4
- package/dist/library/src/local/sidecar-paths.d.ts.map +1 -1
- package/dist/library/src/local/store-paths.d.ts +4 -3
- package/dist/library/src/local/store-paths.d.ts.map +1 -1
- package/dist/library/src/pin-resolver.d.ts.map +1 -1
- package/dist/library/src/preset/apply.d.ts.map +1 -1
- package/dist/library/src/preset/placeholders.d.ts.map +1 -1
- package/dist/library/src/remote/remote-catalog-source.d.ts +7 -0
- package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
- package/dist/library/src/remote/rest-catalog-source.d.ts +7 -0
- package/dist/library/src/remote/rest-catalog-source.d.ts.map +1 -1
- package/dist/library/src/sync/manifest-writeback.d.ts +1 -1
- package/dist/library/src/sync/manifest-writeback.d.ts.map +1 -1
- package/dist/open-library-WYASW4BH.js +22 -0
- package/dist/{open-library-67FSSQWE.js.map → open-library-WYASW4BH.js.map} +1 -1
- package/dist/paths-BMW6JYW6.js +15 -0
- package/dist/{paths-FKKGS6BA.js.map → paths-BMW6JYW6.js.map} +1 -1
- package/dist/{plugin-store-IZ5SCRAV.js → plugin-store-O5VR45CA.js} +9 -8
- package/dist/plugin-store-O5VR45CA.js.map +1 -0
- package/dist/plugins/src/asset-kind-provider.d.ts +1 -1
- package/dist/plugins/src/catalog-source.d.ts +13 -0
- package/dist/plugins/src/catalog-source.d.ts.map +1 -1
- package/dist/resolver/index.js +1 -1
- package/dist/resolver/src/parser.d.ts.map +1 -1
- package/dist/runner/index.js +20 -19
- package/dist/runner/src/capability-registry.d.ts +1 -1
- package/dist/runner/src/capability-registry.d.ts.map +1 -1
- package/dist/runner/src/external-mcp.d.ts +112 -0
- package/dist/runner/src/external-mcp.d.ts.map +1 -0
- package/dist/runner/src/resource-handler.d.ts.map +1 -1
- package/dist/runner/src/resources.d.ts +10 -2
- package/dist/runner/src/resources.d.ts.map +1 -1
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/runner/src/session-builder.d.ts +12 -0
- package/dist/runner/src/session-builder.d.ts.map +1 -1
- package/dist/runner/src/workspace-migration.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +11 -10
- package/dist/sdk/bridge.js +4 -4
- package/dist/sdk/core.js +7 -6
- package/dist/sdk/flow.js +12 -1
- package/dist/sdk/index.js +23 -22
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/resolver.js +1 -1
- package/dist/sdk/runner.js +20 -19
- package/dist/sdk/session.js +1 -1
- package/dist/sdk/src/flow/index.d.ts +1 -1
- package/dist/sdk/src/flow/index.d.ts.map +1 -1
- package/dist/sdk/src/workspace.d.ts +3 -2
- package/dist/sdk/src/workspace.d.ts.map +1 -1
- package/dist/sdk/telemetry.js +1 -1
- package/dist/secrets/index.js +1 -1
- package/dist/secrets/src/providers/env.d.ts.map +1 -1
- package/dist/secrets/src/providers/local.d.ts.map +1 -1
- package/dist/session/index.js +1 -1
- package/dist/session/src/mentions.d.ts.map +1 -1
- package/dist/{setup-J7CYEQOF.js → setup-YNLFR5GB.js} +13 -12
- package/dist/setup-YNLFR5GB.js.map +1 -0
- package/dist/skills-6HJ3WINN.js +7 -0
- package/dist/{skills-CRL3VJNN.js.map → skills-6HJ3WINN.js.map} +1 -1
- package/dist/store-client-CENBEASX.js +15 -0
- package/dist/{store-client-AEI6Y3KD.js.map → store-client-CENBEASX.js.map} +1 -1
- package/dist/telemetry/index.js +1 -1
- package/dist/telemetry/src/config.d.ts +0 -16
- package/dist/telemetry/src/config.d.ts.map +1 -1
- package/dist/tui/index.js +20 -19
- package/dist/tui/index.js.map +1 -1
- package/dist/types/manifests.js +1 -1
- package/dist/types/src/flow.d.ts +2 -2
- package/dist/types/src/install-manifest.d.ts +1 -1
- package/dist/types/src/install-manifest.d.ts.map +1 -1
- package/dist/types/src/manifests/index.d.ts +1 -1
- package/dist/types/src/manifests/skill.d.ts +21 -0
- package/dist/types/src/manifests/skill.d.ts.map +1 -1
- package/dist/workspace-plugin/adapters/mcp.js +4 -4
- package/dist/workspace-plugin/adapters/omp.js +7 -7
- package/dist/workspace-plugin/index.js +1 -1
- package/dist/workspace-plugin/src/tools/flows.d.ts.map +1 -1
- package/package.json +158 -151
- package/dist/asset-feeds-WKIKSZ6Z.js.map +0 -1
- package/dist/base-assets/connectors/deploy/adapter.d.ts.map +0 -1
- package/dist/base-assets/connectors/deploy.js +0 -21
- package/dist/base-assets/connectors/devserver/adapter.d.ts.map +0 -1
- package/dist/base-assets/connectors/devserver.js +0 -21
- package/dist/base-assets/connectors/flow/adapter.d.ts.map +0 -1
- package/dist/base-assets/connectors/flow/adapter.js +0 -21
- package/dist/base-assets/connectors/flow/engine/engine.d.ts.map +0 -1
- package/dist/base-assets/connectors/flow/engine/flow-kind-provider.d.ts.map +0 -1
- package/dist/base-assets/connectors/flow/engine/flow-manifest.d.ts.map +0 -1
- package/dist/base-assets/connectors/flow/engine/index.d.ts.map +0 -1
- package/dist/base-assets/connectors/flow/engine/loader.d.ts.map +0 -1
- package/dist/base-assets/connectors/flow/engine/types.d.ts.map +0 -1
- package/dist/base-assets/connectors/flow/engine.js +0 -4
- package/dist/base-assets/connectors/flow/index.d.ts.map +0 -1
- package/dist/base-assets/connectors/flow/prompt-fragments.d.ts.map +0 -1
- package/dist/base-assets/connectors/flow/run-flow.d.ts.map +0 -1
- package/dist/base-assets/connectors/flow/run-flow.js +0 -24
- package/dist/base-assets/connectors/flow/stimulus-driver.d.ts.map +0 -1
- package/dist/base-assets/connectors/flow/stimulus-driver.js +0 -4
- package/dist/base-assets/connectors/flow.js +0 -21
- package/dist/base-assets/connectors/git/driver.d.ts.map +0 -1
- package/dist/base-assets/connectors/git.js +0 -21
- package/dist/base-assets/connectors/gmail/adapter.d.ts.map +0 -1
- package/dist/base-assets/connectors/gmail.js +0 -21
- package/dist/base-assets/connectors/googledrive/driver.d.ts.map +0 -1
- package/dist/base-assets/connectors/googledrive.js +0 -21
- package/dist/base-assets/connectors/local/driver.d.ts.map +0 -1
- package/dist/base-assets/connectors/local.js +0 -21
- package/dist/base-assets/connectors/mattermost/adapter.d.ts.map +0 -1
- package/dist/base-assets/connectors/mattermost.js +0 -21
- package/dist/base-assets/connectors/memory/adapter.d.ts.map +0 -1
- package/dist/base-assets/connectors/memory.js +0 -21
- package/dist/base-assets/connectors/minio/adapter.d.ts.map +0 -1
- package/dist/base-assets/connectors/minio.js +0 -21
- package/dist/base-assets/connectors/postgres/adapter.d.ts.map +0 -1
- package/dist/base-assets/connectors/postgres.js +0 -21
- package/dist/base-assets/connectors/s3/driver.d.ts.map +0 -1
- package/dist/base-assets/connectors/s3.js +0 -21
- package/dist/base-assets/connectors/sharepoint/driver.d.ts.map +0 -1
- package/dist/base-assets/connectors/sharepoint.js +0 -21
- package/dist/base-assets/connectors/sqlite/adapter.d.ts.map +0 -1
- package/dist/base-assets/connectors/sqlite.js +0 -21
- package/dist/base-assets/connectors/static-server/adapter.d.ts.map +0 -1
- package/dist/base-assets/connectors/static-server.js +0 -21
- package/dist/base-assets/connectors/tunnel/adapter.d.ts.map +0 -1
- package/dist/base-assets/connectors/tunnel.js +0 -21
- package/dist/base-assets/connectors/webdav/driver.d.ts.map +0 -1
- package/dist/base-assets/connectors/webdav.js +0 -21
- package/dist/base-assets/connectors/xstate/adapter.d.ts.map +0 -1
- package/dist/base-assets/connectors/xstate-store/adapter.d.ts.map +0 -1
- package/dist/base-assets/connectors/xstate-store.js +0 -21
- package/dist/base-assets/connectors/xstate.js +0 -21
- package/dist/base-assets/index.d.ts.map +0 -1
- package/dist/base-assets/index.js.map +0 -1
- package/dist/chunk-2F3RUZXC.js.map +0 -1
- package/dist/chunk-2M3XTMOL.js +0 -23
- package/dist/chunk-2M3XTMOL.js.map +0 -1
- package/dist/chunk-2RFOFHSM.js.map +0 -1
- package/dist/chunk-2XY6732A.js.map +0 -1
- package/dist/chunk-46COM7M5.js.map +0 -1
- package/dist/chunk-542K7SR6.js.map +0 -1
- package/dist/chunk-5ESCS2OS.js.map +0 -1
- package/dist/chunk-D3VO6WNC.js.map +0 -1
- package/dist/chunk-DQWREFRQ.js.map +0 -1
- package/dist/chunk-FVTV7M76.js.map +0 -1
- package/dist/chunk-GCJXPUHG.js.map +0 -1
- package/dist/chunk-GZWJGNNN.js.map +0 -1
- package/dist/chunk-HIIARTRZ.js.map +0 -1
- package/dist/chunk-ICS76R4T.js.map +0 -1
- package/dist/chunk-JDX54X4Y.js.map +0 -1
- package/dist/chunk-JQBHCJ6N.js.map +0 -1
- package/dist/chunk-KLNL7QHN.js.map +0 -1
- package/dist/chunk-KOVLSBXK.js.map +0 -1
- package/dist/chunk-LJ52ZKIU.js.map +0 -1
- package/dist/chunk-M5TE6YI5.js.map +0 -1
- package/dist/chunk-N6TA6RSH.js.map +0 -1
- package/dist/chunk-NELZIQ2E.js.map +0 -1
- package/dist/chunk-OYRW5RCM.js.map +0 -1
- package/dist/chunk-QAVZOJCV.js.map +0 -1
- package/dist/chunk-YX3UWPJ5.js.map +0 -1
- package/dist/chunk-Z3M5K67G.js.map +0 -1
- package/dist/ensure-sources-OJUBGX6Z.js.map +0 -1
- package/dist/open-library-67FSSQWE.js +0 -13
- package/dist/paths-FKKGS6BA.js +0 -4
- package/dist/plugin-store-IZ5SCRAV.js.map +0 -1
- package/dist/setup-J7CYEQOF.js.map +0 -1
- package/dist/skills-CRL3VJNN.js +0 -7
- package/dist/store-client-AEI6Y3KD.js +0 -14
- /package/dist/{base-assets → factory-assets}/connectors/deploy.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/deploy.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/devserver.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/devserver.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/flow/adapter.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/flow/engine/engine.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/flow/engine/flow-manifest.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/flow/engine/index.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/flow/engine/loader.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/flow/engine/types.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/flow/engine.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/flow/engine.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/flow/index.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/flow/prompt-fragments.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/flow/run-flow.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/flow/stimulus-driver.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/flow.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/flow.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/git.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/git.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/gmail.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/gmail.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/googledrive.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/googledrive.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/local.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/local.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/mattermost.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/mattermost.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/memory.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/memory.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/minio.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/minio.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/postgres.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/postgres.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/s3.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/s3.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/sharepoint.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/sharepoint.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/sqlite.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/sqlite.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/static-server.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/static-server.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/tunnel.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/tunnel.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/webdav.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/webdav.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/xstate-store.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/xstate-store.js.map +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/xstate.d.ts +0 -0
- /package/dist/{base-assets → factory-assets}/connectors/xstate.js.map +0 -0
package/dist/cli/index.js
CHANGED
|
@@ -1,62 +1,63 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
2
|
+
import { AI_RESOURCES, aiResourceRoots } from '../chunk-4SQ6Y6U7.js';
|
|
3
|
+
import { openCatalogSource, openLibraryManager, createFullRegistry, openLibrary } from '../chunk-7OBGSR7O.js';
|
|
3
4
|
import { logErr, S, logOk, colorRef, logInfo, logWarn, kindColorPad, kindColor, formatRelativeTime, fitWidth } from '../chunk-WSZAFRQL.js';
|
|
4
|
-
import { getStoreConfig, storeFetch, saveStoreTokens, clearStoreTokens, isStoreAuthenticated } from '../chunk-
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { resolveLibraryDir, LocalCatalogSource, skaileHomeDir } from '../chunk-2F3RUZXC.js';
|
|
5
|
+
import { getStoreConfig, storeFetch, saveStoreTokens, clearStoreTokens, isStoreAuthenticated } from '../chunk-XGLGS5B4.js';
|
|
6
|
+
import { LocalSecretsProvider } from '../chunk-7GWYRVAX.js';
|
|
7
|
+
import { resolveLibraryDir, LocalCatalogSource, skaileHomeDir } from '../chunk-RTAIGPTF.js';
|
|
8
8
|
import '../chunk-R7FOF242.js';
|
|
9
|
-
import '../chunk-
|
|
9
|
+
import '../chunk-JIQLLZ65.js';
|
|
10
10
|
import '../chunk-OKRUTSG7.js';
|
|
11
|
-
import { runFlow, resumeFlow } from '../chunk-
|
|
12
|
-
import '../chunk-
|
|
13
|
-
import { validateFlowVersions, parseSkillFrontmatter } from '../chunk-
|
|
14
|
-
import { runAgentChat, loadSessionById, loadSession, listSessions, setCurrentSession, deleteSession, clearSession, loadAgentManifest, compileComposition, MarkdownStreamer, resolveMixin } from '../chunk-
|
|
15
|
-
import { buildClaudePluginFiles } from '../chunk-
|
|
11
|
+
import { runFlow, resumeFlow } from '../chunk-QHXS3YDV.js';
|
|
12
|
+
import '../chunk-ZONCCO5N.js';
|
|
13
|
+
import { validateFlowVersions, parseSkillFrontmatter } from '../chunk-TV72ZJYN.js';
|
|
14
|
+
import { runAgentChat, loadSessionById, loadSession, listSessions, setCurrentSession, deleteSession, clearSession, loadAgentManifest, compileComposition, MarkdownStreamer, resolveMixin } from '../chunk-WD4LP66U.js';
|
|
15
|
+
import { buildClaudePluginFiles } from '../chunk-BQRRBGDE.js';
|
|
16
16
|
import '../chunk-X5YPJV4N.js';
|
|
17
|
+
import '../chunk-TDSRLMDB.js';
|
|
17
18
|
import '../chunk-O7SG5PC2.js';
|
|
18
19
|
import '../chunk-7QBNJTTQ.js';
|
|
19
20
|
import '../chunk-GTS2FODO.js';
|
|
20
21
|
import '../chunk-WQ7DE5UC.js';
|
|
21
22
|
import '../chunk-32NA4TVC.js';
|
|
22
23
|
import '../chunk-W3UDISS2.js';
|
|
23
|
-
import '../chunk-
|
|
24
|
-
import '../chunk-
|
|
25
|
-
import '../chunk-
|
|
26
|
-
import '../chunk-KOVLSBXK.js';
|
|
24
|
+
import '../chunk-23M4XZQW.js';
|
|
25
|
+
import '../chunk-BMQKMOQY.js';
|
|
26
|
+
import '../chunk-PAYAFNXG.js';
|
|
27
27
|
import '../chunk-RRVQAE5D.js';
|
|
28
|
-
import '../chunk-
|
|
28
|
+
import '../chunk-45H3UO2R.js';
|
|
29
29
|
import '../chunk-LV2HPH3C.js';
|
|
30
|
-
import '../chunk-
|
|
31
|
-
import '../chunk-
|
|
30
|
+
import '../chunk-YDTW4GT6.js';
|
|
31
|
+
import '../chunk-ZYDE52WE.js';
|
|
32
32
|
import '../chunk-QMONOHXT.js';
|
|
33
|
-
import '../chunk-
|
|
33
|
+
import '../chunk-OVRSNIKJ.js';
|
|
34
34
|
import '../chunk-6E6PKKAD.js';
|
|
35
|
-
import { loadAllFlows } from '../chunk-
|
|
36
|
-
import '../chunk-
|
|
37
|
-
import '../chunk-
|
|
38
|
-
import { AssetManager } from '../chunk-
|
|
39
|
-
import '../chunk-
|
|
40
|
-
import { readLock, resolveSettings, globalSettingsPath, projectSettingsPath, loadSettings, saveSettings, portableSpawn, portableSpawnSync, WorkspaceYamlEditor } from '../chunk-
|
|
35
|
+
import { loadFlow, loadAllFlows } from '../chunk-W7W66MDZ.js';
|
|
36
|
+
import '../chunk-DEYYRFQU.js';
|
|
37
|
+
import '../chunk-IFGTRL2I.js';
|
|
38
|
+
import { AssetManager } from '../chunk-PY7AQRGH.js';
|
|
39
|
+
import '../chunk-BKF3UFF4.js';
|
|
40
|
+
import { readLock, resolveSettings, globalSettingsPath, projectSettingsPath, loadSettings, saveSettings, portableSpawn, portableSpawnSync, WorkspaceYamlEditor } from '../chunk-KL2MQ6WI.js';
|
|
41
41
|
import { DRIVER_DEFAULTS } from '../chunk-K5GBV4SA.js';
|
|
42
|
-
import '../chunk-
|
|
43
|
-
import '../chunk-
|
|
44
|
-
import {
|
|
45
|
-
import {
|
|
46
|
-
import {
|
|
42
|
+
import { assetSearchDirs, detectDomains } from '../chunk-ZAP2BDHG.js';
|
|
43
|
+
import '../chunk-C32BRO2W.js';
|
|
44
|
+
import { resolveAgentDir, resolveSkWorkspaceConfig, findWorkspaceRoot, workspaceConfigFilename } from '../chunk-Z5DI7PDG.js';
|
|
45
|
+
import { SKAILE_MANIFEST_FILENAME, decodeSkaileManifest } from '../chunk-IERB3UXJ.js';
|
|
46
|
+
import { parseFrontmatter } from '../chunk-2FS4FPZ7.js';
|
|
47
|
+
import { ASSET_KINDS, parseAssetRef, isValidAssetName, ASSET_NAME_HINT, assetRefToStr } from '../chunk-IEJ5IOC3.js';
|
|
47
48
|
import '../chunk-JKNWJ64A.js';
|
|
48
49
|
import { SUPPORTED_DRIVER_TARGETS } from '../chunk-O4JH3KUE.js';
|
|
49
50
|
import { openSqlite } from '../chunk-24UIWON4.js';
|
|
50
51
|
import '../chunk-KTBKW2FI.js';
|
|
51
52
|
import '../chunk-UQ6LFBPZ.js';
|
|
52
|
-
import '../chunk-
|
|
53
|
-
import '../chunk-
|
|
53
|
+
import '../chunk-MBOR7D65.js';
|
|
54
|
+
import '../chunk-QDJKE557.js';
|
|
54
55
|
import '../chunk-CGYEHQOX.js';
|
|
55
56
|
import '../chunk-NSBPE2FW.js';
|
|
56
|
-
import * as
|
|
57
|
-
import
|
|
58
|
-
import * as
|
|
59
|
-
import
|
|
57
|
+
import * as fs11 from 'fs';
|
|
58
|
+
import fs11__default, { readFileSync, existsSync, writeFileSync, readdirSync, rmSync, statSync } from 'fs';
|
|
59
|
+
import * as path15 from 'path';
|
|
60
|
+
import path15__default, { resolve, join } from 'path';
|
|
60
61
|
import { fileURLToPath } from 'url';
|
|
61
62
|
import { Help, Command, Option } from 'commander';
|
|
62
63
|
import * as p5 from '@clack/prompts';
|
|
@@ -65,7 +66,7 @@ import * as readline from 'readline';
|
|
|
65
66
|
import { createInterface } from 'readline';
|
|
66
67
|
import { execSync, spawnSync } from 'child_process';
|
|
67
68
|
import { homedir } from 'os';
|
|
68
|
-
import
|
|
69
|
+
import fs6 from 'fs/promises';
|
|
69
70
|
import { parse as parse$1, stringify } from 'smol-toml';
|
|
70
71
|
import { createTRPCUntypedClient, httpLink, httpSubscriptionLink } from '@trpc/client';
|
|
71
72
|
import { parse } from 'yaml';
|
|
@@ -78,7 +79,7 @@ function makeAssetCommand() {
|
|
|
78
79
|
logErr(`Invalid --mode "${opts.mode}". Expected: copy | move | link.`);
|
|
79
80
|
process.exit(1);
|
|
80
81
|
}
|
|
81
|
-
if (!
|
|
82
|
+
if (!fs11.existsSync(srcPath)) {
|
|
82
83
|
logErr(`Source path does not exist: ${srcPath}`);
|
|
83
84
|
process.exit(1);
|
|
84
85
|
}
|
|
@@ -105,23 +106,23 @@ function makeAssetCommand() {
|
|
|
105
106
|
);
|
|
106
107
|
process.exit(1);
|
|
107
108
|
}
|
|
108
|
-
const basename2 =
|
|
109
|
-
const destDir = target.structure === "domain" && opts.domain ?
|
|
110
|
-
|
|
111
|
-
const destPath =
|
|
112
|
-
if (
|
|
109
|
+
const basename2 = path15.basename(srcPath);
|
|
110
|
+
const destDir = target.structure === "domain" && opts.domain ? path15.join(target.path, opts.domain) : target.path;
|
|
111
|
+
fs11.mkdirSync(destDir, { recursive: true });
|
|
112
|
+
const destPath = path15.join(destDir, basename2);
|
|
113
|
+
if (fs11.existsSync(destPath)) {
|
|
113
114
|
logErr(`Destination already exists: ${destPath}`);
|
|
114
115
|
process.exit(1);
|
|
115
116
|
}
|
|
116
117
|
switch (opts.mode) {
|
|
117
118
|
case "copy":
|
|
118
|
-
|
|
119
|
+
fs11.cpSync(srcPath, destPath, { recursive: true });
|
|
119
120
|
break;
|
|
120
121
|
case "move":
|
|
121
|
-
|
|
122
|
+
fs11.renameSync(srcPath, destPath);
|
|
122
123
|
break;
|
|
123
124
|
case "link":
|
|
124
|
-
|
|
125
|
+
fs11.symlinkSync(path15.resolve(srcPath), destPath);
|
|
125
126
|
break;
|
|
126
127
|
}
|
|
127
128
|
if (target.backend === "git" && opts.commit) {
|
|
@@ -169,17 +170,17 @@ function makeAssetCommand() {
|
|
|
169
170
|
}
|
|
170
171
|
const manifestPath = def.manifest.path;
|
|
171
172
|
const candidateSubpath = typeof manifestPath === "string" && manifestPath.length > 0 ? manifestPath : def.name;
|
|
172
|
-
const srcPath =
|
|
173
|
-
if (!
|
|
173
|
+
const srcPath = path15.join(lib.path, candidateSubpath);
|
|
174
|
+
if (!fs11.existsSync(srcPath)) {
|
|
174
175
|
logErr(`Asset path not found: ${srcPath}`);
|
|
175
176
|
process.exit(1);
|
|
176
177
|
}
|
|
177
|
-
const destPath =
|
|
178
|
-
|
|
178
|
+
const destPath = path15.join(target, candidateSubpath);
|
|
179
|
+
fs11.mkdirSync(path15.dirname(destPath), { recursive: true });
|
|
179
180
|
if (opts.mode === "copy") {
|
|
180
|
-
|
|
181
|
+
fs11.cpSync(srcPath, destPath, { recursive: true });
|
|
181
182
|
} else {
|
|
182
|
-
|
|
183
|
+
fs11.symlinkSync(path15.resolve(srcPath), destPath);
|
|
183
184
|
}
|
|
184
185
|
logOk(`Installed ${ref} \u2192 ${destPath} (${opts.mode})`);
|
|
185
186
|
} finally {
|
|
@@ -273,7 +274,7 @@ function makeSearchCommand() {
|
|
|
273
274
|
const showLocal = !opts.store;
|
|
274
275
|
const showStore = !opts.local;
|
|
275
276
|
if (showLocal) {
|
|
276
|
-
const am2 = new AssetManager({ projectDir:
|
|
277
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
277
278
|
const entries = am2.search(query, kind);
|
|
278
279
|
if (entries.length === 0) {
|
|
279
280
|
if (!showStore) {
|
|
@@ -310,7 +311,7 @@ function makeSearchCommand() {
|
|
|
310
311
|
}
|
|
311
312
|
if (showStore) {
|
|
312
313
|
try {
|
|
313
|
-
const { getStoreConfig: getStoreConfig2, storeFetch: storeFetch2 } = await import('../store-client-
|
|
314
|
+
const { getStoreConfig: getStoreConfig2, storeFetch: storeFetch2 } = await import('../store-client-CENBEASX.js');
|
|
314
315
|
const config = getStoreConfig2();
|
|
315
316
|
const params = {};
|
|
316
317
|
if (query) params.q = query;
|
|
@@ -339,7 +340,7 @@ function makeSearchCommand() {
|
|
|
339
340
|
function makeAddCommand() {
|
|
340
341
|
return new Command("add").description("Add to skaile.yaml + deploy").argument("<ref>", "Asset reference (kind:name[@repo])").option("--project-dir <path>", "Project directory", process.cwd()).option("--global", "Deploy to global dir (~/.claude)").option("--target <agent>", "Driver target", "claude-code").action(async (ref, opts) => {
|
|
341
342
|
const am2 = new AssetManager({
|
|
342
|
-
projectDir:
|
|
343
|
+
projectDir: path15__default.resolve(opts.projectDir),
|
|
343
344
|
global: opts.global,
|
|
344
345
|
driverTarget: opts.target
|
|
345
346
|
});
|
|
@@ -360,7 +361,7 @@ function makeAddCommand() {
|
|
|
360
361
|
function makeRemoveCommand() {
|
|
361
362
|
return new Command("remove").description("Remove from skaile.yaml + undeploy").argument("<ref>", "Asset reference (kind:name)").option("--project-dir <path>", "Project directory", process.cwd()).option("--global", "Remove from global dir").option("--target <agent>", "Driver target", "claude-code").action((ref, opts) => {
|
|
362
363
|
const am2 = new AssetManager({
|
|
363
|
-
projectDir:
|
|
364
|
+
projectDir: path15__default.resolve(opts.projectDir),
|
|
364
365
|
global: opts.global,
|
|
365
366
|
driverTarget: opts.target
|
|
366
367
|
});
|
|
@@ -374,7 +375,7 @@ function makeListCommand() {
|
|
|
374
375
|
new Option("--target <agent>", "Driver target").default("claude-code").choices(SUPPORTED_DRIVER_TARGETS)
|
|
375
376
|
).action((kind, opts) => {
|
|
376
377
|
const am2 = new AssetManager({
|
|
377
|
-
projectDir:
|
|
378
|
+
projectDir: path15__default.resolve(opts.projectDir),
|
|
378
379
|
global: opts.global,
|
|
379
380
|
driverTarget: opts.target
|
|
380
381
|
});
|
|
@@ -398,7 +399,7 @@ function makeListCommand() {
|
|
|
398
399
|
}
|
|
399
400
|
function makeInfoCommand() {
|
|
400
401
|
return new Command("info").description("Show asset metadata, deps, deploy status").argument("<ref>", "Asset reference (kind:name)").option("--project-dir <path>", "Project directory", process.cwd()).action((ref, opts) => {
|
|
401
|
-
const am2 = new AssetManager({ projectDir:
|
|
402
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
402
403
|
const entry = am2.info(ref);
|
|
403
404
|
if (!entry) {
|
|
404
405
|
logErr(
|
|
@@ -431,7 +432,7 @@ function makeCreateCommand() {
|
|
|
431
432
|
new Option("-k, --kind <kind>", "Asset kind").default("skill").choices([...ASSET_KINDS])
|
|
432
433
|
).option("-d, --dir <dir>", "Target directory (default: cwd)").action((name, opts) => {
|
|
433
434
|
const am2 = new AssetManager({ projectDir: process.cwd() });
|
|
434
|
-
const destDir = opts.dir ?
|
|
435
|
+
const destDir = opts.dir ? path15__default.resolve(opts.dir) : process.cwd();
|
|
435
436
|
const result = am2.create(name, opts.kind, destDir);
|
|
436
437
|
if (result.ok) logOk(`Created ${kindColor(opts.kind)}: ${pc5.dim(result.path)}`);
|
|
437
438
|
else {
|
|
@@ -442,7 +443,7 @@ function makeCreateCommand() {
|
|
|
442
443
|
}
|
|
443
444
|
function makeDoctorCommand() {
|
|
444
445
|
return new Command("doctor").description("Scan for missing dependency chains").argument("[name]", "Check a specific asset (kind:name)").option("--project-dir <path>", "Project directory", process.cwd()).action((name, opts) => {
|
|
445
|
-
const am2 = new AssetManager({ projectDir:
|
|
446
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
446
447
|
const issues = am2.doctor();
|
|
447
448
|
if (issues.length === 0) {
|
|
448
449
|
logOk("No missing dependencies.");
|
|
@@ -468,11 +469,11 @@ function makeCatalogCommand() {
|
|
|
468
469
|
const catalog = new Command("catalog").description("Catalog source health and configuration");
|
|
469
470
|
catalog.command("test").description("Probe the configured catalog source and report status").option("--project-dir <path>", "Project directory (for project-level config overlay)").option("--url <url>", "Override the catalog URL for this probe").option("--force", "Probe the network even in air-gapped mode (cache_ttl: 0)").action(async (opts) => {
|
|
470
471
|
const { resolveConfig, isLocalCatalogUrl, trpcGetUrl } = await import('../library/index.js');
|
|
471
|
-
const projectDir = opts.projectDir ?
|
|
472
|
+
const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : void 0;
|
|
472
473
|
const cfg = resolveConfig({ projectDir });
|
|
473
474
|
const baseUrl = opts.url ?? cfg.catalog.url;
|
|
474
475
|
if (isLocalCatalogUrl(baseUrl)) {
|
|
475
|
-
const { resolveCatalogSource } = await import('../open-library-
|
|
476
|
+
const { resolveCatalogSource } = await import('../open-library-WYASW4BH.js');
|
|
476
477
|
let resolved;
|
|
477
478
|
try {
|
|
478
479
|
resolved = await resolveCatalogSource({ projectDir: opts.projectDir });
|
|
@@ -561,7 +562,7 @@ function makeCatalogCommand() {
|
|
|
561
562
|
});
|
|
562
563
|
catalog.command("info").description("Print the resolved catalog configuration (url, framing, cacheTtlMs)").option("--project-dir <path>", "Project directory (for project-level config overlay)").action(async (opts) => {
|
|
563
564
|
const { resolveConfig } = await import('../library/index.js');
|
|
564
|
-
const projectDir = opts.projectDir ?
|
|
565
|
+
const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : void 0;
|
|
565
566
|
const cfg = resolveConfig({ projectDir });
|
|
566
567
|
console.log(`url: ${cfg.catalog.url}`);
|
|
567
568
|
console.log(`framing: ${cfg.catalog.framing}`);
|
|
@@ -613,23 +614,48 @@ complete -F _${bin}_completion ${bin}`,
|
|
|
613
614
|
end
|
|
614
615
|
complete -c ${bin} -f -a '(__${bin}_complete)'`
|
|
615
616
|
};
|
|
617
|
+
function discoverFlows() {
|
|
618
|
+
const byId = /* @__PURE__ */ new Map();
|
|
619
|
+
for (const root of aiResourceRoots()) {
|
|
620
|
+
for (const flow of loadAllFlows(root)) {
|
|
621
|
+
if (!byId.has(flow.id)) byId.set(flow.id, flow);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
return [...byId.values()];
|
|
625
|
+
}
|
|
626
|
+
function findFlowFile(flowId, priorityRoots = []) {
|
|
627
|
+
for (const root of [...priorityRoots, ...aiResourceRoots()]) {
|
|
628
|
+
for (const { dir } of assetSearchDirs(root, "flows")) {
|
|
629
|
+
for (const ext of [".flow.yaml", ".flow.json", ".json"]) {
|
|
630
|
+
const candidate = path15__default.join(dir, `${flowId}${ext}`);
|
|
631
|
+
if (fs11__default.existsSync(candidate)) return candidate;
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
return void 0;
|
|
636
|
+
}
|
|
616
637
|
function findSkills(domain) {
|
|
617
|
-
const
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
if (!fs10__default.existsSync(skillsDir)) continue;
|
|
623
|
-
walkSkills(skillsDir, d.name, skills);
|
|
638
|
+
const found = [];
|
|
639
|
+
for (const root of aiResourceRoots()) {
|
|
640
|
+
for (const { dir, domain: dirDomain } of assetSearchDirs(root, "skills")) {
|
|
641
|
+
if (fs11__default.existsSync(dir)) walkSkills(dir, dirDomain, found);
|
|
642
|
+
}
|
|
624
643
|
}
|
|
625
|
-
|
|
644
|
+
const seen = /* @__PURE__ */ new Set();
|
|
645
|
+
const deduped = [];
|
|
646
|
+
for (const s of found) {
|
|
647
|
+
if (seen.has(s.name)) continue;
|
|
648
|
+
seen.add(s.name);
|
|
649
|
+
deduped.push(s);
|
|
650
|
+
}
|
|
651
|
+
return deduped;
|
|
626
652
|
}
|
|
627
653
|
function walkSkills(dir, domain, out) {
|
|
628
|
-
for (const entry of
|
|
629
|
-
const full =
|
|
654
|
+
for (const entry of fs11__default.readdirSync(dir, { withFileTypes: true })) {
|
|
655
|
+
const full = path15__default.join(dir, entry.name);
|
|
630
656
|
if (entry.isDirectory()) {
|
|
631
|
-
const skillMd =
|
|
632
|
-
if (
|
|
657
|
+
const skillMd = path15__default.join(full, "SKILL.md");
|
|
658
|
+
if (fs11__default.existsSync(skillMd)) {
|
|
633
659
|
out.push({ name: entry.name, path: full, skillPath: skillMd, domain });
|
|
634
660
|
} else {
|
|
635
661
|
walkSkills(full, domain, out);
|
|
@@ -643,21 +669,24 @@ function resolveSkillNames() {
|
|
|
643
669
|
return findSkills().map((s) => s.name);
|
|
644
670
|
}
|
|
645
671
|
function resolveDomains() {
|
|
646
|
-
|
|
647
|
-
|
|
672
|
+
const domains = /* @__PURE__ */ new Set();
|
|
673
|
+
for (const root of aiResourceRoots()) {
|
|
674
|
+
for (const d of detectDomains(root)) domains.add(d.id);
|
|
675
|
+
}
|
|
676
|
+
return [...domains];
|
|
648
677
|
}
|
|
649
678
|
function resolveFlowIds() {
|
|
650
679
|
try {
|
|
651
|
-
return
|
|
680
|
+
return discoverFlows().map((f) => f.id);
|
|
652
681
|
} catch {
|
|
653
682
|
return [];
|
|
654
683
|
}
|
|
655
684
|
}
|
|
656
685
|
function resolveSessionIds(projectDir) {
|
|
657
|
-
const sessionsDir =
|
|
658
|
-
if (!
|
|
686
|
+
const sessionsDir = path15__default.join(projectDir, ".skaile", "sessions");
|
|
687
|
+
if (!fs11__default.existsSync(sessionsDir)) return [];
|
|
659
688
|
try {
|
|
660
|
-
return
|
|
689
|
+
return fs11__default.readdirSync(sessionsDir).filter((f) => f.endsWith(".json")).map((f) => f.slice(0, -".json".length));
|
|
661
690
|
} catch {
|
|
662
691
|
return [];
|
|
663
692
|
}
|
|
@@ -712,73 +741,74 @@ function resolveDynamic(words, cword) {
|
|
|
712
741
|
}
|
|
713
742
|
var PERSONAL_KEYS = /* @__PURE__ */ new Set(["driver", "model", "provider"]);
|
|
714
743
|
var API_KEY_PREFIX = "apiKey.";
|
|
715
|
-
function
|
|
716
|
-
const
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
const
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
744
|
+
async function showConfig(opts) {
|
|
745
|
+
const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : process.cwd();
|
|
746
|
+
const config = await resolveSettings(projectDir);
|
|
747
|
+
const wsDefaults = {};
|
|
748
|
+
try {
|
|
749
|
+
const ws = resolveSkWorkspaceConfig(projectDir);
|
|
750
|
+
const p7 = ws.agent_config?.default ?? {};
|
|
751
|
+
if (p7.driver) wsDefaults.driver = p7.driver;
|
|
752
|
+
if (p7.provider) wsDefaults.provider = p7.provider;
|
|
753
|
+
if (p7.model) wsDefaults.model = p7.model;
|
|
754
|
+
if (p7.skills_dir) wsDefaults.skills_dir = p7.skills_dir;
|
|
755
|
+
if (p7.agents_dir) wsDefaults.agents_dir = p7.agents_dir;
|
|
756
|
+
if (p7.prompts_dir) wsDefaults.prompts_dir = p7.prompts_dir;
|
|
757
|
+
} catch {
|
|
758
|
+
}
|
|
759
|
+
console.log();
|
|
760
|
+
console.log(S.heading(" Effective Config"));
|
|
761
|
+
console.log(` ${S.rule(40)}`);
|
|
762
|
+
for (const key of ["driver", "provider", "model"]) {
|
|
763
|
+
const value = config[key];
|
|
764
|
+
if (value !== void 0) {
|
|
765
|
+
console.log(` ${S.label(`${key}:`.padEnd(16))} ${value}`);
|
|
731
766
|
}
|
|
767
|
+
}
|
|
768
|
+
if (Object.keys(wsDefaults).length > 0) {
|
|
732
769
|
console.log();
|
|
733
|
-
console.log(S.heading("
|
|
770
|
+
console.log(` ${S.heading("Workspace Defaults")} ${S.dim("(skaile.yaml)")}`);
|
|
734
771
|
console.log(` ${S.rule(40)}`);
|
|
735
|
-
for (const key of
|
|
736
|
-
|
|
737
|
-
if (value !== void 0) {
|
|
738
|
-
console.log(` ${S.label(`${key}:`.padEnd(16))} ${value}`);
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
if (Object.keys(wsDefaults).length > 0) {
|
|
742
|
-
console.log();
|
|
743
|
-
console.log(` ${S.heading("Workspace Defaults")} ${S.dim("(skaile.yaml)")}`);
|
|
744
|
-
console.log(` ${S.rule(40)}`);
|
|
745
|
-
for (const [key, value] of Object.entries(wsDefaults)) {
|
|
746
|
-
console.log(` ${S.label(`${key}:`.padEnd(16))} ${value}`);
|
|
747
|
-
}
|
|
772
|
+
for (const [key, value] of Object.entries(wsDefaults)) {
|
|
773
|
+
console.log(` ${S.label(`${key}:`.padEnd(16))} ${value}`);
|
|
748
774
|
}
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
)
|
|
759
|
-
|
|
775
|
+
}
|
|
776
|
+
if (config.apiKeys && Object.keys(config.apiKeys).length > 0) {
|
|
777
|
+
console.log();
|
|
778
|
+
console.log(` ${S.heading("API Keys")}`);
|
|
779
|
+
console.log(` ${S.rule(40)}`);
|
|
780
|
+
for (const [provider, key] of Object.entries(config.apiKeys)) {
|
|
781
|
+
const fromEnv = !!process.env[`${provider.toUpperCase()}_API_KEY`];
|
|
782
|
+
if (key) {
|
|
783
|
+
console.log(
|
|
784
|
+
` ${S.label(`${provider}:`.padEnd(16))} ****${key.slice(-4)}` + (fromEnv ? ` ${S.dim("[env]")}` : "")
|
|
785
|
+
);
|
|
760
786
|
}
|
|
761
787
|
}
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
console.log(` ${S.heading("Resolved Paths")} ${S.dim(`(${fw})`)}`);
|
|
767
|
-
console.log(` ${S.rule(40)}`);
|
|
768
|
-
console.log(` ${S.label("skills:".padEnd(16))} ${config.skillsDir ?? paths.skillsDir}`);
|
|
769
|
-
console.log(` ${S.label("agents:".padEnd(16))} ${config.agentsDir ?? paths.agentsDir}`);
|
|
770
|
-
console.log(` ${S.label("prompts:".padEnd(16))} ${config.promptsDir ?? paths.promptsDir}`);
|
|
771
|
-
}
|
|
788
|
+
}
|
|
789
|
+
const fw = config.driver ?? "omp";
|
|
790
|
+
const paths = DRIVER_DEFAULTS[fw] ?? DRIVER_DEFAULTS.omp;
|
|
791
|
+
if (paths) {
|
|
772
792
|
console.log();
|
|
773
|
-
});
|
|
793
|
+
console.log(` ${S.heading("Resolved Paths")} ${S.dim(`(${fw})`)}`);
|
|
794
|
+
console.log(` ${S.rule(40)}`);
|
|
795
|
+
console.log(` ${S.label("skills:".padEnd(16))} ${config.skillsDir ?? paths.skillsDir}`);
|
|
796
|
+
console.log(` ${S.label("agents:".padEnd(16))} ${config.agentsDir ?? paths.agentsDir}`);
|
|
797
|
+
console.log(` ${S.label("prompts:".padEnd(16))} ${config.promptsDir ?? paths.promptsDir}`);
|
|
798
|
+
}
|
|
799
|
+
console.log();
|
|
800
|
+
}
|
|
801
|
+
function makeConfigCommand() {
|
|
802
|
+
const cmd = new Command("config").description("Manage personal config (.skaile/settings.json)");
|
|
803
|
+
cmd.command("show").description("Show effective config with sources").option("--project-dir <path>", "Project directory").action((opts) => showConfig(opts));
|
|
774
804
|
cmd.command("get <key>").description("Get an effective config value").option("--project-dir <path>", "Project directory").action(async (key, opts) => {
|
|
775
|
-
const projectDir = opts.projectDir ?
|
|
805
|
+
const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : process.cwd();
|
|
776
806
|
const config = await resolveSettings(projectDir);
|
|
777
807
|
const value = config[key];
|
|
778
808
|
console.log(value ?? S.dim("(not set)"));
|
|
779
809
|
});
|
|
780
810
|
cmd.command("set <key> <value>").description("Set a personal config value (driver, model, provider, apiKey.<provider>)").option("--project-dir <path>", "Project directory").option("--global", "Write to ~/.skaile/settings.json instead of project-local").action(async (key, value, opts) => {
|
|
781
|
-
const projectDir = opts.projectDir ?
|
|
811
|
+
const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : process.cwd();
|
|
782
812
|
const isApiKey = key.startsWith(API_KEY_PREFIX);
|
|
783
813
|
if (!PERSONAL_KEYS.has(key) && !isApiKey) {
|
|
784
814
|
logErr(
|
|
@@ -802,9 +832,7 @@ function makeConfigCommand() {
|
|
|
802
832
|
}
|
|
803
833
|
console.log(S.dim(` \u2192 ${filePath}`));
|
|
804
834
|
});
|
|
805
|
-
cmd.action(() => {
|
|
806
|
-
cmd.commands.find((c) => c.name() === "show").parse(process.argv);
|
|
807
|
-
});
|
|
835
|
+
cmd.action(() => showConfig({}));
|
|
808
836
|
return cmd;
|
|
809
837
|
}
|
|
810
838
|
function parseShorthand(input) {
|
|
@@ -954,6 +982,22 @@ function makeConnectCommand() {
|
|
|
954
982
|
await client.disconnect();
|
|
955
983
|
});
|
|
956
984
|
}
|
|
985
|
+
function parsePositiveIntOption(value) {
|
|
986
|
+
const n = Number.parseInt(value, 10);
|
|
987
|
+
if (!Number.isFinite(n) || n <= 0) {
|
|
988
|
+
throw new Error(`--limit must be a positive integer (got ${value})`);
|
|
989
|
+
}
|
|
990
|
+
return n;
|
|
991
|
+
}
|
|
992
|
+
function scanFactoryConnectors(scanDirectory, roots) {
|
|
993
|
+
const byName = /* @__PURE__ */ new Map();
|
|
994
|
+
for (const dir of roots) {
|
|
995
|
+
for (const e of scanDirectory(dir, "factory-assets")) {
|
|
996
|
+
if (e.kind === "connector" && !byName.has(e.name)) byName.set(e.name, e);
|
|
997
|
+
}
|
|
998
|
+
}
|
|
999
|
+
return [...byName.values()];
|
|
1000
|
+
}
|
|
957
1001
|
async function connectConnectors(projectDir) {
|
|
958
1002
|
const res = await import('../connectors/index.js');
|
|
959
1003
|
res.registerBuiltinConnectors();
|
|
@@ -1056,11 +1100,8 @@ async function promptField(field) {
|
|
|
1056
1100
|
function makeConnectorCommand() {
|
|
1057
1101
|
const cmd = new Command("connector").description("Operate on connectors in a workspace");
|
|
1058
1102
|
cmd.command("catalog").description("List all available connector drivers and their dependencies").action(async () => {
|
|
1059
|
-
const { scanDirectory,
|
|
1060
|
-
const
|
|
1061
|
-
const entries = scanDirectory(baseAssetsDir, "base-assets").filter(
|
|
1062
|
-
(e) => e.kind === "connector"
|
|
1063
|
-
);
|
|
1103
|
+
const { scanDirectory, factoryAssetRoots } = await import('../core/index.js');
|
|
1104
|
+
const entries = scanFactoryConnectors(scanDirectory, factoryAssetRoots());
|
|
1064
1105
|
if (entries.length === 0) {
|
|
1065
1106
|
console.log("No connector descriptors found.");
|
|
1066
1107
|
return;
|
|
@@ -1084,17 +1125,14 @@ function makeConnectorCommand() {
|
|
|
1084
1125
|
cmd.command("add <driver>").option("--id <id>", "Connector instance ID (defaults to driver name)").option("--access <level>", "Access level: read-only | read-write", "read-only").option("--no-install", "Skip npm dependency installation").option("--project-dir <path>", "Workspace directory", process.cwd()).description("Add a connector to skaile.yaml and install its npm deps").action(
|
|
1085
1126
|
async (driver, opts) => {
|
|
1086
1127
|
const { installNpmPackages } = await import('../connectors/index.js');
|
|
1087
|
-
const { scanDirectory,
|
|
1088
|
-
const projectDir =
|
|
1089
|
-
const yamlPath =
|
|
1128
|
+
const { scanDirectory, factoryAssetRoots, WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
|
|
1129
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1130
|
+
const yamlPath = path15__default.join(projectDir, "skaile.yaml");
|
|
1090
1131
|
if (!existsSync(yamlPath)) {
|
|
1091
1132
|
logErr("No skaile.yaml found in current directory. Run 'skaile init' first.");
|
|
1092
1133
|
process.exit(1);
|
|
1093
1134
|
}
|
|
1094
|
-
const
|
|
1095
|
-
const entries = scanDirectory(baseAssetsDir, "base-assets").filter(
|
|
1096
|
-
(e) => e.kind === "connector"
|
|
1097
|
-
);
|
|
1135
|
+
const entries = scanFactoryConnectors(scanDirectory, factoryAssetRoots());
|
|
1098
1136
|
const entry = entries.find((e) => e.name === driver);
|
|
1099
1137
|
if (!entry) {
|
|
1100
1138
|
logErr(
|
|
@@ -1149,8 +1187,8 @@ ${installResult.output}`);
|
|
|
1149
1187
|
);
|
|
1150
1188
|
cmd.command("remove <id>").option("--project-dir <path>", "Workspace directory", process.cwd()).description("Remove a connector from skaile.yaml by its instance ID").action(async (id, opts) => {
|
|
1151
1189
|
const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
|
|
1152
|
-
const projectDir =
|
|
1153
|
-
const yamlPath =
|
|
1190
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1191
|
+
const yamlPath = path15__default.join(projectDir, "skaile.yaml");
|
|
1154
1192
|
if (!existsSync(yamlPath)) {
|
|
1155
1193
|
logErr("No skaile.yaml found in current directory.");
|
|
1156
1194
|
process.exit(1);
|
|
@@ -1167,7 +1205,7 @@ ${installResult.output}`);
|
|
|
1167
1205
|
cmd.command("status [id]").option("--project-dir <path>", "Workspace directory", process.cwd()).description("Connect and report health status for one or all connectors").action(async (id, opts) => {
|
|
1168
1206
|
const res = await import('../connectors/index.js');
|
|
1169
1207
|
res.registerBuiltinConnectors();
|
|
1170
|
-
const projectDir =
|
|
1208
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1171
1209
|
const declarations = res.loadConnectorDeclarations(projectDir);
|
|
1172
1210
|
if (declarations.length === 0) {
|
|
1173
1211
|
console.log("No connectors configured in skaile.yaml.");
|
|
@@ -1191,7 +1229,7 @@ ${installResult.output}`);
|
|
|
1191
1229
|
await manager.disconnectAll();
|
|
1192
1230
|
});
|
|
1193
1231
|
cmd.command("list").description("List all configured connectors").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (opts) => {
|
|
1194
|
-
const projectDir =
|
|
1232
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1195
1233
|
const manager = await connectConnectors(projectDir);
|
|
1196
1234
|
try {
|
|
1197
1235
|
console.log(JSON.stringify(manager.listConnectors(), null, 2));
|
|
@@ -1200,7 +1238,7 @@ ${installResult.output}`);
|
|
|
1200
1238
|
}
|
|
1201
1239
|
});
|
|
1202
1240
|
cmd.command("sync [id]").description("Re-sync a filesystem-face connector or all of them (git pull, S3 refresh, etc.)").option("--all", "Sync all connectors").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (id, opts) => {
|
|
1203
|
-
const projectDir =
|
|
1241
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1204
1242
|
const manager = await connectConnectors(projectDir);
|
|
1205
1243
|
try {
|
|
1206
1244
|
if (opts.all) {
|
|
@@ -1224,7 +1262,7 @@ ${installResult.output}`);
|
|
|
1224
1262
|
}
|
|
1225
1263
|
});
|
|
1226
1264
|
cmd.command("ops <id>").description("List available operations for a connector").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (id, opts) => {
|
|
1227
|
-
const projectDir =
|
|
1265
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1228
1266
|
const manager = await connectConnectors(projectDir);
|
|
1229
1267
|
try {
|
|
1230
1268
|
if (!manager.has(id)) {
|
|
@@ -1239,7 +1277,7 @@ ${installResult.output}`);
|
|
|
1239
1277
|
}
|
|
1240
1278
|
});
|
|
1241
1279
|
cmd.command("read <id> <resource-path>").description("Read content from a connector").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (id, resourcePath, opts) => {
|
|
1242
|
-
const projectDir =
|
|
1280
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1243
1281
|
const manager = await connectConnectors(projectDir);
|
|
1244
1282
|
try {
|
|
1245
1283
|
const content = await manager.read(id, resourcePath);
|
|
@@ -1249,7 +1287,7 @@ ${installResult.output}`);
|
|
|
1249
1287
|
}
|
|
1250
1288
|
});
|
|
1251
1289
|
cmd.command("write <id> <resource-path> <content>").description("Write content to a connector at a path").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (id, resourcePath, content, opts) => {
|
|
1252
|
-
const projectDir =
|
|
1290
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1253
1291
|
const manager = await connectConnectors(projectDir);
|
|
1254
1292
|
try {
|
|
1255
1293
|
await manager.write(id, resourcePath, { data: content });
|
|
@@ -1258,8 +1296,8 @@ ${installResult.output}`);
|
|
|
1258
1296
|
await manager.disconnectAll();
|
|
1259
1297
|
}
|
|
1260
1298
|
});
|
|
1261
|
-
cmd.command("entries <id> [resource-path]").description("List entries in a connector (files, keys, rows, etc)").option("--project-dir <path>", "Workspace directory", process.cwd()).option("--recursive", "Include nested entries").option("--limit <n>", "Maximum entries to return",
|
|
1262
|
-
const projectDir =
|
|
1299
|
+
cmd.command("entries <id> [resource-path]").description("List entries in a connector (files, keys, rows, etc)").option("--project-dir <path>", "Workspace directory", process.cwd()).option("--recursive", "Include nested entries").option("--limit <n>", "Maximum entries to return", parsePositiveIntOption).action(async (id, resourcePath, opts) => {
|
|
1300
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1263
1301
|
const manager = await connectConnectors(projectDir);
|
|
1264
1302
|
try {
|
|
1265
1303
|
const entries = await manager.list(id, resourcePath, {
|
|
@@ -1272,7 +1310,7 @@ ${installResult.output}`);
|
|
|
1272
1310
|
}
|
|
1273
1311
|
});
|
|
1274
1312
|
cmd.command("search <id> <query>").description("Search within a connector for matching content").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (id, query, opts) => {
|
|
1275
|
-
const projectDir =
|
|
1313
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1276
1314
|
const manager = await connectConnectors(projectDir);
|
|
1277
1315
|
try {
|
|
1278
1316
|
const results = await manager.search(id, query);
|
|
@@ -1282,7 +1320,7 @@ ${installResult.output}`);
|
|
|
1282
1320
|
}
|
|
1283
1321
|
});
|
|
1284
1322
|
cmd.command("delete <id> <resource-path>").description("Delete an entry from a connector").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (id, resourcePath, opts) => {
|
|
1285
|
-
const projectDir =
|
|
1323
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1286
1324
|
const manager = await connectConnectors(projectDir);
|
|
1287
1325
|
try {
|
|
1288
1326
|
const ok = await manager.delete(id, resourcePath);
|
|
@@ -1292,7 +1330,7 @@ ${installResult.output}`);
|
|
|
1292
1330
|
}
|
|
1293
1331
|
});
|
|
1294
1332
|
cmd.command("run <id> <op> [args...]").description("Run a custom adapter operation (e.g. git log, sqlite query)").option("--project-dir <path>", "Workspace directory", process.cwd()).allowUnknownOption().action(async (id, op, args, opts) => {
|
|
1295
|
-
const projectDir =
|
|
1333
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1296
1334
|
const manager = await connectConnectors(projectDir);
|
|
1297
1335
|
try {
|
|
1298
1336
|
if (!manager.has(id)) {
|
|
@@ -1401,7 +1439,7 @@ function envRecord() {
|
|
|
1401
1439
|
async function buildDeployContext(projectDir) {
|
|
1402
1440
|
const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
|
|
1403
1441
|
const config = resolveSkWorkspaceConfig2(projectDir);
|
|
1404
|
-
const workspaceId = config.name ??
|
|
1442
|
+
const workspaceId = config.name ?? path15__default.basename(projectDir);
|
|
1405
1443
|
let log;
|
|
1406
1444
|
try {
|
|
1407
1445
|
const { createLogger } = await import('../core/logging.js');
|
|
@@ -1433,13 +1471,13 @@ async function ensureTargetsRegistered(projectDir) {
|
|
|
1433
1471
|
const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
|
|
1434
1472
|
const config = resolveSkWorkspaceConfig2(projectDir);
|
|
1435
1473
|
if (config.plugins && config.plugins.length > 0) {
|
|
1436
|
-
const { ensurePluginsLoaded } = await import('../plugin-store-
|
|
1474
|
+
const { ensurePluginsLoaded } = await import('../plugin-store-O5VR45CA.js');
|
|
1437
1475
|
const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
|
|
1438
1476
|
for (const f of result.failed) logWarn(f.error);
|
|
1439
1477
|
}
|
|
1440
1478
|
}
|
|
1441
1479
|
async function runUp(opts) {
|
|
1442
|
-
const projectDir =
|
|
1480
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1443
1481
|
await ensureTargetsRegistered(projectDir);
|
|
1444
1482
|
const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
|
|
1445
1483
|
const { resolveDeployTarget, pluginRegistry } = await import('../plugin-registry/index.js');
|
|
@@ -1507,7 +1545,7 @@ async function restoreFromHandle(projectDir) {
|
|
|
1507
1545
|
return { target, handle, ctx };
|
|
1508
1546
|
}
|
|
1509
1547
|
async function runDown(opts) {
|
|
1510
|
-
const projectDir =
|
|
1548
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1511
1549
|
const restored = await restoreFromHandle(projectDir);
|
|
1512
1550
|
if (!restored) return;
|
|
1513
1551
|
await restored.handle.stop();
|
|
@@ -1516,7 +1554,7 @@ async function runDown(opts) {
|
|
|
1516
1554
|
logOk(`Stopped ${S.cmd(restored.target.id)} and cleared the handle.`);
|
|
1517
1555
|
}
|
|
1518
1556
|
async function runStatus(opts) {
|
|
1519
|
-
const projectDir =
|
|
1557
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1520
1558
|
const restored = await restoreFromHandle(projectDir);
|
|
1521
1559
|
if (!restored) return;
|
|
1522
1560
|
const health = await restored.handle.health();
|
|
@@ -1530,7 +1568,7 @@ async function runStatus(opts) {
|
|
|
1530
1568
|
console.log();
|
|
1531
1569
|
}
|
|
1532
1570
|
async function runLogs(opts) {
|
|
1533
|
-
const projectDir =
|
|
1571
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1534
1572
|
const restored = await restoreFromHandle(projectDir);
|
|
1535
1573
|
if (!restored) return;
|
|
1536
1574
|
if (!restored.handle.logs) {
|
|
@@ -1554,7 +1592,7 @@ function makeDeployCommand() {
|
|
|
1554
1592
|
}
|
|
1555
1593
|
function makeDiffCommand() {
|
|
1556
1594
|
return new Command("diff").description("Show changes between deployed and source versions").argument("<ref>", "Asset reference (kind:name)").option("--project-dir <path>", "Project directory", process.cwd()).action((ref, opts) => {
|
|
1557
|
-
const am2 = new AssetManager({ projectDir:
|
|
1595
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
1558
1596
|
const result = am2.diff(ref);
|
|
1559
1597
|
if (result === null) {
|
|
1560
1598
|
logInfo("No differences (or asset not found).");
|
|
@@ -1566,7 +1604,7 @@ function makeDiffCommand() {
|
|
|
1566
1604
|
function makeFlowCommand() {
|
|
1567
1605
|
const cmd = new Command("flow").description("Manage flows");
|
|
1568
1606
|
cmd.command("list").description("List available flows").action(async () => {
|
|
1569
|
-
const flows =
|
|
1607
|
+
const flows = discoverFlows();
|
|
1570
1608
|
if (flows.length === 0) {
|
|
1571
1609
|
logInfo("No flows found.");
|
|
1572
1610
|
return;
|
|
@@ -1581,7 +1619,7 @@ function makeFlowCommand() {
|
|
|
1581
1619
|
console.log();
|
|
1582
1620
|
});
|
|
1583
1621
|
cmd.command("show <id>").description("Show flow details and node graph").action(async (id) => {
|
|
1584
|
-
const flows =
|
|
1622
|
+
const flows = discoverFlows();
|
|
1585
1623
|
const flow = flows.find((f) => f.id === id);
|
|
1586
1624
|
if (!flow) {
|
|
1587
1625
|
logErr(`Flow not found: ${id}`);
|
|
@@ -1607,7 +1645,7 @@ function makeFlowCommand() {
|
|
|
1607
1645
|
function makeHistoryCommand() {
|
|
1608
1646
|
const cmd = new Command("history").description("Show recent add/remove/update actions");
|
|
1609
1647
|
cmd.argument("[limit]", "Number of entries to show", "20").option("--project-dir <path>", "Project directory", process.cwd()).action((limitStr, opts) => {
|
|
1610
|
-
const am2 = new AssetManager({ projectDir:
|
|
1648
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
1611
1649
|
const limit = parseInt(limitStr, 10) || 20;
|
|
1612
1650
|
const entries = am2.history(limit);
|
|
1613
1651
|
if (entries.length === 0) {
|
|
@@ -1627,7 +1665,7 @@ function makeHistoryCommand() {
|
|
|
1627
1665
|
console.log();
|
|
1628
1666
|
});
|
|
1629
1667
|
cmd.command("clear").description("Clear action history").option("--project-dir <path>", "Project directory", process.cwd()).action((opts) => {
|
|
1630
|
-
const am2 = new AssetManager({ projectDir:
|
|
1668
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
1631
1669
|
am2.clearHistory();
|
|
1632
1670
|
logOk("History cleared.");
|
|
1633
1671
|
});
|
|
@@ -1695,12 +1733,12 @@ function makeLibraryCommand() {
|
|
|
1695
1733
|
cmd.command("init <name>").description("Create a new local library at ~/.skaile/libraries/<name>").option("--git <url>", "Initialize as a git library tracking <url>").option("--owner", "Mark as owner (default for local)").option("--contributor", "Mark as contributor").option("--reader", "Mark as reader").action(
|
|
1696
1734
|
async (name, opts) => {
|
|
1697
1735
|
const libDir = resolveLibraryDir();
|
|
1698
|
-
const libPath =
|
|
1736
|
+
const libPath = path15.join(libDir, name);
|
|
1699
1737
|
const ownership = opts.contributor ? "contributor" : opts.reader ? "reader" : "owner";
|
|
1700
1738
|
const { manager, close } = await openLibraryManager();
|
|
1701
1739
|
try {
|
|
1702
1740
|
if (opts.git) {
|
|
1703
|
-
|
|
1741
|
+
fs11.mkdirSync(libPath, { recursive: true });
|
|
1704
1742
|
await manager.addLibrary({
|
|
1705
1743
|
name,
|
|
1706
1744
|
path: libPath,
|
|
@@ -1709,7 +1747,7 @@ function makeLibraryCommand() {
|
|
|
1709
1747
|
ownership
|
|
1710
1748
|
});
|
|
1711
1749
|
} else {
|
|
1712
|
-
|
|
1750
|
+
fs11.mkdirSync(libPath, { recursive: true });
|
|
1713
1751
|
await manager.addLibrary({
|
|
1714
1752
|
name,
|
|
1715
1753
|
path: libPath,
|
|
@@ -1768,7 +1806,7 @@ function makeLibraryCommand() {
|
|
|
1768
1806
|
target = def;
|
|
1769
1807
|
}
|
|
1770
1808
|
const am2 = new AssetManager({ projectDir: process.cwd() });
|
|
1771
|
-
const destDir = opts.dir ?
|
|
1809
|
+
const destDir = opts.dir ? path15.join(target.path, opts.dir) : target.path;
|
|
1772
1810
|
const res = am2.create(name, opts.kind ?? kind, destDir);
|
|
1773
1811
|
if (res.ok) {
|
|
1774
1812
|
logOk(`Created ${opts.kind ?? kind}: ${pc5.dim(res.path)}`);
|
|
@@ -1794,13 +1832,13 @@ function makeLibraryCommand() {
|
|
|
1794
1832
|
const { manager, close } = await openLibraryManager();
|
|
1795
1833
|
try {
|
|
1796
1834
|
const lib = await manager.requireLibrary(oldName);
|
|
1797
|
-
const parent =
|
|
1798
|
-
const newPath =
|
|
1799
|
-
if (
|
|
1835
|
+
const parent = path15.dirname(lib.path);
|
|
1836
|
+
const newPath = path15.join(parent, newName);
|
|
1837
|
+
if (fs11.existsSync(newPath)) {
|
|
1800
1838
|
logErr(`Target directory already exists: ${newPath}`);
|
|
1801
1839
|
process.exit(1);
|
|
1802
1840
|
}
|
|
1803
|
-
|
|
1841
|
+
fs11.renameSync(lib.path, newPath);
|
|
1804
1842
|
await manager.updateLibrary(lib.id, { name: newName, path: newPath });
|
|
1805
1843
|
logOk(`Renamed ${oldName} \u2192 ${newName}`);
|
|
1806
1844
|
} finally {
|
|
@@ -1986,9 +2024,9 @@ async function printOverallStatus(projectDir, asJson) {
|
|
|
1986
2024
|
} catch {
|
|
1987
2025
|
secretsStrategy = "unavailable";
|
|
1988
2026
|
}
|
|
1989
|
-
const resolvedProjectDir =
|
|
1990
|
-
const hasWorkspaceConfig = existsSync(
|
|
1991
|
-
const hasLockFile = existsSync(
|
|
2027
|
+
const resolvedProjectDir = path15.resolve(projectDir);
|
|
2028
|
+
const hasWorkspaceConfig = existsSync(path15.join(resolvedProjectDir, "skaile.yaml"));
|
|
2029
|
+
const hasLockFile = existsSync(path15.join(resolvedProjectDir, "skaile.lock.yaml"));
|
|
1992
2030
|
let subscriptions = [];
|
|
1993
2031
|
if (hasWorkspaceConfig) {
|
|
1994
2032
|
try {
|
|
@@ -2292,7 +2330,7 @@ function actOnHeader(row, action3) {
|
|
|
2292
2330
|
return false;
|
|
2293
2331
|
}
|
|
2294
2332
|
async function loadAssets() {
|
|
2295
|
-
const { gatherAssetFeeds } = await import('../asset-feeds-
|
|
2333
|
+
const { gatherAssetFeeds } = await import('../asset-feeds-WMVTI7KW.js');
|
|
2296
2334
|
const { entries, notes } = await gatherAssetFeeds(am, am.projectDir);
|
|
2297
2335
|
if (notes.length > 0) {
|
|
2298
2336
|
state.message = notes.map((n) => `[${n.feed}] ${n.message}`).join(" \u2022 ");
|
|
@@ -2347,12 +2385,12 @@ async function loadAssets() {
|
|
|
2347
2385
|
async function loadSourcesAndLibraries() {
|
|
2348
2386
|
try {
|
|
2349
2387
|
const [{ openLibraryManager: openLibraryManager2 }, { skaileHomeDir: skaileHomeDir2 }] = await Promise.all([
|
|
2350
|
-
import('../open-library-
|
|
2388
|
+
import('../open-library-WYASW4BH.js'),
|
|
2351
2389
|
import('../library/index.js')
|
|
2352
2390
|
]);
|
|
2353
2391
|
const { manager, library, close } = await openLibraryManager2();
|
|
2354
2392
|
try {
|
|
2355
|
-
const sourcesDir2 =
|
|
2393
|
+
const sourcesDir2 = path15__default.join(skaileHomeDir2(), "sources");
|
|
2356
2394
|
const isSourceRow = (l) => l.path.startsWith(sourcesDir2);
|
|
2357
2395
|
const libs = await manager.listLibraries();
|
|
2358
2396
|
const defs = await library.listAssetDefs();
|
|
@@ -2854,13 +2892,13 @@ async function run(projectDir) {
|
|
|
2854
2892
|
}
|
|
2855
2893
|
function makeManageCommand() {
|
|
2856
2894
|
return new Command("manage").description("Interactive TUI for managing assets, sources, and libraries").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
|
|
2857
|
-
await run(
|
|
2895
|
+
await run(path15__default.resolve(opts.projectDir));
|
|
2858
2896
|
});
|
|
2859
2897
|
}
|
|
2860
2898
|
function makeMcpServerCommand() {
|
|
2861
2899
|
return new Command("mcp-server").description("Start skaile workspace MCP server (stdio transport)").option("--project-dir <path>", "Project directory (default: cwd)", process.cwd()).action(async (opts) => {
|
|
2862
|
-
const
|
|
2863
|
-
const projectDir =
|
|
2900
|
+
const path35 = await import('path');
|
|
2901
|
+
const projectDir = path35.default.resolve(opts.projectDir);
|
|
2864
2902
|
const { LogStore, StdoutSink, registerLogStore } = await import('../core/logging.js');
|
|
2865
2903
|
registerLogStore(
|
|
2866
2904
|
new LogStore({
|
|
@@ -2897,8 +2935,8 @@ function makeNpxCommand() {
|
|
|
2897
2935
|
skills.command("add <url>").description(
|
|
2898
2936
|
"Clone a repo, register it in the project's skaile.yaml sources[], and install a skill from it"
|
|
2899
2937
|
).requiredOption("--skill <name>", "Skill name to install from the repo").option("--project-dir <path>", "Project directory", process.cwd()).option("--target <agent>", "Agent framework", "claude-code").option("--global", "Deploy globally").action(async (url, opts) => {
|
|
2900
|
-
const projectDir =
|
|
2901
|
-
const projYaml =
|
|
2938
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
2939
|
+
const projYaml = path15__default.join(projectDir, "skaile.yaml");
|
|
2902
2940
|
if (!existsSync(projYaml)) {
|
|
2903
2941
|
logErr(`No skaile.yaml in ${projectDir} \u2014 run \`skaile init\` first.`);
|
|
2904
2942
|
process.exit(1);
|
|
@@ -2911,7 +2949,7 @@ function makeNpxCommand() {
|
|
|
2911
2949
|
}
|
|
2912
2950
|
const spinner5 = p5.spinner();
|
|
2913
2951
|
const slug = sourceSlug(url);
|
|
2914
|
-
const clonePath =
|
|
2952
|
+
const clonePath = path15__default.join(homedir(), ".skaile", "sources", slug);
|
|
2915
2953
|
spinner5.start(`Cloning ${url}`);
|
|
2916
2954
|
try {
|
|
2917
2955
|
if (!existsSync(clonePath)) {
|
|
@@ -2960,12 +2998,12 @@ function makeNpxCommand() {
|
|
|
2960
2998
|
return npx;
|
|
2961
2999
|
}
|
|
2962
3000
|
function resolvePublisher(clonePath, url) {
|
|
2963
|
-
const
|
|
2964
|
-
if (existsSync(
|
|
3001
|
+
const manifestPath = path15__default.join(clonePath, SKAILE_MANIFEST_FILENAME);
|
|
3002
|
+
if (existsSync(manifestPath)) {
|
|
2965
3003
|
try {
|
|
2966
|
-
const {
|
|
2967
|
-
if (typeof
|
|
2968
|
-
return
|
|
3004
|
+
const { manifest } = decodeSkaileManifest(readFileSync(manifestPath, "utf8"));
|
|
3005
|
+
if (typeof manifest.publisher === "string" && manifest.publisher.length > 0) {
|
|
3006
|
+
return manifest.publisher;
|
|
2969
3007
|
}
|
|
2970
3008
|
} catch {
|
|
2971
3009
|
}
|
|
@@ -2973,12 +3011,12 @@ function resolvePublisher(clonePath, url) {
|
|
|
2973
3011
|
return url.match(/github\.com[/:]([^/]+)\/[^/]+/)?.[1];
|
|
2974
3012
|
}
|
|
2975
3013
|
function resolveSkillName(clonePath, requested) {
|
|
2976
|
-
const skillsDir =
|
|
2977
|
-
if (existsSync(
|
|
3014
|
+
const skillsDir = path15__default.join(clonePath, "skills");
|
|
3015
|
+
if (existsSync(path15__default.join(skillsDir, requested, "SKILL.md"))) return requested;
|
|
2978
3016
|
if (!existsSync(skillsDir)) return requested;
|
|
2979
3017
|
for (const entry of readdirSync(skillsDir, { withFileTypes: true })) {
|
|
2980
3018
|
if (!entry.isDirectory()) continue;
|
|
2981
|
-
const md =
|
|
3019
|
+
const md = path15__default.join(skillsDir, entry.name, "SKILL.md");
|
|
2982
3020
|
if (!existsSync(md)) continue;
|
|
2983
3021
|
try {
|
|
2984
3022
|
const { data } = parseFrontmatter(readFileSync(md, "utf8"));
|
|
@@ -2998,12 +3036,12 @@ var MCP_SERVER_ENTRY = {
|
|
|
2998
3036
|
env: {}
|
|
2999
3037
|
};
|
|
3000
3038
|
function pluginDir(projectDir) {
|
|
3001
|
-
return
|
|
3039
|
+
return path15__default.join(projectDir, ".claude", "plugins", "skaile");
|
|
3002
3040
|
}
|
|
3003
3041
|
async function readJsonStrict(p7) {
|
|
3004
3042
|
let raw;
|
|
3005
3043
|
try {
|
|
3006
|
-
raw = await
|
|
3044
|
+
raw = await fs6.readFile(p7, "utf-8");
|
|
3007
3045
|
} catch {
|
|
3008
3046
|
return null;
|
|
3009
3047
|
}
|
|
@@ -3016,32 +3054,32 @@ async function readJsonStrict(p7) {
|
|
|
3016
3054
|
}
|
|
3017
3055
|
}
|
|
3018
3056
|
async function writeJson(p7, value) {
|
|
3019
|
-
await
|
|
3020
|
-
await
|
|
3057
|
+
await fs6.mkdir(path15__default.dirname(p7), { recursive: true });
|
|
3058
|
+
await fs6.writeFile(p7, `${JSON.stringify(value, null, 2)}
|
|
3021
3059
|
`);
|
|
3022
3060
|
}
|
|
3023
3061
|
async function copyDir(src, dest) {
|
|
3024
|
-
await
|
|
3025
|
-
const entries = await
|
|
3062
|
+
await fs6.mkdir(dest, { recursive: true });
|
|
3063
|
+
const entries = await fs6.readdir(src, { withFileTypes: true });
|
|
3026
3064
|
for (const entry of entries) {
|
|
3027
|
-
const srcPath =
|
|
3028
|
-
const destPath =
|
|
3065
|
+
const srcPath = path15__default.join(src, entry.name);
|
|
3066
|
+
const destPath = path15__default.join(dest, entry.name);
|
|
3029
3067
|
if (entry.isDirectory()) await copyDir(srcPath, destPath);
|
|
3030
|
-
else await
|
|
3068
|
+
else await fs6.copyFile(srcPath, destPath);
|
|
3031
3069
|
}
|
|
3032
3070
|
}
|
|
3033
3071
|
async function install(projectDir, opts) {
|
|
3034
3072
|
return opts?.full ? installFullPlugin(projectDir) : installMcp(projectDir);
|
|
3035
3073
|
}
|
|
3036
3074
|
async function installMcp(projectDir) {
|
|
3037
|
-
const mcpPath =
|
|
3075
|
+
const mcpPath = path15__default.join(projectDir, ".claude", "mcp.json");
|
|
3038
3076
|
const existing = await readJsonStrict(mcpPath) ?? {};
|
|
3039
3077
|
const mcpServers = { ...existing.mcpServers ?? {} };
|
|
3040
3078
|
const previous = mcpServers[SKAILE_MCP_NAME];
|
|
3041
3079
|
const matches = previous && JSON.stringify(previous) === JSON.stringify(MCP_SERVER_ENTRY);
|
|
3042
3080
|
let warning;
|
|
3043
3081
|
if (previous && !matches) {
|
|
3044
|
-
warning = `overwrote existing ${SKAILE_MCP_NAME} entry in ${
|
|
3082
|
+
warning = `overwrote existing ${SKAILE_MCP_NAME} entry in ${path15__default.relative(projectDir, mcpPath)}`;
|
|
3045
3083
|
}
|
|
3046
3084
|
mcpServers[SKAILE_MCP_NAME] = MCP_SERVER_ENTRY;
|
|
3047
3085
|
await writeJson(mcpPath, { ...existing, mcpServers });
|
|
@@ -3050,15 +3088,15 @@ async function installMcp(projectDir) {
|
|
|
3050
3088
|
async function installFullPlugin(projectDir) {
|
|
3051
3089
|
const dir = pluginDir(projectDir);
|
|
3052
3090
|
for (const [rel, content] of Object.entries(buildClaudePluginFiles())) {
|
|
3053
|
-
const dest =
|
|
3054
|
-
await
|
|
3055
|
-
await
|
|
3091
|
+
const dest = path15__default.join(dir, rel);
|
|
3092
|
+
await fs6.mkdir(path15__default.dirname(dest), { recursive: true });
|
|
3093
|
+
await fs6.writeFile(dest, content);
|
|
3056
3094
|
}
|
|
3057
|
-
const projectSkillsDir =
|
|
3095
|
+
const projectSkillsDir = path15__default.join(projectDir, ".skaile", "skills");
|
|
3058
3096
|
if (existsSync(projectSkillsDir)) {
|
|
3059
|
-
await copyDir(projectSkillsDir,
|
|
3097
|
+
await copyDir(projectSkillsDir, path15__default.join(dir, "skills"));
|
|
3060
3098
|
}
|
|
3061
|
-
const settingsPath =
|
|
3099
|
+
const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
|
|
3062
3100
|
const settings = await readJsonStrict(settingsPath) ?? {};
|
|
3063
3101
|
const plugins = settings.plugins ?? [];
|
|
3064
3102
|
if (!plugins.includes(dir)) plugins.push(dir);
|
|
@@ -3066,8 +3104,8 @@ async function installFullPlugin(projectDir) {
|
|
|
3066
3104
|
return { changed: true, method: "plugin" };
|
|
3067
3105
|
}
|
|
3068
3106
|
async function uninstall(projectDir) {
|
|
3069
|
-
const settingsPath =
|
|
3070
|
-
const mcpPath =
|
|
3107
|
+
const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
|
|
3108
|
+
const mcpPath = path15__default.join(projectDir, ".claude", "mcp.json");
|
|
3071
3109
|
const dir = pluginDir(projectDir);
|
|
3072
3110
|
let changed = false;
|
|
3073
3111
|
const settings = await readJsonStrict(settingsPath);
|
|
@@ -3081,7 +3119,7 @@ async function uninstall(projectDir) {
|
|
|
3081
3119
|
}
|
|
3082
3120
|
}
|
|
3083
3121
|
if (existsSync(dir)) {
|
|
3084
|
-
await
|
|
3122
|
+
await fs6.rm(dir, { recursive: true, force: true });
|
|
3085
3123
|
changed = true;
|
|
3086
3124
|
}
|
|
3087
3125
|
const mcp = await readJsonStrict(mcpPath);
|
|
@@ -3091,7 +3129,7 @@ async function uninstall(projectDir) {
|
|
|
3091
3129
|
const updated = { ...mcp, mcpServers: rest };
|
|
3092
3130
|
if (Object.keys(rest).length === 0) delete updated.mcpServers;
|
|
3093
3131
|
if (Object.keys(updated).length === 0) {
|
|
3094
|
-
await
|
|
3132
|
+
await fs6.unlink(mcpPath);
|
|
3095
3133
|
} else {
|
|
3096
3134
|
await writeJson(mcpPath, updated);
|
|
3097
3135
|
}
|
|
@@ -3101,12 +3139,12 @@ async function uninstall(projectDir) {
|
|
|
3101
3139
|
async function detectInstall(projectDir) {
|
|
3102
3140
|
const dir = pluginDir(projectDir);
|
|
3103
3141
|
const settings = await readJsonStrict(
|
|
3104
|
-
|
|
3142
|
+
path15__default.join(projectDir, ".claude", "settings.json")
|
|
3105
3143
|
);
|
|
3106
|
-
if (existsSync(
|
|
3144
|
+
if (existsSync(path15__default.join(dir, ".claude-plugin", "plugin.json")) && settings?.plugins?.includes(dir)) {
|
|
3107
3145
|
return { method: "plugin", pluginPath: dir };
|
|
3108
3146
|
}
|
|
3109
|
-
const mcp = await readJsonStrict(
|
|
3147
|
+
const mcp = await readJsonStrict(path15__default.join(projectDir, ".claude", "mcp.json"));
|
|
3110
3148
|
if (mcp?.mcpServers && SKAILE_MCP_NAME in mcp.mcpServers) {
|
|
3111
3149
|
return { method: "mcp" };
|
|
3112
3150
|
}
|
|
@@ -3115,7 +3153,7 @@ async function detectInstall(projectDir) {
|
|
|
3115
3153
|
async function enable(projectDir) {
|
|
3116
3154
|
const detected = await detectInstall(projectDir);
|
|
3117
3155
|
if (!detected) throw new Error("plugin not installed for claude-code");
|
|
3118
|
-
const settingsPath =
|
|
3156
|
+
const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
|
|
3119
3157
|
const settings = await readJsonStrict(settingsPath) ?? {};
|
|
3120
3158
|
if (detected.method === "plugin") {
|
|
3121
3159
|
const disabled2 = settings.disabledPlugins ?? [];
|
|
@@ -3137,7 +3175,7 @@ async function enable(projectDir) {
|
|
|
3137
3175
|
async function disable(projectDir) {
|
|
3138
3176
|
const detected = await detectInstall(projectDir);
|
|
3139
3177
|
if (!detected) throw new Error("plugin not installed for claude-code");
|
|
3140
|
-
const settingsPath =
|
|
3178
|
+
const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
|
|
3141
3179
|
const settings = await readJsonStrict(settingsPath) ?? {};
|
|
3142
3180
|
if (detected.method === "plugin") {
|
|
3143
3181
|
const list2 = settings.disabledPlugins ?? [];
|
|
@@ -3157,12 +3195,12 @@ async function disable(projectDir) {
|
|
|
3157
3195
|
return { changed: true };
|
|
3158
3196
|
}
|
|
3159
3197
|
async function status(projectDir) {
|
|
3160
|
-
const settingsPath =
|
|
3161
|
-
const mcpPath =
|
|
3198
|
+
const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
|
|
3199
|
+
const mcpPath = path15__default.join(projectDir, ".claude", "mcp.json");
|
|
3162
3200
|
const dir = pluginDir(projectDir);
|
|
3163
3201
|
const settings = await readJsonStrict(settingsPath);
|
|
3164
3202
|
const mcp = await readJsonStrict(mcpPath);
|
|
3165
|
-
const pluginInstalled = !!(existsSync(
|
|
3203
|
+
const pluginInstalled = !!(existsSync(path15__default.join(dir, ".claude-plugin", "plugin.json")) && settings?.plugins?.includes(dir));
|
|
3166
3204
|
const mcpInstalled = !!(mcp?.mcpServers && SKAILE_MCP_NAME in mcp.mcpServers);
|
|
3167
3205
|
if (!pluginInstalled && !mcpInstalled) {
|
|
3168
3206
|
return {
|
|
@@ -3180,7 +3218,7 @@ async function status(projectDir) {
|
|
|
3180
3218
|
installed: "yes",
|
|
3181
3219
|
enabled: disabled2 ? "no" : "yes",
|
|
3182
3220
|
method: "plugin",
|
|
3183
|
-
location:
|
|
3221
|
+
location: path15__default.relative(projectDir, dir)
|
|
3184
3222
|
};
|
|
3185
3223
|
}
|
|
3186
3224
|
const disabled = settings?.disabledMcpjsonServers?.includes(SKAILE_MCP_NAME) ?? false;
|
|
@@ -3189,7 +3227,7 @@ async function status(projectDir) {
|
|
|
3189
3227
|
installed: "yes",
|
|
3190
3228
|
enabled: disabled ? "no" : "yes",
|
|
3191
3229
|
method: "mcp",
|
|
3192
|
-
location:
|
|
3230
|
+
location: path15__default.relative(projectDir, mcpPath)
|
|
3193
3231
|
};
|
|
3194
3232
|
}
|
|
3195
3233
|
var SKAILE_MCP_NAME2 = "skaile-workspace";
|
|
@@ -3203,7 +3241,7 @@ function buildEntry(projectDir) {
|
|
|
3203
3241
|
async function readConfig(p7) {
|
|
3204
3242
|
let raw;
|
|
3205
3243
|
try {
|
|
3206
|
-
raw = await
|
|
3244
|
+
raw = await fs6.readFile(p7, "utf-8");
|
|
3207
3245
|
} catch {
|
|
3208
3246
|
return null;
|
|
3209
3247
|
}
|
|
@@ -3216,16 +3254,16 @@ async function readConfig(p7) {
|
|
|
3216
3254
|
}
|
|
3217
3255
|
}
|
|
3218
3256
|
async function writeConfig(p7, value) {
|
|
3219
|
-
await
|
|
3257
|
+
await fs6.mkdir(path15__default.dirname(p7), { recursive: true });
|
|
3220
3258
|
const cleaned = {};
|
|
3221
3259
|
for (const [k, v] of Object.entries(value)) {
|
|
3222
3260
|
if (v === void 0) continue;
|
|
3223
3261
|
cleaned[k] = v;
|
|
3224
3262
|
}
|
|
3225
|
-
await
|
|
3263
|
+
await fs6.writeFile(p7, stringify(cleaned));
|
|
3226
3264
|
}
|
|
3227
3265
|
function configPath(projectDir) {
|
|
3228
|
-
return
|
|
3266
|
+
return path15__default.join(projectDir, ".codex", "config.toml");
|
|
3229
3267
|
}
|
|
3230
3268
|
async function install2(projectDir) {
|
|
3231
3269
|
const p7 = configPath(projectDir);
|
|
@@ -3236,7 +3274,7 @@ async function install2(projectDir) {
|
|
|
3236
3274
|
const matches = previous && JSON.stringify(previous) === JSON.stringify(next);
|
|
3237
3275
|
let warning;
|
|
3238
3276
|
if (previous && !matches) {
|
|
3239
|
-
warning = `overwrote existing ${SKAILE_MCP_NAME2} entry in ${
|
|
3277
|
+
warning = `overwrote existing ${SKAILE_MCP_NAME2} entry in ${path15__default.relative(projectDir, p7)}`;
|
|
3240
3278
|
}
|
|
3241
3279
|
if (matches) return { changed: false, method: "toml" };
|
|
3242
3280
|
servers[SKAILE_MCP_NAME2] = next;
|
|
@@ -3253,7 +3291,7 @@ async function uninstall2(projectDir) {
|
|
|
3253
3291
|
const updated = { ...cfg, mcp_servers: rest };
|
|
3254
3292
|
if (Object.keys(rest).length === 0) delete updated.mcp_servers;
|
|
3255
3293
|
if (Object.keys(updated).length === 0) {
|
|
3256
|
-
await
|
|
3294
|
+
await fs6.unlink(p7);
|
|
3257
3295
|
} else {
|
|
3258
3296
|
await writeConfig(p7, updated);
|
|
3259
3297
|
}
|
|
@@ -3277,43 +3315,43 @@ async function status2(projectDir) {
|
|
|
3277
3315
|
installed: "yes",
|
|
3278
3316
|
enabled: "n/a",
|
|
3279
3317
|
method: "mcp",
|
|
3280
|
-
location:
|
|
3318
|
+
location: path15__default.relative(projectDir, p7)
|
|
3281
3319
|
};
|
|
3282
3320
|
}
|
|
3283
3321
|
async function install3(projectDir) {
|
|
3284
|
-
const extDir =
|
|
3285
|
-
const extPath =
|
|
3286
|
-
await
|
|
3322
|
+
const extDir = path15__default.join(projectDir, ".omp", "extensions");
|
|
3323
|
+
const extPath = path15__default.join(extDir, "skaile.ts");
|
|
3324
|
+
await fs6.mkdir(extDir, { recursive: true });
|
|
3287
3325
|
const { WorkspacePlugin } = await import('../workspace-plugin/index.js');
|
|
3288
3326
|
const plugin = new WorkspacePlugin({ projectDir });
|
|
3289
3327
|
const nextSrc = await plugin.buildOmpExtensionSource();
|
|
3290
3328
|
let prevSrc = null;
|
|
3291
3329
|
try {
|
|
3292
|
-
prevSrc = await
|
|
3330
|
+
prevSrc = await fs6.readFile(extPath, "utf-8");
|
|
3293
3331
|
} catch {
|
|
3294
3332
|
}
|
|
3295
3333
|
if (prevSrc === nextSrc) return { changed: false, method: "generated" };
|
|
3296
|
-
await
|
|
3334
|
+
await fs6.writeFile(extPath, nextSrc);
|
|
3297
3335
|
return { changed: true, method: "generated" };
|
|
3298
3336
|
}
|
|
3299
3337
|
async function uninstall3(projectDir) {
|
|
3300
|
-
const extPath =
|
|
3338
|
+
const extPath = path15__default.join(projectDir, ".omp", "extensions", "skaile.ts");
|
|
3301
3339
|
try {
|
|
3302
|
-
await
|
|
3340
|
+
await fs6.unlink(extPath);
|
|
3303
3341
|
return { changed: true };
|
|
3304
3342
|
} catch {
|
|
3305
3343
|
return { changed: false };
|
|
3306
3344
|
}
|
|
3307
3345
|
}
|
|
3308
3346
|
async function status3(projectDir) {
|
|
3309
|
-
const extPath =
|
|
3347
|
+
const extPath = path15__default.join(projectDir, ".omp", "extensions", "skaile.ts");
|
|
3310
3348
|
if (existsSync(extPath)) {
|
|
3311
3349
|
return {
|
|
3312
3350
|
backend: "omp",
|
|
3313
3351
|
installed: "yes",
|
|
3314
3352
|
enabled: "n/a",
|
|
3315
3353
|
method: "extension",
|
|
3316
|
-
location:
|
|
3354
|
+
location: path15__default.relative(projectDir, extPath)
|
|
3317
3355
|
};
|
|
3318
3356
|
}
|
|
3319
3357
|
return {
|
|
@@ -3334,7 +3372,7 @@ function resolveDriver(driver) {
|
|
|
3334
3372
|
throw new Error(`unknown driver: ${driver} (expected: claude-code | omp | codex | all)`);
|
|
3335
3373
|
}
|
|
3336
3374
|
async function runInstall(opts) {
|
|
3337
|
-
const projectDir =
|
|
3375
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
3338
3376
|
const targets = resolveDriver(opts.driver);
|
|
3339
3377
|
let exitCode = 0;
|
|
3340
3378
|
if (targets.includes("claude-code")) {
|
|
@@ -3389,7 +3427,7 @@ async function runInstall(opts) {
|
|
|
3389
3427
|
return exitCode;
|
|
3390
3428
|
}
|
|
3391
3429
|
async function runUninstall(opts) {
|
|
3392
|
-
const projectDir =
|
|
3430
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
3393
3431
|
const targets = resolveDriver(opts.driver);
|
|
3394
3432
|
let exitCode = 0;
|
|
3395
3433
|
if (targets.includes("claude-code")) {
|
|
@@ -3426,7 +3464,7 @@ async function runUninstall(opts) {
|
|
|
3426
3464
|
return exitCode;
|
|
3427
3465
|
}
|
|
3428
3466
|
async function runToggle(opts, action3) {
|
|
3429
|
-
const projectDir =
|
|
3467
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
3430
3468
|
const requestedAll = opts.driver === "all";
|
|
3431
3469
|
const targets = resolveDriver(opts.driver);
|
|
3432
3470
|
if (!requestedAll) {
|
|
@@ -3461,7 +3499,7 @@ async function runToggle(opts, action3) {
|
|
|
3461
3499
|
return exitCode;
|
|
3462
3500
|
}
|
|
3463
3501
|
async function runStatus2(opts) {
|
|
3464
|
-
const projectDir =
|
|
3502
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
3465
3503
|
const targets = resolveDriver(opts.driver);
|
|
3466
3504
|
const rows = [];
|
|
3467
3505
|
let exitCode = 0;
|
|
@@ -3532,7 +3570,7 @@ async function runHook(event) {
|
|
|
3532
3570
|
await plugin.shutdown();
|
|
3533
3571
|
return;
|
|
3534
3572
|
}
|
|
3535
|
-
const store = new PluginStore(
|
|
3573
|
+
const store = new PluginStore(path15__default.join(projectDir, ".skaile", "plugin-state.json"));
|
|
3536
3574
|
await store.load();
|
|
3537
3575
|
const status4 = store.get("connector:status");
|
|
3538
3576
|
if (status4 && typeof status4 === "object" && Object.keys(status4).length > 0) {
|
|
@@ -3597,7 +3635,7 @@ function makeOutdatedCommand() {
|
|
|
3597
3635
|
new Option("--target <agent>", "Driver target").default("claude-code").choices(SUPPORTED_DRIVER_TARGETS)
|
|
3598
3636
|
).action((name, opts) => {
|
|
3599
3637
|
const am2 = new AssetManager({
|
|
3600
|
-
projectDir:
|
|
3638
|
+
projectDir: path15__default.resolve(opts.projectDir),
|
|
3601
3639
|
driverTarget: opts.target
|
|
3602
3640
|
});
|
|
3603
3641
|
const entries = am2.outdated();
|
|
@@ -3626,7 +3664,7 @@ function makeOutdatedCommand() {
|
|
|
3626
3664
|
function makePatchCommand() {
|
|
3627
3665
|
const cmd = new Command("patch").description("Patch workflow for skill improvement");
|
|
3628
3666
|
cmd.command("extract <ref>").alias("start").description("Extract asset for local editing").option("--project-dir <path>", "Project directory", process.cwd()).action((ref, opts) => {
|
|
3629
|
-
const am2 = new AssetManager({ projectDir:
|
|
3667
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
3630
3668
|
try {
|
|
3631
3669
|
const dest = am2.patch(ref);
|
|
3632
3670
|
logOk(`Extracted to ${S.dim(dest)}`);
|
|
@@ -3637,7 +3675,7 @@ function makePatchCommand() {
|
|
|
3637
3675
|
}
|
|
3638
3676
|
});
|
|
3639
3677
|
cmd.command("commit <ref>").description("Generate .patch file from edits").option("--project-dir <path>", "Project directory", process.cwd()).action((ref, opts) => {
|
|
3640
|
-
const am2 = new AssetManager({ projectDir:
|
|
3678
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
3641
3679
|
try {
|
|
3642
3680
|
const patchFile = am2.patchCommit(ref);
|
|
3643
3681
|
logOk(`Patch saved to ${S.dim(patchFile)}`);
|
|
@@ -3648,7 +3686,7 @@ function makePatchCommand() {
|
|
|
3648
3686
|
}
|
|
3649
3687
|
});
|
|
3650
3688
|
cmd.command("submit <ref>").description("Apply patch to repo clone and prepare for PR").option("--project-dir <path>", "Project directory", process.cwd()).action((ref, opts) => {
|
|
3651
|
-
const am2 = new AssetManager({ projectDir:
|
|
3689
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
3652
3690
|
try {
|
|
3653
3691
|
am2.patchSubmit(ref);
|
|
3654
3692
|
logOk("Patch applied to repo clone and committed.");
|
|
@@ -3661,7 +3699,7 @@ function makePatchCommand() {
|
|
|
3661
3699
|
}
|
|
3662
3700
|
});
|
|
3663
3701
|
cmd.command("remove <ref>").description("Remove local patch after upstream merge").option("--project-dir <path>", "Project directory", process.cwd()).action((ref, opts) => {
|
|
3664
|
-
const am2 = new AssetManager({ projectDir:
|
|
3702
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
3665
3703
|
am2.patchRemove(ref);
|
|
3666
3704
|
logOk(`Patch removed for ${ref}`);
|
|
3667
3705
|
});
|
|
@@ -3679,7 +3717,7 @@ function action2(fn) {
|
|
|
3679
3717
|
};
|
|
3680
3718
|
}
|
|
3681
3719
|
async function reconcileAndReport(projectDir, plugins) {
|
|
3682
|
-
const { reconcilePlugins } = await import('../plugin-store-
|
|
3720
|
+
const { reconcilePlugins } = await import('../plugin-store-O5VR45CA.js');
|
|
3683
3721
|
if (plugins.length === 0) {
|
|
3684
3722
|
logInfo("No plugins declared \u2014 nothing to reconcile.");
|
|
3685
3723
|
return;
|
|
@@ -3693,10 +3731,10 @@ async function reconcileAndReport(projectDir, plugins) {
|
|
|
3693
3731
|
}
|
|
3694
3732
|
}
|
|
3695
3733
|
async function runInstall2(spec, opts) {
|
|
3696
|
-
const projectDir =
|
|
3734
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
3697
3735
|
const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
|
|
3698
|
-
const { specName } = await import('../plugin-store-
|
|
3699
|
-
const yamlPath =
|
|
3736
|
+
const { specName } = await import('../plugin-store-O5VR45CA.js');
|
|
3737
|
+
const yamlPath = path15__default.join(projectDir, "skaile.yaml");
|
|
3700
3738
|
const editor = WorkspaceYamlEditor2.load(yamlPath);
|
|
3701
3739
|
const replaced = editor.addPlugin(spec, specName);
|
|
3702
3740
|
editor.save();
|
|
@@ -3705,10 +3743,10 @@ async function runInstall2(spec, opts) {
|
|
|
3705
3743
|
await reconcileAndReport(projectDir, editor.getPlugins());
|
|
3706
3744
|
}
|
|
3707
3745
|
async function runRemove(name, opts) {
|
|
3708
|
-
const projectDir =
|
|
3746
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
3709
3747
|
const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
|
|
3710
|
-
const { specName } = await import('../plugin-store-
|
|
3711
|
-
const yamlPath =
|
|
3748
|
+
const { specName } = await import('../plugin-store-O5VR45CA.js');
|
|
3749
|
+
const yamlPath = path15__default.join(projectDir, "skaile.yaml");
|
|
3712
3750
|
const editor = WorkspaceYamlEditor2.load(yamlPath);
|
|
3713
3751
|
const removed = editor.removePlugin(name, specName);
|
|
3714
3752
|
if (!removed) {
|
|
@@ -3720,7 +3758,7 @@ async function runRemove(name, opts) {
|
|
|
3720
3758
|
await reconcileAndReport(projectDir, editor.getPlugins());
|
|
3721
3759
|
}
|
|
3722
3760
|
async function runList(opts) {
|
|
3723
|
-
const projectDir =
|
|
3761
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
3724
3762
|
const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
|
|
3725
3763
|
const config = resolveSkWorkspaceConfig2(projectDir);
|
|
3726
3764
|
const declared = config.plugins ?? [];
|
|
@@ -3735,7 +3773,7 @@ async function runList(opts) {
|
|
|
3735
3773
|
const registry = createPluginRegistry();
|
|
3736
3774
|
if (declared.length > 0) {
|
|
3737
3775
|
try {
|
|
3738
|
-
const { loadPlugins } = await import('../plugin-store-
|
|
3776
|
+
const { loadPlugins } = await import('../plugin-store-O5VR45CA.js');
|
|
3739
3777
|
const result = await loadPlugins(projectDir, declared, registry);
|
|
3740
3778
|
for (const f of result.failed) logWarn(f.error);
|
|
3741
3779
|
} catch (err) {
|
|
@@ -3774,7 +3812,7 @@ function makePresetCommand() {
|
|
|
3774
3812
|
cmd.command("init [name]").description("Scaffold a new .preset.yaml file").option("--dir <path>", "Output directory", process.cwd()).action(async (name, opts) => {
|
|
3775
3813
|
const presetName = name ?? "my-preset";
|
|
3776
3814
|
const filename = `${presetName}.preset.yaml`;
|
|
3777
|
-
const outPath =
|
|
3815
|
+
const outPath = path15__default.join(path15__default.resolve(opts.dir), filename);
|
|
3778
3816
|
if (existsSync(outPath)) {
|
|
3779
3817
|
logErr(`File already exists: ${outPath}`);
|
|
3780
3818
|
logInfo("Choose a different name or remove the existing file.");
|
|
@@ -3788,7 +3826,7 @@ function makePresetCommand() {
|
|
|
3788
3826
|
logInfo(` skaile preset validate ${filename}`);
|
|
3789
3827
|
});
|
|
3790
3828
|
cmd.command("validate <path>").description("Validate a preset YAML file (schema + cycles + nesting depth)").action(async (filePath) => {
|
|
3791
|
-
const resolved =
|
|
3829
|
+
const resolved = path15__default.resolve(filePath);
|
|
3792
3830
|
if (!existsSync(resolved)) {
|
|
3793
3831
|
logErr(`File not found: ${resolved}`);
|
|
3794
3832
|
process.exit(1);
|
|
@@ -3814,7 +3852,7 @@ function makePresetCommand() {
|
|
|
3814
3852
|
logInfo(`Nested preset refs: ${nestedRefs.length} (depth validated at apply-time)`);
|
|
3815
3853
|
}
|
|
3816
3854
|
const { detectCycles } = await import('../discovery/index.js');
|
|
3817
|
-
const presetRef =
|
|
3855
|
+
const presetRef = path15__default.basename(resolved, ".preset.yaml");
|
|
3818
3856
|
const edges = [];
|
|
3819
3857
|
for (const item of preset.items) {
|
|
3820
3858
|
if (item.ref) {
|
|
@@ -3899,20 +3937,30 @@ items:
|
|
|
3899
3937
|
# credential_ref: "\${SECRET:EXAMPLE_KEY}" # for secret placeholders
|
|
3900
3938
|
`;
|
|
3901
3939
|
}
|
|
3902
|
-
var
|
|
3940
|
+
var REF_HINT = "kind:@<publisher>/<name>#<version> (e.g. skill:@skaile/use-exa#1.0.0)";
|
|
3941
|
+
function isValidAssetRef(ref) {
|
|
3942
|
+
try {
|
|
3943
|
+
parseAssetRef(ref);
|
|
3944
|
+
return true;
|
|
3945
|
+
} catch {
|
|
3946
|
+
return false;
|
|
3947
|
+
}
|
|
3948
|
+
}
|
|
3903
3949
|
function supportsInstallManifest(source) {
|
|
3904
3950
|
return typeof source?.getInstallManifest === "function";
|
|
3905
3951
|
}
|
|
3906
3952
|
async function runPointerOnlyInstall(ref, deps) {
|
|
3907
|
-
|
|
3908
|
-
|
|
3953
|
+
let requested;
|
|
3954
|
+
try {
|
|
3955
|
+
requested = parseAssetRef(ref);
|
|
3956
|
+
} catch (e) {
|
|
3909
3957
|
throw new Error(
|
|
3910
|
-
`malformed asset ref '${ref}' \u2014 expected
|
|
3958
|
+
`malformed asset ref '${ref}' \u2014 expected ${REF_HINT}: ${e instanceof Error ? e.message : String(e)}`
|
|
3911
3959
|
);
|
|
3912
3960
|
}
|
|
3913
3961
|
const manifest = await deps.catalog.getInstallManifest(ref);
|
|
3914
|
-
const
|
|
3915
|
-
if (
|
|
3962
|
+
const got = parseAssetRef(manifest.ref);
|
|
3963
|
+
if (got.kind !== requested.kind || got.publisher !== requested.publisher || got.name !== requested.name || got.pin !== requested.pin) {
|
|
3916
3964
|
throw new Error(
|
|
3917
3965
|
`catalog identity mismatch: requested '${ref}' but the catalog returned a manifest for '${manifest.ref}'`
|
|
3918
3966
|
);
|
|
@@ -3926,20 +3974,18 @@ async function runPointerOnlyInstall(ref, deps) {
|
|
|
3926
3974
|
}
|
|
3927
3975
|
function makeInstallCommand() {
|
|
3928
3976
|
return new Command("install").description(
|
|
3929
|
-
|
|
3930
|
-
).argument("[ref]",
|
|
3977
|
+
`Install dependencies from skaile.yaml, or a single asset by ref (${REF_HINT})`
|
|
3978
|
+
).argument("[ref]", `Asset ref to install from the Catalog (${REF_HINT})`).option("--locked", "Install from lock file (CI mode \u2014 fails on drift)").option("--project-dir <path>", "Project directory", process.cwd()).option("--target <agent>", "Agent framework", "claude-code").action(async (ref, opts) => {
|
|
3931
3979
|
if (ref !== void 0) {
|
|
3932
|
-
if (!
|
|
3933
|
-
logErr(
|
|
3934
|
-
`malformed asset ref '${ref}' \u2014 expected <publisher>/<name>@<version> (e.g. skaile/use-exa@1.0.0)`
|
|
3935
|
-
);
|
|
3980
|
+
if (!isValidAssetRef(ref)) {
|
|
3981
|
+
logErr(`malformed asset ref '${ref}' \u2014 expected ${REF_HINT}`);
|
|
3936
3982
|
process.exit(1);
|
|
3937
3983
|
}
|
|
3938
3984
|
const spinner6 = p5.spinner();
|
|
3939
3985
|
spinner6.start(`Installing ${ref}`);
|
|
3940
3986
|
try {
|
|
3941
|
-
const { openCatalogSource: openCatalogSource2, openLibrary: openLibrary2 } = await import('../open-library-
|
|
3942
|
-
const catalog = await openCatalogSource2({ projectDir:
|
|
3987
|
+
const { openCatalogSource: openCatalogSource2, openLibrary: openLibrary2 } = await import('../open-library-WYASW4BH.js');
|
|
3988
|
+
const catalog = await openCatalogSource2({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
3943
3989
|
if (!supportsInstallManifest(catalog)) {
|
|
3944
3990
|
throw new Error(
|
|
3945
3991
|
"pointer-only install (skaile install <ref>) requires a tRPC-framed Catalog. The configured catalog uses REST framing, which does not serve install manifests. Set catalog.url to https://skaile.store, or catalog.framing: trpc, in ~/.skaile/config.yaml."
|
|
@@ -3968,9 +4014,9 @@ function makeInstallCommand() {
|
|
|
3968
4014
|
}
|
|
3969
4015
|
return;
|
|
3970
4016
|
}
|
|
3971
|
-
const projectDir =
|
|
4017
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
3972
4018
|
try {
|
|
3973
|
-
const { ensureSourcesCloned } = await import('../ensure-sources-
|
|
4019
|
+
const { ensureSourcesCloned } = await import('../ensure-sources-CVULUVH4.js');
|
|
3974
4020
|
const hydrate = ensureSourcesCloned(projectDir, { quiet: true });
|
|
3975
4021
|
if (hydrate.cloned.length > 0) {
|
|
3976
4022
|
logOk(`Cloned source(s): ${hydrate.cloned.join(", ")}`);
|
|
@@ -4016,7 +4062,7 @@ function makeInstallCommand() {
|
|
|
4016
4062
|
}
|
|
4017
4063
|
function makeCheckCommand() {
|
|
4018
4064
|
return new Command("check").description("Check for unmet requirements").option("--project-dir <path>", "Project directory", process.cwd()).action((opts) => {
|
|
4019
|
-
const am2 = new AssetManager({ projectDir:
|
|
4065
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
4020
4066
|
const issues = am2.doctor();
|
|
4021
4067
|
if (issues.length === 0) {
|
|
4022
4068
|
logOk("All dependencies satisfied.");
|
|
@@ -4033,10 +4079,10 @@ function makeCheckCommand() {
|
|
|
4033
4079
|
function makeCleanCommand() {
|
|
4034
4080
|
return new Command("clean").description("Remove all skaile-managed assets from the workspace").option("--all", "Full reset: also remove history, patches, repos, and lock file").option("--dry-run", "Show what would be removed without doing it").option("-y, --yes", "Skip confirmation prompt").option("--project-dir <path>", "Project directory", process.cwd()).option("--target <agent>", "Agent framework", "claude-code").action(async (opts) => {
|
|
4035
4081
|
const am2 = new AssetManager({
|
|
4036
|
-
projectDir:
|
|
4082
|
+
projectDir: path15__default.resolve(opts.projectDir),
|
|
4037
4083
|
driverTarget: opts.target
|
|
4038
4084
|
});
|
|
4039
|
-
const lock = readLock(
|
|
4085
|
+
const lock = readLock(path15__default.resolve(opts.projectDir, "skaile.lock.yaml"));
|
|
4040
4086
|
if (!lock || Object.keys(lock.assets).length === 0) {
|
|
4041
4087
|
logInfo("Nothing to clean (no skaile-managed assets found).");
|
|
4042
4088
|
return;
|
|
@@ -4089,14 +4135,14 @@ function makeCleanCommand() {
|
|
|
4089
4135
|
}
|
|
4090
4136
|
function makeRebuildCommand() {
|
|
4091
4137
|
return new Command("rebuild").description("Re-snapshot inline-snapshot composition items and bump prompt version").argument("[agent]", "Agent name or path (defaults to current project agent)").option("--project-dir <dir>", "Project directory", process.cwd()).action(async (agentArg, opts) => {
|
|
4092
|
-
const projectDir =
|
|
4138
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
4093
4139
|
let agentDir;
|
|
4094
4140
|
if (agentArg) {
|
|
4095
4141
|
if (agentArg.includes("/") || agentArg.includes("\\")) {
|
|
4096
|
-
agentDir =
|
|
4142
|
+
agentDir = path15__default.resolve(projectDir, agentArg);
|
|
4097
4143
|
} else {
|
|
4098
4144
|
const resolved = resolveAgentDir(projectDir);
|
|
4099
|
-
agentDir = resolved ??
|
|
4145
|
+
agentDir = resolved ?? path15__default.resolve(projectDir, agentArg);
|
|
4100
4146
|
}
|
|
4101
4147
|
} else {
|
|
4102
4148
|
const resolved = resolveAgentDir(projectDir);
|
|
@@ -4174,19 +4220,19 @@ function makeFlowEventHandler() {
|
|
|
4174
4220
|
}
|
|
4175
4221
|
function makeRunCommand() {
|
|
4176
4222
|
const cmd = new Command("run").description("Start a flow or run a single-shot text prompt").argument("[flow-id-or-text...]", "Flow ID or text prompt").option("--project-dir <path>", "Project directory", process.cwd()).option("--driver <name>", "Driver backend (claude-sdk, codex, omp)").option("--provider <name>", "LLM provider").option("--model <name>", "Model override").option("--label <label>", "Human-readable session label").option("--dry-run", "Print plan without executing").option("--skill <name>", "Skill name (for single-shot mode)").action(async (positional, opts) => {
|
|
4177
|
-
const projectDir =
|
|
4223
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
4178
4224
|
const cliDriver = opts.driver;
|
|
4179
4225
|
const dryRun = opts.dryRun ?? false;
|
|
4180
4226
|
let flowId = positional[0];
|
|
4181
4227
|
if (!flowId) {
|
|
4182
|
-
const
|
|
4183
|
-
if (
|
|
4228
|
+
const flows = discoverFlows();
|
|
4229
|
+
if (flows.length === 0) {
|
|
4184
4230
|
logErr("No flows available.");
|
|
4185
4231
|
process.exit(1);
|
|
4186
4232
|
}
|
|
4187
4233
|
const selected = await p5.select({
|
|
4188
4234
|
message: "Select a flow to run",
|
|
4189
|
-
options:
|
|
4235
|
+
options: flows.map((f) => ({
|
|
4190
4236
|
value: f.id,
|
|
4191
4237
|
label: f.name,
|
|
4192
4238
|
hint: f.description
|
|
@@ -4206,13 +4252,25 @@ function makeRunCommand() {
|
|
|
4206
4252
|
const driver = config.driver ?? "omp";
|
|
4207
4253
|
const model = config.model;
|
|
4208
4254
|
const provider = config.provider;
|
|
4209
|
-
const
|
|
4210
|
-
|
|
4211
|
-
|
|
4255
|
+
const priorityRoots = [];
|
|
4256
|
+
let dir = projectDir;
|
|
4257
|
+
for (let i = 0; i < 6; i++) {
|
|
4258
|
+
const candidate = path15__default.join(dir, "ai-assets");
|
|
4259
|
+
if (fs11__default.existsSync(candidate)) {
|
|
4260
|
+
priorityRoots.push(candidate);
|
|
4261
|
+
break;
|
|
4262
|
+
}
|
|
4263
|
+
dir = path15__default.dirname(dir);
|
|
4264
|
+
}
|
|
4265
|
+
const flowPath = findFlowFile(flowId, priorityRoots);
|
|
4266
|
+
if (!flowPath) {
|
|
4212
4267
|
const textPrompt = positional.join(" ");
|
|
4213
4268
|
if (!textPrompt.trim()) {
|
|
4214
4269
|
logErr(`Flow not found: ${flowId}`);
|
|
4215
|
-
|
|
4270
|
+
const available = discoverFlows().map((f) => f.id);
|
|
4271
|
+
if (available.length > 0) {
|
|
4272
|
+
console.log(` ${S.dim("Available:")} ${available.map((id) => S.cmd(id)).join(", ")}`);
|
|
4273
|
+
}
|
|
4216
4274
|
process.exit(1);
|
|
4217
4275
|
}
|
|
4218
4276
|
await runAgentChat({
|
|
@@ -4225,43 +4283,13 @@ function makeRunCommand() {
|
|
|
4225
4283
|
});
|
|
4226
4284
|
return;
|
|
4227
4285
|
}
|
|
4228
|
-
let
|
|
4229
|
-
|
|
4230
|
-
|
|
4231
|
-
|
|
4232
|
-
|
|
4233
|
-
|
|
4234
|
-
|
|
4235
|
-
if (fs10__default.existsSync(p_)) {
|
|
4236
|
-
flowPath = p_;
|
|
4237
|
-
break;
|
|
4238
|
-
}
|
|
4239
|
-
const legacy = path14__default.join(candidate, domain, "flows", `${flowId}.json`);
|
|
4240
|
-
if (fs10__default.existsSync(legacy)) {
|
|
4241
|
-
flowPath = legacy;
|
|
4242
|
-
break;
|
|
4243
|
-
}
|
|
4244
|
-
}
|
|
4245
|
-
break;
|
|
4246
|
-
}
|
|
4247
|
-
dir = path14__default.dirname(dir);
|
|
4248
|
-
}
|
|
4249
|
-
if (!flowPath) {
|
|
4250
|
-
for (const domain of fs10__default.readdirSync(AI_RESOURCES)) {
|
|
4251
|
-
const p_ = path14__default.join(AI_RESOURCES, domain, "flows", `${flowId}.flow.yaml`);
|
|
4252
|
-
if (fs10__default.existsSync(p_)) {
|
|
4253
|
-
flowPath = p_;
|
|
4254
|
-
break;
|
|
4255
|
-
}
|
|
4256
|
-
const legacy = path14__default.join(AI_RESOURCES, domain, "flows", `${flowId}.json`);
|
|
4257
|
-
if (fs10__default.existsSync(legacy)) {
|
|
4258
|
-
flowPath = legacy;
|
|
4259
|
-
break;
|
|
4260
|
-
}
|
|
4261
|
-
}
|
|
4262
|
-
}
|
|
4263
|
-
if (!flowPath) {
|
|
4264
|
-
logErr(`Could not locate flow file for: ${flowId}`);
|
|
4286
|
+
let flow;
|
|
4287
|
+
try {
|
|
4288
|
+
flow = loadFlow(flowPath);
|
|
4289
|
+
} catch (err) {
|
|
4290
|
+
logErr(
|
|
4291
|
+
`Failed to load flow "${flowId}": ${err instanceof Error ? err.message : String(err)}`
|
|
4292
|
+
);
|
|
4265
4293
|
process.exit(1);
|
|
4266
4294
|
}
|
|
4267
4295
|
console.log();
|
|
@@ -4287,7 +4315,7 @@ function makeRunCommand() {
|
|
|
4287
4315
|
}
|
|
4288
4316
|
function makeResumeCommand() {
|
|
4289
4317
|
const cmd = new Command("resume").description("Resume current session").option("--project-dir <path>", "Project directory", process.cwd()).option("--session <run-id>", "Target session by runId").option("--dry-run", "Print plan without executing").action(async (opts) => {
|
|
4290
|
-
const projectDir =
|
|
4318
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
4291
4319
|
const sessionId = opts.session;
|
|
4292
4320
|
const dryRun = opts.dryRun ?? false;
|
|
4293
4321
|
const session = sessionId ? await loadSessionById(projectDir, sessionId) : await loadSession(projectDir);
|
|
@@ -4314,7 +4342,7 @@ function makeResumeCommand() {
|
|
|
4314
4342
|
}
|
|
4315
4343
|
function makeStatusCommand() {
|
|
4316
4344
|
return new Command("status").description("Show current session state").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
|
|
4317
|
-
const projectDir =
|
|
4345
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
4318
4346
|
const session = await loadSession(projectDir);
|
|
4319
4347
|
if (!session) {
|
|
4320
4348
|
logInfo("No active session.");
|
|
@@ -4339,7 +4367,7 @@ function makeStatusCommand() {
|
|
|
4339
4367
|
}
|
|
4340
4368
|
function makeClearCommand() {
|
|
4341
4369
|
return new Command("clear").description("Unset current session pointer").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
|
|
4342
|
-
const projectDir =
|
|
4370
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
4343
4371
|
await clearSession(projectDir);
|
|
4344
4372
|
logOk("Session cleared.");
|
|
4345
4373
|
});
|
|
@@ -4349,7 +4377,7 @@ function makeReplCommand() {
|
|
|
4349
4377
|
const { findWorkspaceRoot: findWorkspaceRoot2 } = await import('../core/index.js');
|
|
4350
4378
|
const { startRepl } = await import('../tui/index.js');
|
|
4351
4379
|
const os = await import('os');
|
|
4352
|
-
const userCwd =
|
|
4380
|
+
const userCwd = path15__default.resolve(opts.projectDir ?? process.cwd());
|
|
4353
4381
|
const workspaceRoot = findWorkspaceRoot2(userCwd);
|
|
4354
4382
|
let projectDir;
|
|
4355
4383
|
let agentCwd;
|
|
@@ -4371,13 +4399,13 @@ function makeReplCommand() {
|
|
|
4371
4399
|
p5.cancel("Cancelled.");
|
|
4372
4400
|
process.exit(0);
|
|
4373
4401
|
}
|
|
4374
|
-
const tmpDir =
|
|
4402
|
+
const tmpDir = fs11__default.mkdtempSync(path15__default.join(os.tmpdir(), "skaile-repl-"));
|
|
4375
4403
|
projectDir = tmpDir;
|
|
4376
4404
|
agentCwd = userCwd;
|
|
4377
4405
|
logOk(`Temporary workspace: ${S.cmd(tmpDir)}`);
|
|
4378
4406
|
if (!driverOverride) {
|
|
4379
|
-
const claudeDir =
|
|
4380
|
-
if (
|
|
4407
|
+
const claudeDir = path15__default.join(os.homedir(), ".claude");
|
|
4408
|
+
if (fs11__default.existsSync(claudeDir)) {
|
|
4381
4409
|
driverOverride = "claude-sdk";
|
|
4382
4410
|
logInfo(`Detected ${S.cmd("~/.claude")} \u2192 using ${S.cmd("claude-sdk")} backend`);
|
|
4383
4411
|
} else {
|
|
@@ -4428,7 +4456,7 @@ async function ensurePluginsLoadedForServe(projectDir) {
|
|
|
4428
4456
|
const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
|
|
4429
4457
|
const config = resolveSkWorkspaceConfig2(projectDir);
|
|
4430
4458
|
if (!config.plugins || config.plugins.length === 0) return;
|
|
4431
|
-
const { ensurePluginsLoaded } = await import('../plugin-store-
|
|
4459
|
+
const { ensurePluginsLoaded } = await import('../plugin-store-O5VR45CA.js');
|
|
4432
4460
|
const { pluginRegistry } = await import('../plugin-registry/index.js');
|
|
4433
4461
|
const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
|
|
4434
4462
|
if (result.loaded.length > 0) {
|
|
@@ -4449,7 +4477,7 @@ async function runCompileTest(opts) {
|
|
|
4449
4477
|
const { unlinkSync, existsSync: existsSync12 } = await import('fs');
|
|
4450
4478
|
const { spawn } = await import('child_process');
|
|
4451
4479
|
const { portableSpawnSync: portableSpawnSync2 } = await import('../core/index.js');
|
|
4452
|
-
const { MONOREPO_ROOT } = await import('../paths-
|
|
4480
|
+
const { MONOREPO_ROOT } = await import('../paths-BMW6JYW6.js');
|
|
4453
4481
|
if (MONOREPO_ROOT === null) {
|
|
4454
4482
|
logErr2("--compile-test is only available inside the skaile-dev workspace.");
|
|
4455
4483
|
logInfo2("Run it from a checkout of skaile-ai/skaile-dev (the monorepo shell).");
|
|
@@ -4919,7 +4947,7 @@ function resolveMode(opts) {
|
|
|
4919
4947
|
if (opts.forceLocal && opts.forceRemote) {
|
|
4920
4948
|
throw new Error("Cannot use both --local and --remote");
|
|
4921
4949
|
}
|
|
4922
|
-
const startDir =
|
|
4950
|
+
const startDir = path15__default.resolve(opts.projectDir ?? process.cwd());
|
|
4923
4951
|
const localDb = findLogsDb(startDir);
|
|
4924
4952
|
if (opts.forceLocal) {
|
|
4925
4953
|
if (!localDb) {
|
|
@@ -4952,14 +4980,14 @@ function resolveMode(opts) {
|
|
|
4952
4980
|
function findLogsDb(startDir) {
|
|
4953
4981
|
let dir = startDir;
|
|
4954
4982
|
for (let i = 0; i < MAX_WALK_LEVELS; i++) {
|
|
4955
|
-
const candidate =
|
|
4983
|
+
const candidate = path15__default.join(dir, ".skaile", "logs.db");
|
|
4956
4984
|
if (existsSync(candidate)) {
|
|
4957
4985
|
try {
|
|
4958
4986
|
if (statSync(candidate).isFile()) return candidate;
|
|
4959
4987
|
} catch {
|
|
4960
4988
|
}
|
|
4961
4989
|
}
|
|
4962
|
-
const parent =
|
|
4990
|
+
const parent = path15__default.dirname(dir);
|
|
4963
4991
|
if (parent === dir) return void 0;
|
|
4964
4992
|
dir = parent;
|
|
4965
4993
|
}
|
|
@@ -4985,7 +5013,7 @@ function readApiToken() {
|
|
|
4985
5013
|
}
|
|
4986
5014
|
function readGlobalSettings() {
|
|
4987
5015
|
try {
|
|
4988
|
-
const settingsPath =
|
|
5016
|
+
const settingsPath = path15__default.join(homedir(), ".skaile", "settings.json");
|
|
4989
5017
|
if (!existsSync(settingsPath)) return {};
|
|
4990
5018
|
return JSON.parse(readFileSync(settingsPath, "utf8"));
|
|
4991
5019
|
} catch {
|
|
@@ -5133,7 +5161,7 @@ function parsePositiveInt(value, flag) {
|
|
|
5133
5161
|
function makeSessionCommand() {
|
|
5134
5162
|
const cmd = new Command("session").description("Manage sessions");
|
|
5135
5163
|
cmd.command("list").description("List all sessions for a project").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
|
|
5136
|
-
const projectDir =
|
|
5164
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
5137
5165
|
const sessions = await listSessions(projectDir);
|
|
5138
5166
|
const current = await loadSession(projectDir);
|
|
5139
5167
|
if (sessions.length === 0) {
|
|
@@ -5161,7 +5189,7 @@ function makeSessionCommand() {
|
|
|
5161
5189
|
console.log();
|
|
5162
5190
|
});
|
|
5163
5191
|
cmd.command("show <run-id>").description("Show a specific session").option("--project-dir <path>", "Project directory", process.cwd()).action(async (runId, opts) => {
|
|
5164
|
-
const projectDir =
|
|
5192
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
5165
5193
|
const session = await loadSessionById(projectDir, runId);
|
|
5166
5194
|
if (!session) {
|
|
5167
5195
|
logErr(`Session not found: ${runId}`);
|
|
@@ -5170,12 +5198,12 @@ function makeSessionCommand() {
|
|
|
5170
5198
|
console.log(JSON.stringify(session, null, 2));
|
|
5171
5199
|
});
|
|
5172
5200
|
cmd.command("switch <run-id>").description("Switch the current session").option("--project-dir <path>", "Project directory", process.cwd()).action(async (runId, opts) => {
|
|
5173
|
-
const projectDir =
|
|
5201
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
5174
5202
|
await setCurrentSession(projectDir, runId);
|
|
5175
5203
|
logOk(`Switched to session: ${S.dim(runId.slice(0, 8))}`);
|
|
5176
5204
|
});
|
|
5177
5205
|
cmd.command("delete <run-id>").description("Delete a session").option("--project-dir <path>", "Project directory", process.cwd()).action(async (runId, opts) => {
|
|
5178
|
-
const projectDir =
|
|
5206
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
5179
5207
|
await deleteSession(projectDir, runId);
|
|
5180
5208
|
logOk(`Deleted session: ${S.dim(runId.slice(0, 8))}`);
|
|
5181
5209
|
});
|
|
@@ -5224,12 +5252,12 @@ function showOverview(am2) {
|
|
|
5224
5252
|
}
|
|
5225
5253
|
function showAsset(am2, kind, name) {
|
|
5226
5254
|
const entry = am2.info(`${kind}:${name}`);
|
|
5227
|
-
if (entry?.source &&
|
|
5255
|
+
if (entry?.source && fs11__default.existsSync(entry.source)) {
|
|
5228
5256
|
console.log();
|
|
5229
5257
|
console.log(` ${kindColor(entry.kind)} ${S.heading(entry.name)}`);
|
|
5230
5258
|
console.log(` ${S.rule(40)}`);
|
|
5231
5259
|
console.log();
|
|
5232
|
-
console.log(
|
|
5260
|
+
console.log(fs11__default.readFileSync(entry.source, "utf-8"));
|
|
5233
5261
|
return;
|
|
5234
5262
|
}
|
|
5235
5263
|
logErr(`Asset not found: ${kind}:${name}`);
|
|
@@ -5238,7 +5266,7 @@ function showAsset(am2, kind, name) {
|
|
|
5238
5266
|
function makeShowCommand() {
|
|
5239
5267
|
return new Command("show").description("Show deployed assets overview, or print asset content").argument("[kind]", "Asset kind (skill, agent, prompt, flow, bundle, contract)").argument("[name]", "Asset name").option("--project-dir <path>", "Project directory", process.cwd()).option("--target <agent>", "Agent framework", "claude-code").action((kind, name, opts) => {
|
|
5240
5268
|
const am2 = new AssetManager({
|
|
5241
|
-
projectDir:
|
|
5269
|
+
projectDir: path15__default.resolve(opts.projectDir),
|
|
5242
5270
|
driverTarget: opts.target
|
|
5243
5271
|
});
|
|
5244
5272
|
if (!kind) {
|
|
@@ -5276,10 +5304,10 @@ function addSourceManifestCommands(src) {
|
|
|
5276
5304
|
|
|
5277
5305
|
// cli/src/commands/source.ts
|
|
5278
5306
|
function sourcesDir() {
|
|
5279
|
-
return
|
|
5307
|
+
return path15.join(skaileHomeDir(), "sources");
|
|
5280
5308
|
}
|
|
5281
5309
|
function sourceClonePath(name) {
|
|
5282
|
-
return
|
|
5310
|
+
return path15.join(sourcesDir(), name);
|
|
5283
5311
|
}
|
|
5284
5312
|
function deriveSlug(url) {
|
|
5285
5313
|
return url.replace(/\.git$/, "").split(/[/:]/).pop() ?? "source";
|
|
@@ -5300,7 +5328,7 @@ function requireProjectYamlPath() {
|
|
|
5300
5328
|
);
|
|
5301
5329
|
process.exit(1);
|
|
5302
5330
|
}
|
|
5303
|
-
return
|
|
5331
|
+
return path15.join(root, workspaceConfigFilename());
|
|
5304
5332
|
}
|
|
5305
5333
|
function readProjectSources(yamlPath) {
|
|
5306
5334
|
if (!existsSync(yamlPath)) return [];
|
|
@@ -5398,7 +5426,7 @@ function makeSourceCommand() {
|
|
|
5398
5426
|
const result = await refreshManifestCache(entry, opts.dev);
|
|
5399
5427
|
logOk(`Indexed ${result.assetsUpdated} of ${result.assetsFound} asset(s) from "${slug}".`);
|
|
5400
5428
|
for (const err of result.errors) logWarn(err);
|
|
5401
|
-
logOk(`Source "${slug}" registered in ${
|
|
5429
|
+
logOk(`Source "${slug}" registered in ${path15.relative(process.cwd(), yamlPath)}.`);
|
|
5402
5430
|
}
|
|
5403
5431
|
);
|
|
5404
5432
|
cmd.command("list").description("List sources registered in this project's skaile.yaml").option("--json", "Output as JSON").action(async (opts) => {
|
|
@@ -5665,7 +5693,7 @@ function printTree(node, prefix = "", isLast = true) {
|
|
|
5665
5693
|
}
|
|
5666
5694
|
function makeTreeCommand() {
|
|
5667
5695
|
return new Command("tree").description("Show full dependency tree").option("--project-dir <path>", "Project directory", process.cwd()).action((opts) => {
|
|
5668
|
-
const am2 = new AssetManager({ projectDir:
|
|
5696
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
5669
5697
|
const root = am2.tree();
|
|
5670
5698
|
if (root.children.length === 0) {
|
|
5671
5699
|
logInfo("No dependencies in lock file. Run `skaile install` first.");
|
|
@@ -5683,7 +5711,7 @@ function makeUpdateCommand() {
|
|
|
5683
5711
|
try {
|
|
5684
5712
|
const catalogSpinner = p5.spinner();
|
|
5685
5713
|
catalogSpinner.start("Refreshing catalog cache");
|
|
5686
|
-
const remote = await openCatalogSource({ projectDir:
|
|
5714
|
+
const remote = await openCatalogSource({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
5687
5715
|
const result2 = await remote.refresh();
|
|
5688
5716
|
catalogSpinner.stop(
|
|
5689
5717
|
`Catalog refreshed: ${S.heading(String(result2.assetsCached))} assets cached`
|
|
@@ -5695,7 +5723,7 @@ function makeUpdateCommand() {
|
|
|
5695
5723
|
}
|
|
5696
5724
|
}
|
|
5697
5725
|
if (opts.catalogOnly) return;
|
|
5698
|
-
const am2 = new AssetManager({ projectDir:
|
|
5726
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
5699
5727
|
const spinner5 = p5.spinner();
|
|
5700
5728
|
spinner5.start("Re-deploying assets");
|
|
5701
5729
|
const result = await am2.install();
|
|
@@ -5729,12 +5757,12 @@ function findManifestCandidates(rootPath) {
|
|
|
5729
5757
|
function walk(dir) {
|
|
5730
5758
|
let entries;
|
|
5731
5759
|
try {
|
|
5732
|
-
entries =
|
|
5760
|
+
entries = fs11__default.readdirSync(dir, { withFileTypes: true });
|
|
5733
5761
|
} catch {
|
|
5734
5762
|
return;
|
|
5735
5763
|
}
|
|
5736
5764
|
for (const entry of entries) {
|
|
5737
|
-
const fullPath =
|
|
5765
|
+
const fullPath = path15__default.join(dir, entry.name);
|
|
5738
5766
|
if (entry.isDirectory()) {
|
|
5739
5767
|
if (!SKIP_DIRS.has(entry.name)) walk(fullPath);
|
|
5740
5768
|
} else if (entry.isFile()) {
|
|
@@ -5755,9 +5783,28 @@ function parseMdFrontmatter(content) {
|
|
|
5755
5783
|
if (!fmMatch) return null;
|
|
5756
5784
|
return parse(fmMatch[1]);
|
|
5757
5785
|
}
|
|
5786
|
+
function checkManifestIdentity(kind, parsed) {
|
|
5787
|
+
if (parsed === null || typeof parsed !== "object") return null;
|
|
5788
|
+
const obj = parsed;
|
|
5789
|
+
const identity = kind === "flow" ? obj.id : obj.name;
|
|
5790
|
+
if (typeof identity !== "string" || identity.length === 0) return null;
|
|
5791
|
+
const publisher = typeof obj.publisher === "string" ? obj.publisher : void 0;
|
|
5792
|
+
if (publisher !== void 0) {
|
|
5793
|
+
try {
|
|
5794
|
+
parseAssetRef(`${kind}:@${publisher}/${identity}`);
|
|
5795
|
+
return null;
|
|
5796
|
+
} catch (e) {
|
|
5797
|
+
return e instanceof Error ? e.message : String(e);
|
|
5798
|
+
}
|
|
5799
|
+
}
|
|
5800
|
+
if (!isValidAssetName(identity)) {
|
|
5801
|
+
return `invalid asset ${kind === "flow" ? "id" : "name"} "${identity}" \u2014 ${ASSET_NAME_HINT}`;
|
|
5802
|
+
}
|
|
5803
|
+
return null;
|
|
5804
|
+
}
|
|
5758
5805
|
function validateManifests(rootPath) {
|
|
5759
|
-
const absRoot =
|
|
5760
|
-
if (!
|
|
5806
|
+
const absRoot = path15__default.resolve(rootPath);
|
|
5807
|
+
if (!fs11__default.existsSync(absRoot)) {
|
|
5761
5808
|
logErr(`Path does not exist: ${absRoot}`);
|
|
5762
5809
|
return { total: 0, errors: 1, warnings: 0 };
|
|
5763
5810
|
}
|
|
@@ -5766,7 +5813,7 @@ function validateManifests(rootPath) {
|
|
|
5766
5813
|
let errors = 0;
|
|
5767
5814
|
let warnings = 0;
|
|
5768
5815
|
for (const c of candidates) {
|
|
5769
|
-
const content =
|
|
5816
|
+
const content = fs11__default.readFileSync(c.filePath, "utf-8");
|
|
5770
5817
|
let parsed;
|
|
5771
5818
|
if (c.filePath.endsWith(".md")) {
|
|
5772
5819
|
parsed = parseMdFrontmatter(content);
|
|
@@ -5777,14 +5824,19 @@ function validateManifests(rootPath) {
|
|
|
5777
5824
|
try {
|
|
5778
5825
|
parsed = c.filePath.endsWith(".json") ? JSON.parse(content) : parse(content);
|
|
5779
5826
|
} catch (e) {
|
|
5780
|
-
const relPath2 =
|
|
5827
|
+
const relPath2 = path15__default.relative(absRoot, c.filePath);
|
|
5781
5828
|
logErr(`${relPath2} \u2014 parse error: ${e instanceof Error ? e.message : String(e)}`);
|
|
5782
5829
|
errors++;
|
|
5783
5830
|
continue;
|
|
5784
5831
|
}
|
|
5785
5832
|
}
|
|
5833
|
+
const relPath = path15__default.relative(absRoot, c.filePath);
|
|
5834
|
+
const identityError = checkManifestIdentity(c.kind, parsed);
|
|
5835
|
+
if (identityError) {
|
|
5836
|
+
logErr(`${relPath} [${c.kind}] \u2014 ${identityError}`);
|
|
5837
|
+
errors++;
|
|
5838
|
+
}
|
|
5786
5839
|
const provider = registry.getProvider(c.kind);
|
|
5787
|
-
const relPath = path14__default.relative(absRoot, c.filePath);
|
|
5788
5840
|
if (!provider) {
|
|
5789
5841
|
logWarn(`${relPath} [${c.kind}] \u2014 kind "${c.kind}" is not registered, skipping validation`);
|
|
5790
5842
|
warnings++;
|
|
@@ -5800,27 +5852,106 @@ function validateManifests(rootPath) {
|
|
|
5800
5852
|
}
|
|
5801
5853
|
return { total: candidates.length, errors, warnings };
|
|
5802
5854
|
}
|
|
5855
|
+
function findWorkspaceManifests(rootPath) {
|
|
5856
|
+
const out = [];
|
|
5857
|
+
function walk(dir) {
|
|
5858
|
+
let entries;
|
|
5859
|
+
try {
|
|
5860
|
+
entries = fs11__default.readdirSync(dir, { withFileTypes: true });
|
|
5861
|
+
} catch {
|
|
5862
|
+
return;
|
|
5863
|
+
}
|
|
5864
|
+
for (const entry of entries) {
|
|
5865
|
+
const full = path15__default.join(dir, entry.name);
|
|
5866
|
+
if (entry.isDirectory()) {
|
|
5867
|
+
if (!SKIP_DIRS.has(entry.name)) walk(full);
|
|
5868
|
+
} else if (entry.isFile() && /(^|\.)skaile\.yaml$/.test(entry.name)) {
|
|
5869
|
+
out.push(full);
|
|
5870
|
+
}
|
|
5871
|
+
}
|
|
5872
|
+
}
|
|
5873
|
+
walk(rootPath);
|
|
5874
|
+
return out;
|
|
5875
|
+
}
|
|
5876
|
+
function validateWorkspaceManifests(rootPath) {
|
|
5877
|
+
const absRoot = path15__default.resolve(rootPath);
|
|
5878
|
+
const files = findWorkspaceManifests(absRoot);
|
|
5879
|
+
let errors = 0;
|
|
5880
|
+
for (const file of files) {
|
|
5881
|
+
const relPath = path15__default.relative(absRoot, file);
|
|
5882
|
+
let parsed;
|
|
5883
|
+
try {
|
|
5884
|
+
parsed = parse(fs11__default.readFileSync(file, "utf-8")) ?? {};
|
|
5885
|
+
} catch (e) {
|
|
5886
|
+
logErr(`${relPath} \u2014 parse error: ${e instanceof Error ? e.message : String(e)}`);
|
|
5887
|
+
errors++;
|
|
5888
|
+
continue;
|
|
5889
|
+
}
|
|
5890
|
+
const refFields = [];
|
|
5891
|
+
if (Array.isArray(parsed.dependencies)) {
|
|
5892
|
+
for (const d of parsed.dependencies) {
|
|
5893
|
+
if (typeof d === "string") refFields.push(["dependencies", d]);
|
|
5894
|
+
}
|
|
5895
|
+
}
|
|
5896
|
+
if (Array.isArray(parsed.overrides)) {
|
|
5897
|
+
for (const o of parsed.overrides) {
|
|
5898
|
+
const ref = o?.ref;
|
|
5899
|
+
if (typeof ref === "string") refFields.push(["overrides.ref", ref]);
|
|
5900
|
+
}
|
|
5901
|
+
}
|
|
5902
|
+
for (const [field, ref] of refFields) {
|
|
5903
|
+
try {
|
|
5904
|
+
parseAssetRef(ref);
|
|
5905
|
+
} catch (e) {
|
|
5906
|
+
logErr(`${relPath} [${field}] \u2014 ${e instanceof Error ? e.message : String(e)}`);
|
|
5907
|
+
errors++;
|
|
5908
|
+
}
|
|
5909
|
+
}
|
|
5910
|
+
if (Array.isArray(parsed.assets)) {
|
|
5911
|
+
const topPublisher = typeof parsed.publisher === "string" ? parsed.publisher : void 0;
|
|
5912
|
+
for (const a of parsed.assets) {
|
|
5913
|
+
const asset = a;
|
|
5914
|
+
const name = asset?.name;
|
|
5915
|
+
const kind = typeof asset?.kind === "string" ? asset.kind : "skill";
|
|
5916
|
+
if (typeof name !== "string" || name.length === 0) continue;
|
|
5917
|
+
const publisher = typeof asset?.publisher === "string" ? asset.publisher : topPublisher;
|
|
5918
|
+
if (publisher !== void 0) {
|
|
5919
|
+
try {
|
|
5920
|
+
parseAssetRef(`${kind}:@${publisher}/${name}`);
|
|
5921
|
+
} catch (e) {
|
|
5922
|
+
logErr(`${relPath} [assets] \u2014 ${e instanceof Error ? e.message : String(e)}`);
|
|
5923
|
+
errors++;
|
|
5924
|
+
}
|
|
5925
|
+
} else if (!isValidAssetName(name)) {
|
|
5926
|
+
logErr(`${relPath} [assets] \u2014 invalid asset name "${name}" \u2014 ${ASSET_NAME_HINT}`);
|
|
5927
|
+
errors++;
|
|
5928
|
+
}
|
|
5929
|
+
}
|
|
5930
|
+
}
|
|
5931
|
+
}
|
|
5932
|
+
return { total: files.length, errors };
|
|
5933
|
+
}
|
|
5803
5934
|
var EXCLUDED_DOMAINS = /* @__PURE__ */ new Set(["skaileup-shared", "external", "docs"]);
|
|
5804
5935
|
function collectAssetVersions() {
|
|
5805
5936
|
const assets = [];
|
|
5806
|
-
if (!
|
|
5807
|
-
const domains =
|
|
5937
|
+
if (!fs11__default.existsSync(AI_RESOURCES)) return assets;
|
|
5938
|
+
const domains = fs11__default.readdirSync(AI_RESOURCES, { withFileTypes: true }).filter((d) => d.isDirectory() && !EXCLUDED_DOMAINS.has(d.name));
|
|
5808
5939
|
for (const d of domains) {
|
|
5809
|
-
const domainDir =
|
|
5810
|
-
const skillsDir =
|
|
5811
|
-
if (
|
|
5940
|
+
const domainDir = path15__default.join(AI_RESOURCES, d.name);
|
|
5941
|
+
const skillsDir = path15__default.join(domainDir, "skills");
|
|
5942
|
+
if (fs11__default.existsSync(skillsDir)) {
|
|
5812
5943
|
collectSkillVersions(skillsDir, d.name, assets);
|
|
5813
5944
|
}
|
|
5814
|
-
const agentsDir =
|
|
5815
|
-
if (
|
|
5945
|
+
const agentsDir = path15__default.join(domainDir, "agents");
|
|
5946
|
+
if (fs11__default.existsSync(agentsDir)) {
|
|
5816
5947
|
collectAgentVersions(agentsDir, d.name, assets);
|
|
5817
5948
|
}
|
|
5818
|
-
const flowsDir =
|
|
5819
|
-
if (
|
|
5820
|
-
for (const f of
|
|
5949
|
+
const flowsDir = path15__default.join(domainDir, "flows");
|
|
5950
|
+
if (fs11__default.existsSync(flowsDir)) {
|
|
5951
|
+
for (const f of fs11__default.readdirSync(flowsDir)) {
|
|
5821
5952
|
if (!f.endsWith(".flow.yaml")) continue;
|
|
5822
|
-
const fp =
|
|
5823
|
-
const content =
|
|
5953
|
+
const fp = path15__default.join(flowsDir, f);
|
|
5954
|
+
const content = fs11__default.readFileSync(fp, "utf-8");
|
|
5824
5955
|
const parsed = parse(content);
|
|
5825
5956
|
assets.push({
|
|
5826
5957
|
kind: "flow",
|
|
@@ -5831,12 +5962,12 @@ function collectAssetVersions() {
|
|
|
5831
5962
|
});
|
|
5832
5963
|
}
|
|
5833
5964
|
}
|
|
5834
|
-
const promptsDir =
|
|
5835
|
-
if (
|
|
5836
|
-
for (const f of
|
|
5965
|
+
const promptsDir = path15__default.join(domainDir, "prompts");
|
|
5966
|
+
if (fs11__default.existsSync(promptsDir)) {
|
|
5967
|
+
for (const f of fs11__default.readdirSync(promptsDir)) {
|
|
5837
5968
|
if (!f.endsWith(".prompt.md")) continue;
|
|
5838
|
-
const fp =
|
|
5839
|
-
const content =
|
|
5969
|
+
const fp = path15__default.join(promptsDir, f);
|
|
5970
|
+
const content = fs11__default.readFileSync(fp, "utf-8");
|
|
5840
5971
|
const fm = parseSkillFrontmatter(content);
|
|
5841
5972
|
assets.push({
|
|
5842
5973
|
kind: "prompt",
|
|
@@ -5851,12 +5982,12 @@ function collectAssetVersions() {
|
|
|
5851
5982
|
return assets;
|
|
5852
5983
|
}
|
|
5853
5984
|
function collectSkillVersions(dir, domain, out) {
|
|
5854
|
-
for (const entry of
|
|
5985
|
+
for (const entry of fs11__default.readdirSync(dir, { withFileTypes: true })) {
|
|
5855
5986
|
if (!entry.isDirectory()) continue;
|
|
5856
|
-
const full =
|
|
5857
|
-
const skillMd =
|
|
5858
|
-
if (
|
|
5859
|
-
const content =
|
|
5987
|
+
const full = path15__default.join(dir, entry.name);
|
|
5988
|
+
const skillMd = path15__default.join(full, "SKILL.md");
|
|
5989
|
+
if (fs11__default.existsSync(skillMd)) {
|
|
5990
|
+
const content = fs11__default.readFileSync(skillMd, "utf-8");
|
|
5860
5991
|
const fm = parseSkillFrontmatter(content);
|
|
5861
5992
|
out.push({
|
|
5862
5993
|
kind: "skill",
|
|
@@ -5871,11 +6002,11 @@ function collectSkillVersions(dir, domain, out) {
|
|
|
5871
6002
|
}
|
|
5872
6003
|
}
|
|
5873
6004
|
function collectAgentVersions(dir, domain, out) {
|
|
5874
|
-
for (const entry of
|
|
6005
|
+
for (const entry of fs11__default.readdirSync(dir, { withFileTypes: true })) {
|
|
5875
6006
|
if (!entry.isDirectory()) continue;
|
|
5876
|
-
const agentYaml =
|
|
5877
|
-
if (!
|
|
5878
|
-
const content =
|
|
6007
|
+
const agentYaml = path15__default.join(dir, entry.name, "agent.yaml");
|
|
6008
|
+
if (!fs11__default.existsSync(agentYaml)) continue;
|
|
6009
|
+
const content = fs11__default.readFileSync(agentYaml, "utf-8");
|
|
5879
6010
|
const parsed = parse(content);
|
|
5880
6011
|
out.push({
|
|
5881
6012
|
kind: "agent",
|
|
@@ -5904,15 +6035,17 @@ function makeValidateCommand() {
|
|
|
5904
6035
|
"Validate asset manifests, versions, and changelogs"
|
|
5905
6036
|
);
|
|
5906
6037
|
cmd.argument("[path]", "Path to asset repo or directory to validate", ".").action((targetPath) => {
|
|
5907
|
-
const absPath =
|
|
6038
|
+
const absPath = path15__default.resolve(targetPath);
|
|
5908
6039
|
logInfo(`Validating manifests in ${absPath}`);
|
|
5909
6040
|
const { total, errors } = validateManifests(absPath);
|
|
6041
|
+
const ws = validateWorkspaceManifests(absPath);
|
|
6042
|
+
const totalErrors = errors + ws.errors;
|
|
5910
6043
|
console.log();
|
|
5911
|
-
logInfo(`Scanned ${total} manifest
|
|
5912
|
-
if (
|
|
6044
|
+
logInfo(`Scanned ${total} asset manifest(s) and ${ws.total} skaile.yaml file(s)`);
|
|
6045
|
+
if (totalErrors === 0) {
|
|
5913
6046
|
logOk("All manifests valid");
|
|
5914
6047
|
} else {
|
|
5915
|
-
logErr(`${
|
|
6048
|
+
logErr(`${totalErrors} validation error(s)`);
|
|
5916
6049
|
process.exit(1);
|
|
5917
6050
|
}
|
|
5918
6051
|
});
|
|
@@ -5925,7 +6058,7 @@ function makeValidateCommand() {
|
|
|
5925
6058
|
encoding: "utf-8"
|
|
5926
6059
|
});
|
|
5927
6060
|
const changedFiles = new Set(
|
|
5928
|
-
diffOutput.trim().split("\n").filter(Boolean).map((f) =>
|
|
6061
|
+
diffOutput.trim().split("\n").filter(Boolean).map((f) => path15__default.resolve(AI_RESOURCES, f))
|
|
5929
6062
|
);
|
|
5930
6063
|
assets = assets.filter((a) => changedFiles.has(a.filePath));
|
|
5931
6064
|
} catch {
|
|
@@ -5947,7 +6080,7 @@ function makeValidateCommand() {
|
|
|
5947
6080
|
if (opts.changedOnly) {
|
|
5948
6081
|
for (const a of assets) {
|
|
5949
6082
|
if (!a.version) continue;
|
|
5950
|
-
const relPath =
|
|
6083
|
+
const relPath = path15__default.relative(AI_RESOURCES, a.filePath);
|
|
5951
6084
|
try {
|
|
5952
6085
|
const headContent = execSync(`git show HEAD:${relPath}`, {
|
|
5953
6086
|
cwd: AI_RESOURCES,
|
|
@@ -5970,7 +6103,7 @@ function makeValidateCommand() {
|
|
|
5970
6103
|
skillVersionMap.set(a.name, a.version);
|
|
5971
6104
|
}
|
|
5972
6105
|
for (const f of flows) {
|
|
5973
|
-
const content =
|
|
6106
|
+
const content = fs11__default.readFileSync(f.filePath, "utf-8");
|
|
5974
6107
|
const parsed = parse(content);
|
|
5975
6108
|
const nodes = (parsed?.nodes ?? []).filter((n) => n.type === "skill" && n.data?.version).map((n) => ({
|
|
5976
6109
|
nodeId: n.id,
|
|
@@ -6027,7 +6160,7 @@ function makeValidateCommand() {
|
|
|
6027
6160
|
let errors = 0;
|
|
6028
6161
|
for (const domain of modifiedDomains) {
|
|
6029
6162
|
const changelogModified = modifiedFiles.some(
|
|
6030
|
-
(f) => f === `${domain}/CHANGELOG.md` || f ===
|
|
6163
|
+
(f) => f === `${domain}/CHANGELOG.md` || f === path15__default.join(domain, "CHANGELOG.md")
|
|
6031
6164
|
);
|
|
6032
6165
|
if (changelogModified) {
|
|
6033
6166
|
logOk(`${domain}/CHANGELOG.md updated`);
|
|
@@ -6109,7 +6242,7 @@ function makeVerifyCommand() {
|
|
|
6109
6242
|
}
|
|
6110
6243
|
function makeWhyCommand() {
|
|
6111
6244
|
return new Command("why").description("Show why an asset is installed (dependency chain)").argument("<ref>", "Asset reference (kind:name)").option("--project-dir <path>", "Project directory", process.cwd()).action((ref, opts) => {
|
|
6112
|
-
const am2 = new AssetManager({ projectDir:
|
|
6245
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
6113
6246
|
const chain = am2.why(ref);
|
|
6114
6247
|
if (chain.length === 0) {
|
|
6115
6248
|
logErr(`${ref} not found in lock file. Run \`skaile install\` first.`);
|
|
@@ -6130,7 +6263,7 @@ function makeWhyCommand() {
|
|
|
6130
6263
|
var _defaultFormatHelp = Help.prototype.formatHelp;
|
|
6131
6264
|
var pkg = JSON.parse(
|
|
6132
6265
|
readFileSync(
|
|
6133
|
-
|
|
6266
|
+
path15__default.resolve(path15__default.dirname(fileURLToPath(import.meta.url)), "../../package.json"),
|
|
6134
6267
|
"utf-8"
|
|
6135
6268
|
)
|
|
6136
6269
|
);
|
|
@@ -6198,6 +6331,7 @@ Execution:
|
|
|
6198
6331
|
clear Unset current session
|
|
6199
6332
|
|
|
6200
6333
|
Validation:
|
|
6334
|
+
validate [path] Check manifest schemas + canonical asset names/refs
|
|
6201
6335
|
validate versions Check asset version fields and flow pins
|
|
6202
6336
|
validate changelog Check changelogs for modified domains
|
|
6203
6337
|
|
|
@@ -6241,6 +6375,11 @@ Advanced:
|
|
|
6241
6375
|
`;
|
|
6242
6376
|
}
|
|
6243
6377
|
});
|
|
6378
|
+
var BACKEND_DEFAULTS = {
|
|
6379
|
+
"claude-code": { driver: "claude-sdk", provider: "anthropic", model: "claude-sonnet-4-6" },
|
|
6380
|
+
omp: { driver: "omp" },
|
|
6381
|
+
codex: { driver: "codex", provider: "openai" }
|
|
6382
|
+
};
|
|
6244
6383
|
program.command("init [project-dir]").description("Initialize a project directory (defaults to current directory)").option("--backend <name>", "Coding-agent backend (claude-code | omp | codex)", "claude-code").option("--no-git", "Skip git init and .gitignore").action(async (projectDir, opts) => {
|
|
6245
6384
|
const { execSync: execSync3 } = await import('child_process');
|
|
6246
6385
|
const { existsSync: existsSync12, mkdirSync: mkdirSync3, readFileSync: readFileSync6, writeFileSync: writeFileSync2 } = await import('fs');
|
|
@@ -6254,25 +6393,26 @@ program.command("init [project-dir]").description("Initialize a project director
|
|
|
6254
6393
|
process.exitCode = 1;
|
|
6255
6394
|
return;
|
|
6256
6395
|
}
|
|
6257
|
-
const resolved =
|
|
6258
|
-
const projectName =
|
|
6396
|
+
const resolved = path15__default.resolve(projectDir ?? ".");
|
|
6397
|
+
const projectName = path15__default.basename(resolved);
|
|
6259
6398
|
const created = [];
|
|
6260
6399
|
if (!existsSync12(resolved)) {
|
|
6261
6400
|
mkdirSync3(resolved, { recursive: true });
|
|
6262
6401
|
created.push(".");
|
|
6263
6402
|
}
|
|
6264
|
-
const skaileDir =
|
|
6403
|
+
const skaileDir = path15__default.join(resolved, ".skaile");
|
|
6265
6404
|
if (!existsSync12(skaileDir)) {
|
|
6266
|
-
mkdirSync3(
|
|
6405
|
+
mkdirSync3(path15__default.join(skaileDir, "sessions"), { recursive: true });
|
|
6267
6406
|
created.push(".skaile/");
|
|
6268
6407
|
}
|
|
6269
|
-
const settingsPath =
|
|
6408
|
+
const settingsPath = path15__default.join(skaileDir, "settings.json");
|
|
6270
6409
|
if (!existsSync12(settingsPath)) {
|
|
6271
6410
|
writeFileSync2(settingsPath, "{}\n");
|
|
6272
6411
|
created.push(".skaile/settings.json");
|
|
6273
6412
|
}
|
|
6274
|
-
const wsConfigPath =
|
|
6413
|
+
const wsConfigPath = path15__default.join(resolved, "skaile.yaml");
|
|
6275
6414
|
if (!existsSync12(wsConfigPath)) {
|
|
6415
|
+
const backendDefaults = BACKEND_DEFAULTS[backend];
|
|
6276
6416
|
writeFileSync2(
|
|
6277
6417
|
wsConfigPath,
|
|
6278
6418
|
stringify({
|
|
@@ -6281,9 +6421,10 @@ program.command("init [project-dir]").description("Initialize a project director
|
|
|
6281
6421
|
"agent-config": {
|
|
6282
6422
|
default: {
|
|
6283
6423
|
agent: backend,
|
|
6284
|
-
provider
|
|
6285
|
-
|
|
6286
|
-
|
|
6424
|
+
// provider/model are omitted for backends that don't fix them (omp, codex).
|
|
6425
|
+
...backendDefaults.provider ? { provider: backendDefaults.provider } : {},
|
|
6426
|
+
...backendDefaults.model ? { model: backendDefaults.model } : {},
|
|
6427
|
+
driver: backendDefaults.driver,
|
|
6287
6428
|
max_turns: 200
|
|
6288
6429
|
}
|
|
6289
6430
|
}
|
|
@@ -6292,14 +6433,14 @@ program.command("init [project-dir]").description("Initialize a project director
|
|
|
6292
6433
|
created.push("skaile.yaml");
|
|
6293
6434
|
}
|
|
6294
6435
|
for (const dir of new Set(Object.values(DRIVER_TARGETS[backend].local))) {
|
|
6295
|
-
const full =
|
|
6436
|
+
const full = path15__default.join(resolved, dir);
|
|
6296
6437
|
if (!existsSync12(full)) {
|
|
6297
6438
|
mkdirSync3(full, { recursive: true });
|
|
6298
6439
|
created.push(`${dir}/`);
|
|
6299
6440
|
}
|
|
6300
6441
|
}
|
|
6301
6442
|
if (opts.git) {
|
|
6302
|
-
const gitignorePath =
|
|
6443
|
+
const gitignorePath = path15__default.join(resolved, ".gitignore");
|
|
6303
6444
|
const entries = ["node_modules/", ".skaile/sessions/", "*.log", ".env", ".env.local"];
|
|
6304
6445
|
const existing = existsSync12(gitignorePath) ? readFileSync6(gitignorePath, "utf-8") : "";
|
|
6305
6446
|
const have = new Set(existing.split("\n").map((l) => l.trim()));
|
|
@@ -6310,7 +6451,7 @@ program.command("init [project-dir]").description("Initialize a project director
|
|
|
6310
6451
|
`);
|
|
6311
6452
|
if (!existing) created.push(".gitignore");
|
|
6312
6453
|
}
|
|
6313
|
-
if (!existsSync12(
|
|
6454
|
+
if (!existsSync12(path15__default.join(resolved, ".git"))) {
|
|
6314
6455
|
try {
|
|
6315
6456
|
execSync3("git init", { cwd: resolved, stdio: "pipe" });
|
|
6316
6457
|
created.push(".git/");
|
|
@@ -6321,10 +6462,10 @@ program.command("init [project-dir]").description("Initialize a project director
|
|
|
6321
6462
|
}
|
|
6322
6463
|
}
|
|
6323
6464
|
try {
|
|
6324
|
-
const
|
|
6465
|
+
const fs12 = await import('fs');
|
|
6325
6466
|
const { userConfigPath, saveConfig, getConfigDefaults } = await import('../library/index.js');
|
|
6326
6467
|
const userCfgPath = userConfigPath();
|
|
6327
|
-
if (!
|
|
6468
|
+
if (!fs12.existsSync(userCfgPath)) {
|
|
6328
6469
|
const defaults = getConfigDefaults();
|
|
6329
6470
|
saveConfig(userCfgPath, {
|
|
6330
6471
|
catalog: { url: defaults.catalog.url, cache_ttl: defaults.catalog.cache_ttl }
|
|
@@ -6337,7 +6478,7 @@ program.command("init [project-dir]").description("Initialize a project director
|
|
|
6337
6478
|
);
|
|
6338
6479
|
}
|
|
6339
6480
|
try {
|
|
6340
|
-
const { ensureSourcesCloned } = await import('../ensure-sources-
|
|
6481
|
+
const { ensureSourcesCloned } = await import('../ensure-sources-CVULUVH4.js');
|
|
6341
6482
|
const hydrate = ensureSourcesCloned(resolved, { quiet: true });
|
|
6342
6483
|
for (const n of hydrate.cloned) created.push(`~/.skaile/sources/${n}/`);
|
|
6343
6484
|
if (hydrate.failed.length > 0) {
|
|
@@ -6351,7 +6492,7 @@ program.command("init [project-dir]").description("Initialize a project director
|
|
|
6351
6492
|
logOk(`Initialized project at ${S.heading(resolved)}`);
|
|
6352
6493
|
console.log();
|
|
6353
6494
|
console.log(S.heading(" Next steps:"));
|
|
6354
|
-
const isCurrentDir = resolved ===
|
|
6495
|
+
const isCurrentDir = resolved === path15__default.resolve(".");
|
|
6355
6496
|
let step = 1;
|
|
6356
6497
|
if (!isCurrentDir) {
|
|
6357
6498
|
console.log(` ${S.dim(`${step}.`)} ${S.cmd(`cd ${projectDir}`)}`);
|
|
@@ -6363,7 +6504,7 @@ program.command("init [project-dir]").description("Initialize a project director
|
|
|
6363
6504
|
console.log();
|
|
6364
6505
|
});
|
|
6365
6506
|
program.command("setup").description("Interactive provider setup wizard").action(async () => {
|
|
6366
|
-
const { cmdSetup } = await import('../setup-
|
|
6507
|
+
const { cmdSetup } = await import('../setup-YNLFR5GB.js');
|
|
6367
6508
|
await cmdSetup([], { projectDir: process.cwd() });
|
|
6368
6509
|
});
|
|
6369
6510
|
program.addCommand(makeInstallCommand());
|