@skaile/workspaces 0.25.0 → 0.27.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 +271 -0
- package/README.md +2 -2
- package/dist/{asset-feeds-77KLWCBP.js → asset-feeds-DGZO27M7.js} +20 -12
- package/dist/asset-feeds-DGZO27M7.js.map +1 -0
- package/dist/asset-manager/index.js +12 -11
- package/dist/asset-manager/installer.js +11 -10
- 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/continue.d.ts +2 -0
- package/dist/bridge/drivers/continue.js +103 -0
- package/dist/bridge/drivers/continue.js.map +1 -0
- package/dist/bridge/drivers/echo.js +1 -1
- package/dist/bridge/drivers/gemini.d.ts +2 -0
- package/dist/bridge/drivers/gemini.js +10 -0
- package/dist/bridge/drivers/gemini.js.map +1 -0
- package/dist/bridge/drivers/goose.d.ts +2 -0
- package/dist/bridge/drivers/goose.js +88 -0
- package/dist/bridge/drivers/goose.js.map +1 -0
- package/dist/bridge/drivers/omp.js +64 -50
- package/dist/bridge/drivers/omp.js.map +1 -1
- package/dist/bridge/drivers/opencode.d.ts +2 -0
- package/dist/bridge/drivers/opencode.js +99 -0
- package/dist/bridge/drivers/opencode.js.map +1 -0
- package/dist/bridge/drivers/qwen.d.ts +2 -0
- package/dist/bridge/drivers/qwen.js +57 -0
- package/dist/bridge/drivers/qwen.js.map +1 -0
- package/dist/bridge/index.js +4 -4
- package/dist/bridge/src/drivers/_subprocess-cli.d.ts +136 -0
- package/dist/bridge/src/drivers/_subprocess-cli.d.ts.map +1 -0
- 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/continue.d.ts +43 -0
- package/dist/bridge/src/drivers/continue.d.ts.map +1 -0
- package/dist/bridge/src/drivers/gemini.d.ts +55 -0
- package/dist/bridge/src/drivers/gemini.d.ts.map +1 -0
- package/dist/bridge/src/drivers/goose.d.ts +42 -0
- package/dist/bridge/src/drivers/goose.d.ts.map +1 -0
- 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/drivers/opencode.d.ts +43 -0
- package/dist/bridge/src/drivers/opencode.d.ts.map +1 -0
- package/dist/bridge/src/drivers/qwen.d.ts +39 -0
- package/dist/bridge/src/drivers/qwen.d.ts.map +1 -0
- 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/registry.d.ts.map +1 -1
- package/dist/bridge/src/validation.d.ts +1 -1
- package/dist/bridge/src/validation.d.ts.map +1 -1
- package/dist/{chunk-GL45UNVS.js → chunk-2FS4FPZ7.js} +3 -3
- package/dist/{chunk-GL45UNVS.js.map → chunk-2FS4FPZ7.js.map} +1 -1
- package/dist/{chunk-4FJE6BI6.js → chunk-2NOE4AGD.js} +3 -3
- package/dist/{chunk-4FJE6BI6.js.map → chunk-2NOE4AGD.js.map} +1 -1
- package/dist/{chunk-3QTZWPGH.js → chunk-3QQSSRYN.js} +168 -90
- package/dist/chunk-3QQSSRYN.js.map +1 -0
- package/dist/{chunk-4FADEVBN.js → chunk-3ZER5DST.js} +6 -6
- package/dist/chunk-3ZER5DST.js.map +1 -0
- package/dist/chunk-5RBPPBEK.js +110 -0
- package/dist/chunk-5RBPPBEK.js.map +1 -0
- package/dist/chunk-5V5KZQIC.js +445 -0
- package/dist/chunk-5V5KZQIC.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-B4ZXBH57.js → chunk-A4ASAIKK.js} +59 -13
- package/dist/chunk-A4ASAIKK.js.map +1 -0
- package/dist/{chunk-M5TE6YI5.js → chunk-AKSR434V.js} +10 -52
- package/dist/chunk-AKSR434V.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-FJFHJBGS.js → chunk-BUL5H6J7.js} +9 -9
- package/dist/chunk-BUL5H6J7.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-SETTLPBD.js → chunk-DGM74UP4.js} +3 -3
- package/dist/{chunk-SETTLPBD.js.map → chunk-DGM74UP4.js.map} +1 -1
- package/dist/{chunk-UD4ZLXGS.js → chunk-FWHOU3CX.js} +67 -35
- package/dist/chunk-FWHOU3CX.js.map +1 -0
- package/dist/{chunk-WSZAFRQL.js → chunk-GYPA2Q7F.js} +6 -5
- package/dist/chunk-GYPA2Q7F.js.map +1 -0
- package/dist/{chunk-WIAHJOMG.js → chunk-IEJ5IOC3.js} +10 -2
- 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-KT3CK26V.js → chunk-JIQLLZ65.js} +203 -39
- package/dist/chunk-JIQLLZ65.js.map +1 -0
- package/dist/{chunk-XVL22AWE.js → chunk-M4KLIEIJ.js} +114 -63
- package/dist/chunk-M4KLIEIJ.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-BJWUSHC4.js → chunk-MZDXEFXF.js} +30 -20
- package/dist/chunk-MZDXEFXF.js.map +1 -0
- 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-NELZIQ2E.js → chunk-QDJKE557.js} +20 -3
- package/dist/chunk-QDJKE557.js.map +1 -0
- package/dist/{chunk-QXC62DOF.js → chunk-SF4GWVR5.js} +21 -9
- package/dist/chunk-SF4GWVR5.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-4QVFQEY2.js → chunk-UAW7VRAL.js} +2 -2
- package/dist/{chunk-4QVFQEY2.js.map → chunk-UAW7VRAL.js.map} +1 -1
- package/dist/chunk-UBCZVONU.js +28 -0
- package/dist/chunk-UBCZVONU.js.map +1 -0
- package/dist/{chunk-2XY6732A.js → chunk-UIZKIUC6.js} +6 -6
- package/dist/chunk-UIZKIUC6.js.map +1 -0
- package/dist/{chunk-ICS76R4T.js → chunk-W7W66MDZ.js} +10 -8
- package/dist/chunk-W7W66MDZ.js.map +1 -0
- package/dist/{chunk-DCAWIRD6.js → chunk-WRRYESHC.js} +152 -187
- package/dist/chunk-WRRYESHC.js.map +1 -0
- package/dist/{chunk-XMP6XTMF.js → chunk-XHBPQ7QP.js} +450 -207
- package/dist/chunk-XHBPQ7QP.js.map +1 -0
- package/dist/chunk-Z3XXKR5E.js +88 -0
- package/dist/chunk-Z3XXKR5E.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-6VTG73UY.js → chunk-ZEKWHJBB.js} +52 -2
- package/dist/chunk-ZEKWHJBB.js.map +1 -0
- package/dist/{chunk-GCJXPUHG.js → chunk-ZONCCO5N.js} +9 -4
- package/dist/chunk-ZONCCO5N.js.map +1 -0
- package/dist/cli/index.js +618 -482
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/src/asset-feeds.d.ts +14 -1
- package/dist/cli/src/asset-feeds.d.ts.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/manage.d.ts +46 -23
- package/dist/cli/src/commands/manage.d.ts.map +1 -1
- package/dist/cli/src/commands/npx.d.ts.map +1 -1
- package/dist/cli/src/commands/run.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/helpers.d.ts +10 -1
- package/dist/cli/src/helpers.d.ts.map +1 -1
- 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 +9 -8
- package/dist/connectors/index.js +14 -13
- 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 +8 -7
- 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 +8 -5
- 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 +6 -0
- 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 +19 -37
- 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 +51 -80
- 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-7MOOKY3K.js → ensure-sources-KQQEUDKM.js} +15 -13
- package/dist/ensure-sources-KQQEUDKM.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-L3GHQD7F.js} +4 -4
- package/dist/{flows-DYFTPCPM.js.map → flows-L3GHQD7F.js.map} +1 -1
- package/dist/helpers-F4NZ66VD.js +4 -0
- package/dist/{helpers-LTN3HMD3.js.map → helpers-F4NZ66VD.js.map} +1 -1
- package/dist/library/index.js +12 -10
- package/dist/library/install.d.ts +2 -0
- package/dist/library/install.js +16 -0
- package/dist/library/install.js.map +1 -0
- package/dist/library/src/install/index.d.ts +3 -0
- package/dist/library/src/install/index.d.ts.map +1 -0
- 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-I7YTADMD.js +23 -0
- package/dist/{open-library-GW7DWWNZ.js.map → open-library-I7YTADMD.js.map} +1 -1
- package/dist/paths-CE66L3AL.js +15 -0
- package/dist/{paths-FKKGS6BA.js.map → paths-CE66L3AL.js.map} +1 -1
- package/dist/{plugin-store-R32NH7JE.js → plugin-store-GL5VKYUA.js} +10 -9
- package/dist/plugin-store-GL5VKYUA.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/resource-handler.d.ts.map +1 -1
- package/dist/runner/src/resources.d.ts +1 -1
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/runner/src/workspace-migration.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +12 -11
- package/dist/sdk/bridge.js +4 -4
- package/dist/sdk/core.js +8 -7
- 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-SRPBQOHY.js → setup-4YMN2BDU.js} +14 -13
- package/dist/setup-4YMN2BDU.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-BCP5LCAZ.js +15 -0
- package/dist/{store-client-INZD2RYD.js.map → store-client-BCP5LCAZ.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/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 +194 -151
- package/dist/asset-feeds-77KLWCBP.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-2M3XTMOL.js +0 -23
- package/dist/chunk-2M3XTMOL.js.map +0 -1
- package/dist/chunk-2XY6732A.js.map +0 -1
- package/dist/chunk-3QTZWPGH.js.map +0 -1
- package/dist/chunk-4FADEVBN.js.map +0 -1
- package/dist/chunk-6VTG73UY.js.map +0 -1
- package/dist/chunk-B4ZXBH57.js.map +0 -1
- package/dist/chunk-BJWUSHC4.js.map +0 -1
- package/dist/chunk-D3VO6WNC.js.map +0 -1
- package/dist/chunk-DCAWIRD6.js.map +0 -1
- package/dist/chunk-DQWREFRQ.js.map +0 -1
- package/dist/chunk-FJFHJBGS.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-ICS76R4T.js.map +0 -1
- package/dist/chunk-JDX54X4Y.js.map +0 -1
- package/dist/chunk-KLNL7QHN.js.map +0 -1
- package/dist/chunk-KOVLSBXK.js.map +0 -1
- package/dist/chunk-KT3CK26V.js.map +0 -1
- package/dist/chunk-M5TE6YI5.js.map +0 -1
- package/dist/chunk-NELZIQ2E.js.map +0 -1
- package/dist/chunk-QAVZOJCV.js.map +0 -1
- package/dist/chunk-QXC62DOF.js.map +0 -1
- package/dist/chunk-UD4ZLXGS.js.map +0 -1
- package/dist/chunk-WIAHJOMG.js.map +0 -1
- package/dist/chunk-WSZAFRQL.js.map +0 -1
- package/dist/chunk-XMP6XTMF.js.map +0 -1
- package/dist/chunk-XVL22AWE.js.map +0 -1
- package/dist/ensure-sources-7MOOKY3K.js.map +0 -1
- package/dist/helpers-LTN3HMD3.js +0 -4
- package/dist/open-library-GW7DWWNZ.js +0 -21
- package/dist/paths-FKKGS6BA.js +0 -4
- package/dist/plugin-store-R32NH7JE.js.map +0 -1
- package/dist/setup-SRPBQOHY.js.map +0 -1
- package/dist/skills-CRL3VJNN.js +0 -7
- package/dist/store-client-INZD2RYD.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,18 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { openCatalogSource, openLibraryManager, createFullRegistry, openLibrary } from '../chunk-
|
|
3
|
-
import { logErr, S, logOk, colorRef, logInfo, logWarn, kindColorPad, kindColor, formatRelativeTime, fitWidth } from '../chunk-
|
|
4
|
-
import { getStoreConfig, storeFetch, saveStoreTokens, clearStoreTokens, isStoreAuthenticated } from '../chunk-
|
|
5
|
-
import { AI_RESOURCES } from '../chunk-
|
|
6
|
-
import { LocalSecretsProvider } from '../chunk-
|
|
7
|
-
import { resolveLibraryDir, LocalCatalogSource, skaileHomeDir } from '../chunk-
|
|
2
|
+
import { openCatalogSource, openLibraryManager, createFullRegistry, openLibrary } from '../chunk-3ZER5DST.js';
|
|
3
|
+
import { logErr, S, logOk, colorRef, logInfo, logWarn, kindColorPad, kindColor, formatRelativeTime, fitWidth } from '../chunk-GYPA2Q7F.js';
|
|
4
|
+
import { getStoreConfig, storeFetch, saveStoreTokens, clearStoreTokens, isStoreAuthenticated } from '../chunk-2NOE4AGD.js';
|
|
5
|
+
import { AI_RESOURCES, aiResourceRoots } from '../chunk-UBCZVONU.js';
|
|
6
|
+
import { LocalSecretsProvider } from '../chunk-7GWYRVAX.js';
|
|
7
|
+
import { resolveLibraryDir, LocalCatalogSource, skaileHomeDir } from '../chunk-WRRYESHC.js';
|
|
8
|
+
import '../chunk-JIQLLZ65.js';
|
|
9
|
+
import '../chunk-Z3XXKR5E.js';
|
|
8
10
|
import '../chunk-R7FOF242.js';
|
|
9
|
-
import '../chunk-KT3CK26V.js';
|
|
10
11
|
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-
|
|
12
|
+
import { runFlow, resumeFlow } from '../chunk-BUL5H6J7.js';
|
|
13
|
+
import '../chunk-ZONCCO5N.js';
|
|
14
|
+
import { validateFlowVersions, parseSkillFrontmatter } from '../chunk-TV72ZJYN.js';
|
|
15
|
+
import { runAgentChat, loadSessionById, loadSession, listSessions, setCurrentSession, deleteSession, clearSession, loadAgentManifest, compileComposition, MarkdownStreamer, resolveMixin } from '../chunk-MZDXEFXF.js';
|
|
16
|
+
import { buildClaudePluginFiles } from '../chunk-UAW7VRAL.js';
|
|
16
17
|
import '../chunk-X5YPJV4N.js';
|
|
17
18
|
import '../chunk-O7SG5PC2.js';
|
|
18
19
|
import '../chunk-7QBNJTTQ.js';
|
|
@@ -21,42 +22,43 @@ import '../chunk-WQ7DE5UC.js';
|
|
|
21
22
|
import '../chunk-32NA4TVC.js';
|
|
22
23
|
import '../chunk-W3UDISS2.js';
|
|
23
24
|
import '../chunk-TDSRLMDB.js';
|
|
24
|
-
import '../chunk-
|
|
25
|
-
import '../chunk-DQWREFRQ.js';
|
|
26
|
-
import '../chunk-KOVLSBXK.js';
|
|
25
|
+
import '../chunk-AKSR434V.js';
|
|
27
26
|
import '../chunk-RRVQAE5D.js';
|
|
28
|
-
import '../chunk-
|
|
27
|
+
import '../chunk-BMQKMOQY.js';
|
|
28
|
+
import '../chunk-PAYAFNXG.js';
|
|
29
|
+
import '../chunk-ZEKWHJBB.js';
|
|
29
30
|
import '../chunk-LV2HPH3C.js';
|
|
30
|
-
import '../chunk-
|
|
31
|
-
import '../chunk-
|
|
31
|
+
import '../chunk-XHBPQ7QP.js';
|
|
32
|
+
import '../chunk-OVRSNIKJ.js';
|
|
33
|
+
import '../chunk-DGM74UP4.js';
|
|
32
34
|
import '../chunk-QMONOHXT.js';
|
|
33
|
-
import '../chunk-QAVZOJCV.js';
|
|
34
35
|
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-
|
|
41
|
-
import
|
|
42
|
-
import '../chunk-
|
|
43
|
-
import '../chunk-
|
|
44
|
-
import {
|
|
45
|
-
import {
|
|
46
|
-
import { ASSET_KINDS, parseAssetRef, isValidAssetName, ASSET_NAME_HINT, assetRefToStr } from '../chunk-WIAHJOMG.js';
|
|
36
|
+
import { loadFlow, loadAllFlows } from '../chunk-W7W66MDZ.js';
|
|
37
|
+
import '../chunk-DEYYRFQU.js';
|
|
38
|
+
import '../chunk-IFGTRL2I.js';
|
|
39
|
+
import { AssetManager } from '../chunk-A4ASAIKK.js';
|
|
40
|
+
import '../chunk-SF4GWVR5.js';
|
|
41
|
+
import { readLock, resolveSettings, globalSettingsPath, projectSettingsPath, loadSettings, saveSettings, portableSpawn, portableSpawnSync, WorkspaceYamlEditor } from '../chunk-M4KLIEIJ.js';
|
|
42
|
+
import '../chunk-FWHOU3CX.js';
|
|
43
|
+
import { resolveAgentDir, resolveSkWorkspaceConfig, findWorkspaceRoot, workspaceConfigFilename } from '../chunk-3QQSSRYN.js';
|
|
44
|
+
import { SKAILE_MANIFEST_FILENAME, decodeSkaileManifest } from '../chunk-IERB3UXJ.js';
|
|
45
|
+
import { parseFrontmatter } from '../chunk-2FS4FPZ7.js';
|
|
46
|
+
import { ASSET_KINDS, parseAssetRef, isValidAssetName, ASSET_NAME_HINT, assetRefToStr } from '../chunk-IEJ5IOC3.js';
|
|
47
47
|
import '../chunk-JKNWJ64A.js';
|
|
48
48
|
import { SUPPORTED_DRIVER_TARGETS } from '../chunk-O4JH3KUE.js';
|
|
49
|
+
import { DRIVER_DEFAULTS } from '../chunk-K5GBV4SA.js';
|
|
50
|
+
import { assetSearchDirs, detectDomains } from '../chunk-ZAP2BDHG.js';
|
|
49
51
|
import { openSqlite } from '../chunk-24UIWON4.js';
|
|
50
52
|
import '../chunk-KTBKW2FI.js';
|
|
51
53
|
import '../chunk-UQ6LFBPZ.js';
|
|
52
|
-
import '../chunk-
|
|
53
|
-
import '../chunk-
|
|
54
|
+
import '../chunk-MBOR7D65.js';
|
|
55
|
+
import '../chunk-QDJKE557.js';
|
|
54
56
|
import '../chunk-CGYEHQOX.js';
|
|
55
57
|
import '../chunk-NSBPE2FW.js';
|
|
56
|
-
import * as
|
|
57
|
-
import
|
|
58
|
-
import * as
|
|
59
|
-
import
|
|
58
|
+
import * as fs11 from 'fs';
|
|
59
|
+
import fs11__default, { readFileSync, existsSync, writeFileSync, readdirSync, rmSync, statSync } from 'fs';
|
|
60
|
+
import * as path15 from 'path';
|
|
61
|
+
import path15__default, { resolve, join } from 'path';
|
|
60
62
|
import { fileURLToPath } from 'url';
|
|
61
63
|
import { Help, Command, Option } from 'commander';
|
|
62
64
|
import * as p5 from '@clack/prompts';
|
|
@@ -65,7 +67,7 @@ import * as readline from 'readline';
|
|
|
65
67
|
import { createInterface } from 'readline';
|
|
66
68
|
import { execSync, spawnSync } from 'child_process';
|
|
67
69
|
import { homedir } from 'os';
|
|
68
|
-
import
|
|
70
|
+
import fs6 from 'fs/promises';
|
|
69
71
|
import { parse as parse$1, stringify } from 'smol-toml';
|
|
70
72
|
import { createTRPCUntypedClient, httpLink, httpSubscriptionLink } from '@trpc/client';
|
|
71
73
|
import { parse } from 'yaml';
|
|
@@ -78,7 +80,7 @@ function makeAssetCommand() {
|
|
|
78
80
|
logErr(`Invalid --mode "${opts.mode}". Expected: copy | move | link.`);
|
|
79
81
|
process.exit(1);
|
|
80
82
|
}
|
|
81
|
-
if (!
|
|
83
|
+
if (!fs11.existsSync(srcPath)) {
|
|
82
84
|
logErr(`Source path does not exist: ${srcPath}`);
|
|
83
85
|
process.exit(1);
|
|
84
86
|
}
|
|
@@ -105,23 +107,23 @@ function makeAssetCommand() {
|
|
|
105
107
|
);
|
|
106
108
|
process.exit(1);
|
|
107
109
|
}
|
|
108
|
-
const basename2 =
|
|
109
|
-
const destDir = target.structure === "domain" && opts.domain ?
|
|
110
|
-
|
|
111
|
-
const destPath =
|
|
112
|
-
if (
|
|
110
|
+
const basename2 = path15.basename(srcPath);
|
|
111
|
+
const destDir = target.structure === "domain" && opts.domain ? path15.join(target.path, opts.domain) : target.path;
|
|
112
|
+
fs11.mkdirSync(destDir, { recursive: true });
|
|
113
|
+
const destPath = path15.join(destDir, basename2);
|
|
114
|
+
if (fs11.existsSync(destPath)) {
|
|
113
115
|
logErr(`Destination already exists: ${destPath}`);
|
|
114
116
|
process.exit(1);
|
|
115
117
|
}
|
|
116
118
|
switch (opts.mode) {
|
|
117
119
|
case "copy":
|
|
118
|
-
|
|
120
|
+
fs11.cpSync(srcPath, destPath, { recursive: true });
|
|
119
121
|
break;
|
|
120
122
|
case "move":
|
|
121
|
-
|
|
123
|
+
fs11.renameSync(srcPath, destPath);
|
|
122
124
|
break;
|
|
123
125
|
case "link":
|
|
124
|
-
|
|
126
|
+
fs11.symlinkSync(path15.resolve(srcPath), destPath);
|
|
125
127
|
break;
|
|
126
128
|
}
|
|
127
129
|
if (target.backend === "git" && opts.commit) {
|
|
@@ -169,17 +171,17 @@ function makeAssetCommand() {
|
|
|
169
171
|
}
|
|
170
172
|
const manifestPath = def.manifest.path;
|
|
171
173
|
const candidateSubpath = typeof manifestPath === "string" && manifestPath.length > 0 ? manifestPath : def.name;
|
|
172
|
-
const srcPath =
|
|
173
|
-
if (!
|
|
174
|
+
const srcPath = path15.join(lib.path, candidateSubpath);
|
|
175
|
+
if (!fs11.existsSync(srcPath)) {
|
|
174
176
|
logErr(`Asset path not found: ${srcPath}`);
|
|
175
177
|
process.exit(1);
|
|
176
178
|
}
|
|
177
|
-
const destPath =
|
|
178
|
-
|
|
179
|
+
const destPath = path15.join(target, candidateSubpath);
|
|
180
|
+
fs11.mkdirSync(path15.dirname(destPath), { recursive: true });
|
|
179
181
|
if (opts.mode === "copy") {
|
|
180
|
-
|
|
182
|
+
fs11.cpSync(srcPath, destPath, { recursive: true });
|
|
181
183
|
} else {
|
|
182
|
-
|
|
184
|
+
fs11.symlinkSync(path15.resolve(srcPath), destPath);
|
|
183
185
|
}
|
|
184
186
|
logOk(`Installed ${ref} \u2192 ${destPath} (${opts.mode})`);
|
|
185
187
|
} finally {
|
|
@@ -273,7 +275,7 @@ function makeSearchCommand() {
|
|
|
273
275
|
const showLocal = !opts.store;
|
|
274
276
|
const showStore = !opts.local;
|
|
275
277
|
if (showLocal) {
|
|
276
|
-
const am2 = new AssetManager({ projectDir:
|
|
278
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
277
279
|
const entries = am2.search(query, kind);
|
|
278
280
|
if (entries.length === 0) {
|
|
279
281
|
if (!showStore) {
|
|
@@ -310,7 +312,7 @@ function makeSearchCommand() {
|
|
|
310
312
|
}
|
|
311
313
|
if (showStore) {
|
|
312
314
|
try {
|
|
313
|
-
const { getStoreConfig: getStoreConfig2, storeFetch: storeFetch2 } = await import('../store-client-
|
|
315
|
+
const { getStoreConfig: getStoreConfig2, storeFetch: storeFetch2 } = await import('../store-client-BCP5LCAZ.js');
|
|
314
316
|
const config = getStoreConfig2();
|
|
315
317
|
const params = {};
|
|
316
318
|
if (query) params.q = query;
|
|
@@ -339,7 +341,7 @@ function makeSearchCommand() {
|
|
|
339
341
|
function makeAddCommand() {
|
|
340
342
|
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
343
|
const am2 = new AssetManager({
|
|
342
|
-
projectDir:
|
|
344
|
+
projectDir: path15__default.resolve(opts.projectDir),
|
|
343
345
|
global: opts.global,
|
|
344
346
|
driverTarget: opts.target
|
|
345
347
|
});
|
|
@@ -360,7 +362,7 @@ function makeAddCommand() {
|
|
|
360
362
|
function makeRemoveCommand() {
|
|
361
363
|
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
364
|
const am2 = new AssetManager({
|
|
363
|
-
projectDir:
|
|
365
|
+
projectDir: path15__default.resolve(opts.projectDir),
|
|
364
366
|
global: opts.global,
|
|
365
367
|
driverTarget: opts.target
|
|
366
368
|
});
|
|
@@ -374,7 +376,7 @@ function makeListCommand() {
|
|
|
374
376
|
new Option("--target <agent>", "Driver target").default("claude-code").choices(SUPPORTED_DRIVER_TARGETS)
|
|
375
377
|
).action((kind, opts) => {
|
|
376
378
|
const am2 = new AssetManager({
|
|
377
|
-
projectDir:
|
|
379
|
+
projectDir: path15__default.resolve(opts.projectDir),
|
|
378
380
|
global: opts.global,
|
|
379
381
|
driverTarget: opts.target
|
|
380
382
|
});
|
|
@@ -398,7 +400,7 @@ function makeListCommand() {
|
|
|
398
400
|
}
|
|
399
401
|
function makeInfoCommand() {
|
|
400
402
|
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:
|
|
403
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
402
404
|
const entry = am2.info(ref);
|
|
403
405
|
if (!entry) {
|
|
404
406
|
logErr(
|
|
@@ -431,7 +433,7 @@ function makeCreateCommand() {
|
|
|
431
433
|
new Option("-k, --kind <kind>", "Asset kind").default("skill").choices([...ASSET_KINDS])
|
|
432
434
|
).option("-d, --dir <dir>", "Target directory (default: cwd)").action((name, opts) => {
|
|
433
435
|
const am2 = new AssetManager({ projectDir: process.cwd() });
|
|
434
|
-
const destDir = opts.dir ?
|
|
436
|
+
const destDir = opts.dir ? path15__default.resolve(opts.dir) : process.cwd();
|
|
435
437
|
const result = am2.create(name, opts.kind, destDir);
|
|
436
438
|
if (result.ok) logOk(`Created ${kindColor(opts.kind)}: ${pc5.dim(result.path)}`);
|
|
437
439
|
else {
|
|
@@ -442,7 +444,7 @@ function makeCreateCommand() {
|
|
|
442
444
|
}
|
|
443
445
|
function makeDoctorCommand() {
|
|
444
446
|
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:
|
|
447
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
446
448
|
const issues = am2.doctor();
|
|
447
449
|
if (issues.length === 0) {
|
|
448
450
|
logOk("No missing dependencies.");
|
|
@@ -468,11 +470,11 @@ function makeCatalogCommand() {
|
|
|
468
470
|
const catalog = new Command("catalog").description("Catalog source health and configuration");
|
|
469
471
|
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
472
|
const { resolveConfig, isLocalCatalogUrl, trpcGetUrl } = await import('../library/index.js');
|
|
471
|
-
const projectDir = opts.projectDir ?
|
|
473
|
+
const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : void 0;
|
|
472
474
|
const cfg = resolveConfig({ projectDir });
|
|
473
475
|
const baseUrl = opts.url ?? cfg.catalog.url;
|
|
474
476
|
if (isLocalCatalogUrl(baseUrl)) {
|
|
475
|
-
const { resolveCatalogSource } = await import('../open-library-
|
|
477
|
+
const { resolveCatalogSource } = await import('../open-library-I7YTADMD.js');
|
|
476
478
|
let resolved;
|
|
477
479
|
try {
|
|
478
480
|
resolved = await resolveCatalogSource({ projectDir: opts.projectDir });
|
|
@@ -561,7 +563,7 @@ function makeCatalogCommand() {
|
|
|
561
563
|
});
|
|
562
564
|
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
565
|
const { resolveConfig } = await import('../library/index.js');
|
|
564
|
-
const projectDir = opts.projectDir ?
|
|
566
|
+
const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : void 0;
|
|
565
567
|
const cfg = resolveConfig({ projectDir });
|
|
566
568
|
console.log(`url: ${cfg.catalog.url}`);
|
|
567
569
|
console.log(`framing: ${cfg.catalog.framing}`);
|
|
@@ -613,23 +615,48 @@ complete -F _${bin}_completion ${bin}`,
|
|
|
613
615
|
end
|
|
614
616
|
complete -c ${bin} -f -a '(__${bin}_complete)'`
|
|
615
617
|
};
|
|
618
|
+
function discoverFlows() {
|
|
619
|
+
const byId = /* @__PURE__ */ new Map();
|
|
620
|
+
for (const root of aiResourceRoots()) {
|
|
621
|
+
for (const flow of loadAllFlows(root)) {
|
|
622
|
+
if (!byId.has(flow.id)) byId.set(flow.id, flow);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
return [...byId.values()];
|
|
626
|
+
}
|
|
627
|
+
function findFlowFile(flowId, priorityRoots = []) {
|
|
628
|
+
for (const root of [...priorityRoots, ...aiResourceRoots()]) {
|
|
629
|
+
for (const { dir } of assetSearchDirs(root, "flows")) {
|
|
630
|
+
for (const ext of [".flow.yaml", ".flow.json", ".json"]) {
|
|
631
|
+
const candidate = path15__default.join(dir, `${flowId}${ext}`);
|
|
632
|
+
if (fs11__default.existsSync(candidate)) return candidate;
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
return void 0;
|
|
637
|
+
}
|
|
616
638
|
function findSkills(domain) {
|
|
617
|
-
const
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
639
|
+
const found = [];
|
|
640
|
+
for (const root of aiResourceRoots()) {
|
|
641
|
+
for (const { dir, domain: dirDomain } of assetSearchDirs(root, "skills")) {
|
|
642
|
+
if (fs11__default.existsSync(dir)) walkSkills(dir, dirDomain, found);
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
const seen = /* @__PURE__ */ new Set();
|
|
646
|
+
const deduped = [];
|
|
647
|
+
for (const s of found) {
|
|
648
|
+
if (seen.has(s.name)) continue;
|
|
649
|
+
seen.add(s.name);
|
|
650
|
+
deduped.push(s);
|
|
624
651
|
}
|
|
625
|
-
return
|
|
652
|
+
return deduped;
|
|
626
653
|
}
|
|
627
654
|
function walkSkills(dir, domain, out) {
|
|
628
|
-
for (const entry of
|
|
629
|
-
const full =
|
|
655
|
+
for (const entry of fs11__default.readdirSync(dir, { withFileTypes: true })) {
|
|
656
|
+
const full = path15__default.join(dir, entry.name);
|
|
630
657
|
if (entry.isDirectory()) {
|
|
631
|
-
const skillMd =
|
|
632
|
-
if (
|
|
658
|
+
const skillMd = path15__default.join(full, "SKILL.md");
|
|
659
|
+
if (fs11__default.existsSync(skillMd)) {
|
|
633
660
|
out.push({ name: entry.name, path: full, skillPath: skillMd, domain });
|
|
634
661
|
} else {
|
|
635
662
|
walkSkills(full, domain, out);
|
|
@@ -643,21 +670,24 @@ function resolveSkillNames() {
|
|
|
643
670
|
return findSkills().map((s) => s.name);
|
|
644
671
|
}
|
|
645
672
|
function resolveDomains() {
|
|
646
|
-
|
|
647
|
-
|
|
673
|
+
const domains = /* @__PURE__ */ new Set();
|
|
674
|
+
for (const root of aiResourceRoots()) {
|
|
675
|
+
for (const d of detectDomains(root)) domains.add(d.id);
|
|
676
|
+
}
|
|
677
|
+
return [...domains];
|
|
648
678
|
}
|
|
649
679
|
function resolveFlowIds() {
|
|
650
680
|
try {
|
|
651
|
-
return
|
|
681
|
+
return discoverFlows().map((f) => f.id);
|
|
652
682
|
} catch {
|
|
653
683
|
return [];
|
|
654
684
|
}
|
|
655
685
|
}
|
|
656
686
|
function resolveSessionIds(projectDir) {
|
|
657
|
-
const sessionsDir =
|
|
658
|
-
if (!
|
|
687
|
+
const sessionsDir = path15__default.join(projectDir, ".skaile", "sessions");
|
|
688
|
+
if (!fs11__default.existsSync(sessionsDir)) return [];
|
|
659
689
|
try {
|
|
660
|
-
return
|
|
690
|
+
return fs11__default.readdirSync(sessionsDir).filter((f) => f.endsWith(".json")).map((f) => f.slice(0, -".json".length));
|
|
661
691
|
} catch {
|
|
662
692
|
return [];
|
|
663
693
|
}
|
|
@@ -712,73 +742,74 @@ function resolveDynamic(words, cword) {
|
|
|
712
742
|
}
|
|
713
743
|
var PERSONAL_KEYS = /* @__PURE__ */ new Set(["driver", "model", "provider"]);
|
|
714
744
|
var API_KEY_PREFIX = "apiKey.";
|
|
715
|
-
function
|
|
716
|
-
const
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
const
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
745
|
+
async function showConfig(opts) {
|
|
746
|
+
const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : process.cwd();
|
|
747
|
+
const config = await resolveSettings(projectDir);
|
|
748
|
+
const wsDefaults = {};
|
|
749
|
+
try {
|
|
750
|
+
const ws = resolveSkWorkspaceConfig(projectDir);
|
|
751
|
+
const p7 = ws.agent_config?.default ?? {};
|
|
752
|
+
if (p7.driver) wsDefaults.driver = p7.driver;
|
|
753
|
+
if (p7.provider) wsDefaults.provider = p7.provider;
|
|
754
|
+
if (p7.model) wsDefaults.model = p7.model;
|
|
755
|
+
if (p7.skills_dir) wsDefaults.skills_dir = p7.skills_dir;
|
|
756
|
+
if (p7.agents_dir) wsDefaults.agents_dir = p7.agents_dir;
|
|
757
|
+
if (p7.prompts_dir) wsDefaults.prompts_dir = p7.prompts_dir;
|
|
758
|
+
} catch {
|
|
759
|
+
}
|
|
760
|
+
console.log();
|
|
761
|
+
console.log(S.heading(" Effective Config"));
|
|
762
|
+
console.log(` ${S.rule(40)}`);
|
|
763
|
+
for (const key of ["driver", "provider", "model"]) {
|
|
764
|
+
const value = config[key];
|
|
765
|
+
if (value !== void 0) {
|
|
766
|
+
console.log(` ${S.label(`${key}:`.padEnd(16))} ${value}`);
|
|
731
767
|
}
|
|
768
|
+
}
|
|
769
|
+
if (Object.keys(wsDefaults).length > 0) {
|
|
732
770
|
console.log();
|
|
733
|
-
console.log(S.heading("
|
|
771
|
+
console.log(` ${S.heading("Workspace Defaults")} ${S.dim("(skaile.yaml)")}`);
|
|
734
772
|
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
|
-
}
|
|
773
|
+
for (const [key, value] of Object.entries(wsDefaults)) {
|
|
774
|
+
console.log(` ${S.label(`${key}:`.padEnd(16))} ${value}`);
|
|
748
775
|
}
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
)
|
|
759
|
-
|
|
776
|
+
}
|
|
777
|
+
if (config.apiKeys && Object.keys(config.apiKeys).length > 0) {
|
|
778
|
+
console.log();
|
|
779
|
+
console.log(` ${S.heading("API Keys")}`);
|
|
780
|
+
console.log(` ${S.rule(40)}`);
|
|
781
|
+
for (const [provider, key] of Object.entries(config.apiKeys)) {
|
|
782
|
+
const fromEnv = !!process.env[`${provider.toUpperCase()}_API_KEY`];
|
|
783
|
+
if (key) {
|
|
784
|
+
console.log(
|
|
785
|
+
` ${S.label(`${provider}:`.padEnd(16))} ****${key.slice(-4)}` + (fromEnv ? ` ${S.dim("[env]")}` : "")
|
|
786
|
+
);
|
|
760
787
|
}
|
|
761
788
|
}
|
|
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
|
-
}
|
|
789
|
+
}
|
|
790
|
+
const fw = config.driver ?? "omp";
|
|
791
|
+
const paths = DRIVER_DEFAULTS[fw] ?? DRIVER_DEFAULTS.omp;
|
|
792
|
+
if (paths) {
|
|
772
793
|
console.log();
|
|
773
|
-
});
|
|
794
|
+
console.log(` ${S.heading("Resolved Paths")} ${S.dim(`(${fw})`)}`);
|
|
795
|
+
console.log(` ${S.rule(40)}`);
|
|
796
|
+
console.log(` ${S.label("skills:".padEnd(16))} ${config.skillsDir ?? paths.skillsDir}`);
|
|
797
|
+
console.log(` ${S.label("agents:".padEnd(16))} ${config.agentsDir ?? paths.agentsDir}`);
|
|
798
|
+
console.log(` ${S.label("prompts:".padEnd(16))} ${config.promptsDir ?? paths.promptsDir}`);
|
|
799
|
+
}
|
|
800
|
+
console.log();
|
|
801
|
+
}
|
|
802
|
+
function makeConfigCommand() {
|
|
803
|
+
const cmd = new Command("config").description("Manage personal config (.skaile/settings.json)");
|
|
804
|
+
cmd.command("show").description("Show effective config with sources").option("--project-dir <path>", "Project directory").action((opts) => showConfig(opts));
|
|
774
805
|
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 ?
|
|
806
|
+
const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : process.cwd();
|
|
776
807
|
const config = await resolveSettings(projectDir);
|
|
777
808
|
const value = config[key];
|
|
778
809
|
console.log(value ?? S.dim("(not set)"));
|
|
779
810
|
});
|
|
780
811
|
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 ?
|
|
812
|
+
const projectDir = opts.projectDir ? path15__default.resolve(opts.projectDir) : process.cwd();
|
|
782
813
|
const isApiKey = key.startsWith(API_KEY_PREFIX);
|
|
783
814
|
if (!PERSONAL_KEYS.has(key) && !isApiKey) {
|
|
784
815
|
logErr(
|
|
@@ -802,9 +833,7 @@ function makeConfigCommand() {
|
|
|
802
833
|
}
|
|
803
834
|
console.log(S.dim(` \u2192 ${filePath}`));
|
|
804
835
|
});
|
|
805
|
-
cmd.action(() => {
|
|
806
|
-
cmd.commands.find((c) => c.name() === "show").parse(process.argv);
|
|
807
|
-
});
|
|
836
|
+
cmd.action(() => showConfig({}));
|
|
808
837
|
return cmd;
|
|
809
838
|
}
|
|
810
839
|
function parseShorthand(input) {
|
|
@@ -954,6 +983,22 @@ function makeConnectCommand() {
|
|
|
954
983
|
await client.disconnect();
|
|
955
984
|
});
|
|
956
985
|
}
|
|
986
|
+
function parsePositiveIntOption(value) {
|
|
987
|
+
const n = Number.parseInt(value, 10);
|
|
988
|
+
if (!Number.isFinite(n) || n <= 0) {
|
|
989
|
+
throw new Error(`--limit must be a positive integer (got ${value})`);
|
|
990
|
+
}
|
|
991
|
+
return n;
|
|
992
|
+
}
|
|
993
|
+
function scanFactoryConnectors(scanDirectory, roots) {
|
|
994
|
+
const byName = /* @__PURE__ */ new Map();
|
|
995
|
+
for (const dir of roots) {
|
|
996
|
+
for (const e of scanDirectory(dir, "factory-assets")) {
|
|
997
|
+
if (e.kind === "connector" && !byName.has(e.name)) byName.set(e.name, e);
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
return [...byName.values()];
|
|
1001
|
+
}
|
|
957
1002
|
async function connectConnectors(projectDir) {
|
|
958
1003
|
const res = await import('../connectors/index.js');
|
|
959
1004
|
res.registerBuiltinConnectors();
|
|
@@ -1056,11 +1101,8 @@ async function promptField(field) {
|
|
|
1056
1101
|
function makeConnectorCommand() {
|
|
1057
1102
|
const cmd = new Command("connector").description("Operate on connectors in a workspace");
|
|
1058
1103
|
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
|
-
);
|
|
1104
|
+
const { scanDirectory, factoryAssetRoots } = await import('../core/index.js');
|
|
1105
|
+
const entries = scanFactoryConnectors(scanDirectory, factoryAssetRoots());
|
|
1064
1106
|
if (entries.length === 0) {
|
|
1065
1107
|
console.log("No connector descriptors found.");
|
|
1066
1108
|
return;
|
|
@@ -1084,17 +1126,14 @@ function makeConnectorCommand() {
|
|
|
1084
1126
|
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
1127
|
async (driver, opts) => {
|
|
1086
1128
|
const { installNpmPackages } = await import('../connectors/index.js');
|
|
1087
|
-
const { scanDirectory,
|
|
1088
|
-
const projectDir =
|
|
1089
|
-
const yamlPath =
|
|
1129
|
+
const { scanDirectory, factoryAssetRoots, WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
|
|
1130
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1131
|
+
const yamlPath = path15__default.join(projectDir, "skaile.yaml");
|
|
1090
1132
|
if (!existsSync(yamlPath)) {
|
|
1091
1133
|
logErr("No skaile.yaml found in current directory. Run 'skaile init' first.");
|
|
1092
1134
|
process.exit(1);
|
|
1093
1135
|
}
|
|
1094
|
-
const
|
|
1095
|
-
const entries = scanDirectory(baseAssetsDir, "base-assets").filter(
|
|
1096
|
-
(e) => e.kind === "connector"
|
|
1097
|
-
);
|
|
1136
|
+
const entries = scanFactoryConnectors(scanDirectory, factoryAssetRoots());
|
|
1098
1137
|
const entry = entries.find((e) => e.name === driver);
|
|
1099
1138
|
if (!entry) {
|
|
1100
1139
|
logErr(
|
|
@@ -1149,8 +1188,8 @@ ${installResult.output}`);
|
|
|
1149
1188
|
);
|
|
1150
1189
|
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
1190
|
const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
|
|
1152
|
-
const projectDir =
|
|
1153
|
-
const yamlPath =
|
|
1191
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1192
|
+
const yamlPath = path15__default.join(projectDir, "skaile.yaml");
|
|
1154
1193
|
if (!existsSync(yamlPath)) {
|
|
1155
1194
|
logErr("No skaile.yaml found in current directory.");
|
|
1156
1195
|
process.exit(1);
|
|
@@ -1167,7 +1206,7 @@ ${installResult.output}`);
|
|
|
1167
1206
|
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
1207
|
const res = await import('../connectors/index.js');
|
|
1169
1208
|
res.registerBuiltinConnectors();
|
|
1170
|
-
const projectDir =
|
|
1209
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1171
1210
|
const declarations = res.loadConnectorDeclarations(projectDir);
|
|
1172
1211
|
if (declarations.length === 0) {
|
|
1173
1212
|
console.log("No connectors configured in skaile.yaml.");
|
|
@@ -1191,7 +1230,7 @@ ${installResult.output}`);
|
|
|
1191
1230
|
await manager.disconnectAll();
|
|
1192
1231
|
});
|
|
1193
1232
|
cmd.command("list").description("List all configured connectors").option("--project-dir <path>", "Workspace directory", process.cwd()).action(async (opts) => {
|
|
1194
|
-
const projectDir =
|
|
1233
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1195
1234
|
const manager = await connectConnectors(projectDir);
|
|
1196
1235
|
try {
|
|
1197
1236
|
console.log(JSON.stringify(manager.listConnectors(), null, 2));
|
|
@@ -1200,7 +1239,7 @@ ${installResult.output}`);
|
|
|
1200
1239
|
}
|
|
1201
1240
|
});
|
|
1202
1241
|
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 =
|
|
1242
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1204
1243
|
const manager = await connectConnectors(projectDir);
|
|
1205
1244
|
try {
|
|
1206
1245
|
if (opts.all) {
|
|
@@ -1224,7 +1263,7 @@ ${installResult.output}`);
|
|
|
1224
1263
|
}
|
|
1225
1264
|
});
|
|
1226
1265
|
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 =
|
|
1266
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1228
1267
|
const manager = await connectConnectors(projectDir);
|
|
1229
1268
|
try {
|
|
1230
1269
|
if (!manager.has(id)) {
|
|
@@ -1239,7 +1278,7 @@ ${installResult.output}`);
|
|
|
1239
1278
|
}
|
|
1240
1279
|
});
|
|
1241
1280
|
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 =
|
|
1281
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1243
1282
|
const manager = await connectConnectors(projectDir);
|
|
1244
1283
|
try {
|
|
1245
1284
|
const content = await manager.read(id, resourcePath);
|
|
@@ -1249,7 +1288,7 @@ ${installResult.output}`);
|
|
|
1249
1288
|
}
|
|
1250
1289
|
});
|
|
1251
1290
|
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 =
|
|
1291
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1253
1292
|
const manager = await connectConnectors(projectDir);
|
|
1254
1293
|
try {
|
|
1255
1294
|
await manager.write(id, resourcePath, { data: content });
|
|
@@ -1258,8 +1297,8 @@ ${installResult.output}`);
|
|
|
1258
1297
|
await manager.disconnectAll();
|
|
1259
1298
|
}
|
|
1260
1299
|
});
|
|
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 =
|
|
1300
|
+
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) => {
|
|
1301
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1263
1302
|
const manager = await connectConnectors(projectDir);
|
|
1264
1303
|
try {
|
|
1265
1304
|
const entries = await manager.list(id, resourcePath, {
|
|
@@ -1272,7 +1311,7 @@ ${installResult.output}`);
|
|
|
1272
1311
|
}
|
|
1273
1312
|
});
|
|
1274
1313
|
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 =
|
|
1314
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1276
1315
|
const manager = await connectConnectors(projectDir);
|
|
1277
1316
|
try {
|
|
1278
1317
|
const results = await manager.search(id, query);
|
|
@@ -1282,7 +1321,7 @@ ${installResult.output}`);
|
|
|
1282
1321
|
}
|
|
1283
1322
|
});
|
|
1284
1323
|
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 =
|
|
1324
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1286
1325
|
const manager = await connectConnectors(projectDir);
|
|
1287
1326
|
try {
|
|
1288
1327
|
const ok = await manager.delete(id, resourcePath);
|
|
@@ -1292,7 +1331,7 @@ ${installResult.output}`);
|
|
|
1292
1331
|
}
|
|
1293
1332
|
});
|
|
1294
1333
|
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 =
|
|
1334
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1296
1335
|
const manager = await connectConnectors(projectDir);
|
|
1297
1336
|
try {
|
|
1298
1337
|
if (!manager.has(id)) {
|
|
@@ -1401,7 +1440,7 @@ function envRecord() {
|
|
|
1401
1440
|
async function buildDeployContext(projectDir) {
|
|
1402
1441
|
const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
|
|
1403
1442
|
const config = resolveSkWorkspaceConfig2(projectDir);
|
|
1404
|
-
const workspaceId = config.name ??
|
|
1443
|
+
const workspaceId = config.name ?? path15__default.basename(projectDir);
|
|
1405
1444
|
let log;
|
|
1406
1445
|
try {
|
|
1407
1446
|
const { createLogger } = await import('../core/logging.js');
|
|
@@ -1433,13 +1472,13 @@ async function ensureTargetsRegistered(projectDir) {
|
|
|
1433
1472
|
const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
|
|
1434
1473
|
const config = resolveSkWorkspaceConfig2(projectDir);
|
|
1435
1474
|
if (config.plugins && config.plugins.length > 0) {
|
|
1436
|
-
const { ensurePluginsLoaded } = await import('../plugin-store-
|
|
1475
|
+
const { ensurePluginsLoaded } = await import('../plugin-store-GL5VKYUA.js');
|
|
1437
1476
|
const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
|
|
1438
1477
|
for (const f of result.failed) logWarn(f.error);
|
|
1439
1478
|
}
|
|
1440
1479
|
}
|
|
1441
1480
|
async function runUp(opts) {
|
|
1442
|
-
const projectDir =
|
|
1481
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1443
1482
|
await ensureTargetsRegistered(projectDir);
|
|
1444
1483
|
const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
|
|
1445
1484
|
const { resolveDeployTarget, pluginRegistry } = await import('../plugin-registry/index.js');
|
|
@@ -1507,7 +1546,7 @@ async function restoreFromHandle(projectDir) {
|
|
|
1507
1546
|
return { target, handle, ctx };
|
|
1508
1547
|
}
|
|
1509
1548
|
async function runDown(opts) {
|
|
1510
|
-
const projectDir =
|
|
1549
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1511
1550
|
const restored = await restoreFromHandle(projectDir);
|
|
1512
1551
|
if (!restored) return;
|
|
1513
1552
|
await restored.handle.stop();
|
|
@@ -1516,7 +1555,7 @@ async function runDown(opts) {
|
|
|
1516
1555
|
logOk(`Stopped ${S.cmd(restored.target.id)} and cleared the handle.`);
|
|
1517
1556
|
}
|
|
1518
1557
|
async function runStatus(opts) {
|
|
1519
|
-
const projectDir =
|
|
1558
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1520
1559
|
const restored = await restoreFromHandle(projectDir);
|
|
1521
1560
|
if (!restored) return;
|
|
1522
1561
|
const health = await restored.handle.health();
|
|
@@ -1530,7 +1569,7 @@ async function runStatus(opts) {
|
|
|
1530
1569
|
console.log();
|
|
1531
1570
|
}
|
|
1532
1571
|
async function runLogs(opts) {
|
|
1533
|
-
const projectDir =
|
|
1572
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
1534
1573
|
const restored = await restoreFromHandle(projectDir);
|
|
1535
1574
|
if (!restored) return;
|
|
1536
1575
|
if (!restored.handle.logs) {
|
|
@@ -1554,7 +1593,7 @@ function makeDeployCommand() {
|
|
|
1554
1593
|
}
|
|
1555
1594
|
function makeDiffCommand() {
|
|
1556
1595
|
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:
|
|
1596
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
1558
1597
|
const result = am2.diff(ref);
|
|
1559
1598
|
if (result === null) {
|
|
1560
1599
|
logInfo("No differences (or asset not found).");
|
|
@@ -1566,7 +1605,7 @@ function makeDiffCommand() {
|
|
|
1566
1605
|
function makeFlowCommand() {
|
|
1567
1606
|
const cmd = new Command("flow").description("Manage flows");
|
|
1568
1607
|
cmd.command("list").description("List available flows").action(async () => {
|
|
1569
|
-
const flows =
|
|
1608
|
+
const flows = discoverFlows();
|
|
1570
1609
|
if (flows.length === 0) {
|
|
1571
1610
|
logInfo("No flows found.");
|
|
1572
1611
|
return;
|
|
@@ -1581,7 +1620,7 @@ function makeFlowCommand() {
|
|
|
1581
1620
|
console.log();
|
|
1582
1621
|
});
|
|
1583
1622
|
cmd.command("show <id>").description("Show flow details and node graph").action(async (id) => {
|
|
1584
|
-
const flows =
|
|
1623
|
+
const flows = discoverFlows();
|
|
1585
1624
|
const flow = flows.find((f) => f.id === id);
|
|
1586
1625
|
if (!flow) {
|
|
1587
1626
|
logErr(`Flow not found: ${id}`);
|
|
@@ -1607,7 +1646,7 @@ function makeFlowCommand() {
|
|
|
1607
1646
|
function makeHistoryCommand() {
|
|
1608
1647
|
const cmd = new Command("history").description("Show recent add/remove/update actions");
|
|
1609
1648
|
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:
|
|
1649
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
1611
1650
|
const limit = parseInt(limitStr, 10) || 20;
|
|
1612
1651
|
const entries = am2.history(limit);
|
|
1613
1652
|
if (entries.length === 0) {
|
|
@@ -1627,7 +1666,7 @@ function makeHistoryCommand() {
|
|
|
1627
1666
|
console.log();
|
|
1628
1667
|
});
|
|
1629
1668
|
cmd.command("clear").description("Clear action history").option("--project-dir <path>", "Project directory", process.cwd()).action((opts) => {
|
|
1630
|
-
const am2 = new AssetManager({ projectDir:
|
|
1669
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
1631
1670
|
am2.clearHistory();
|
|
1632
1671
|
logOk("History cleared.");
|
|
1633
1672
|
});
|
|
@@ -1695,12 +1734,12 @@ function makeLibraryCommand() {
|
|
|
1695
1734
|
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
1735
|
async (name, opts) => {
|
|
1697
1736
|
const libDir = resolveLibraryDir();
|
|
1698
|
-
const libPath =
|
|
1737
|
+
const libPath = path15.join(libDir, name);
|
|
1699
1738
|
const ownership = opts.contributor ? "contributor" : opts.reader ? "reader" : "owner";
|
|
1700
1739
|
const { manager, close } = await openLibraryManager();
|
|
1701
1740
|
try {
|
|
1702
1741
|
if (opts.git) {
|
|
1703
|
-
|
|
1742
|
+
fs11.mkdirSync(libPath, { recursive: true });
|
|
1704
1743
|
await manager.addLibrary({
|
|
1705
1744
|
name,
|
|
1706
1745
|
path: libPath,
|
|
@@ -1709,7 +1748,7 @@ function makeLibraryCommand() {
|
|
|
1709
1748
|
ownership
|
|
1710
1749
|
});
|
|
1711
1750
|
} else {
|
|
1712
|
-
|
|
1751
|
+
fs11.mkdirSync(libPath, { recursive: true });
|
|
1713
1752
|
await manager.addLibrary({
|
|
1714
1753
|
name,
|
|
1715
1754
|
path: libPath,
|
|
@@ -1768,7 +1807,7 @@ function makeLibraryCommand() {
|
|
|
1768
1807
|
target = def;
|
|
1769
1808
|
}
|
|
1770
1809
|
const am2 = new AssetManager({ projectDir: process.cwd() });
|
|
1771
|
-
const destDir = opts.dir ?
|
|
1810
|
+
const destDir = opts.dir ? path15.join(target.path, opts.dir) : target.path;
|
|
1772
1811
|
const res = am2.create(name, opts.kind ?? kind, destDir);
|
|
1773
1812
|
if (res.ok) {
|
|
1774
1813
|
logOk(`Created ${opts.kind ?? kind}: ${pc5.dim(res.path)}`);
|
|
@@ -1794,13 +1833,13 @@ function makeLibraryCommand() {
|
|
|
1794
1833
|
const { manager, close } = await openLibraryManager();
|
|
1795
1834
|
try {
|
|
1796
1835
|
const lib = await manager.requireLibrary(oldName);
|
|
1797
|
-
const parent =
|
|
1798
|
-
const newPath =
|
|
1799
|
-
if (
|
|
1836
|
+
const parent = path15.dirname(lib.path);
|
|
1837
|
+
const newPath = path15.join(parent, newName);
|
|
1838
|
+
if (fs11.existsSync(newPath)) {
|
|
1800
1839
|
logErr(`Target directory already exists: ${newPath}`);
|
|
1801
1840
|
process.exit(1);
|
|
1802
1841
|
}
|
|
1803
|
-
|
|
1842
|
+
fs11.renameSync(lib.path, newPath);
|
|
1804
1843
|
await manager.updateLibrary(lib.id, { name: newName, path: newPath });
|
|
1805
1844
|
logOk(`Renamed ${oldName} \u2192 ${newName}`);
|
|
1806
1845
|
} finally {
|
|
@@ -1986,9 +2025,9 @@ async function printOverallStatus(projectDir, asJson) {
|
|
|
1986
2025
|
} catch {
|
|
1987
2026
|
secretsStrategy = "unavailable";
|
|
1988
2027
|
}
|
|
1989
|
-
const resolvedProjectDir =
|
|
1990
|
-
const hasWorkspaceConfig = existsSync(
|
|
1991
|
-
const hasLockFile = existsSync(
|
|
2028
|
+
const resolvedProjectDir = path15.resolve(projectDir);
|
|
2029
|
+
const hasWorkspaceConfig = existsSync(path15.join(resolvedProjectDir, "skaile.yaml"));
|
|
2030
|
+
const hasLockFile = existsSync(path15.join(resolvedProjectDir, "skaile.lock.yaml"));
|
|
1992
2031
|
let subscriptions = [];
|
|
1993
2032
|
if (hasWorkspaceConfig) {
|
|
1994
2033
|
try {
|
|
@@ -2193,6 +2232,14 @@ function makeLogsCommand() {
|
|
|
2193
2232
|
}
|
|
2194
2233
|
);
|
|
2195
2234
|
}
|
|
2235
|
+
var ORIGIN_META = {
|
|
2236
|
+
library: { icon: "\u{1F4DA}", label: "Library" },
|
|
2237
|
+
source: { icon: "\u{1F517}", label: "Sources" },
|
|
2238
|
+
store: { icon: "\u{1F4E6}", label: "Store" }
|
|
2239
|
+
};
|
|
2240
|
+
var ORIGIN_ORDER = ["library", "source", "store"];
|
|
2241
|
+
var srcKey = (origin, publisher) => `${origin}:${publisher}`;
|
|
2242
|
+
var repoKey = (origin, publisher, repo) => `${origin}:${publisher}:${repo}`;
|
|
2196
2243
|
var am;
|
|
2197
2244
|
var state = {
|
|
2198
2245
|
tab: "assets",
|
|
@@ -2203,39 +2250,61 @@ var state = {
|
|
|
2203
2250
|
visibleRows: [],
|
|
2204
2251
|
pendingAdds: /* @__PURE__ */ new Set(),
|
|
2205
2252
|
pendingRemoves: /* @__PURE__ */ new Set(),
|
|
2253
|
+
collapsedOrigins: /* @__PURE__ */ new Set(),
|
|
2206
2254
|
collapsedSources: /* @__PURE__ */ new Set(),
|
|
2207
2255
|
collapsedRepos: /* @__PURE__ */ new Set(),
|
|
2256
|
+
seenOrigins: /* @__PURE__ */ new Set(),
|
|
2257
|
+
originFilter: null,
|
|
2208
2258
|
message: "",
|
|
2209
2259
|
cols: 80,
|
|
2210
2260
|
awaitingExitConfirm: false
|
|
2211
2261
|
};
|
|
2212
|
-
function buildVisibleRows(rows, collapsedSources, collapsedRepos) {
|
|
2262
|
+
function buildVisibleRows(rows, collapsedOrigins, collapsedSources, collapsedRepos, originFilter = null) {
|
|
2213
2263
|
return rows.filter((row) => {
|
|
2264
|
+
const origin = rowOrigin(row);
|
|
2265
|
+
if (originFilter && origin !== originFilter) return false;
|
|
2266
|
+
if (row.type === "origin-header") return true;
|
|
2267
|
+
if (collapsedOrigins.has(origin)) return false;
|
|
2214
2268
|
if (row.type === "publisher-header") return true;
|
|
2215
2269
|
if (row.type === "repo-header") {
|
|
2216
|
-
return !collapsedSources.has(row.source);
|
|
2270
|
+
return !collapsedSources.has(srcKey(origin, row.source));
|
|
2217
2271
|
}
|
|
2218
|
-
const publisher = row
|
|
2219
|
-
if (collapsedSources.has(publisher)) return false;
|
|
2220
|
-
const repo = row
|
|
2221
|
-
return repo === "" || !collapsedRepos.has(
|
|
2272
|
+
const publisher = rowPublisher(row);
|
|
2273
|
+
if (collapsedSources.has(srcKey(origin, publisher))) return false;
|
|
2274
|
+
const repo = rowRepo(row);
|
|
2275
|
+
return repo === "" || !collapsedRepos.has(repoKey(origin, publisher, repo));
|
|
2222
2276
|
});
|
|
2223
2277
|
}
|
|
2224
|
-
function
|
|
2225
|
-
return rows.filter((r) => isAsset(r) &&
|
|
2278
|
+
function originAssetRefs(rows, origin) {
|
|
2279
|
+
return refsOf(rows.filter((r) => isAsset(r) && rowOrigin(r) === origin));
|
|
2280
|
+
}
|
|
2281
|
+
function repoAssetRefs(rows, origin, publisher, repo) {
|
|
2282
|
+
return refsOf(rows.filter((r) => isAsset(r) && inRepo(r, origin, publisher, repo)));
|
|
2226
2283
|
}
|
|
2227
|
-
function sourceAssetRefs(rows, source) {
|
|
2228
|
-
return rows.filter((r) => isAsset(r) && inSource(r, source))
|
|
2284
|
+
function sourceAssetRefs(rows, origin, source) {
|
|
2285
|
+
return refsOf(rows.filter((r) => isAsset(r) && inSource(r, origin, source)));
|
|
2229
2286
|
}
|
|
2230
2287
|
function isAsset(r) {
|
|
2231
2288
|
return r.type === "asset";
|
|
2232
2289
|
}
|
|
2233
|
-
function
|
|
2234
|
-
return
|
|
2290
|
+
function rowOrigin(r) {
|
|
2291
|
+
return r.origin ?? "source";
|
|
2292
|
+
}
|
|
2293
|
+
function rowPublisher(r) {
|
|
2294
|
+
return r.entry?.publisher || "other";
|
|
2295
|
+
}
|
|
2296
|
+
function rowRepo(r) {
|
|
2297
|
+
return r.entry?.repo || "";
|
|
2298
|
+
}
|
|
2299
|
+
function refsOf(rows) {
|
|
2300
|
+
return rows.map((r) => assetRefOf(r)).filter((ref) => ref !== null);
|
|
2301
|
+
}
|
|
2302
|
+
function inSource(r, origin, source) {
|
|
2303
|
+
return rowOrigin(r) === origin && rowPublisher(r) === source;
|
|
2235
2304
|
}
|
|
2236
|
-
function inRepo(r, publisher, repo) {
|
|
2237
|
-
if (!inSource(r, publisher)) return false;
|
|
2238
|
-
return (r
|
|
2305
|
+
function inRepo(r, origin, publisher, repo) {
|
|
2306
|
+
if (!inSource(r, origin, publisher)) return false;
|
|
2307
|
+
return rowRepo(r) === repo;
|
|
2239
2308
|
}
|
|
2240
2309
|
function assetRefOf(r) {
|
|
2241
2310
|
if (!isAsset(r) || !r.entry?.publisher) return null;
|
|
@@ -2281,62 +2350,84 @@ function bulkSelection(refs, action3) {
|
|
|
2281
2350
|
for (const ref of refs) setSelection(ref, action3);
|
|
2282
2351
|
}
|
|
2283
2352
|
function actOnHeader(row, action3) {
|
|
2353
|
+
if (row.type === "origin-header") {
|
|
2354
|
+
bulkSelection(originAssetRefs(state.assetRows, rowOrigin(row)), action3);
|
|
2355
|
+
return true;
|
|
2356
|
+
}
|
|
2284
2357
|
if (row.type === "publisher-header") {
|
|
2285
|
-
bulkSelection(sourceAssetRefs(state.assetRows, row.source), action3);
|
|
2358
|
+
bulkSelection(sourceAssetRefs(state.assetRows, rowOrigin(row), row.source), action3);
|
|
2286
2359
|
return true;
|
|
2287
2360
|
}
|
|
2288
2361
|
if (row.type === "repo-header") {
|
|
2289
|
-
bulkSelection(repoAssetRefs(state.assetRows, row.source, row.repo), action3);
|
|
2362
|
+
bulkSelection(repoAssetRefs(state.assetRows, rowOrigin(row), row.source, row.repo), action3);
|
|
2290
2363
|
return true;
|
|
2291
2364
|
}
|
|
2292
2365
|
return false;
|
|
2293
2366
|
}
|
|
2294
2367
|
async function loadAssets() {
|
|
2295
|
-
const { gatherAssetFeeds } = await import('../asset-feeds-
|
|
2368
|
+
const { gatherAssetFeeds } = await import('../asset-feeds-DGZO27M7.js');
|
|
2296
2369
|
const { entries, notes } = await gatherAssetFeeds(am, am.projectDir);
|
|
2297
2370
|
if (notes.length > 0) {
|
|
2298
2371
|
state.message = notes.map((n) => `[${n.feed}] ${n.message}`).join(" \u2022 ");
|
|
2299
2372
|
}
|
|
2300
2373
|
const installed = new Set(am.listDeployed().map((e) => `${e.kind}:${e.name}`));
|
|
2301
|
-
const
|
|
2302
|
-
for (const
|
|
2303
|
-
const publisher =
|
|
2304
|
-
const repo =
|
|
2374
|
+
const byOrigin = /* @__PURE__ */ new Map();
|
|
2375
|
+
for (const { origin, entry } of entries) {
|
|
2376
|
+
const publisher = entry.publisher || "other";
|
|
2377
|
+
const repo = entry.repo || "";
|
|
2378
|
+
if (!byOrigin.has(origin)) byOrigin.set(origin, /* @__PURE__ */ new Map());
|
|
2379
|
+
const byPublisher = byOrigin.get(origin);
|
|
2305
2380
|
if (!byPublisher.has(publisher)) byPublisher.set(publisher, /* @__PURE__ */ new Map());
|
|
2306
2381
|
const byRepo = byPublisher.get(publisher);
|
|
2307
2382
|
if (!byRepo.has(repo)) byRepo.set(repo, []);
|
|
2308
|
-
byRepo.get(repo).push(
|
|
2383
|
+
byRepo.get(repo).push(entry);
|
|
2309
2384
|
}
|
|
2310
2385
|
const rows = [];
|
|
2311
|
-
for (const
|
|
2312
|
-
|
|
2313
|
-
|
|
2314
|
-
rows.push({ type: "
|
|
2315
|
-
const
|
|
2316
|
-
|
|
2317
|
-
|
|
2318
|
-
);
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
2386
|
+
for (const origin of ORIGIN_ORDER) {
|
|
2387
|
+
const byPublisher = byOrigin.get(origin);
|
|
2388
|
+
if (!byPublisher || byPublisher.size === 0) continue;
|
|
2389
|
+
rows.push({ type: "origin-header", origin });
|
|
2390
|
+
for (const [publisher, byRepo] of [...byPublisher.entries()].sort(
|
|
2391
|
+
(a, b) => a[0].localeCompare(b[0])
|
|
2392
|
+
)) {
|
|
2393
|
+
rows.push({ type: "publisher-header", origin, source: publisher });
|
|
2394
|
+
const pushAssets = (items) => {
|
|
2395
|
+
items.sort(
|
|
2396
|
+
(a, b) => a.kind !== b.kind ? a.kind.localeCompare(b.kind) : a.name.localeCompare(b.name)
|
|
2397
|
+
);
|
|
2398
|
+
for (const entry of items) {
|
|
2399
|
+
const ref = `${entry.kind}:${entry.name}`;
|
|
2400
|
+
rows.push({ type: "asset", origin, entry, installed: installed.has(ref) });
|
|
2401
|
+
}
|
|
2402
|
+
};
|
|
2403
|
+
const noRepo = byRepo.get("");
|
|
2404
|
+
if (noRepo) pushAssets(noRepo);
|
|
2405
|
+
for (const [repo, items] of [...byRepo.entries()].filter(([r]) => r !== "").sort((a, b) => a[0].localeCompare(b[0]))) {
|
|
2406
|
+
rows.push({ type: "repo-header", origin, source: publisher, repo });
|
|
2407
|
+
pushAssets(items);
|
|
2322
2408
|
}
|
|
2323
|
-
};
|
|
2324
|
-
const noRepo = byRepo.get("");
|
|
2325
|
-
if (noRepo) pushAssets(noRepo);
|
|
2326
|
-
for (const [repo, items] of [...byRepo.entries()].filter(([r]) => r !== "").sort((a, b) => a[0].localeCompare(b[0]))) {
|
|
2327
|
-
rows.push({ type: "repo-header", source: publisher, repo });
|
|
2328
|
-
pushAssets(items);
|
|
2329
2409
|
}
|
|
2330
2410
|
}
|
|
2331
2411
|
state.assetRows = rows;
|
|
2412
|
+
const presentOrigins = new Set(rows.filter((r) => r.type === "origin-header").map(rowOrigin));
|
|
2413
|
+
for (const o of presentOrigins) {
|
|
2414
|
+
if (!state.seenOrigins.has(o)) {
|
|
2415
|
+
if (o === "store") state.collapsedOrigins.add(o);
|
|
2416
|
+
state.seenOrigins.add(o);
|
|
2417
|
+
}
|
|
2418
|
+
}
|
|
2419
|
+
for (const o of state.collapsedOrigins) {
|
|
2420
|
+
if (!presentOrigins.has(o)) state.collapsedOrigins.delete(o);
|
|
2421
|
+
}
|
|
2422
|
+
if (state.originFilter && !presentOrigins.has(state.originFilter)) state.originFilter = null;
|
|
2332
2423
|
const newSources = new Set(
|
|
2333
|
-
rows.filter((r) => r.type === "publisher-header").map((r) => r.source)
|
|
2424
|
+
rows.filter((r) => r.type === "publisher-header").map((r) => srcKey(rowOrigin(r), r.source))
|
|
2334
2425
|
);
|
|
2335
2426
|
for (const s of state.collapsedSources) {
|
|
2336
2427
|
if (!newSources.has(s)) state.collapsedSources.delete(s);
|
|
2337
2428
|
}
|
|
2338
2429
|
const newRepoKeys = new Set(
|
|
2339
|
-
rows.filter((r) => r.type === "repo-header").map((r) =>
|
|
2430
|
+
rows.filter((r) => r.type === "repo-header").map((r) => repoKey(rowOrigin(r), r.source, r.repo))
|
|
2340
2431
|
);
|
|
2341
2432
|
for (const d of state.collapsedRepos) {
|
|
2342
2433
|
if (!newRepoKeys.has(d)) state.collapsedRepos.delete(d);
|
|
@@ -2347,12 +2438,12 @@ async function loadAssets() {
|
|
|
2347
2438
|
async function loadSourcesAndLibraries() {
|
|
2348
2439
|
try {
|
|
2349
2440
|
const [{ openLibraryManager: openLibraryManager2 }, { skaileHomeDir: skaileHomeDir2 }] = await Promise.all([
|
|
2350
|
-
import('../open-library-
|
|
2441
|
+
import('../open-library-I7YTADMD.js'),
|
|
2351
2442
|
import('../library/index.js')
|
|
2352
2443
|
]);
|
|
2353
2444
|
const { manager, library, close } = await openLibraryManager2();
|
|
2354
2445
|
try {
|
|
2355
|
-
const sourcesDir2 =
|
|
2446
|
+
const sourcesDir2 = path15__default.join(skaileHomeDir2(), "sources");
|
|
2356
2447
|
const isSourceRow = (l) => l.path.startsWith(sourcesDir2);
|
|
2357
2448
|
const libs = await manager.listLibraries();
|
|
2358
2449
|
const defs = await library.listAssetDefs();
|
|
@@ -2385,8 +2476,10 @@ async function loadSourcesAndLibraries() {
|
|
|
2385
2476
|
function rebuildVisible() {
|
|
2386
2477
|
state.visibleRows = buildVisibleRows(
|
|
2387
2478
|
state.assetRows,
|
|
2479
|
+
state.collapsedOrigins,
|
|
2388
2480
|
state.collapsedSources,
|
|
2389
|
-
state.collapsedRepos
|
|
2481
|
+
state.collapsedRepos,
|
|
2482
|
+
state.originFilter
|
|
2390
2483
|
);
|
|
2391
2484
|
clampCursor();
|
|
2392
2485
|
}
|
|
@@ -2410,7 +2503,7 @@ var TABS = {
|
|
|
2410
2503
|
rowCount: () => state.visibleRows.length,
|
|
2411
2504
|
selectableCount: () => state.assetRows.filter(isAsset).length,
|
|
2412
2505
|
renderRow: (i, sel) => renderAssetRow(state.visibleRows[i], sel),
|
|
2413
|
-
footer: " \u2191\u2193/jk
|
|
2506
|
+
footer: " \u2191\u2193/jk nav \u2190/\u2192 collapse/expand [space/+/-] select [a/\u21B5] apply [i] info [1]lib [2]src [3]store [0]all Tab switch [q] quit"
|
|
2414
2507
|
},
|
|
2415
2508
|
sources: {
|
|
2416
2509
|
label: "Sources",
|
|
@@ -2494,24 +2587,38 @@ function renderHeaderLine(opts) {
|
|
|
2494
2587
|
return opts.selected ? pc5.bgWhite(pc5.black(`${line} `.padEnd(state.cols))) : line;
|
|
2495
2588
|
}
|
|
2496
2589
|
function renderAssetRow(row, selected) {
|
|
2497
|
-
if (row.type === "
|
|
2590
|
+
if (row.type === "origin-header") {
|
|
2591
|
+
const origin = rowOrigin(row);
|
|
2592
|
+
const meta = ORIGIN_META[origin];
|
|
2498
2593
|
return renderHeaderLine({
|
|
2499
2594
|
indent: " ",
|
|
2500
|
-
collapsed: state.
|
|
2501
|
-
match: (r) => isAsset(r) &&
|
|
2502
|
-
refs:
|
|
2595
|
+
collapsed: state.collapsedOrigins.has(origin),
|
|
2596
|
+
match: (r) => isAsset(r) && rowOrigin(r) === origin,
|
|
2597
|
+
refs: originAssetRefs(state.assetRows, origin),
|
|
2598
|
+
label: `${meta.icon} ${pc5.bold(pc5.cyan(meta.label))}`,
|
|
2599
|
+
selected
|
|
2600
|
+
});
|
|
2601
|
+
}
|
|
2602
|
+
if (row.type === "publisher-header") {
|
|
2603
|
+
const origin = rowOrigin(row);
|
|
2604
|
+
return renderHeaderLine({
|
|
2605
|
+
indent: " ".repeat(3),
|
|
2606
|
+
collapsed: state.collapsedSources.has(srcKey(origin, row.source)),
|
|
2607
|
+
match: (r) => isAsset(r) && inSource(r, origin, row.source),
|
|
2608
|
+
refs: sourceAssetRefs(state.assetRows, origin, row.source),
|
|
2503
2609
|
label: pc5.bold(pc5.cyan(row.source)),
|
|
2504
2610
|
selected
|
|
2505
2611
|
});
|
|
2506
2612
|
}
|
|
2507
2613
|
if (row.type === "repo-header") {
|
|
2614
|
+
const origin = rowOrigin(row);
|
|
2508
2615
|
const slug = row.repo;
|
|
2509
2616
|
const bare = slug.includes("/") ? slug.slice(slug.indexOf("/") + 1) : slug;
|
|
2510
2617
|
return renderHeaderLine({
|
|
2511
|
-
indent: " ".repeat(
|
|
2512
|
-
collapsed: state.collapsedRepos.has(
|
|
2513
|
-
match: (r) => isAsset(r) && inRepo(r, row.source, slug),
|
|
2514
|
-
refs: repoAssetRefs(state.assetRows, row.source, slug),
|
|
2618
|
+
indent: " ".repeat(5),
|
|
2619
|
+
collapsed: state.collapsedRepos.has(repoKey(origin, row.source, slug)),
|
|
2620
|
+
match: (r) => isAsset(r) && inRepo(r, origin, row.source, slug),
|
|
2621
|
+
refs: repoAssetRefs(state.assetRows, origin, row.source, slug),
|
|
2515
2622
|
label: pc5.bold(bare),
|
|
2516
2623
|
selected
|
|
2517
2624
|
});
|
|
@@ -2523,12 +2630,12 @@ function renderAssetRow(row, selected) {
|
|
|
2523
2630
|
else if (state.pendingRemoves.has(ref)) status4 = pc5.red("- ");
|
|
2524
2631
|
else if (row.installed) status4 = pc5.green("\u2713 ");
|
|
2525
2632
|
else status4 = pc5.dim("\xB7 ");
|
|
2526
|
-
const kind = kindColorPad(e.kind
|
|
2633
|
+
const kind = kindColorPad(e.kind);
|
|
2527
2634
|
const name = fitWidth(e.name, 30);
|
|
2528
2635
|
const badge = e.category ? `${pc5.dim("[")}${pc5.cyan(e.category)}${pc5.dim("]")} ` : "";
|
|
2529
2636
|
const badgeWidth = e.category ? e.category.length + 3 : 0;
|
|
2530
|
-
const desc = e.description?.slice(0, Math.max(0, state.cols -
|
|
2531
|
-
const indent = " ".repeat(e.repo ?
|
|
2637
|
+
const desc = e.description?.slice(0, Math.max(0, state.cols - 56 - badgeWidth)) ?? "";
|
|
2638
|
+
const indent = " ".repeat(e.repo ? 7 : 5);
|
|
2532
2639
|
const line = `${indent}${status4} ${kind} ${name} ${badge}${pc5.dim(desc)}`;
|
|
2533
2640
|
return selected ? pc5.inverse(line.padEnd(state.cols)) : line;
|
|
2534
2641
|
}
|
|
@@ -2549,7 +2656,8 @@ function render() {
|
|
|
2549
2656
|
const overhead = 5 + pendingLines + msgLines;
|
|
2550
2657
|
const maxRows = Math.max(5, (process.stdout.rows || 30) - overhead);
|
|
2551
2658
|
console.log();
|
|
2552
|
-
|
|
2659
|
+
const filterTag = state.tab === "assets" && state.originFilter ? ` ${pc5.bgYellow(pc5.black(` filter: ${ORIGIN_META[state.originFilter].label} `))} ${pc5.dim("[0] clear")}` : "";
|
|
2660
|
+
console.log(` ${pc5.bold("skaile manage")} ${renderTabs()}${filterTag}`);
|
|
2553
2661
|
console.log(` ${S.rule(state.cols - 4)}`);
|
|
2554
2662
|
const spec = TABS[state.tab];
|
|
2555
2663
|
const total = spec.rowCount();
|
|
@@ -2642,9 +2750,10 @@ async function showInfo() {
|
|
|
2642
2750
|
console.log();
|
|
2643
2751
|
console.log(` ${kindColor(e.kind)} ${pc5.bold(e.name)}`);
|
|
2644
2752
|
console.log(` ${S.rule(50)}`);
|
|
2753
|
+
console.log(` origin: ${pc5.dim(ORIGIN_META[rowOrigin(row)].label)}`);
|
|
2645
2754
|
if (e.version) console.log(` version: ${e.version}`);
|
|
2646
2755
|
if (e.description) console.log(` description: ${e.description}`);
|
|
2647
|
-
if (e.publisher) console.log(`
|
|
2756
|
+
if (e.publisher) console.log(` publisher: ${pc5.dim(e.publisher)}`);
|
|
2648
2757
|
console.log(` manifest: ${pc5.dim(e.source)}`);
|
|
2649
2758
|
console.log(` installed: ${row.installed ? pc5.green("yes") : pc5.red("no")}`);
|
|
2650
2759
|
if (e.requires.length) {
|
|
@@ -2665,14 +2774,31 @@ async function showInfo() {
|
|
|
2665
2774
|
process.stdin.once("data", onData);
|
|
2666
2775
|
});
|
|
2667
2776
|
}
|
|
2777
|
+
function setOriginFilter(origin) {
|
|
2778
|
+
if (origin === null || state.originFilter === origin) {
|
|
2779
|
+
state.originFilter = null;
|
|
2780
|
+
} else if (state.seenOrigins.has(origin)) {
|
|
2781
|
+
state.originFilter = origin;
|
|
2782
|
+
state.collapsedOrigins.delete(origin);
|
|
2783
|
+
} else {
|
|
2784
|
+
state.message = pc5.dim(`No ${ORIGIN_META[origin].label} assets to show.`);
|
|
2785
|
+
return;
|
|
2786
|
+
}
|
|
2787
|
+
state.cursor = 0;
|
|
2788
|
+
rebuildVisible();
|
|
2789
|
+
}
|
|
2668
2790
|
function expandUnderCursor() {
|
|
2669
2791
|
const row = state.visibleRows[state.cursor];
|
|
2670
2792
|
if (!row) return;
|
|
2671
|
-
|
|
2672
|
-
|
|
2793
|
+
const origin = rowOrigin(row);
|
|
2794
|
+
if (row.type === "origin-header" && state.collapsedOrigins.has(origin)) {
|
|
2795
|
+
state.collapsedOrigins.delete(origin);
|
|
2796
|
+
rebuildVisible();
|
|
2797
|
+
} else if (row.type === "publisher-header" && state.collapsedSources.has(srcKey(origin, row.source))) {
|
|
2798
|
+
state.collapsedSources.delete(srcKey(origin, row.source));
|
|
2673
2799
|
rebuildVisible();
|
|
2674
2800
|
} else if (row.type === "repo-header") {
|
|
2675
|
-
const dk =
|
|
2801
|
+
const dk = repoKey(origin, row.source, row.repo);
|
|
2676
2802
|
if (state.collapsedRepos.has(dk)) {
|
|
2677
2803
|
state.collapsedRepos.delete(dk);
|
|
2678
2804
|
rebuildVisible();
|
|
@@ -2682,15 +2808,31 @@ function expandUnderCursor() {
|
|
|
2682
2808
|
function collapseOrJumpUnderCursor() {
|
|
2683
2809
|
const row = state.visibleRows[state.cursor];
|
|
2684
2810
|
if (!row) return;
|
|
2811
|
+
const origin = rowOrigin(row);
|
|
2812
|
+
if (row.type === "origin-header") {
|
|
2813
|
+
if (!state.collapsedOrigins.has(origin)) {
|
|
2814
|
+
state.collapsedOrigins.add(origin);
|
|
2815
|
+
rebuildVisible();
|
|
2816
|
+
}
|
|
2817
|
+
return;
|
|
2818
|
+
}
|
|
2685
2819
|
if (row.type === "publisher-header") {
|
|
2686
|
-
|
|
2687
|
-
|
|
2820
|
+
const sk = srcKey(origin, row.source);
|
|
2821
|
+
if (!state.collapsedSources.has(sk)) {
|
|
2822
|
+
state.collapsedSources.add(sk);
|
|
2688
2823
|
rebuildVisible();
|
|
2824
|
+
} else {
|
|
2825
|
+
const idx2 = findLastIndex(
|
|
2826
|
+
state.visibleRows,
|
|
2827
|
+
state.cursor,
|
|
2828
|
+
(r) => r.type === "origin-header"
|
|
2829
|
+
);
|
|
2830
|
+
if (idx2 >= 0) state.cursor = idx2;
|
|
2689
2831
|
}
|
|
2690
2832
|
return;
|
|
2691
2833
|
}
|
|
2692
2834
|
if (row.type === "repo-header") {
|
|
2693
|
-
const dk =
|
|
2835
|
+
const dk = repoKey(origin, row.source, row.repo);
|
|
2694
2836
|
if (!state.collapsedRepos.has(dk)) {
|
|
2695
2837
|
state.collapsedRepos.add(dk);
|
|
2696
2838
|
rebuildVisible();
|
|
@@ -2707,7 +2849,7 @@ function collapseOrJumpUnderCursor() {
|
|
|
2707
2849
|
const idx = findLastIndex(
|
|
2708
2850
|
state.visibleRows,
|
|
2709
2851
|
state.cursor,
|
|
2710
|
-
(r) => r.type === "repo-header" || r.type === "publisher-header"
|
|
2852
|
+
(r) => r.type === "repo-header" || r.type === "publisher-header" || r.type === "origin-header"
|
|
2711
2853
|
);
|
|
2712
2854
|
if (idx >= 0) state.cursor = idx;
|
|
2713
2855
|
}
|
|
@@ -2808,7 +2950,12 @@ var KEYMAP = [
|
|
|
2808
2950
|
// Enter — apply on assets tab
|
|
2809
2951
|
{ keys: ["\r", "\n"], when: TAB_ASSETS, run: applyChanges },
|
|
2810
2952
|
// Info — assets only
|
|
2811
|
-
{ keys: ["i"], when: TAB_ASSETS, run: showInfo }
|
|
2953
|
+
{ keys: ["i"], when: TAB_ASSETS, run: showInfo },
|
|
2954
|
+
// Origin filter — assets only. 1/2/3 isolate one origin, 0 clears.
|
|
2955
|
+
{ keys: ["1"], when: TAB_ASSETS, run: () => setOriginFilter("library") },
|
|
2956
|
+
{ keys: ["2"], when: TAB_ASSETS, run: () => setOriginFilter("source") },
|
|
2957
|
+
{ keys: ["3"], when: TAB_ASSETS, run: () => setOriginFilter("store") },
|
|
2958
|
+
{ keys: ["0"], when: TAB_ASSETS, run: () => setOriginFilter(null) }
|
|
2812
2959
|
];
|
|
2813
2960
|
async function dispatchKey(key) {
|
|
2814
2961
|
for (const b of KEYMAP) {
|
|
@@ -2854,13 +3001,13 @@ async function run(projectDir) {
|
|
|
2854
3001
|
}
|
|
2855
3002
|
function makeManageCommand() {
|
|
2856
3003
|
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(
|
|
3004
|
+
await run(path15__default.resolve(opts.projectDir));
|
|
2858
3005
|
});
|
|
2859
3006
|
}
|
|
2860
3007
|
function makeMcpServerCommand() {
|
|
2861
3008
|
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 =
|
|
3009
|
+
const path35 = await import('path');
|
|
3010
|
+
const projectDir = path35.default.resolve(opts.projectDir);
|
|
2864
3011
|
const { LogStore, StdoutSink, registerLogStore } = await import('../core/logging.js');
|
|
2865
3012
|
registerLogStore(
|
|
2866
3013
|
new LogStore({
|
|
@@ -2897,8 +3044,8 @@ function makeNpxCommand() {
|
|
|
2897
3044
|
skills.command("add <url>").description(
|
|
2898
3045
|
"Clone a repo, register it in the project's skaile.yaml sources[], and install a skill from it"
|
|
2899
3046
|
).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 =
|
|
3047
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
3048
|
+
const projYaml = path15__default.join(projectDir, "skaile.yaml");
|
|
2902
3049
|
if (!existsSync(projYaml)) {
|
|
2903
3050
|
logErr(`No skaile.yaml in ${projectDir} \u2014 run \`skaile init\` first.`);
|
|
2904
3051
|
process.exit(1);
|
|
@@ -2911,7 +3058,7 @@ function makeNpxCommand() {
|
|
|
2911
3058
|
}
|
|
2912
3059
|
const spinner5 = p5.spinner();
|
|
2913
3060
|
const slug = sourceSlug(url);
|
|
2914
|
-
const clonePath =
|
|
3061
|
+
const clonePath = path15__default.join(homedir(), ".skaile", "sources", slug);
|
|
2915
3062
|
spinner5.start(`Cloning ${url}`);
|
|
2916
3063
|
try {
|
|
2917
3064
|
if (!existsSync(clonePath)) {
|
|
@@ -2960,12 +3107,12 @@ function makeNpxCommand() {
|
|
|
2960
3107
|
return npx;
|
|
2961
3108
|
}
|
|
2962
3109
|
function resolvePublisher(clonePath, url) {
|
|
2963
|
-
const
|
|
2964
|
-
if (existsSync(
|
|
3110
|
+
const manifestPath = path15__default.join(clonePath, SKAILE_MANIFEST_FILENAME);
|
|
3111
|
+
if (existsSync(manifestPath)) {
|
|
2965
3112
|
try {
|
|
2966
|
-
const {
|
|
2967
|
-
if (typeof
|
|
2968
|
-
return
|
|
3113
|
+
const { manifest } = decodeSkaileManifest(readFileSync(manifestPath, "utf8"));
|
|
3114
|
+
if (typeof manifest.publisher === "string" && manifest.publisher.length > 0) {
|
|
3115
|
+
return manifest.publisher;
|
|
2969
3116
|
}
|
|
2970
3117
|
} catch {
|
|
2971
3118
|
}
|
|
@@ -2973,12 +3120,12 @@ function resolvePublisher(clonePath, url) {
|
|
|
2973
3120
|
return url.match(/github\.com[/:]([^/]+)\/[^/]+/)?.[1];
|
|
2974
3121
|
}
|
|
2975
3122
|
function resolveSkillName(clonePath, requested) {
|
|
2976
|
-
const skillsDir =
|
|
2977
|
-
if (existsSync(
|
|
3123
|
+
const skillsDir = path15__default.join(clonePath, "skills");
|
|
3124
|
+
if (existsSync(path15__default.join(skillsDir, requested, "SKILL.md"))) return requested;
|
|
2978
3125
|
if (!existsSync(skillsDir)) return requested;
|
|
2979
3126
|
for (const entry of readdirSync(skillsDir, { withFileTypes: true })) {
|
|
2980
3127
|
if (!entry.isDirectory()) continue;
|
|
2981
|
-
const md =
|
|
3128
|
+
const md = path15__default.join(skillsDir, entry.name, "SKILL.md");
|
|
2982
3129
|
if (!existsSync(md)) continue;
|
|
2983
3130
|
try {
|
|
2984
3131
|
const { data } = parseFrontmatter(readFileSync(md, "utf8"));
|
|
@@ -2998,12 +3145,12 @@ var MCP_SERVER_ENTRY = {
|
|
|
2998
3145
|
env: {}
|
|
2999
3146
|
};
|
|
3000
3147
|
function pluginDir(projectDir) {
|
|
3001
|
-
return
|
|
3148
|
+
return path15__default.join(projectDir, ".claude", "plugins", "skaile");
|
|
3002
3149
|
}
|
|
3003
3150
|
async function readJsonStrict(p7) {
|
|
3004
3151
|
let raw;
|
|
3005
3152
|
try {
|
|
3006
|
-
raw = await
|
|
3153
|
+
raw = await fs6.readFile(p7, "utf-8");
|
|
3007
3154
|
} catch {
|
|
3008
3155
|
return null;
|
|
3009
3156
|
}
|
|
@@ -3016,32 +3163,32 @@ async function readJsonStrict(p7) {
|
|
|
3016
3163
|
}
|
|
3017
3164
|
}
|
|
3018
3165
|
async function writeJson(p7, value) {
|
|
3019
|
-
await
|
|
3020
|
-
await
|
|
3166
|
+
await fs6.mkdir(path15__default.dirname(p7), { recursive: true });
|
|
3167
|
+
await fs6.writeFile(p7, `${JSON.stringify(value, null, 2)}
|
|
3021
3168
|
`);
|
|
3022
3169
|
}
|
|
3023
3170
|
async function copyDir(src, dest) {
|
|
3024
|
-
await
|
|
3025
|
-
const entries = await
|
|
3171
|
+
await fs6.mkdir(dest, { recursive: true });
|
|
3172
|
+
const entries = await fs6.readdir(src, { withFileTypes: true });
|
|
3026
3173
|
for (const entry of entries) {
|
|
3027
|
-
const srcPath =
|
|
3028
|
-
const destPath =
|
|
3174
|
+
const srcPath = path15__default.join(src, entry.name);
|
|
3175
|
+
const destPath = path15__default.join(dest, entry.name);
|
|
3029
3176
|
if (entry.isDirectory()) await copyDir(srcPath, destPath);
|
|
3030
|
-
else await
|
|
3177
|
+
else await fs6.copyFile(srcPath, destPath);
|
|
3031
3178
|
}
|
|
3032
3179
|
}
|
|
3033
3180
|
async function install(projectDir, opts) {
|
|
3034
3181
|
return opts?.full ? installFullPlugin(projectDir) : installMcp(projectDir);
|
|
3035
3182
|
}
|
|
3036
3183
|
async function installMcp(projectDir) {
|
|
3037
|
-
const mcpPath =
|
|
3184
|
+
const mcpPath = path15__default.join(projectDir, ".claude", "mcp.json");
|
|
3038
3185
|
const existing = await readJsonStrict(mcpPath) ?? {};
|
|
3039
3186
|
const mcpServers = { ...existing.mcpServers ?? {} };
|
|
3040
3187
|
const previous = mcpServers[SKAILE_MCP_NAME];
|
|
3041
3188
|
const matches = previous && JSON.stringify(previous) === JSON.stringify(MCP_SERVER_ENTRY);
|
|
3042
3189
|
let warning;
|
|
3043
3190
|
if (previous && !matches) {
|
|
3044
|
-
warning = `overwrote existing ${SKAILE_MCP_NAME} entry in ${
|
|
3191
|
+
warning = `overwrote existing ${SKAILE_MCP_NAME} entry in ${path15__default.relative(projectDir, mcpPath)}`;
|
|
3045
3192
|
}
|
|
3046
3193
|
mcpServers[SKAILE_MCP_NAME] = MCP_SERVER_ENTRY;
|
|
3047
3194
|
await writeJson(mcpPath, { ...existing, mcpServers });
|
|
@@ -3050,15 +3197,15 @@ async function installMcp(projectDir) {
|
|
|
3050
3197
|
async function installFullPlugin(projectDir) {
|
|
3051
3198
|
const dir = pluginDir(projectDir);
|
|
3052
3199
|
for (const [rel, content] of Object.entries(buildClaudePluginFiles())) {
|
|
3053
|
-
const dest =
|
|
3054
|
-
await
|
|
3055
|
-
await
|
|
3200
|
+
const dest = path15__default.join(dir, rel);
|
|
3201
|
+
await fs6.mkdir(path15__default.dirname(dest), { recursive: true });
|
|
3202
|
+
await fs6.writeFile(dest, content);
|
|
3056
3203
|
}
|
|
3057
|
-
const projectSkillsDir =
|
|
3204
|
+
const projectSkillsDir = path15__default.join(projectDir, ".skaile", "skills");
|
|
3058
3205
|
if (existsSync(projectSkillsDir)) {
|
|
3059
|
-
await copyDir(projectSkillsDir,
|
|
3206
|
+
await copyDir(projectSkillsDir, path15__default.join(dir, "skills"));
|
|
3060
3207
|
}
|
|
3061
|
-
const settingsPath =
|
|
3208
|
+
const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
|
|
3062
3209
|
const settings = await readJsonStrict(settingsPath) ?? {};
|
|
3063
3210
|
const plugins = settings.plugins ?? [];
|
|
3064
3211
|
if (!plugins.includes(dir)) plugins.push(dir);
|
|
@@ -3066,8 +3213,8 @@ async function installFullPlugin(projectDir) {
|
|
|
3066
3213
|
return { changed: true, method: "plugin" };
|
|
3067
3214
|
}
|
|
3068
3215
|
async function uninstall(projectDir) {
|
|
3069
|
-
const settingsPath =
|
|
3070
|
-
const mcpPath =
|
|
3216
|
+
const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
|
|
3217
|
+
const mcpPath = path15__default.join(projectDir, ".claude", "mcp.json");
|
|
3071
3218
|
const dir = pluginDir(projectDir);
|
|
3072
3219
|
let changed = false;
|
|
3073
3220
|
const settings = await readJsonStrict(settingsPath);
|
|
@@ -3081,7 +3228,7 @@ async function uninstall(projectDir) {
|
|
|
3081
3228
|
}
|
|
3082
3229
|
}
|
|
3083
3230
|
if (existsSync(dir)) {
|
|
3084
|
-
await
|
|
3231
|
+
await fs6.rm(dir, { recursive: true, force: true });
|
|
3085
3232
|
changed = true;
|
|
3086
3233
|
}
|
|
3087
3234
|
const mcp = await readJsonStrict(mcpPath);
|
|
@@ -3091,7 +3238,7 @@ async function uninstall(projectDir) {
|
|
|
3091
3238
|
const updated = { ...mcp, mcpServers: rest };
|
|
3092
3239
|
if (Object.keys(rest).length === 0) delete updated.mcpServers;
|
|
3093
3240
|
if (Object.keys(updated).length === 0) {
|
|
3094
|
-
await
|
|
3241
|
+
await fs6.unlink(mcpPath);
|
|
3095
3242
|
} else {
|
|
3096
3243
|
await writeJson(mcpPath, updated);
|
|
3097
3244
|
}
|
|
@@ -3101,12 +3248,12 @@ async function uninstall(projectDir) {
|
|
|
3101
3248
|
async function detectInstall(projectDir) {
|
|
3102
3249
|
const dir = pluginDir(projectDir);
|
|
3103
3250
|
const settings = await readJsonStrict(
|
|
3104
|
-
|
|
3251
|
+
path15__default.join(projectDir, ".claude", "settings.json")
|
|
3105
3252
|
);
|
|
3106
|
-
if (existsSync(
|
|
3253
|
+
if (existsSync(path15__default.join(dir, ".claude-plugin", "plugin.json")) && settings?.plugins?.includes(dir)) {
|
|
3107
3254
|
return { method: "plugin", pluginPath: dir };
|
|
3108
3255
|
}
|
|
3109
|
-
const mcp = await readJsonStrict(
|
|
3256
|
+
const mcp = await readJsonStrict(path15__default.join(projectDir, ".claude", "mcp.json"));
|
|
3110
3257
|
if (mcp?.mcpServers && SKAILE_MCP_NAME in mcp.mcpServers) {
|
|
3111
3258
|
return { method: "mcp" };
|
|
3112
3259
|
}
|
|
@@ -3115,7 +3262,7 @@ async function detectInstall(projectDir) {
|
|
|
3115
3262
|
async function enable(projectDir) {
|
|
3116
3263
|
const detected = await detectInstall(projectDir);
|
|
3117
3264
|
if (!detected) throw new Error("plugin not installed for claude-code");
|
|
3118
|
-
const settingsPath =
|
|
3265
|
+
const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
|
|
3119
3266
|
const settings = await readJsonStrict(settingsPath) ?? {};
|
|
3120
3267
|
if (detected.method === "plugin") {
|
|
3121
3268
|
const disabled2 = settings.disabledPlugins ?? [];
|
|
@@ -3137,7 +3284,7 @@ async function enable(projectDir) {
|
|
|
3137
3284
|
async function disable(projectDir) {
|
|
3138
3285
|
const detected = await detectInstall(projectDir);
|
|
3139
3286
|
if (!detected) throw new Error("plugin not installed for claude-code");
|
|
3140
|
-
const settingsPath =
|
|
3287
|
+
const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
|
|
3141
3288
|
const settings = await readJsonStrict(settingsPath) ?? {};
|
|
3142
3289
|
if (detected.method === "plugin") {
|
|
3143
3290
|
const list2 = settings.disabledPlugins ?? [];
|
|
@@ -3157,12 +3304,12 @@ async function disable(projectDir) {
|
|
|
3157
3304
|
return { changed: true };
|
|
3158
3305
|
}
|
|
3159
3306
|
async function status(projectDir) {
|
|
3160
|
-
const settingsPath =
|
|
3161
|
-
const mcpPath =
|
|
3307
|
+
const settingsPath = path15__default.join(projectDir, ".claude", "settings.json");
|
|
3308
|
+
const mcpPath = path15__default.join(projectDir, ".claude", "mcp.json");
|
|
3162
3309
|
const dir = pluginDir(projectDir);
|
|
3163
3310
|
const settings = await readJsonStrict(settingsPath);
|
|
3164
3311
|
const mcp = await readJsonStrict(mcpPath);
|
|
3165
|
-
const pluginInstalled = !!(existsSync(
|
|
3312
|
+
const pluginInstalled = !!(existsSync(path15__default.join(dir, ".claude-plugin", "plugin.json")) && settings?.plugins?.includes(dir));
|
|
3166
3313
|
const mcpInstalled = !!(mcp?.mcpServers && SKAILE_MCP_NAME in mcp.mcpServers);
|
|
3167
3314
|
if (!pluginInstalled && !mcpInstalled) {
|
|
3168
3315
|
return {
|
|
@@ -3180,7 +3327,7 @@ async function status(projectDir) {
|
|
|
3180
3327
|
installed: "yes",
|
|
3181
3328
|
enabled: disabled2 ? "no" : "yes",
|
|
3182
3329
|
method: "plugin",
|
|
3183
|
-
location:
|
|
3330
|
+
location: path15__default.relative(projectDir, dir)
|
|
3184
3331
|
};
|
|
3185
3332
|
}
|
|
3186
3333
|
const disabled = settings?.disabledMcpjsonServers?.includes(SKAILE_MCP_NAME) ?? false;
|
|
@@ -3189,7 +3336,7 @@ async function status(projectDir) {
|
|
|
3189
3336
|
installed: "yes",
|
|
3190
3337
|
enabled: disabled ? "no" : "yes",
|
|
3191
3338
|
method: "mcp",
|
|
3192
|
-
location:
|
|
3339
|
+
location: path15__default.relative(projectDir, mcpPath)
|
|
3193
3340
|
};
|
|
3194
3341
|
}
|
|
3195
3342
|
var SKAILE_MCP_NAME2 = "skaile-workspace";
|
|
@@ -3203,7 +3350,7 @@ function buildEntry(projectDir) {
|
|
|
3203
3350
|
async function readConfig(p7) {
|
|
3204
3351
|
let raw;
|
|
3205
3352
|
try {
|
|
3206
|
-
raw = await
|
|
3353
|
+
raw = await fs6.readFile(p7, "utf-8");
|
|
3207
3354
|
} catch {
|
|
3208
3355
|
return null;
|
|
3209
3356
|
}
|
|
@@ -3216,16 +3363,16 @@ async function readConfig(p7) {
|
|
|
3216
3363
|
}
|
|
3217
3364
|
}
|
|
3218
3365
|
async function writeConfig(p7, value) {
|
|
3219
|
-
await
|
|
3366
|
+
await fs6.mkdir(path15__default.dirname(p7), { recursive: true });
|
|
3220
3367
|
const cleaned = {};
|
|
3221
3368
|
for (const [k, v] of Object.entries(value)) {
|
|
3222
3369
|
if (v === void 0) continue;
|
|
3223
3370
|
cleaned[k] = v;
|
|
3224
3371
|
}
|
|
3225
|
-
await
|
|
3372
|
+
await fs6.writeFile(p7, stringify(cleaned));
|
|
3226
3373
|
}
|
|
3227
3374
|
function configPath(projectDir) {
|
|
3228
|
-
return
|
|
3375
|
+
return path15__default.join(projectDir, ".codex", "config.toml");
|
|
3229
3376
|
}
|
|
3230
3377
|
async function install2(projectDir) {
|
|
3231
3378
|
const p7 = configPath(projectDir);
|
|
@@ -3236,7 +3383,7 @@ async function install2(projectDir) {
|
|
|
3236
3383
|
const matches = previous && JSON.stringify(previous) === JSON.stringify(next);
|
|
3237
3384
|
let warning;
|
|
3238
3385
|
if (previous && !matches) {
|
|
3239
|
-
warning = `overwrote existing ${SKAILE_MCP_NAME2} entry in ${
|
|
3386
|
+
warning = `overwrote existing ${SKAILE_MCP_NAME2} entry in ${path15__default.relative(projectDir, p7)}`;
|
|
3240
3387
|
}
|
|
3241
3388
|
if (matches) return { changed: false, method: "toml" };
|
|
3242
3389
|
servers[SKAILE_MCP_NAME2] = next;
|
|
@@ -3253,7 +3400,7 @@ async function uninstall2(projectDir) {
|
|
|
3253
3400
|
const updated = { ...cfg, mcp_servers: rest };
|
|
3254
3401
|
if (Object.keys(rest).length === 0) delete updated.mcp_servers;
|
|
3255
3402
|
if (Object.keys(updated).length === 0) {
|
|
3256
|
-
await
|
|
3403
|
+
await fs6.unlink(p7);
|
|
3257
3404
|
} else {
|
|
3258
3405
|
await writeConfig(p7, updated);
|
|
3259
3406
|
}
|
|
@@ -3277,43 +3424,43 @@ async function status2(projectDir) {
|
|
|
3277
3424
|
installed: "yes",
|
|
3278
3425
|
enabled: "n/a",
|
|
3279
3426
|
method: "mcp",
|
|
3280
|
-
location:
|
|
3427
|
+
location: path15__default.relative(projectDir, p7)
|
|
3281
3428
|
};
|
|
3282
3429
|
}
|
|
3283
3430
|
async function install3(projectDir) {
|
|
3284
|
-
const extDir =
|
|
3285
|
-
const extPath =
|
|
3286
|
-
await
|
|
3431
|
+
const extDir = path15__default.join(projectDir, ".omp", "extensions");
|
|
3432
|
+
const extPath = path15__default.join(extDir, "skaile.ts");
|
|
3433
|
+
await fs6.mkdir(extDir, { recursive: true });
|
|
3287
3434
|
const { WorkspacePlugin } = await import('../workspace-plugin/index.js');
|
|
3288
3435
|
const plugin = new WorkspacePlugin({ projectDir });
|
|
3289
3436
|
const nextSrc = await plugin.buildOmpExtensionSource();
|
|
3290
3437
|
let prevSrc = null;
|
|
3291
3438
|
try {
|
|
3292
|
-
prevSrc = await
|
|
3439
|
+
prevSrc = await fs6.readFile(extPath, "utf-8");
|
|
3293
3440
|
} catch {
|
|
3294
3441
|
}
|
|
3295
3442
|
if (prevSrc === nextSrc) return { changed: false, method: "generated" };
|
|
3296
|
-
await
|
|
3443
|
+
await fs6.writeFile(extPath, nextSrc);
|
|
3297
3444
|
return { changed: true, method: "generated" };
|
|
3298
3445
|
}
|
|
3299
3446
|
async function uninstall3(projectDir) {
|
|
3300
|
-
const extPath =
|
|
3447
|
+
const extPath = path15__default.join(projectDir, ".omp", "extensions", "skaile.ts");
|
|
3301
3448
|
try {
|
|
3302
|
-
await
|
|
3449
|
+
await fs6.unlink(extPath);
|
|
3303
3450
|
return { changed: true };
|
|
3304
3451
|
} catch {
|
|
3305
3452
|
return { changed: false };
|
|
3306
3453
|
}
|
|
3307
3454
|
}
|
|
3308
3455
|
async function status3(projectDir) {
|
|
3309
|
-
const extPath =
|
|
3456
|
+
const extPath = path15__default.join(projectDir, ".omp", "extensions", "skaile.ts");
|
|
3310
3457
|
if (existsSync(extPath)) {
|
|
3311
3458
|
return {
|
|
3312
3459
|
backend: "omp",
|
|
3313
3460
|
installed: "yes",
|
|
3314
3461
|
enabled: "n/a",
|
|
3315
3462
|
method: "extension",
|
|
3316
|
-
location:
|
|
3463
|
+
location: path15__default.relative(projectDir, extPath)
|
|
3317
3464
|
};
|
|
3318
3465
|
}
|
|
3319
3466
|
return {
|
|
@@ -3334,7 +3481,7 @@ function resolveDriver(driver) {
|
|
|
3334
3481
|
throw new Error(`unknown driver: ${driver} (expected: claude-code | omp | codex | all)`);
|
|
3335
3482
|
}
|
|
3336
3483
|
async function runInstall(opts) {
|
|
3337
|
-
const projectDir =
|
|
3484
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
3338
3485
|
const targets = resolveDriver(opts.driver);
|
|
3339
3486
|
let exitCode = 0;
|
|
3340
3487
|
if (targets.includes("claude-code")) {
|
|
@@ -3389,7 +3536,7 @@ async function runInstall(opts) {
|
|
|
3389
3536
|
return exitCode;
|
|
3390
3537
|
}
|
|
3391
3538
|
async function runUninstall(opts) {
|
|
3392
|
-
const projectDir =
|
|
3539
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
3393
3540
|
const targets = resolveDriver(opts.driver);
|
|
3394
3541
|
let exitCode = 0;
|
|
3395
3542
|
if (targets.includes("claude-code")) {
|
|
@@ -3426,7 +3573,7 @@ async function runUninstall(opts) {
|
|
|
3426
3573
|
return exitCode;
|
|
3427
3574
|
}
|
|
3428
3575
|
async function runToggle(opts, action3) {
|
|
3429
|
-
const projectDir =
|
|
3576
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
3430
3577
|
const requestedAll = opts.driver === "all";
|
|
3431
3578
|
const targets = resolveDriver(opts.driver);
|
|
3432
3579
|
if (!requestedAll) {
|
|
@@ -3461,7 +3608,7 @@ async function runToggle(opts, action3) {
|
|
|
3461
3608
|
return exitCode;
|
|
3462
3609
|
}
|
|
3463
3610
|
async function runStatus2(opts) {
|
|
3464
|
-
const projectDir =
|
|
3611
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
3465
3612
|
const targets = resolveDriver(opts.driver);
|
|
3466
3613
|
const rows = [];
|
|
3467
3614
|
let exitCode = 0;
|
|
@@ -3532,7 +3679,7 @@ async function runHook(event) {
|
|
|
3532
3679
|
await plugin.shutdown();
|
|
3533
3680
|
return;
|
|
3534
3681
|
}
|
|
3535
|
-
const store = new PluginStore(
|
|
3682
|
+
const store = new PluginStore(path15__default.join(projectDir, ".skaile", "plugin-state.json"));
|
|
3536
3683
|
await store.load();
|
|
3537
3684
|
const status4 = store.get("connector:status");
|
|
3538
3685
|
if (status4 && typeof status4 === "object" && Object.keys(status4).length > 0) {
|
|
@@ -3597,7 +3744,7 @@ function makeOutdatedCommand() {
|
|
|
3597
3744
|
new Option("--target <agent>", "Driver target").default("claude-code").choices(SUPPORTED_DRIVER_TARGETS)
|
|
3598
3745
|
).action((name, opts) => {
|
|
3599
3746
|
const am2 = new AssetManager({
|
|
3600
|
-
projectDir:
|
|
3747
|
+
projectDir: path15__default.resolve(opts.projectDir),
|
|
3601
3748
|
driverTarget: opts.target
|
|
3602
3749
|
});
|
|
3603
3750
|
const entries = am2.outdated();
|
|
@@ -3626,7 +3773,7 @@ function makeOutdatedCommand() {
|
|
|
3626
3773
|
function makePatchCommand() {
|
|
3627
3774
|
const cmd = new Command("patch").description("Patch workflow for skill improvement");
|
|
3628
3775
|
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:
|
|
3776
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
3630
3777
|
try {
|
|
3631
3778
|
const dest = am2.patch(ref);
|
|
3632
3779
|
logOk(`Extracted to ${S.dim(dest)}`);
|
|
@@ -3637,7 +3784,7 @@ function makePatchCommand() {
|
|
|
3637
3784
|
}
|
|
3638
3785
|
});
|
|
3639
3786
|
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:
|
|
3787
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
3641
3788
|
try {
|
|
3642
3789
|
const patchFile = am2.patchCommit(ref);
|
|
3643
3790
|
logOk(`Patch saved to ${S.dim(patchFile)}`);
|
|
@@ -3648,7 +3795,7 @@ function makePatchCommand() {
|
|
|
3648
3795
|
}
|
|
3649
3796
|
});
|
|
3650
3797
|
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:
|
|
3798
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
3652
3799
|
try {
|
|
3653
3800
|
am2.patchSubmit(ref);
|
|
3654
3801
|
logOk("Patch applied to repo clone and committed.");
|
|
@@ -3661,7 +3808,7 @@ function makePatchCommand() {
|
|
|
3661
3808
|
}
|
|
3662
3809
|
});
|
|
3663
3810
|
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:
|
|
3811
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
3665
3812
|
am2.patchRemove(ref);
|
|
3666
3813
|
logOk(`Patch removed for ${ref}`);
|
|
3667
3814
|
});
|
|
@@ -3679,7 +3826,7 @@ function action2(fn) {
|
|
|
3679
3826
|
};
|
|
3680
3827
|
}
|
|
3681
3828
|
async function reconcileAndReport(projectDir, plugins) {
|
|
3682
|
-
const { reconcilePlugins } = await import('../plugin-store-
|
|
3829
|
+
const { reconcilePlugins } = await import('../plugin-store-GL5VKYUA.js');
|
|
3683
3830
|
if (plugins.length === 0) {
|
|
3684
3831
|
logInfo("No plugins declared \u2014 nothing to reconcile.");
|
|
3685
3832
|
return;
|
|
@@ -3693,10 +3840,10 @@ async function reconcileAndReport(projectDir, plugins) {
|
|
|
3693
3840
|
}
|
|
3694
3841
|
}
|
|
3695
3842
|
async function runInstall2(spec, opts) {
|
|
3696
|
-
const projectDir =
|
|
3843
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
3697
3844
|
const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
|
|
3698
|
-
const { specName } = await import('../plugin-store-
|
|
3699
|
-
const yamlPath =
|
|
3845
|
+
const { specName } = await import('../plugin-store-GL5VKYUA.js');
|
|
3846
|
+
const yamlPath = path15__default.join(projectDir, "skaile.yaml");
|
|
3700
3847
|
const editor = WorkspaceYamlEditor2.load(yamlPath);
|
|
3701
3848
|
const replaced = editor.addPlugin(spec, specName);
|
|
3702
3849
|
editor.save();
|
|
@@ -3705,10 +3852,10 @@ async function runInstall2(spec, opts) {
|
|
|
3705
3852
|
await reconcileAndReport(projectDir, editor.getPlugins());
|
|
3706
3853
|
}
|
|
3707
3854
|
async function runRemove(name, opts) {
|
|
3708
|
-
const projectDir =
|
|
3855
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
3709
3856
|
const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
|
|
3710
|
-
const { specName } = await import('../plugin-store-
|
|
3711
|
-
const yamlPath =
|
|
3857
|
+
const { specName } = await import('../plugin-store-GL5VKYUA.js');
|
|
3858
|
+
const yamlPath = path15__default.join(projectDir, "skaile.yaml");
|
|
3712
3859
|
const editor = WorkspaceYamlEditor2.load(yamlPath);
|
|
3713
3860
|
const removed = editor.removePlugin(name, specName);
|
|
3714
3861
|
if (!removed) {
|
|
@@ -3720,7 +3867,7 @@ async function runRemove(name, opts) {
|
|
|
3720
3867
|
await reconcileAndReport(projectDir, editor.getPlugins());
|
|
3721
3868
|
}
|
|
3722
3869
|
async function runList(opts) {
|
|
3723
|
-
const projectDir =
|
|
3870
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
3724
3871
|
const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
|
|
3725
3872
|
const config = resolveSkWorkspaceConfig2(projectDir);
|
|
3726
3873
|
const declared = config.plugins ?? [];
|
|
@@ -3735,7 +3882,7 @@ async function runList(opts) {
|
|
|
3735
3882
|
const registry = createPluginRegistry();
|
|
3736
3883
|
if (declared.length > 0) {
|
|
3737
3884
|
try {
|
|
3738
|
-
const { loadPlugins } = await import('../plugin-store-
|
|
3885
|
+
const { loadPlugins } = await import('../plugin-store-GL5VKYUA.js');
|
|
3739
3886
|
const result = await loadPlugins(projectDir, declared, registry);
|
|
3740
3887
|
for (const f of result.failed) logWarn(f.error);
|
|
3741
3888
|
} catch (err) {
|
|
@@ -3774,7 +3921,7 @@ function makePresetCommand() {
|
|
|
3774
3921
|
cmd.command("init [name]").description("Scaffold a new .preset.yaml file").option("--dir <path>", "Output directory", process.cwd()).action(async (name, opts) => {
|
|
3775
3922
|
const presetName = name ?? "my-preset";
|
|
3776
3923
|
const filename = `${presetName}.preset.yaml`;
|
|
3777
|
-
const outPath =
|
|
3924
|
+
const outPath = path15__default.join(path15__default.resolve(opts.dir), filename);
|
|
3778
3925
|
if (existsSync(outPath)) {
|
|
3779
3926
|
logErr(`File already exists: ${outPath}`);
|
|
3780
3927
|
logInfo("Choose a different name or remove the existing file.");
|
|
@@ -3788,7 +3935,7 @@ function makePresetCommand() {
|
|
|
3788
3935
|
logInfo(` skaile preset validate ${filename}`);
|
|
3789
3936
|
});
|
|
3790
3937
|
cmd.command("validate <path>").description("Validate a preset YAML file (schema + cycles + nesting depth)").action(async (filePath) => {
|
|
3791
|
-
const resolved =
|
|
3938
|
+
const resolved = path15__default.resolve(filePath);
|
|
3792
3939
|
if (!existsSync(resolved)) {
|
|
3793
3940
|
logErr(`File not found: ${resolved}`);
|
|
3794
3941
|
process.exit(1);
|
|
@@ -3814,7 +3961,7 @@ function makePresetCommand() {
|
|
|
3814
3961
|
logInfo(`Nested preset refs: ${nestedRefs.length} (depth validated at apply-time)`);
|
|
3815
3962
|
}
|
|
3816
3963
|
const { detectCycles } = await import('../discovery/index.js');
|
|
3817
|
-
const presetRef =
|
|
3964
|
+
const presetRef = path15__default.basename(resolved, ".preset.yaml");
|
|
3818
3965
|
const edges = [];
|
|
3819
3966
|
for (const item of preset.items) {
|
|
3820
3967
|
if (item.ref) {
|
|
@@ -3946,8 +4093,8 @@ function makeInstallCommand() {
|
|
|
3946
4093
|
const spinner6 = p5.spinner();
|
|
3947
4094
|
spinner6.start(`Installing ${ref}`);
|
|
3948
4095
|
try {
|
|
3949
|
-
const { openCatalogSource: openCatalogSource2, openLibrary: openLibrary2 } = await import('../open-library-
|
|
3950
|
-
const catalog = await openCatalogSource2({ projectDir:
|
|
4096
|
+
const { openCatalogSource: openCatalogSource2, openLibrary: openLibrary2 } = await import('../open-library-I7YTADMD.js');
|
|
4097
|
+
const catalog = await openCatalogSource2({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
3951
4098
|
if (!supportsInstallManifest(catalog)) {
|
|
3952
4099
|
throw new Error(
|
|
3953
4100
|
"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."
|
|
@@ -3976,9 +4123,9 @@ function makeInstallCommand() {
|
|
|
3976
4123
|
}
|
|
3977
4124
|
return;
|
|
3978
4125
|
}
|
|
3979
|
-
const projectDir =
|
|
4126
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
3980
4127
|
try {
|
|
3981
|
-
const { ensureSourcesCloned } = await import('../ensure-sources-
|
|
4128
|
+
const { ensureSourcesCloned } = await import('../ensure-sources-KQQEUDKM.js');
|
|
3982
4129
|
const hydrate = ensureSourcesCloned(projectDir, { quiet: true });
|
|
3983
4130
|
if (hydrate.cloned.length > 0) {
|
|
3984
4131
|
logOk(`Cloned source(s): ${hydrate.cloned.join(", ")}`);
|
|
@@ -4024,7 +4171,7 @@ function makeInstallCommand() {
|
|
|
4024
4171
|
}
|
|
4025
4172
|
function makeCheckCommand() {
|
|
4026
4173
|
return new Command("check").description("Check for unmet requirements").option("--project-dir <path>", "Project directory", process.cwd()).action((opts) => {
|
|
4027
|
-
const am2 = new AssetManager({ projectDir:
|
|
4174
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
4028
4175
|
const issues = am2.doctor();
|
|
4029
4176
|
if (issues.length === 0) {
|
|
4030
4177
|
logOk("All dependencies satisfied.");
|
|
@@ -4041,10 +4188,10 @@ function makeCheckCommand() {
|
|
|
4041
4188
|
function makeCleanCommand() {
|
|
4042
4189
|
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) => {
|
|
4043
4190
|
const am2 = new AssetManager({
|
|
4044
|
-
projectDir:
|
|
4191
|
+
projectDir: path15__default.resolve(opts.projectDir),
|
|
4045
4192
|
driverTarget: opts.target
|
|
4046
4193
|
});
|
|
4047
|
-
const lock = readLock(
|
|
4194
|
+
const lock = readLock(path15__default.resolve(opts.projectDir, "skaile.lock.yaml"));
|
|
4048
4195
|
if (!lock || Object.keys(lock.assets).length === 0) {
|
|
4049
4196
|
logInfo("Nothing to clean (no skaile-managed assets found).");
|
|
4050
4197
|
return;
|
|
@@ -4097,14 +4244,14 @@ function makeCleanCommand() {
|
|
|
4097
4244
|
}
|
|
4098
4245
|
function makeRebuildCommand() {
|
|
4099
4246
|
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) => {
|
|
4100
|
-
const projectDir =
|
|
4247
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
4101
4248
|
let agentDir;
|
|
4102
4249
|
if (agentArg) {
|
|
4103
4250
|
if (agentArg.includes("/") || agentArg.includes("\\")) {
|
|
4104
|
-
agentDir =
|
|
4251
|
+
agentDir = path15__default.resolve(projectDir, agentArg);
|
|
4105
4252
|
} else {
|
|
4106
4253
|
const resolved = resolveAgentDir(projectDir);
|
|
4107
|
-
agentDir = resolved ??
|
|
4254
|
+
agentDir = resolved ?? path15__default.resolve(projectDir, agentArg);
|
|
4108
4255
|
}
|
|
4109
4256
|
} else {
|
|
4110
4257
|
const resolved = resolveAgentDir(projectDir);
|
|
@@ -4182,19 +4329,19 @@ function makeFlowEventHandler() {
|
|
|
4182
4329
|
}
|
|
4183
4330
|
function makeRunCommand() {
|
|
4184
4331
|
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) => {
|
|
4185
|
-
const projectDir =
|
|
4332
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
4186
4333
|
const cliDriver = opts.driver;
|
|
4187
4334
|
const dryRun = opts.dryRun ?? false;
|
|
4188
4335
|
let flowId = positional[0];
|
|
4189
4336
|
if (!flowId) {
|
|
4190
|
-
const
|
|
4191
|
-
if (
|
|
4337
|
+
const flows = discoverFlows();
|
|
4338
|
+
if (flows.length === 0) {
|
|
4192
4339
|
logErr("No flows available.");
|
|
4193
4340
|
process.exit(1);
|
|
4194
4341
|
}
|
|
4195
4342
|
const selected = await p5.select({
|
|
4196
4343
|
message: "Select a flow to run",
|
|
4197
|
-
options:
|
|
4344
|
+
options: flows.map((f) => ({
|
|
4198
4345
|
value: f.id,
|
|
4199
4346
|
label: f.name,
|
|
4200
4347
|
hint: f.description
|
|
@@ -4214,13 +4361,25 @@ function makeRunCommand() {
|
|
|
4214
4361
|
const driver = config.driver ?? "omp";
|
|
4215
4362
|
const model = config.model;
|
|
4216
4363
|
const provider = config.provider;
|
|
4217
|
-
const
|
|
4218
|
-
|
|
4219
|
-
|
|
4364
|
+
const priorityRoots = [];
|
|
4365
|
+
let dir = projectDir;
|
|
4366
|
+
for (let i = 0; i < 6; i++) {
|
|
4367
|
+
const candidate = path15__default.join(dir, "ai-assets");
|
|
4368
|
+
if (fs11__default.existsSync(candidate)) {
|
|
4369
|
+
priorityRoots.push(candidate);
|
|
4370
|
+
break;
|
|
4371
|
+
}
|
|
4372
|
+
dir = path15__default.dirname(dir);
|
|
4373
|
+
}
|
|
4374
|
+
const flowPath = findFlowFile(flowId, priorityRoots);
|
|
4375
|
+
if (!flowPath) {
|
|
4220
4376
|
const textPrompt = positional.join(" ");
|
|
4221
4377
|
if (!textPrompt.trim()) {
|
|
4222
4378
|
logErr(`Flow not found: ${flowId}`);
|
|
4223
|
-
|
|
4379
|
+
const available = discoverFlows().map((f) => f.id);
|
|
4380
|
+
if (available.length > 0) {
|
|
4381
|
+
console.log(` ${S.dim("Available:")} ${available.map((id) => S.cmd(id)).join(", ")}`);
|
|
4382
|
+
}
|
|
4224
4383
|
process.exit(1);
|
|
4225
4384
|
}
|
|
4226
4385
|
await runAgentChat({
|
|
@@ -4233,43 +4392,13 @@ function makeRunCommand() {
|
|
|
4233
4392
|
});
|
|
4234
4393
|
return;
|
|
4235
4394
|
}
|
|
4236
|
-
let
|
|
4237
|
-
|
|
4238
|
-
|
|
4239
|
-
|
|
4240
|
-
|
|
4241
|
-
|
|
4242
|
-
|
|
4243
|
-
if (fs10__default.existsSync(p_)) {
|
|
4244
|
-
flowPath = p_;
|
|
4245
|
-
break;
|
|
4246
|
-
}
|
|
4247
|
-
const legacy = path14__default.join(candidate, domain, "flows", `${flowId}.json`);
|
|
4248
|
-
if (fs10__default.existsSync(legacy)) {
|
|
4249
|
-
flowPath = legacy;
|
|
4250
|
-
break;
|
|
4251
|
-
}
|
|
4252
|
-
}
|
|
4253
|
-
break;
|
|
4254
|
-
}
|
|
4255
|
-
dir = path14__default.dirname(dir);
|
|
4256
|
-
}
|
|
4257
|
-
if (!flowPath) {
|
|
4258
|
-
for (const domain of fs10__default.readdirSync(AI_RESOURCES)) {
|
|
4259
|
-
const p_ = path14__default.join(AI_RESOURCES, domain, "flows", `${flowId}.flow.yaml`);
|
|
4260
|
-
if (fs10__default.existsSync(p_)) {
|
|
4261
|
-
flowPath = p_;
|
|
4262
|
-
break;
|
|
4263
|
-
}
|
|
4264
|
-
const legacy = path14__default.join(AI_RESOURCES, domain, "flows", `${flowId}.json`);
|
|
4265
|
-
if (fs10__default.existsSync(legacy)) {
|
|
4266
|
-
flowPath = legacy;
|
|
4267
|
-
break;
|
|
4268
|
-
}
|
|
4269
|
-
}
|
|
4270
|
-
}
|
|
4271
|
-
if (!flowPath) {
|
|
4272
|
-
logErr(`Could not locate flow file for: ${flowId}`);
|
|
4395
|
+
let flow;
|
|
4396
|
+
try {
|
|
4397
|
+
flow = loadFlow(flowPath);
|
|
4398
|
+
} catch (err) {
|
|
4399
|
+
logErr(
|
|
4400
|
+
`Failed to load flow "${flowId}": ${err instanceof Error ? err.message : String(err)}`
|
|
4401
|
+
);
|
|
4273
4402
|
process.exit(1);
|
|
4274
4403
|
}
|
|
4275
4404
|
console.log();
|
|
@@ -4295,7 +4424,7 @@ function makeRunCommand() {
|
|
|
4295
4424
|
}
|
|
4296
4425
|
function makeResumeCommand() {
|
|
4297
4426
|
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) => {
|
|
4298
|
-
const projectDir =
|
|
4427
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
4299
4428
|
const sessionId = opts.session;
|
|
4300
4429
|
const dryRun = opts.dryRun ?? false;
|
|
4301
4430
|
const session = sessionId ? await loadSessionById(projectDir, sessionId) : await loadSession(projectDir);
|
|
@@ -4322,7 +4451,7 @@ function makeResumeCommand() {
|
|
|
4322
4451
|
}
|
|
4323
4452
|
function makeStatusCommand() {
|
|
4324
4453
|
return new Command("status").description("Show current session state").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
|
|
4325
|
-
const projectDir =
|
|
4454
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
4326
4455
|
const session = await loadSession(projectDir);
|
|
4327
4456
|
if (!session) {
|
|
4328
4457
|
logInfo("No active session.");
|
|
@@ -4347,7 +4476,7 @@ function makeStatusCommand() {
|
|
|
4347
4476
|
}
|
|
4348
4477
|
function makeClearCommand() {
|
|
4349
4478
|
return new Command("clear").description("Unset current session pointer").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
|
|
4350
|
-
const projectDir =
|
|
4479
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
4351
4480
|
await clearSession(projectDir);
|
|
4352
4481
|
logOk("Session cleared.");
|
|
4353
4482
|
});
|
|
@@ -4357,7 +4486,7 @@ function makeReplCommand() {
|
|
|
4357
4486
|
const { findWorkspaceRoot: findWorkspaceRoot2 } = await import('../core/index.js');
|
|
4358
4487
|
const { startRepl } = await import('../tui/index.js');
|
|
4359
4488
|
const os = await import('os');
|
|
4360
|
-
const userCwd =
|
|
4489
|
+
const userCwd = path15__default.resolve(opts.projectDir ?? process.cwd());
|
|
4361
4490
|
const workspaceRoot = findWorkspaceRoot2(userCwd);
|
|
4362
4491
|
let projectDir;
|
|
4363
4492
|
let agentCwd;
|
|
@@ -4379,13 +4508,13 @@ function makeReplCommand() {
|
|
|
4379
4508
|
p5.cancel("Cancelled.");
|
|
4380
4509
|
process.exit(0);
|
|
4381
4510
|
}
|
|
4382
|
-
const tmpDir =
|
|
4511
|
+
const tmpDir = fs11__default.mkdtempSync(path15__default.join(os.tmpdir(), "skaile-repl-"));
|
|
4383
4512
|
projectDir = tmpDir;
|
|
4384
4513
|
agentCwd = userCwd;
|
|
4385
4514
|
logOk(`Temporary workspace: ${S.cmd(tmpDir)}`);
|
|
4386
4515
|
if (!driverOverride) {
|
|
4387
|
-
const claudeDir =
|
|
4388
|
-
if (
|
|
4516
|
+
const claudeDir = path15__default.join(os.homedir(), ".claude");
|
|
4517
|
+
if (fs11__default.existsSync(claudeDir)) {
|
|
4389
4518
|
driverOverride = "claude-sdk";
|
|
4390
4519
|
logInfo(`Detected ${S.cmd("~/.claude")} \u2192 using ${S.cmd("claude-sdk")} backend`);
|
|
4391
4520
|
} else {
|
|
@@ -4431,12 +4560,12 @@ function makeServeCommand() {
|
|
|
4431
4560
|
);
|
|
4432
4561
|
}
|
|
4433
4562
|
async function ensurePluginsLoadedForServe(projectDir) {
|
|
4434
|
-
const { logInfo: logInfo2, logWarn: logWarn2 } = await import('../helpers-
|
|
4563
|
+
const { logInfo: logInfo2, logWarn: logWarn2 } = await import('../helpers-F4NZ66VD.js');
|
|
4435
4564
|
try {
|
|
4436
4565
|
const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
|
|
4437
4566
|
const config = resolveSkWorkspaceConfig2(projectDir);
|
|
4438
4567
|
if (!config.plugins || config.plugins.length === 0) return;
|
|
4439
|
-
const { ensurePluginsLoaded } = await import('../plugin-store-
|
|
4568
|
+
const { ensurePluginsLoaded } = await import('../plugin-store-GL5VKYUA.js');
|
|
4440
4569
|
const { pluginRegistry } = await import('../plugin-registry/index.js');
|
|
4441
4570
|
const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
|
|
4442
4571
|
if (result.loaded.length > 0) {
|
|
@@ -4450,14 +4579,14 @@ async function ensurePluginsLoadedForServe(projectDir) {
|
|
|
4450
4579
|
}
|
|
4451
4580
|
}
|
|
4452
4581
|
async function runCompileTest(opts) {
|
|
4453
|
-
const { logOk: logOk2, logErr: logErr2, logInfo: logInfo2, S: S2 } = await import('../helpers-
|
|
4582
|
+
const { logOk: logOk2, logErr: logErr2, logInfo: logInfo2, S: S2 } = await import('../helpers-F4NZ66VD.js');
|
|
4454
4583
|
const { tmpdir } = await import('os');
|
|
4455
4584
|
const { dirname: dirname3, join: join5, resolve: resolve4 } = await import('path');
|
|
4456
4585
|
const { fileURLToPath: fileURLToPath2 } = await import('url');
|
|
4457
4586
|
const { unlinkSync, existsSync: existsSync12 } = await import('fs');
|
|
4458
4587
|
const { spawn } = await import('child_process');
|
|
4459
4588
|
const { portableSpawnSync: portableSpawnSync2 } = await import('../core/index.js');
|
|
4460
|
-
const { MONOREPO_ROOT } = await import('../paths-
|
|
4589
|
+
const { MONOREPO_ROOT } = await import('../paths-CE66L3AL.js');
|
|
4461
4590
|
if (MONOREPO_ROOT === null) {
|
|
4462
4591
|
logErr2("--compile-test is only available inside the skaile-dev workspace.");
|
|
4463
4592
|
logInfo2("Run it from a checkout of skaile-ai/skaile-dev (the monorepo shell).");
|
|
@@ -4927,7 +5056,7 @@ function resolveMode(opts) {
|
|
|
4927
5056
|
if (opts.forceLocal && opts.forceRemote) {
|
|
4928
5057
|
throw new Error("Cannot use both --local and --remote");
|
|
4929
5058
|
}
|
|
4930
|
-
const startDir =
|
|
5059
|
+
const startDir = path15__default.resolve(opts.projectDir ?? process.cwd());
|
|
4931
5060
|
const localDb = findLogsDb(startDir);
|
|
4932
5061
|
if (opts.forceLocal) {
|
|
4933
5062
|
if (!localDb) {
|
|
@@ -4960,14 +5089,14 @@ function resolveMode(opts) {
|
|
|
4960
5089
|
function findLogsDb(startDir) {
|
|
4961
5090
|
let dir = startDir;
|
|
4962
5091
|
for (let i = 0; i < MAX_WALK_LEVELS; i++) {
|
|
4963
|
-
const candidate =
|
|
5092
|
+
const candidate = path15__default.join(dir, ".skaile", "logs.db");
|
|
4964
5093
|
if (existsSync(candidate)) {
|
|
4965
5094
|
try {
|
|
4966
5095
|
if (statSync(candidate).isFile()) return candidate;
|
|
4967
5096
|
} catch {
|
|
4968
5097
|
}
|
|
4969
5098
|
}
|
|
4970
|
-
const parent =
|
|
5099
|
+
const parent = path15__default.dirname(dir);
|
|
4971
5100
|
if (parent === dir) return void 0;
|
|
4972
5101
|
dir = parent;
|
|
4973
5102
|
}
|
|
@@ -4993,7 +5122,7 @@ function readApiToken() {
|
|
|
4993
5122
|
}
|
|
4994
5123
|
function readGlobalSettings() {
|
|
4995
5124
|
try {
|
|
4996
|
-
const settingsPath =
|
|
5125
|
+
const settingsPath = path15__default.join(homedir(), ".skaile", "settings.json");
|
|
4997
5126
|
if (!existsSync(settingsPath)) return {};
|
|
4998
5127
|
return JSON.parse(readFileSync(settingsPath, "utf8"));
|
|
4999
5128
|
} catch {
|
|
@@ -5141,7 +5270,7 @@ function parsePositiveInt(value, flag) {
|
|
|
5141
5270
|
function makeSessionCommand() {
|
|
5142
5271
|
const cmd = new Command("session").description("Manage sessions");
|
|
5143
5272
|
cmd.command("list").description("List all sessions for a project").option("--project-dir <path>", "Project directory", process.cwd()).action(async (opts) => {
|
|
5144
|
-
const projectDir =
|
|
5273
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
5145
5274
|
const sessions = await listSessions(projectDir);
|
|
5146
5275
|
const current = await loadSession(projectDir);
|
|
5147
5276
|
if (sessions.length === 0) {
|
|
@@ -5169,7 +5298,7 @@ function makeSessionCommand() {
|
|
|
5169
5298
|
console.log();
|
|
5170
5299
|
});
|
|
5171
5300
|
cmd.command("show <run-id>").description("Show a specific session").option("--project-dir <path>", "Project directory", process.cwd()).action(async (runId, opts) => {
|
|
5172
|
-
const projectDir =
|
|
5301
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
5173
5302
|
const session = await loadSessionById(projectDir, runId);
|
|
5174
5303
|
if (!session) {
|
|
5175
5304
|
logErr(`Session not found: ${runId}`);
|
|
@@ -5178,12 +5307,12 @@ function makeSessionCommand() {
|
|
|
5178
5307
|
console.log(JSON.stringify(session, null, 2));
|
|
5179
5308
|
});
|
|
5180
5309
|
cmd.command("switch <run-id>").description("Switch the current session").option("--project-dir <path>", "Project directory", process.cwd()).action(async (runId, opts) => {
|
|
5181
|
-
const projectDir =
|
|
5310
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
5182
5311
|
await setCurrentSession(projectDir, runId);
|
|
5183
5312
|
logOk(`Switched to session: ${S.dim(runId.slice(0, 8))}`);
|
|
5184
5313
|
});
|
|
5185
5314
|
cmd.command("delete <run-id>").description("Delete a session").option("--project-dir <path>", "Project directory", process.cwd()).action(async (runId, opts) => {
|
|
5186
|
-
const projectDir =
|
|
5315
|
+
const projectDir = path15__default.resolve(opts.projectDir);
|
|
5187
5316
|
await deleteSession(projectDir, runId);
|
|
5188
5317
|
logOk(`Deleted session: ${S.dim(runId.slice(0, 8))}`);
|
|
5189
5318
|
});
|
|
@@ -5232,12 +5361,12 @@ function showOverview(am2) {
|
|
|
5232
5361
|
}
|
|
5233
5362
|
function showAsset(am2, kind, name) {
|
|
5234
5363
|
const entry = am2.info(`${kind}:${name}`);
|
|
5235
|
-
if (entry?.source &&
|
|
5364
|
+
if (entry?.source && fs11__default.existsSync(entry.source)) {
|
|
5236
5365
|
console.log();
|
|
5237
5366
|
console.log(` ${kindColor(entry.kind)} ${S.heading(entry.name)}`);
|
|
5238
5367
|
console.log(` ${S.rule(40)}`);
|
|
5239
5368
|
console.log();
|
|
5240
|
-
console.log(
|
|
5369
|
+
console.log(fs11__default.readFileSync(entry.source, "utf-8"));
|
|
5241
5370
|
return;
|
|
5242
5371
|
}
|
|
5243
5372
|
logErr(`Asset not found: ${kind}:${name}`);
|
|
@@ -5246,7 +5375,7 @@ function showAsset(am2, kind, name) {
|
|
|
5246
5375
|
function makeShowCommand() {
|
|
5247
5376
|
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) => {
|
|
5248
5377
|
const am2 = new AssetManager({
|
|
5249
|
-
projectDir:
|
|
5378
|
+
projectDir: path15__default.resolve(opts.projectDir),
|
|
5250
5379
|
driverTarget: opts.target
|
|
5251
5380
|
});
|
|
5252
5381
|
if (!kind) {
|
|
@@ -5284,10 +5413,10 @@ function addSourceManifestCommands(src) {
|
|
|
5284
5413
|
|
|
5285
5414
|
// cli/src/commands/source.ts
|
|
5286
5415
|
function sourcesDir() {
|
|
5287
|
-
return
|
|
5416
|
+
return path15.join(skaileHomeDir(), "sources");
|
|
5288
5417
|
}
|
|
5289
5418
|
function sourceClonePath(name) {
|
|
5290
|
-
return
|
|
5419
|
+
return path15.join(sourcesDir(), name);
|
|
5291
5420
|
}
|
|
5292
5421
|
function deriveSlug(url) {
|
|
5293
5422
|
return url.replace(/\.git$/, "").split(/[/:]/).pop() ?? "source";
|
|
@@ -5308,7 +5437,7 @@ function requireProjectYamlPath() {
|
|
|
5308
5437
|
);
|
|
5309
5438
|
process.exit(1);
|
|
5310
5439
|
}
|
|
5311
|
-
return
|
|
5440
|
+
return path15.join(root, workspaceConfigFilename());
|
|
5312
5441
|
}
|
|
5313
5442
|
function readProjectSources(yamlPath) {
|
|
5314
5443
|
if (!existsSync(yamlPath)) return [];
|
|
@@ -5406,7 +5535,7 @@ function makeSourceCommand() {
|
|
|
5406
5535
|
const result = await refreshManifestCache(entry, opts.dev);
|
|
5407
5536
|
logOk(`Indexed ${result.assetsUpdated} of ${result.assetsFound} asset(s) from "${slug}".`);
|
|
5408
5537
|
for (const err of result.errors) logWarn(err);
|
|
5409
|
-
logOk(`Source "${slug}" registered in ${
|
|
5538
|
+
logOk(`Source "${slug}" registered in ${path15.relative(process.cwd(), yamlPath)}.`);
|
|
5410
5539
|
}
|
|
5411
5540
|
);
|
|
5412
5541
|
cmd.command("list").description("List sources registered in this project's skaile.yaml").option("--json", "Output as JSON").action(async (opts) => {
|
|
@@ -5673,7 +5802,7 @@ function printTree(node, prefix = "", isLast = true) {
|
|
|
5673
5802
|
}
|
|
5674
5803
|
function makeTreeCommand() {
|
|
5675
5804
|
return new Command("tree").description("Show full dependency tree").option("--project-dir <path>", "Project directory", process.cwd()).action((opts) => {
|
|
5676
|
-
const am2 = new AssetManager({ projectDir:
|
|
5805
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
5677
5806
|
const root = am2.tree();
|
|
5678
5807
|
if (root.children.length === 0) {
|
|
5679
5808
|
logInfo("No dependencies in lock file. Run `skaile install` first.");
|
|
@@ -5691,7 +5820,7 @@ function makeUpdateCommand() {
|
|
|
5691
5820
|
try {
|
|
5692
5821
|
const catalogSpinner = p5.spinner();
|
|
5693
5822
|
catalogSpinner.start("Refreshing catalog cache");
|
|
5694
|
-
const remote = await openCatalogSource({ projectDir:
|
|
5823
|
+
const remote = await openCatalogSource({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
5695
5824
|
const result2 = await remote.refresh();
|
|
5696
5825
|
catalogSpinner.stop(
|
|
5697
5826
|
`Catalog refreshed: ${S.heading(String(result2.assetsCached))} assets cached`
|
|
@@ -5703,7 +5832,7 @@ function makeUpdateCommand() {
|
|
|
5703
5832
|
}
|
|
5704
5833
|
}
|
|
5705
5834
|
if (opts.catalogOnly) return;
|
|
5706
|
-
const am2 = new AssetManager({ projectDir:
|
|
5835
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
5707
5836
|
const spinner5 = p5.spinner();
|
|
5708
5837
|
spinner5.start("Re-deploying assets");
|
|
5709
5838
|
const result = await am2.install();
|
|
@@ -5737,12 +5866,12 @@ function findManifestCandidates(rootPath) {
|
|
|
5737
5866
|
function walk(dir) {
|
|
5738
5867
|
let entries;
|
|
5739
5868
|
try {
|
|
5740
|
-
entries =
|
|
5869
|
+
entries = fs11__default.readdirSync(dir, { withFileTypes: true });
|
|
5741
5870
|
} catch {
|
|
5742
5871
|
return;
|
|
5743
5872
|
}
|
|
5744
5873
|
for (const entry of entries) {
|
|
5745
|
-
const fullPath =
|
|
5874
|
+
const fullPath = path15__default.join(dir, entry.name);
|
|
5746
5875
|
if (entry.isDirectory()) {
|
|
5747
5876
|
if (!SKIP_DIRS.has(entry.name)) walk(fullPath);
|
|
5748
5877
|
} else if (entry.isFile()) {
|
|
@@ -5783,8 +5912,8 @@ function checkManifestIdentity(kind, parsed) {
|
|
|
5783
5912
|
return null;
|
|
5784
5913
|
}
|
|
5785
5914
|
function validateManifests(rootPath) {
|
|
5786
|
-
const absRoot =
|
|
5787
|
-
if (!
|
|
5915
|
+
const absRoot = path15__default.resolve(rootPath);
|
|
5916
|
+
if (!fs11__default.existsSync(absRoot)) {
|
|
5788
5917
|
logErr(`Path does not exist: ${absRoot}`);
|
|
5789
5918
|
return { total: 0, errors: 1, warnings: 0 };
|
|
5790
5919
|
}
|
|
@@ -5793,7 +5922,7 @@ function validateManifests(rootPath) {
|
|
|
5793
5922
|
let errors = 0;
|
|
5794
5923
|
let warnings = 0;
|
|
5795
5924
|
for (const c of candidates) {
|
|
5796
|
-
const content =
|
|
5925
|
+
const content = fs11__default.readFileSync(c.filePath, "utf-8");
|
|
5797
5926
|
let parsed;
|
|
5798
5927
|
if (c.filePath.endsWith(".md")) {
|
|
5799
5928
|
parsed = parseMdFrontmatter(content);
|
|
@@ -5804,13 +5933,13 @@ function validateManifests(rootPath) {
|
|
|
5804
5933
|
try {
|
|
5805
5934
|
parsed = c.filePath.endsWith(".json") ? JSON.parse(content) : parse(content);
|
|
5806
5935
|
} catch (e) {
|
|
5807
|
-
const relPath2 =
|
|
5936
|
+
const relPath2 = path15__default.relative(absRoot, c.filePath);
|
|
5808
5937
|
logErr(`${relPath2} \u2014 parse error: ${e instanceof Error ? e.message : String(e)}`);
|
|
5809
5938
|
errors++;
|
|
5810
5939
|
continue;
|
|
5811
5940
|
}
|
|
5812
5941
|
}
|
|
5813
|
-
const relPath =
|
|
5942
|
+
const relPath = path15__default.relative(absRoot, c.filePath);
|
|
5814
5943
|
const identityError = checkManifestIdentity(c.kind, parsed);
|
|
5815
5944
|
if (identityError) {
|
|
5816
5945
|
logErr(`${relPath} [${c.kind}] \u2014 ${identityError}`);
|
|
@@ -5837,12 +5966,12 @@ function findWorkspaceManifests(rootPath) {
|
|
|
5837
5966
|
function walk(dir) {
|
|
5838
5967
|
let entries;
|
|
5839
5968
|
try {
|
|
5840
|
-
entries =
|
|
5969
|
+
entries = fs11__default.readdirSync(dir, { withFileTypes: true });
|
|
5841
5970
|
} catch {
|
|
5842
5971
|
return;
|
|
5843
5972
|
}
|
|
5844
5973
|
for (const entry of entries) {
|
|
5845
|
-
const full =
|
|
5974
|
+
const full = path15__default.join(dir, entry.name);
|
|
5846
5975
|
if (entry.isDirectory()) {
|
|
5847
5976
|
if (!SKIP_DIRS.has(entry.name)) walk(full);
|
|
5848
5977
|
} else if (entry.isFile() && /(^|\.)skaile\.yaml$/.test(entry.name)) {
|
|
@@ -5854,14 +5983,14 @@ function findWorkspaceManifests(rootPath) {
|
|
|
5854
5983
|
return out;
|
|
5855
5984
|
}
|
|
5856
5985
|
function validateWorkspaceManifests(rootPath) {
|
|
5857
|
-
const absRoot =
|
|
5986
|
+
const absRoot = path15__default.resolve(rootPath);
|
|
5858
5987
|
const files = findWorkspaceManifests(absRoot);
|
|
5859
5988
|
let errors = 0;
|
|
5860
5989
|
for (const file of files) {
|
|
5861
|
-
const relPath =
|
|
5990
|
+
const relPath = path15__default.relative(absRoot, file);
|
|
5862
5991
|
let parsed;
|
|
5863
5992
|
try {
|
|
5864
|
-
parsed = parse(
|
|
5993
|
+
parsed = parse(fs11__default.readFileSync(file, "utf-8")) ?? {};
|
|
5865
5994
|
} catch (e) {
|
|
5866
5995
|
logErr(`${relPath} \u2014 parse error: ${e instanceof Error ? e.message : String(e)}`);
|
|
5867
5996
|
errors++;
|
|
@@ -5914,24 +6043,24 @@ function validateWorkspaceManifests(rootPath) {
|
|
|
5914
6043
|
var EXCLUDED_DOMAINS = /* @__PURE__ */ new Set(["skaileup-shared", "external", "docs"]);
|
|
5915
6044
|
function collectAssetVersions() {
|
|
5916
6045
|
const assets = [];
|
|
5917
|
-
if (!
|
|
5918
|
-
const domains =
|
|
6046
|
+
if (!fs11__default.existsSync(AI_RESOURCES)) return assets;
|
|
6047
|
+
const domains = fs11__default.readdirSync(AI_RESOURCES, { withFileTypes: true }).filter((d) => d.isDirectory() && !EXCLUDED_DOMAINS.has(d.name));
|
|
5919
6048
|
for (const d of domains) {
|
|
5920
|
-
const domainDir =
|
|
5921
|
-
const skillsDir =
|
|
5922
|
-
if (
|
|
6049
|
+
const domainDir = path15__default.join(AI_RESOURCES, d.name);
|
|
6050
|
+
const skillsDir = path15__default.join(domainDir, "skills");
|
|
6051
|
+
if (fs11__default.existsSync(skillsDir)) {
|
|
5923
6052
|
collectSkillVersions(skillsDir, d.name, assets);
|
|
5924
6053
|
}
|
|
5925
|
-
const agentsDir =
|
|
5926
|
-
if (
|
|
6054
|
+
const agentsDir = path15__default.join(domainDir, "agents");
|
|
6055
|
+
if (fs11__default.existsSync(agentsDir)) {
|
|
5927
6056
|
collectAgentVersions(agentsDir, d.name, assets);
|
|
5928
6057
|
}
|
|
5929
|
-
const flowsDir =
|
|
5930
|
-
if (
|
|
5931
|
-
for (const f of
|
|
6058
|
+
const flowsDir = path15__default.join(domainDir, "flows");
|
|
6059
|
+
if (fs11__default.existsSync(flowsDir)) {
|
|
6060
|
+
for (const f of fs11__default.readdirSync(flowsDir)) {
|
|
5932
6061
|
if (!f.endsWith(".flow.yaml")) continue;
|
|
5933
|
-
const fp =
|
|
5934
|
-
const content =
|
|
6062
|
+
const fp = path15__default.join(flowsDir, f);
|
|
6063
|
+
const content = fs11__default.readFileSync(fp, "utf-8");
|
|
5935
6064
|
const parsed = parse(content);
|
|
5936
6065
|
assets.push({
|
|
5937
6066
|
kind: "flow",
|
|
@@ -5942,12 +6071,12 @@ function collectAssetVersions() {
|
|
|
5942
6071
|
});
|
|
5943
6072
|
}
|
|
5944
6073
|
}
|
|
5945
|
-
const promptsDir =
|
|
5946
|
-
if (
|
|
5947
|
-
for (const f of
|
|
6074
|
+
const promptsDir = path15__default.join(domainDir, "prompts");
|
|
6075
|
+
if (fs11__default.existsSync(promptsDir)) {
|
|
6076
|
+
for (const f of fs11__default.readdirSync(promptsDir)) {
|
|
5948
6077
|
if (!f.endsWith(".prompt.md")) continue;
|
|
5949
|
-
const fp =
|
|
5950
|
-
const content =
|
|
6078
|
+
const fp = path15__default.join(promptsDir, f);
|
|
6079
|
+
const content = fs11__default.readFileSync(fp, "utf-8");
|
|
5951
6080
|
const fm = parseSkillFrontmatter(content);
|
|
5952
6081
|
assets.push({
|
|
5953
6082
|
kind: "prompt",
|
|
@@ -5962,12 +6091,12 @@ function collectAssetVersions() {
|
|
|
5962
6091
|
return assets;
|
|
5963
6092
|
}
|
|
5964
6093
|
function collectSkillVersions(dir, domain, out) {
|
|
5965
|
-
for (const entry of
|
|
6094
|
+
for (const entry of fs11__default.readdirSync(dir, { withFileTypes: true })) {
|
|
5966
6095
|
if (!entry.isDirectory()) continue;
|
|
5967
|
-
const full =
|
|
5968
|
-
const skillMd =
|
|
5969
|
-
if (
|
|
5970
|
-
const content =
|
|
6096
|
+
const full = path15__default.join(dir, entry.name);
|
|
6097
|
+
const skillMd = path15__default.join(full, "SKILL.md");
|
|
6098
|
+
if (fs11__default.existsSync(skillMd)) {
|
|
6099
|
+
const content = fs11__default.readFileSync(skillMd, "utf-8");
|
|
5971
6100
|
const fm = parseSkillFrontmatter(content);
|
|
5972
6101
|
out.push({
|
|
5973
6102
|
kind: "skill",
|
|
@@ -5982,11 +6111,11 @@ function collectSkillVersions(dir, domain, out) {
|
|
|
5982
6111
|
}
|
|
5983
6112
|
}
|
|
5984
6113
|
function collectAgentVersions(dir, domain, out) {
|
|
5985
|
-
for (const entry of
|
|
6114
|
+
for (const entry of fs11__default.readdirSync(dir, { withFileTypes: true })) {
|
|
5986
6115
|
if (!entry.isDirectory()) continue;
|
|
5987
|
-
const agentYaml =
|
|
5988
|
-
if (!
|
|
5989
|
-
const content =
|
|
6116
|
+
const agentYaml = path15__default.join(dir, entry.name, "agent.yaml");
|
|
6117
|
+
if (!fs11__default.existsSync(agentYaml)) continue;
|
|
6118
|
+
const content = fs11__default.readFileSync(agentYaml, "utf-8");
|
|
5990
6119
|
const parsed = parse(content);
|
|
5991
6120
|
out.push({
|
|
5992
6121
|
kind: "agent",
|
|
@@ -6015,7 +6144,7 @@ function makeValidateCommand() {
|
|
|
6015
6144
|
"Validate asset manifests, versions, and changelogs"
|
|
6016
6145
|
);
|
|
6017
6146
|
cmd.argument("[path]", "Path to asset repo or directory to validate", ".").action((targetPath) => {
|
|
6018
|
-
const absPath =
|
|
6147
|
+
const absPath = path15__default.resolve(targetPath);
|
|
6019
6148
|
logInfo(`Validating manifests in ${absPath}`);
|
|
6020
6149
|
const { total, errors } = validateManifests(absPath);
|
|
6021
6150
|
const ws = validateWorkspaceManifests(absPath);
|
|
@@ -6038,7 +6167,7 @@ function makeValidateCommand() {
|
|
|
6038
6167
|
encoding: "utf-8"
|
|
6039
6168
|
});
|
|
6040
6169
|
const changedFiles = new Set(
|
|
6041
|
-
diffOutput.trim().split("\n").filter(Boolean).map((f) =>
|
|
6170
|
+
diffOutput.trim().split("\n").filter(Boolean).map((f) => path15__default.resolve(AI_RESOURCES, f))
|
|
6042
6171
|
);
|
|
6043
6172
|
assets = assets.filter((a) => changedFiles.has(a.filePath));
|
|
6044
6173
|
} catch {
|
|
@@ -6060,7 +6189,7 @@ function makeValidateCommand() {
|
|
|
6060
6189
|
if (opts.changedOnly) {
|
|
6061
6190
|
for (const a of assets) {
|
|
6062
6191
|
if (!a.version) continue;
|
|
6063
|
-
const relPath =
|
|
6192
|
+
const relPath = path15__default.relative(AI_RESOURCES, a.filePath);
|
|
6064
6193
|
try {
|
|
6065
6194
|
const headContent = execSync(`git show HEAD:${relPath}`, {
|
|
6066
6195
|
cwd: AI_RESOURCES,
|
|
@@ -6083,7 +6212,7 @@ function makeValidateCommand() {
|
|
|
6083
6212
|
skillVersionMap.set(a.name, a.version);
|
|
6084
6213
|
}
|
|
6085
6214
|
for (const f of flows) {
|
|
6086
|
-
const content =
|
|
6215
|
+
const content = fs11__default.readFileSync(f.filePath, "utf-8");
|
|
6087
6216
|
const parsed = parse(content);
|
|
6088
6217
|
const nodes = (parsed?.nodes ?? []).filter((n) => n.type === "skill" && n.data?.version).map((n) => ({
|
|
6089
6218
|
nodeId: n.id,
|
|
@@ -6140,7 +6269,7 @@ function makeValidateCommand() {
|
|
|
6140
6269
|
let errors = 0;
|
|
6141
6270
|
for (const domain of modifiedDomains) {
|
|
6142
6271
|
const changelogModified = modifiedFiles.some(
|
|
6143
|
-
(f) => f === `${domain}/CHANGELOG.md` || f ===
|
|
6272
|
+
(f) => f === `${domain}/CHANGELOG.md` || f === path15__default.join(domain, "CHANGELOG.md")
|
|
6144
6273
|
);
|
|
6145
6274
|
if (changelogModified) {
|
|
6146
6275
|
logOk(`${domain}/CHANGELOG.md updated`);
|
|
@@ -6222,7 +6351,7 @@ function makeVerifyCommand() {
|
|
|
6222
6351
|
}
|
|
6223
6352
|
function makeWhyCommand() {
|
|
6224
6353
|
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) => {
|
|
6225
|
-
const am2 = new AssetManager({ projectDir:
|
|
6354
|
+
const am2 = new AssetManager({ projectDir: path15__default.resolve(opts.projectDir) });
|
|
6226
6355
|
const chain = am2.why(ref);
|
|
6227
6356
|
if (chain.length === 0) {
|
|
6228
6357
|
logErr(`${ref} not found in lock file. Run \`skaile install\` first.`);
|
|
@@ -6243,7 +6372,7 @@ function makeWhyCommand() {
|
|
|
6243
6372
|
var _defaultFormatHelp = Help.prototype.formatHelp;
|
|
6244
6373
|
var pkg = JSON.parse(
|
|
6245
6374
|
readFileSync(
|
|
6246
|
-
|
|
6375
|
+
path15__default.resolve(path15__default.dirname(fileURLToPath(import.meta.url)), "../../package.json"),
|
|
6247
6376
|
"utf-8"
|
|
6248
6377
|
)
|
|
6249
6378
|
);
|
|
@@ -6355,6 +6484,11 @@ Advanced:
|
|
|
6355
6484
|
`;
|
|
6356
6485
|
}
|
|
6357
6486
|
});
|
|
6487
|
+
var BACKEND_DEFAULTS = {
|
|
6488
|
+
"claude-code": { driver: "claude-sdk", provider: "anthropic", model: "claude-sonnet-4-6" },
|
|
6489
|
+
omp: { driver: "omp" },
|
|
6490
|
+
codex: { driver: "codex", provider: "openai" }
|
|
6491
|
+
};
|
|
6358
6492
|
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) => {
|
|
6359
6493
|
const { execSync: execSync3 } = await import('child_process');
|
|
6360
6494
|
const { existsSync: existsSync12, mkdirSync: mkdirSync3, readFileSync: readFileSync6, writeFileSync: writeFileSync2 } = await import('fs');
|
|
@@ -6368,25 +6502,26 @@ program.command("init [project-dir]").description("Initialize a project director
|
|
|
6368
6502
|
process.exitCode = 1;
|
|
6369
6503
|
return;
|
|
6370
6504
|
}
|
|
6371
|
-
const resolved =
|
|
6372
|
-
const projectName =
|
|
6505
|
+
const resolved = path15__default.resolve(projectDir ?? ".");
|
|
6506
|
+
const projectName = path15__default.basename(resolved);
|
|
6373
6507
|
const created = [];
|
|
6374
6508
|
if (!existsSync12(resolved)) {
|
|
6375
6509
|
mkdirSync3(resolved, { recursive: true });
|
|
6376
6510
|
created.push(".");
|
|
6377
6511
|
}
|
|
6378
|
-
const skaileDir =
|
|
6512
|
+
const skaileDir = path15__default.join(resolved, ".skaile");
|
|
6379
6513
|
if (!existsSync12(skaileDir)) {
|
|
6380
|
-
mkdirSync3(
|
|
6514
|
+
mkdirSync3(path15__default.join(skaileDir, "sessions"), { recursive: true });
|
|
6381
6515
|
created.push(".skaile/");
|
|
6382
6516
|
}
|
|
6383
|
-
const settingsPath =
|
|
6517
|
+
const settingsPath = path15__default.join(skaileDir, "settings.json");
|
|
6384
6518
|
if (!existsSync12(settingsPath)) {
|
|
6385
6519
|
writeFileSync2(settingsPath, "{}\n");
|
|
6386
6520
|
created.push(".skaile/settings.json");
|
|
6387
6521
|
}
|
|
6388
|
-
const wsConfigPath =
|
|
6522
|
+
const wsConfigPath = path15__default.join(resolved, "skaile.yaml");
|
|
6389
6523
|
if (!existsSync12(wsConfigPath)) {
|
|
6524
|
+
const backendDefaults = BACKEND_DEFAULTS[backend];
|
|
6390
6525
|
writeFileSync2(
|
|
6391
6526
|
wsConfigPath,
|
|
6392
6527
|
stringify({
|
|
@@ -6395,9 +6530,10 @@ program.command("init [project-dir]").description("Initialize a project director
|
|
|
6395
6530
|
"agent-config": {
|
|
6396
6531
|
default: {
|
|
6397
6532
|
agent: backend,
|
|
6398
|
-
provider
|
|
6399
|
-
|
|
6400
|
-
|
|
6533
|
+
// provider/model are omitted for backends that don't fix them (omp, codex).
|
|
6534
|
+
...backendDefaults.provider ? { provider: backendDefaults.provider } : {},
|
|
6535
|
+
...backendDefaults.model ? { model: backendDefaults.model } : {},
|
|
6536
|
+
driver: backendDefaults.driver,
|
|
6401
6537
|
max_turns: 200
|
|
6402
6538
|
}
|
|
6403
6539
|
}
|
|
@@ -6406,14 +6542,14 @@ program.command("init [project-dir]").description("Initialize a project director
|
|
|
6406
6542
|
created.push("skaile.yaml");
|
|
6407
6543
|
}
|
|
6408
6544
|
for (const dir of new Set(Object.values(DRIVER_TARGETS[backend].local))) {
|
|
6409
|
-
const full =
|
|
6545
|
+
const full = path15__default.join(resolved, dir);
|
|
6410
6546
|
if (!existsSync12(full)) {
|
|
6411
6547
|
mkdirSync3(full, { recursive: true });
|
|
6412
6548
|
created.push(`${dir}/`);
|
|
6413
6549
|
}
|
|
6414
6550
|
}
|
|
6415
6551
|
if (opts.git) {
|
|
6416
|
-
const gitignorePath =
|
|
6552
|
+
const gitignorePath = path15__default.join(resolved, ".gitignore");
|
|
6417
6553
|
const entries = ["node_modules/", ".skaile/sessions/", "*.log", ".env", ".env.local"];
|
|
6418
6554
|
const existing = existsSync12(gitignorePath) ? readFileSync6(gitignorePath, "utf-8") : "";
|
|
6419
6555
|
const have = new Set(existing.split("\n").map((l) => l.trim()));
|
|
@@ -6424,7 +6560,7 @@ program.command("init [project-dir]").description("Initialize a project director
|
|
|
6424
6560
|
`);
|
|
6425
6561
|
if (!existing) created.push(".gitignore");
|
|
6426
6562
|
}
|
|
6427
|
-
if (!existsSync12(
|
|
6563
|
+
if (!existsSync12(path15__default.join(resolved, ".git"))) {
|
|
6428
6564
|
try {
|
|
6429
6565
|
execSync3("git init", { cwd: resolved, stdio: "pipe" });
|
|
6430
6566
|
created.push(".git/");
|
|
@@ -6435,10 +6571,10 @@ program.command("init [project-dir]").description("Initialize a project director
|
|
|
6435
6571
|
}
|
|
6436
6572
|
}
|
|
6437
6573
|
try {
|
|
6438
|
-
const
|
|
6574
|
+
const fs12 = await import('fs');
|
|
6439
6575
|
const { userConfigPath, saveConfig, getConfigDefaults } = await import('../library/index.js');
|
|
6440
6576
|
const userCfgPath = userConfigPath();
|
|
6441
|
-
if (!
|
|
6577
|
+
if (!fs12.existsSync(userCfgPath)) {
|
|
6442
6578
|
const defaults = getConfigDefaults();
|
|
6443
6579
|
saveConfig(userCfgPath, {
|
|
6444
6580
|
catalog: { url: defaults.catalog.url, cache_ttl: defaults.catalog.cache_ttl }
|
|
@@ -6451,7 +6587,7 @@ program.command("init [project-dir]").description("Initialize a project director
|
|
|
6451
6587
|
);
|
|
6452
6588
|
}
|
|
6453
6589
|
try {
|
|
6454
|
-
const { ensureSourcesCloned } = await import('../ensure-sources-
|
|
6590
|
+
const { ensureSourcesCloned } = await import('../ensure-sources-KQQEUDKM.js');
|
|
6455
6591
|
const hydrate = ensureSourcesCloned(resolved, { quiet: true });
|
|
6456
6592
|
for (const n of hydrate.cloned) created.push(`~/.skaile/sources/${n}/`);
|
|
6457
6593
|
if (hydrate.failed.length > 0) {
|
|
@@ -6465,7 +6601,7 @@ program.command("init [project-dir]").description("Initialize a project director
|
|
|
6465
6601
|
logOk(`Initialized project at ${S.heading(resolved)}`);
|
|
6466
6602
|
console.log();
|
|
6467
6603
|
console.log(S.heading(" Next steps:"));
|
|
6468
|
-
const isCurrentDir = resolved ===
|
|
6604
|
+
const isCurrentDir = resolved === path15__default.resolve(".");
|
|
6469
6605
|
let step = 1;
|
|
6470
6606
|
if (!isCurrentDir) {
|
|
6471
6607
|
console.log(` ${S.dim(`${step}.`)} ${S.cmd(`cd ${projectDir}`)}`);
|
|
@@ -6477,7 +6613,7 @@ program.command("init [project-dir]").description("Initialize a project director
|
|
|
6477
6613
|
console.log();
|
|
6478
6614
|
});
|
|
6479
6615
|
program.command("setup").description("Interactive provider setup wizard").action(async () => {
|
|
6480
|
-
const { cmdSetup } = await import('../setup-
|
|
6616
|
+
const { cmdSetup } = await import('../setup-4YMN2BDU.js');
|
|
6481
6617
|
await cmdSetup([], { projectDir: process.cwd() });
|
|
6482
6618
|
});
|
|
6483
6619
|
program.addCommand(makeInstallCommand());
|