@better-openclaw/core 1.0.22 → 1.0.24
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/dist/bare-metal-partition.test.cjs +3 -4
- package/dist/bare-metal-partition.test.cjs.map +1 -1
- package/dist/bare-metal-partition.test.mjs +3 -4
- package/dist/bare-metal-partition.test.mjs.map +1 -1
- package/dist/composer.cjs +40 -14
- package/dist/composer.cjs.map +1 -1
- package/dist/composer.d.cts.map +1 -1
- package/dist/composer.d.mts.map +1 -1
- package/dist/composer.mjs +40 -14
- package/dist/composer.mjs.map +1 -1
- package/dist/composer.snapshot.test.cjs +1 -1
- package/dist/composer.snapshot.test.mjs +1 -1
- package/dist/composer.test.cjs +3 -2
- package/dist/composer.test.cjs.map +1 -1
- package/dist/composer.test.mjs +3 -2
- package/dist/composer.test.mjs.map +1 -1
- package/dist/deployers/strip-host-ports.test.cjs +1 -1
- package/dist/deployers/strip-host-ports.test.mjs +1 -1
- package/dist/generate.cjs +7 -2
- package/dist/generate.cjs.map +1 -1
- package/dist/generate.d.cts.map +1 -1
- package/dist/generate.d.mts.map +1 -1
- package/dist/generate.mjs +7 -2
- package/dist/generate.mjs.map +1 -1
- package/dist/generate.test.cjs +2 -2
- package/dist/generate.test.cjs.map +1 -1
- package/dist/generate.test.mjs +2 -2
- package/dist/generate.test.mjs.map +1 -1
- package/dist/generators/bare-metal-install.test.cjs +1 -1
- package/dist/generators/bare-metal-install.test.mjs +1 -1
- package/dist/generators/caddy.test.cjs +1 -1
- package/dist/generators/caddy.test.mjs +1 -1
- package/dist/generators/clone-repos.cjs +140 -0
- package/dist/generators/clone-repos.cjs.map +1 -0
- package/dist/generators/clone-repos.d.cts +11 -0
- package/dist/generators/clone-repos.d.cts.map +1 -0
- package/dist/generators/clone-repos.d.mts +11 -0
- package/dist/generators/clone-repos.d.mts.map +1 -0
- package/dist/generators/clone-repos.mjs +139 -0
- package/dist/generators/clone-repos.mjs.map +1 -0
- package/dist/generators/clone-repos.test.cjs +140 -0
- package/dist/generators/clone-repos.test.cjs.map +1 -0
- package/dist/generators/clone-repos.test.d.cts +1 -0
- package/dist/generators/clone-repos.test.d.mts +1 -0
- package/dist/generators/clone-repos.test.mjs +141 -0
- package/dist/generators/clone-repos.test.mjs.map +1 -0
- package/dist/generators/env.cjs +146 -0
- package/dist/generators/env.cjs.map +1 -1
- package/dist/generators/env.d.cts.map +1 -1
- package/dist/generators/env.d.mts.map +1 -1
- package/dist/generators/env.mjs +146 -0
- package/dist/generators/env.mjs.map +1 -1
- package/dist/generators/env.test.cjs +1 -1
- package/dist/generators/env.test.mjs +1 -1
- package/dist/generators/health-check.test.cjs +1 -1
- package/dist/generators/health-check.test.mjs +1 -1
- package/dist/generators/openclaw-json.cjs +102 -7
- package/dist/generators/openclaw-json.cjs.map +1 -1
- package/dist/generators/openclaw-json.mjs +102 -7
- package/dist/generators/openclaw-json.mjs.map +1 -1
- package/dist/generators/postgres-init.cjs +20 -0
- package/dist/generators/postgres-init.cjs.map +1 -1
- package/dist/generators/postgres-init.d.cts.map +1 -1
- package/dist/generators/postgres-init.d.mts.map +1 -1
- package/dist/generators/postgres-init.mjs +20 -0
- package/dist/generators/postgres-init.mjs.map +1 -1
- package/dist/generators/readme.cjs +2 -1
- package/dist/generators/readme.cjs.map +1 -1
- package/dist/generators/readme.mjs +2 -1
- package/dist/generators/readme.mjs.map +1 -1
- package/dist/generators/scripts.cjs +332 -3
- package/dist/generators/scripts.cjs.map +1 -1
- package/dist/generators/scripts.d.cts +3 -1
- package/dist/generators/scripts.d.cts.map +1 -1
- package/dist/generators/scripts.d.mts +3 -1
- package/dist/generators/scripts.d.mts.map +1 -1
- package/dist/generators/scripts.mjs +332 -3
- package/dist/generators/scripts.mjs.map +1 -1
- package/dist/generators/scripts.test.cjs +39 -5
- package/dist/generators/scripts.test.cjs.map +1 -1
- package/dist/generators/scripts.test.mjs +39 -5
- package/dist/generators/scripts.test.mjs.map +1 -1
- package/dist/generators/stack-manifest.cjs +1 -0
- package/dist/generators/stack-manifest.cjs.map +1 -1
- package/dist/generators/stack-manifest.d.cts +3 -2
- package/dist/generators/stack-manifest.d.cts.map +1 -1
- package/dist/generators/stack-manifest.d.mts +3 -2
- package/dist/generators/stack-manifest.d.mts.map +1 -1
- package/dist/generators/stack-manifest.mjs +1 -0
- package/dist/generators/stack-manifest.mjs.map +1 -1
- package/dist/generators/traefik.test.cjs +1 -1
- package/dist/generators/traefik.test.mjs +1 -1
- package/dist/index.cjs +8 -1
- package/dist/index.d.cts +5 -3
- package/dist/index.d.mts +5 -3
- package/dist/index.mjs +5 -3
- package/dist/migrations.test.cjs +1 -1
- package/dist/migrations.test.mjs +1 -1
- package/dist/presets/registry.cjs +19 -0
- package/dist/presets/registry.cjs.map +1 -1
- package/dist/presets/registry.d.cts.map +1 -1
- package/dist/presets/registry.d.mts.map +1 -1
- package/dist/presets/registry.mjs +19 -0
- package/dist/presets/registry.mjs.map +1 -1
- package/dist/presets/registry.test.cjs +1 -1
- package/dist/presets/registry.test.mjs +1 -1
- package/dist/resolver.cjs +8 -0
- package/dist/resolver.cjs.map +1 -1
- package/dist/resolver.mjs +9 -1
- package/dist/resolver.mjs.map +1 -1
- package/dist/resolver.test.cjs +47 -12
- package/dist/resolver.test.cjs.map +1 -1
- package/dist/resolver.test.mjs +47 -12
- package/dist/resolver.test.mjs.map +1 -1
- package/dist/{schema-C_hc7e4k.d.cts → schema-eX44HhRp.d.mts} +78 -8
- package/dist/schema-eX44HhRp.d.mts.map +1 -0
- package/dist/{schema-CaesJaS2.d.mts → schema-tn5RK8CM.d.cts} +78 -8
- package/dist/schema-tn5RK8CM.d.cts.map +1 -0
- package/dist/schema.cjs +26 -4
- package/dist/schema.cjs.map +1 -1
- package/dist/schema.d.cts +2 -2
- package/dist/schema.d.mts +2 -2
- package/dist/schema.mjs +25 -5
- package/dist/schema.mjs.map +1 -1
- package/dist/schema.test.cjs +1 -1
- package/dist/schema.test.mjs +1 -1
- package/dist/services/definitions/adguard-home.cjs +74 -0
- package/dist/services/definitions/adguard-home.cjs.map +1 -0
- package/dist/services/definitions/adguard-home.d.cts +7 -0
- package/dist/services/definitions/adguard-home.d.cts.map +1 -0
- package/dist/services/definitions/adguard-home.d.mts +7 -0
- package/dist/services/definitions/adguard-home.d.mts.map +1 -0
- package/dist/services/definitions/adguard-home.mjs +73 -0
- package/dist/services/definitions/adguard-home.mjs.map +1 -0
- package/dist/services/definitions/apptension-saas.cjs +87 -0
- package/dist/services/definitions/apptension-saas.cjs.map +1 -0
- package/dist/services/definitions/apptension-saas.d.cts +7 -0
- package/dist/services/definitions/apptension-saas.d.cts.map +1 -0
- package/dist/services/definitions/apptension-saas.d.mts +7 -0
- package/dist/services/definitions/apptension-saas.d.mts.map +1 -0
- package/dist/services/definitions/apptension-saas.mjs +86 -0
- package/dist/services/definitions/apptension-saas.mjs.map +1 -0
- package/dist/services/definitions/audiobookshelf.cjs +81 -0
- package/dist/services/definitions/audiobookshelf.cjs.map +1 -0
- package/dist/services/definitions/audiobookshelf.d.cts +7 -0
- package/dist/services/definitions/audiobookshelf.d.cts.map +1 -0
- package/dist/services/definitions/audiobookshelf.d.mts +7 -0
- package/dist/services/definitions/audiobookshelf.d.mts.map +1 -0
- package/dist/services/definitions/audiobookshelf.mjs +80 -0
- package/dist/services/definitions/audiobookshelf.mjs.map +1 -0
- package/dist/services/definitions/baserow.cjs +115 -0
- package/dist/services/definitions/baserow.cjs.map +1 -0
- package/dist/services/definitions/baserow.d.cts +7 -0
- package/dist/services/definitions/baserow.d.cts.map +1 -0
- package/dist/services/definitions/baserow.d.mts +7 -0
- package/dist/services/definitions/baserow.d.mts.map +1 -0
- package/dist/services/definitions/baserow.mjs +114 -0
- package/dist/services/definitions/baserow.mjs.map +1 -0
- package/dist/services/definitions/boxyhq-saas.cjs +88 -0
- package/dist/services/definitions/boxyhq-saas.cjs.map +1 -0
- package/dist/services/definitions/boxyhq-saas.d.cts +7 -0
- package/dist/services/definitions/boxyhq-saas.d.cts.map +1 -0
- package/dist/services/definitions/boxyhq-saas.d.mts +7 -0
- package/dist/services/definitions/boxyhq-saas.d.mts.map +1 -0
- package/dist/services/definitions/boxyhq-saas.mjs +87 -0
- package/dist/services/definitions/boxyhq-saas.mjs.map +1 -0
- package/dist/services/definitions/calibre-web.cjs +91 -0
- package/dist/services/definitions/calibre-web.cjs.map +1 -0
- package/dist/services/definitions/calibre-web.d.cts +7 -0
- package/dist/services/definitions/calibre-web.d.cts.map +1 -0
- package/dist/services/definitions/calibre-web.d.mts +7 -0
- package/dist/services/definitions/calibre-web.d.mts.map +1 -0
- package/dist/services/definitions/calibre-web.mjs +90 -0
- package/dist/services/definitions/calibre-web.mjs.map +1 -0
- package/dist/services/definitions/clickhouse.cjs +113 -0
- package/dist/services/definitions/clickhouse.cjs.map +1 -0
- package/dist/services/definitions/clickhouse.d.cts +7 -0
- package/dist/services/definitions/clickhouse.d.cts.map +1 -0
- package/dist/services/definitions/clickhouse.d.mts +7 -0
- package/dist/services/definitions/clickhouse.d.mts.map +1 -0
- package/dist/services/definitions/clickhouse.mjs +112 -0
- package/dist/services/definitions/clickhouse.mjs.map +1 -0
- package/dist/services/definitions/cloudflared.cjs +55 -0
- package/dist/services/definitions/cloudflared.cjs.map +1 -0
- package/dist/services/definitions/cloudflared.d.cts +7 -0
- package/dist/services/definitions/cloudflared.d.cts.map +1 -0
- package/dist/services/definitions/cloudflared.d.mts +7 -0
- package/dist/services/definitions/cloudflared.d.mts.map +1 -0
- package/dist/services/definitions/cloudflared.mjs +54 -0
- package/dist/services/definitions/cloudflared.mjs.map +1 -0
- package/dist/services/definitions/cmsaas-starter.cjs +86 -0
- package/dist/services/definitions/cmsaas-starter.cjs.map +1 -0
- package/dist/services/definitions/cmsaas-starter.d.cts +7 -0
- package/dist/services/definitions/cmsaas-starter.d.cts.map +1 -0
- package/dist/services/definitions/cmsaas-starter.d.mts +7 -0
- package/dist/services/definitions/cmsaas-starter.d.mts.map +1 -0
- package/dist/services/definitions/cmsaas-starter.mjs +85 -0
- package/dist/services/definitions/cmsaas-starter.mjs.map +1 -0
- package/dist/services/definitions/cockroachdb.cjs +70 -0
- package/dist/services/definitions/cockroachdb.cjs.map +1 -0
- package/dist/services/definitions/cockroachdb.d.cts +7 -0
- package/dist/services/definitions/cockroachdb.d.cts.map +1 -0
- package/dist/services/definitions/cockroachdb.d.mts +7 -0
- package/dist/services/definitions/cockroachdb.d.mts.map +1 -0
- package/dist/services/definitions/cockroachdb.mjs +69 -0
- package/dist/services/definitions/cockroachdb.mjs.map +1 -0
- package/dist/services/definitions/coder.cjs +64 -0
- package/dist/services/definitions/coder.cjs.map +1 -0
- package/dist/services/definitions/coder.d.cts +7 -0
- package/dist/services/definitions/coder.d.cts.map +1 -0
- package/dist/services/definitions/coder.d.mts +7 -0
- package/dist/services/definitions/coder.d.mts.map +1 -0
- package/dist/services/definitions/coder.mjs +63 -0
- package/dist/services/definitions/coder.mjs.map +1 -0
- package/dist/services/definitions/dragonfly.cjs +64 -0
- package/dist/services/definitions/dragonfly.cjs.map +1 -0
- package/dist/services/definitions/dragonfly.d.cts +7 -0
- package/dist/services/definitions/dragonfly.d.cts.map +1 -0
- package/dist/services/definitions/dragonfly.d.mts +7 -0
- package/dist/services/definitions/dragonfly.d.mts.map +1 -0
- package/dist/services/definitions/dragonfly.mjs +63 -0
- package/dist/services/definitions/dragonfly.mjs.map +1 -0
- package/dist/services/definitions/drone-ci.cjs +95 -0
- package/dist/services/definitions/drone-ci.cjs.map +1 -0
- package/dist/services/definitions/drone-ci.d.cts +7 -0
- package/dist/services/definitions/drone-ci.d.cts.map +1 -0
- package/dist/services/definitions/drone-ci.d.mts +7 -0
- package/dist/services/definitions/drone-ci.d.mts.map +1 -0
- package/dist/services/definitions/drone-ci.mjs +94 -0
- package/dist/services/definitions/drone-ci.mjs.map +1 -0
- package/dist/services/definitions/element-web.cjs +61 -0
- package/dist/services/definitions/element-web.cjs.map +1 -0
- package/dist/services/definitions/element-web.d.cts +7 -0
- package/dist/services/definitions/element-web.d.cts.map +1 -0
- package/dist/services/definitions/element-web.d.mts +7 -0
- package/dist/services/definitions/element-web.d.mts.map +1 -0
- package/dist/services/definitions/element-web.mjs +60 -0
- package/dist/services/definitions/element-web.mjs.map +1 -0
- package/dist/services/definitions/focalboard.cjs +65 -0
- package/dist/services/definitions/focalboard.cjs.map +1 -0
- package/dist/services/definitions/focalboard.d.cts +7 -0
- package/dist/services/definitions/focalboard.d.cts.map +1 -0
- package/dist/services/definitions/focalboard.d.mts +7 -0
- package/dist/services/definitions/focalboard.d.mts.map +1 -0
- package/dist/services/definitions/focalboard.mjs +64 -0
- package/dist/services/definitions/focalboard.mjs.map +1 -0
- package/dist/services/definitions/forgejo.cjs +108 -0
- package/dist/services/definitions/forgejo.cjs.map +1 -0
- package/dist/services/definitions/forgejo.d.cts +7 -0
- package/dist/services/definitions/forgejo.d.cts.map +1 -0
- package/dist/services/definitions/forgejo.d.mts +7 -0
- package/dist/services/definitions/forgejo.d.mts.map +1 -0
- package/dist/services/definitions/forgejo.mjs +107 -0
- package/dist/services/definitions/forgejo.mjs.map +1 -0
- package/dist/services/definitions/graylog.cjs +103 -0
- package/dist/services/definitions/graylog.cjs.map +1 -0
- package/dist/services/definitions/graylog.d.cts +7 -0
- package/dist/services/definitions/graylog.d.cts.map +1 -0
- package/dist/services/definitions/graylog.d.mts +7 -0
- package/dist/services/definitions/graylog.d.mts.map +1 -0
- package/dist/services/definitions/graylog.mjs +102 -0
- package/dist/services/definitions/graylog.mjs.map +1 -0
- package/dist/services/definitions/index.cjs +154 -1
- package/dist/services/definitions/index.cjs.map +1 -1
- package/dist/services/definitions/index.d.cts +52 -1
- package/dist/services/definitions/index.d.cts.map +1 -1
- package/dist/services/definitions/index.d.mts +52 -1
- package/dist/services/definitions/index.d.mts.map +1 -1
- package/dist/services/definitions/index.mjs +104 -2
- package/dist/services/definitions/index.mjs.map +1 -1
- package/dist/services/definitions/influxdb.cjs +105 -0
- package/dist/services/definitions/influxdb.cjs.map +1 -0
- package/dist/services/definitions/influxdb.d.cts +7 -0
- package/dist/services/definitions/influxdb.d.cts.map +1 -0
- package/dist/services/definitions/influxdb.d.mts +7 -0
- package/dist/services/definitions/influxdb.d.mts.map +1 -0
- package/dist/services/definitions/influxdb.mjs +104 -0
- package/dist/services/definitions/influxdb.mjs.map +1 -0
- package/dist/services/definitions/invoke-ai.cjs +70 -0
- package/dist/services/definitions/invoke-ai.cjs.map +1 -0
- package/dist/services/definitions/invoke-ai.d.cts +7 -0
- package/dist/services/definitions/invoke-ai.d.cts.map +1 -0
- package/dist/services/definitions/invoke-ai.d.mts +7 -0
- package/dist/services/definitions/invoke-ai.d.mts.map +1 -0
- package/dist/services/definitions/invoke-ai.mjs +69 -0
- package/dist/services/definitions/invoke-ai.mjs.map +1 -0
- package/dist/services/definitions/ixartz-saas.cjs +88 -0
- package/dist/services/definitions/ixartz-saas.cjs.map +1 -0
- package/dist/services/definitions/ixartz-saas.d.cts +7 -0
- package/dist/services/definitions/ixartz-saas.d.cts.map +1 -0
- package/dist/services/definitions/ixartz-saas.d.mts +7 -0
- package/dist/services/definitions/ixartz-saas.d.mts.map +1 -0
- package/dist/services/definitions/ixartz-saas.mjs +87 -0
- package/dist/services/definitions/ixartz-saas.mjs.map +1 -0
- package/dist/services/definitions/jaeger.cjs +95 -0
- package/dist/services/definitions/jaeger.cjs.map +1 -0
- package/dist/services/definitions/jaeger.d.cts +7 -0
- package/dist/services/definitions/jaeger.d.cts.map +1 -0
- package/dist/services/definitions/jaeger.d.mts +7 -0
- package/dist/services/definitions/jaeger.d.mts.map +1 -0
- package/dist/services/definitions/jaeger.mjs +94 -0
- package/dist/services/definitions/jaeger.mjs.map +1 -0
- package/dist/services/definitions/jan.cjs +64 -0
- package/dist/services/definitions/jan.cjs.map +1 -0
- package/dist/services/definitions/jan.d.cts +7 -0
- package/dist/services/definitions/jan.d.cts.map +1 -0
- package/dist/services/definitions/jan.d.mts +7 -0
- package/dist/services/definitions/jan.d.mts.map +1 -0
- package/dist/services/definitions/jan.mjs +63 -0
- package/dist/services/definitions/jan.mjs.map +1 -0
- package/dist/services/definitions/jitsi-meet.cjs +102 -0
- package/dist/services/definitions/jitsi-meet.cjs.map +1 -0
- package/dist/services/definitions/jitsi-meet.d.cts +7 -0
- package/dist/services/definitions/jitsi-meet.d.cts.map +1 -0
- package/dist/services/definitions/jitsi-meet.d.mts +7 -0
- package/dist/services/definitions/jitsi-meet.d.mts.map +1 -0
- package/dist/services/definitions/jitsi-meet.mjs +101 -0
- package/dist/services/definitions/jitsi-meet.mjs.map +1 -0
- package/dist/services/definitions/local-ai.cjs +86 -0
- package/dist/services/definitions/local-ai.cjs.map +1 -0
- package/dist/services/definitions/local-ai.d.cts +7 -0
- package/dist/services/definitions/local-ai.d.cts.map +1 -0
- package/dist/services/definitions/local-ai.d.mts +7 -0
- package/dist/services/definitions/local-ai.d.mts.map +1 -0
- package/dist/services/definitions/local-ai.mjs +85 -0
- package/dist/services/definitions/local-ai.mjs.map +1 -0
- package/dist/services/definitions/metabase.cjs +108 -0
- package/dist/services/definitions/metabase.cjs.map +1 -0
- package/dist/services/definitions/metabase.d.cts +7 -0
- package/dist/services/definitions/metabase.d.cts.map +1 -0
- package/dist/services/definitions/metabase.d.mts +7 -0
- package/dist/services/definitions/metabase.d.mts.map +1 -0
- package/dist/services/definitions/metabase.mjs +107 -0
- package/dist/services/definitions/metabase.mjs.map +1 -0
- package/dist/services/definitions/mission-control.cjs +16 -2
- package/dist/services/definitions/mission-control.cjs.map +1 -1
- package/dist/services/definitions/mission-control.mjs +16 -2
- package/dist/services/definitions/mission-control.mjs.map +1 -1
- package/dist/services/definitions/mosquitto.cjs +82 -0
- package/dist/services/definitions/mosquitto.cjs.map +1 -0
- package/dist/services/definitions/mosquitto.d.cts +7 -0
- package/dist/services/definitions/mosquitto.d.cts.map +1 -0
- package/dist/services/definitions/mosquitto.d.mts +7 -0
- package/dist/services/definitions/mosquitto.d.mts.map +1 -0
- package/dist/services/definitions/mosquitto.mjs +81 -0
- package/dist/services/definitions/mosquitto.mjs.map +1 -0
- package/dist/services/definitions/navidrome.cjs +90 -0
- package/dist/services/definitions/navidrome.cjs.map +1 -0
- package/dist/services/definitions/navidrome.d.cts +7 -0
- package/dist/services/definitions/navidrome.d.cts.map +1 -0
- package/dist/services/definitions/navidrome.d.mts +7 -0
- package/dist/services/definitions/navidrome.d.mts.map +1 -0
- package/dist/services/definitions/navidrome.mjs +89 -0
- package/dist/services/definitions/navidrome.mjs.map +1 -0
- package/dist/services/definitions/nginx-proxy-manager.cjs +71 -0
- package/dist/services/definitions/nginx-proxy-manager.cjs.map +1 -0
- package/dist/services/definitions/nginx-proxy-manager.d.cts +7 -0
- package/dist/services/definitions/nginx-proxy-manager.d.cts.map +1 -0
- package/dist/services/definitions/nginx-proxy-manager.d.mts +7 -0
- package/dist/services/definitions/nginx-proxy-manager.d.mts.map +1 -0
- package/dist/services/definitions/nginx-proxy-manager.mjs +70 -0
- package/dist/services/definitions/nginx-proxy-manager.mjs.map +1 -0
- package/dist/services/definitions/node-red.cjs +77 -0
- package/dist/services/definitions/node-red.cjs.map +1 -0
- package/dist/services/definitions/node-red.d.cts +7 -0
- package/dist/services/definitions/node-red.d.cts.map +1 -0
- package/dist/services/definitions/node-red.d.mts +7 -0
- package/dist/services/definitions/node-red.d.mts.map +1 -0
- package/dist/services/definitions/node-red.mjs +76 -0
- package/dist/services/definitions/node-red.mjs.map +1 -0
- package/dist/services/definitions/open-saas.cjs +81 -0
- package/dist/services/definitions/open-saas.cjs.map +1 -0
- package/dist/services/definitions/open-saas.d.cts +7 -0
- package/dist/services/definitions/open-saas.d.cts.map +1 -0
- package/dist/services/definitions/open-saas.d.mts +7 -0
- package/dist/services/definitions/open-saas.d.mts.map +1 -0
- package/dist/services/definitions/open-saas.mjs +80 -0
- package/dist/services/definitions/open-saas.mjs.map +1 -0
- package/dist/services/definitions/photoprism.cjs +126 -0
- package/dist/services/definitions/photoprism.cjs.map +1 -0
- package/dist/services/definitions/photoprism.d.cts +7 -0
- package/dist/services/definitions/photoprism.d.cts.map +1 -0
- package/dist/services/definitions/photoprism.d.mts +7 -0
- package/dist/services/definitions/photoprism.d.mts.map +1 -0
- package/dist/services/definitions/photoprism.mjs +125 -0
- package/dist/services/definitions/photoprism.mjs.map +1 -0
- package/dist/services/definitions/pihole.cjs +73 -0
- package/dist/services/definitions/pihole.cjs.map +1 -0
- package/dist/services/definitions/pihole.d.cts +7 -0
- package/dist/services/definitions/pihole.d.cts.map +1 -0
- package/dist/services/definitions/pihole.d.mts +7 -0
- package/dist/services/definitions/pihole.d.mts.map +1 -0
- package/dist/services/definitions/pihole.mjs +72 -0
- package/dist/services/definitions/pihole.mjs.map +1 -0
- package/dist/services/definitions/piper-tts.cjs +70 -0
- package/dist/services/definitions/piper-tts.cjs.map +1 -0
- package/dist/services/definitions/piper-tts.d.cts +7 -0
- package/dist/services/definitions/piper-tts.d.cts.map +1 -0
- package/dist/services/definitions/piper-tts.d.mts +7 -0
- package/dist/services/definitions/piper-tts.d.mts.map +1 -0
- package/dist/services/definitions/piper-tts.mjs +69 -0
- package/dist/services/definitions/piper-tts.mjs.map +1 -0
- package/dist/services/definitions/plane.cjs +75 -0
- package/dist/services/definitions/plane.cjs.map +1 -0
- package/dist/services/definitions/plane.d.cts +7 -0
- package/dist/services/definitions/plane.d.cts.map +1 -0
- package/dist/services/definitions/plane.d.mts +7 -0
- package/dist/services/definitions/plane.d.mts.map +1 -0
- package/dist/services/definitions/plane.mjs +74 -0
- package/dist/services/definitions/plane.mjs.map +1 -0
- package/dist/services/definitions/plausible.cjs +94 -0
- package/dist/services/definitions/plausible.cjs.map +1 -0
- package/dist/services/definitions/plausible.d.cts +7 -0
- package/dist/services/definitions/plausible.d.cts.map +1 -0
- package/dist/services/definitions/plausible.d.mts +7 -0
- package/dist/services/definitions/plausible.d.mts.map +1 -0
- package/dist/services/definitions/plausible.mjs +93 -0
- package/dist/services/definitions/plausible.mjs.map +1 -0
- package/dist/services/definitions/pocket-id.cjs +101 -0
- package/dist/services/definitions/pocket-id.cjs.map +1 -0
- package/dist/services/definitions/pocket-id.d.cts +7 -0
- package/dist/services/definitions/pocket-id.d.cts.map +1 -0
- package/dist/services/definitions/pocket-id.d.mts +7 -0
- package/dist/services/definitions/pocket-id.d.mts.map +1 -0
- package/dist/services/definitions/pocket-id.mjs +100 -0
- package/dist/services/definitions/pocket-id.mjs.map +1 -0
- package/dist/services/definitions/posthog.cjs +94 -0
- package/dist/services/definitions/posthog.cjs.map +1 -0
- package/dist/services/definitions/posthog.d.cts +7 -0
- package/dist/services/definitions/posthog.d.cts.map +1 -0
- package/dist/services/definitions/posthog.d.mts +7 -0
- package/dist/services/definitions/posthog.d.mts.map +1 -0
- package/dist/services/definitions/posthog.mjs +93 -0
- package/dist/services/definitions/posthog.mjs.map +1 -0
- package/dist/services/definitions/redis.cjs +1 -1
- package/dist/services/definitions/redis.cjs.map +1 -1
- package/dist/services/definitions/redis.mjs +1 -1
- package/dist/services/definitions/redis.mjs.map +1 -1
- package/dist/services/definitions/revolt.cjs +64 -0
- package/dist/services/definitions/revolt.cjs.map +1 -0
- package/dist/services/definitions/revolt.d.cts +7 -0
- package/dist/services/definitions/revolt.d.cts.map +1 -0
- package/dist/services/definitions/revolt.d.mts +7 -0
- package/dist/services/definitions/revolt.d.mts.map +1 -0
- package/dist/services/definitions/revolt.mjs +63 -0
- package/dist/services/definitions/revolt.mjs.map +1 -0
- package/dist/services/definitions/sentry.cjs +101 -0
- package/dist/services/definitions/sentry.cjs.map +1 -0
- package/dist/services/definitions/sentry.d.cts +7 -0
- package/dist/services/definitions/sentry.d.cts.map +1 -0
- package/dist/services/definitions/sentry.d.mts +7 -0
- package/dist/services/definitions/sentry.d.mts.map +1 -0
- package/dist/services/definitions/sentry.mjs +100 -0
- package/dist/services/definitions/sentry.mjs.map +1 -0
- package/dist/services/definitions/sonarqube.cjs +86 -0
- package/dist/services/definitions/sonarqube.cjs.map +1 -0
- package/dist/services/definitions/sonarqube.d.cts +7 -0
- package/dist/services/definitions/sonarqube.d.cts.map +1 -0
- package/dist/services/definitions/sonarqube.d.mts +7 -0
- package/dist/services/definitions/sonarqube.d.mts.map +1 -0
- package/dist/services/definitions/sonarqube.mjs +85 -0
- package/dist/services/definitions/sonarqube.mjs.map +1 -0
- package/dist/services/definitions/superset.cjs +77 -0
- package/dist/services/definitions/superset.cjs.map +1 -0
- package/dist/services/definitions/superset.d.cts +7 -0
- package/dist/services/definitions/superset.d.cts.map +1 -0
- package/dist/services/definitions/superset.d.mts +7 -0
- package/dist/services/definitions/superset.d.mts.map +1 -0
- package/dist/services/definitions/superset.mjs +76 -0
- package/dist/services/definitions/superset.mjs.map +1 -0
- package/dist/services/definitions/surrealdb.cjs +72 -0
- package/dist/services/definitions/surrealdb.cjs.map +1 -0
- package/dist/services/definitions/surrealdb.d.cts +7 -0
- package/dist/services/definitions/surrealdb.d.cts.map +1 -0
- package/dist/services/definitions/surrealdb.d.mts +7 -0
- package/dist/services/definitions/surrealdb.d.mts.map +1 -0
- package/dist/services/definitions/surrealdb.mjs +71 -0
- package/dist/services/definitions/surrealdb.mjs.map +1 -0
- package/dist/services/definitions/tabby-ml.cjs +70 -0
- package/dist/services/definitions/tabby-ml.cjs.map +1 -0
- package/dist/services/definitions/tabby-ml.d.cts +7 -0
- package/dist/services/definitions/tabby-ml.d.cts.map +1 -0
- package/dist/services/definitions/tabby-ml.d.mts +7 -0
- package/dist/services/definitions/tabby-ml.d.mts.map +1 -0
- package/dist/services/definitions/tabby-ml.mjs +69 -0
- package/dist/services/definitions/tabby-ml.mjs.map +1 -0
- package/dist/services/definitions/tempo.cjs +57 -0
- package/dist/services/definitions/tempo.cjs.map +1 -0
- package/dist/services/definitions/tempo.d.cts +7 -0
- package/dist/services/definitions/tempo.d.cts.map +1 -0
- package/dist/services/definitions/tempo.d.mts +7 -0
- package/dist/services/definitions/tempo.d.mts.map +1 -0
- package/dist/services/definitions/tempo.mjs +56 -0
- package/dist/services/definitions/tempo.mjs.map +1 -0
- package/dist/services/definitions/text-gen-webui.cjs +88 -0
- package/dist/services/definitions/text-gen-webui.cjs.map +1 -0
- package/dist/services/definitions/text-gen-webui.d.cts +7 -0
- package/dist/services/definitions/text-gen-webui.d.cts.map +1 -0
- package/dist/services/definitions/text-gen-webui.d.mts +7 -0
- package/dist/services/definitions/text-gen-webui.d.mts.map +1 -0
- package/dist/services/definitions/text-gen-webui.mjs +87 -0
- package/dist/services/definitions/text-gen-webui.mjs.map +1 -0
- package/dist/services/definitions/timescaledb.cjs +87 -0
- package/dist/services/definitions/timescaledb.cjs.map +1 -0
- package/dist/services/definitions/timescaledb.d.cts +7 -0
- package/dist/services/definitions/timescaledb.d.cts.map +1 -0
- package/dist/services/definitions/timescaledb.d.mts +7 -0
- package/dist/services/definitions/timescaledb.d.mts.map +1 -0
- package/dist/services/definitions/timescaledb.mjs +86 -0
- package/dist/services/definitions/timescaledb.mjs.map +1 -0
- package/dist/services/definitions/valkey.cjs +1 -1
- package/dist/services/definitions/valkey.cjs.map +1 -1
- package/dist/services/definitions/valkey.mjs +1 -1
- package/dist/services/definitions/valkey.mjs.map +1 -1
- package/dist/services/definitions/vector-log.cjs +59 -0
- package/dist/services/definitions/vector-log.cjs.map +1 -0
- package/dist/services/definitions/vector-log.d.cts +7 -0
- package/dist/services/definitions/vector-log.d.cts.map +1 -0
- package/dist/services/definitions/vector-log.d.mts +7 -0
- package/dist/services/definitions/vector-log.d.mts.map +1 -0
- package/dist/services/definitions/vector-log.mjs +58 -0
- package/dist/services/definitions/vector-log.mjs.map +1 -0
- package/dist/services/definitions/vikunja.cjs +96 -0
- package/dist/services/definitions/vikunja.cjs.map +1 -0
- package/dist/services/definitions/vikunja.d.cts +7 -0
- package/dist/services/definitions/vikunja.d.cts.map +1 -0
- package/dist/services/definitions/vikunja.d.mts +7 -0
- package/dist/services/definitions/vikunja.d.mts.map +1 -0
- package/dist/services/definitions/vikunja.mjs +95 -0
- package/dist/services/definitions/vikunja.mjs.map +1 -0
- package/dist/services/definitions/wireguard.cjs +88 -0
- package/dist/services/definitions/wireguard.cjs.map +1 -0
- package/dist/services/definitions/wireguard.d.cts +7 -0
- package/dist/services/definitions/wireguard.d.cts.map +1 -0
- package/dist/services/definitions/wireguard.d.mts +7 -0
- package/dist/services/definitions/wireguard.d.mts.map +1 -0
- package/dist/services/definitions/wireguard.mjs +87 -0
- package/dist/services/definitions/wireguard.mjs.map +1 -0
- package/dist/services/definitions/woodpecker-ci.cjs +93 -0
- package/dist/services/definitions/woodpecker-ci.cjs.map +1 -0
- package/dist/services/definitions/woodpecker-ci.d.cts +7 -0
- package/dist/services/definitions/woodpecker-ci.d.cts.map +1 -0
- package/dist/services/definitions/woodpecker-ci.d.mts +7 -0
- package/dist/services/definitions/woodpecker-ci.d.mts.map +1 -0
- package/dist/services/definitions/woodpecker-ci.mjs +92 -0
- package/dist/services/definitions/woodpecker-ci.mjs.map +1 -0
- package/dist/services/definitions/zulip.cjs +116 -0
- package/dist/services/definitions/zulip.cjs.map +1 -0
- package/dist/services/definitions/zulip.d.cts +7 -0
- package/dist/services/definitions/zulip.d.cts.map +1 -0
- package/dist/services/definitions/zulip.d.mts +7 -0
- package/dist/services/definitions/zulip.d.mts.map +1 -0
- package/dist/services/definitions/zulip.mjs +115 -0
- package/dist/services/definitions/zulip.mjs.map +1 -0
- package/dist/services/registry.cjs +3 -0
- package/dist/services/registry.cjs.map +1 -1
- package/dist/services/registry.d.cts.map +1 -1
- package/dist/services/registry.d.mts.map +1 -1
- package/dist/services/registry.mjs +3 -0
- package/dist/services/registry.mjs.map +1 -1
- package/dist/services/registry.test.cjs +8 -1
- package/dist/services/registry.test.cjs.map +1 -1
- package/dist/services/registry.test.mjs +8 -1
- package/dist/services/registry.test.mjs.map +1 -1
- package/dist/{skill-manifest-BVUXU0__.mjs → skill-manifest-6XhrhWsG.mjs} +49 -1
- package/dist/{skill-manifest--IgY9REK.cjs.map → skill-manifest-6XhrhWsG.mjs.map} +1 -1
- package/dist/{skill-manifest--IgY9REK.cjs → skill-manifest-B8znSsym.cjs} +49 -1
- package/dist/{skill-manifest-BVUXU0__.mjs.map → skill-manifest-B8znSsym.cjs.map} +1 -1
- package/dist/skills/registry.cjs +3 -3
- package/dist/skills/registry.cjs.map +1 -1
- package/dist/skills/registry.mjs +3 -3
- package/dist/skills/registry.mjs.map +1 -1
- package/dist/skills/skill-manifest.cjs +1 -1
- package/dist/skills/skill-manifest.mjs +1 -1
- package/dist/track-analytics.cjs +50 -0
- package/dist/track-analytics.cjs.map +1 -0
- package/dist/track-analytics.d.cts +34 -0
- package/dist/track-analytics.d.cts.map +1 -0
- package/dist/track-analytics.d.mts +34 -0
- package/dist/track-analytics.d.mts.map +1 -0
- package/dist/track-analytics.mjs +48 -0
- package/dist/track-analytics.mjs.map +1 -0
- package/dist/track-analytics.test.cjs +91 -0
- package/dist/track-analytics.test.cjs.map +1 -0
- package/dist/track-analytics.test.d.cts +1 -0
- package/dist/track-analytics.test.d.mts +1 -0
- package/dist/track-analytics.test.mjs +92 -0
- package/dist/track-analytics.test.mjs.map +1 -0
- package/dist/types.cjs +35 -0
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +5 -2
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +5 -2
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs +35 -0
- package/dist/types.mjs.map +1 -1
- package/dist/validator.test.cjs +1 -1
- package/dist/validator.test.mjs +1 -1
- package/dist/version-manager.cjs +1 -1
- package/dist/version-manager.cjs.map +1 -1
- package/dist/version-manager.mjs +1 -1
- package/dist/version-manager.mjs.map +1 -1
- package/dist/version-manager.test.cjs +7 -5
- package/dist/version-manager.test.cjs.map +1 -1
- package/dist/version-manager.test.mjs +7 -5
- package/dist/version-manager.test.mjs.map +1 -1
- package/dist/{vi.2VT5v0um-DvC3SVNc.mjs → vi.2VT5v0um-C_jmO7m2.mjs} +5 -5
- package/dist/{vi.2VT5v0um-DvC3SVNc.mjs.map → vi.2VT5v0um-C_jmO7m2.mjs.map} +1 -1
- package/dist/{vi.2VT5v0um-CRqXre87.cjs → vi.2VT5v0um-iVBt6Fyq.cjs} +5 -5
- package/dist/{vi.2VT5v0um-CRqXre87.cjs.map → vi.2VT5v0um-iVBt6Fyq.cjs.map} +1 -1
- package/package.json +1 -1
- package/src/__snapshots__/composer.snapshot.test.ts.snap +285 -65
- package/src/bare-metal-partition.test.ts +4 -3
- package/src/composer.test.ts +4 -2
- package/src/composer.ts +45 -16
- package/src/generate.test.ts +2 -1
- package/src/generate.ts +11 -1
- package/src/generators/clone-repos.test.ts +154 -0
- package/src/generators/clone-repos.ts +159 -0
- package/src/generators/env.ts +214 -0
- package/src/generators/openclaw-json.ts +156 -1
- package/src/generators/postgres-init.ts +17 -0
- package/src/generators/readme.ts +2 -1
- package/src/generators/scripts.test.ts +52 -4
- package/src/generators/scripts.ts +351 -3
- package/src/generators/stack-manifest.ts +4 -2
- package/src/index.ts +8 -0
- package/src/presets/registry.ts +20 -0
- package/src/resolver.test.ts +53 -15
- package/src/resolver.ts +13 -1
- package/src/schema.ts +37 -4
- package/src/services/definitions/adguard-home.ts +79 -0
- package/src/services/definitions/apptension-saas.ts +84 -0
- package/src/services/definitions/audiobookshelf.ts +83 -0
- package/src/services/definitions/baserow.ts +118 -0
- package/src/services/definitions/boxyhq-saas.ts +84 -0
- package/src/services/definitions/calibre-web.ts +95 -0
- package/src/services/definitions/clickhouse.ts +115 -0
- package/src/services/definitions/cloudflared.ts +55 -0
- package/src/services/definitions/cmsaas-starter.ts +84 -0
- package/src/services/definitions/cockroachdb.ts +75 -0
- package/src/services/definitions/coder.ts +68 -0
- package/src/services/definitions/dragonfly.ts +68 -0
- package/src/services/definitions/drone-ci.ts +96 -0
- package/src/services/definitions/element-web.ts +62 -0
- package/src/services/definitions/focalboard.ts +69 -0
- package/src/services/definitions/forgejo.ts +109 -0
- package/src/services/definitions/graylog.ts +101 -0
- package/src/services/definitions/index.ts +159 -0
- package/src/services/definitions/influxdb.ts +109 -0
- package/src/services/definitions/invoke-ai.ts +76 -0
- package/src/services/definitions/ixartz-saas.ts +84 -0
- package/src/services/definitions/jaeger.ts +94 -0
- package/src/services/definitions/jan.ts +68 -0
- package/src/services/definitions/jitsi-meet.ts +108 -0
- package/src/services/definitions/local-ai.ts +90 -0
- package/src/services/definitions/metabase.ts +111 -0
- package/src/services/definitions/mission-control.ts +19 -2
- package/src/services/definitions/mosquitto.ts +84 -0
- package/src/services/definitions/navidrome.ts +95 -0
- package/src/services/definitions/nginx-proxy-manager.ts +70 -0
- package/src/services/definitions/node-red.ts +83 -0
- package/src/services/definitions/open-saas.ts +79 -0
- package/src/services/definitions/photoprism.ts +130 -0
- package/src/services/definitions/pihole.ts +79 -0
- package/src/services/definitions/piper-tts.ts +76 -0
- package/src/services/definitions/plane.ts +75 -0
- package/src/services/definitions/plausible.ts +97 -0
- package/src/services/definitions/pocket-id.ts +98 -0
- package/src/services/definitions/posthog.ts +97 -0
- package/src/services/definitions/redis.ts +1 -1
- package/src/services/definitions/revolt.ts +68 -0
- package/src/services/definitions/sentry.ts +104 -0
- package/src/services/definitions/sonarqube.ts +85 -0
- package/src/services/definitions/superset.ts +84 -0
- package/src/services/definitions/surrealdb.ts +77 -0
- package/src/services/definitions/tabby-ml.ts +76 -0
- package/src/services/definitions/tempo.ts +59 -0
- package/src/services/definitions/text-gen-webui.ts +92 -0
- package/src/services/definitions/timescaledb.ts +90 -0
- package/src/services/definitions/valkey.ts +1 -1
- package/src/services/definitions/vector-log.ts +61 -0
- package/src/services/definitions/vikunja.ts +96 -0
- package/src/services/definitions/wireguard.ts +89 -0
- package/src/services/definitions/woodpecker-ci.ts +97 -0
- package/src/services/definitions/zulip.ts +117 -0
- package/src/services/registry.test.ts +8 -0
- package/src/services/registry.ts +7 -0
- package/src/skills/manifest.json +64 -0
- package/src/skills/registry.ts +3 -3
- package/src/track-analytics.test.ts +82 -0
- package/src/track-analytics.ts +76 -0
- package/src/types.ts +40 -0
- package/src/version-manager.test.ts +10 -5
- package/src/version-manager.ts +1 -1
- package/dist/schema-C_hc7e4k.d.cts.map +0 -1
- package/dist/schema-CaesJaS2.d.mts.map +0 -1
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
//#region src/generators/clone-repos.ts
|
|
2
|
+
/**
|
|
3
|
+
* Generates clone scripts for git-based services (SaaS boilerplates).
|
|
4
|
+
* Returns empty object if no git-based services exist in the resolved stack.
|
|
5
|
+
*/
|
|
6
|
+
function generateCloneScripts(resolved) {
|
|
7
|
+
const gitServices = resolved.services.filter((s) => s.definition.gitSource && s.definition.buildContext);
|
|
8
|
+
if (gitServices.length === 0) return {};
|
|
9
|
+
const files = {};
|
|
10
|
+
files["scripts/clone-repos.sh"] = `#!/usr/bin/env bash
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
|
|
13
|
+
# ─── Clone/Update Git-Based Service Repositories ────────────────────────────
|
|
14
|
+
# Idempotent: clones if missing, pulls if already present.
|
|
15
|
+
|
|
16
|
+
SCRIPT_DIR="$(cd "$(dirname "\${BASH_SOURCE[0]}")" && pwd)"
|
|
17
|
+
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
|
18
|
+
REPOS_DIR="$PROJECT_DIR/repos"
|
|
19
|
+
|
|
20
|
+
# ── Colour helpers ──────────────────────────────────────────────────────────
|
|
21
|
+
if [ -t 1 ]; then
|
|
22
|
+
GREEN='\\033[0;32m'; YELLOW='\\033[1;33m'; CYAN='\\033[0;36m'; RED='\\033[0;31m'; NC='\\033[0m'
|
|
23
|
+
else
|
|
24
|
+
GREEN=''; YELLOW=''; CYAN=''; RED=''; NC=''
|
|
25
|
+
fi
|
|
26
|
+
info() { echo -e "\${CYAN}i $*\${NC}"; }
|
|
27
|
+
ok() { echo -e "\${GREEN}✓ $*\${NC}"; }
|
|
28
|
+
warn() { echo -e "\${YELLOW}⚠ $*\${NC}"; }
|
|
29
|
+
err() { echo -e "\${RED}✗ $*\${NC}" >&2; }
|
|
30
|
+
|
|
31
|
+
# ── Check git ───────────────────────────────────────────────────────────────
|
|
32
|
+
if ! command -v git &> /dev/null; then
|
|
33
|
+
err "git is not installed. Please install git first."
|
|
34
|
+
exit 1
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
mkdir -p "$REPOS_DIR"
|
|
38
|
+
|
|
39
|
+
clone_or_update() {
|
|
40
|
+
local name="$1" url="$2" branch="\${3:-}"
|
|
41
|
+
local dir="$REPOS_DIR/$name"
|
|
42
|
+
|
|
43
|
+
if [ -d "$dir/.git" ]; then
|
|
44
|
+
info "Updating $name..."
|
|
45
|
+
git -C "$dir" pull --ff-only 2>/dev/null || warn "Could not fast-forward $name (you may have local changes)"
|
|
46
|
+
else
|
|
47
|
+
info "Cloning $name..."
|
|
48
|
+
if [ -n "$branch" ]; then
|
|
49
|
+
git clone --depth 1 --branch "$branch" "$url" "$dir"
|
|
50
|
+
else
|
|
51
|
+
git clone --depth 1 "$url" "$dir"
|
|
52
|
+
fi
|
|
53
|
+
fi
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
echo ""
|
|
57
|
+
info "Cloning/updating SaaS boilerplate repositories..."
|
|
58
|
+
echo ""
|
|
59
|
+
|
|
60
|
+
${gitServices.map((s) => {
|
|
61
|
+
const gs = s.definition.gitSource;
|
|
62
|
+
const branchArg = gs.branch ? `"${gs.branch}"` : "\"\"";
|
|
63
|
+
let block = `clone_or_update "${s.definition.id}" "${gs.repoUrl}" ${branchArg}`;
|
|
64
|
+
if (gs.postCloneCommands && gs.postCloneCommands.length > 0) {
|
|
65
|
+
const cmds = gs.postCloneCommands.map((cmd) => ` (cd "$REPOS_DIR/${s.definition.id}${gs.subdirectory ? `/${gs.subdirectory}` : ""}" && ${cmd})`).join("\n");
|
|
66
|
+
block += `\n${cmds}`;
|
|
67
|
+
}
|
|
68
|
+
return block;
|
|
69
|
+
}).join("\n\n")}
|
|
70
|
+
|
|
71
|
+
echo ""
|
|
72
|
+
ok "All repositories ready."
|
|
73
|
+
`;
|
|
74
|
+
files["scripts/clone-repos.ps1"] = `#Requires -Version 5.1
|
|
75
|
+
<#
|
|
76
|
+
.SYNOPSIS
|
|
77
|
+
Clone/update git-based service repositories.
|
|
78
|
+
Idempotent: clones if missing, pulls if already present.
|
|
79
|
+
#>
|
|
80
|
+
$ErrorActionPreference = "Stop"
|
|
81
|
+
|
|
82
|
+
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
|
83
|
+
$ProjectDir = Split-Path -Parent $ScriptDir
|
|
84
|
+
$ReposDir = Join-Path $ProjectDir "repos"
|
|
85
|
+
|
|
86
|
+
if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
|
|
87
|
+
Write-Error "git is not installed. Please install git first."
|
|
88
|
+
exit 1
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (-not (Test-Path $ReposDir)) { New-Item -ItemType Directory -Path $ReposDir -Force | Out-Null }
|
|
92
|
+
|
|
93
|
+
function Clone-OrUpdate {
|
|
94
|
+
param(
|
|
95
|
+
[string]$Name,
|
|
96
|
+
[string]$Url,
|
|
97
|
+
[string]$Branch = ""
|
|
98
|
+
)
|
|
99
|
+
$dir = Join-Path $ReposDir $Name
|
|
100
|
+
|
|
101
|
+
if (Test-Path (Join-Path $dir ".git")) {
|
|
102
|
+
Write-Host " Updating $Name..." -ForegroundColor Cyan
|
|
103
|
+
git -C $dir pull --ff-only 2>$null
|
|
104
|
+
if ($LASTEXITCODE -ne 0) { Write-Warning "Could not fast-forward $Name" }
|
|
105
|
+
} else {
|
|
106
|
+
Write-Host " Cloning $Name..." -ForegroundColor Cyan
|
|
107
|
+
if ($Branch) {
|
|
108
|
+
git clone --depth 1 --branch $Branch $Url $dir
|
|
109
|
+
} else {
|
|
110
|
+
git clone --depth 1 $Url $dir
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
Write-Host ""
|
|
116
|
+
Write-Host "Cloning/updating SaaS boilerplate repositories..." -ForegroundColor Cyan
|
|
117
|
+
Write-Host ""
|
|
118
|
+
|
|
119
|
+
${gitServices.map((s) => {
|
|
120
|
+
const gs = s.definition.gitSource;
|
|
121
|
+
const branchArg = gs.branch ? ` -Branch "${gs.branch}"` : "";
|
|
122
|
+
let block = `Clone-OrUpdate -Name "${s.definition.id}" -Url "${gs.repoUrl}"${branchArg}`;
|
|
123
|
+
if (gs.postCloneCommands && gs.postCloneCommands.length > 0) {
|
|
124
|
+
const subdir = gs.subdirectory ? `/${gs.subdirectory}` : "";
|
|
125
|
+
const cmds = gs.postCloneCommands.map((cmd) => `Push-Location "$ReposDir/${s.definition.id}${subdir}"; ${cmd}; Pop-Location`).join("\n");
|
|
126
|
+
block += `\n${cmds}`;
|
|
127
|
+
}
|
|
128
|
+
return block;
|
|
129
|
+
}).join("\n\n")}
|
|
130
|
+
|
|
131
|
+
Write-Host ""
|
|
132
|
+
Write-Host "All repositories ready." -ForegroundColor Green
|
|
133
|
+
`;
|
|
134
|
+
return files;
|
|
135
|
+
}
|
|
136
|
+
//#endregion
|
|
137
|
+
export { generateCloneScripts };
|
|
138
|
+
|
|
139
|
+
//# sourceMappingURL=clone-repos.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone-repos.mjs","names":[],"sources":["../../src/generators/clone-repos.ts"],"sourcesContent":["import type { ResolverOutput } from \"../types.js\";\n\n/**\n * Generates clone scripts for git-based services (SaaS boilerplates).\n * Returns empty object if no git-based services exist in the resolved stack.\n */\nexport function generateCloneScripts(resolved: ResolverOutput): Record<string, string> {\n\tconst gitServices = resolved.services.filter(\n\t\t(s) => s.definition.gitSource && s.definition.buildContext,\n\t);\n\n\tif (gitServices.length === 0) return {};\n\n\tconst files: Record<string, string> = {};\n\n\t// ── scripts/clone-repos.sh ─────────────────────────────────────────────\n\n\tconst bashEntries = gitServices\n\t\t.map((s) => {\n\t\t\tconst gs = s.definition.gitSource!;\n\t\t\tconst branchArg = gs.branch ? `\"${gs.branch}\"` : '\"\"';\n\t\t\tlet block = `clone_or_update \"${s.definition.id}\" \"${gs.repoUrl}\" ${branchArg}`;\n\t\t\tif (gs.postCloneCommands && gs.postCloneCommands.length > 0) {\n\t\t\t\tconst cmds = gs.postCloneCommands\n\t\t\t\t\t.map((cmd) => ` (cd \"$REPOS_DIR/${s.definition.id}${gs.subdirectory ? `/${gs.subdirectory}` : \"\"}\" && ${cmd})`)\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t\tblock += `\\n${cmds}`;\n\t\t\t}\n\t\t\treturn block;\n\t\t})\n\t\t.join(\"\\n\\n\");\n\n\tfiles[\"scripts/clone-repos.sh\"] = `#!/usr/bin/env bash\nset -euo pipefail\n\n# ─── Clone/Update Git-Based Service Repositories ────────────────────────────\n# Idempotent: clones if missing, pulls if already present.\n\nSCRIPT_DIR=\"$(cd \"$(dirname \"\\${BASH_SOURCE[0]}\")\" && pwd)\"\nPROJECT_DIR=\"$(dirname \"$SCRIPT_DIR\")\"\nREPOS_DIR=\"$PROJECT_DIR/repos\"\n\n# ── Colour helpers ──────────────────────────────────────────────────────────\nif [ -t 1 ]; then\n GREEN='\\\\033[0;32m'; YELLOW='\\\\033[1;33m'; CYAN='\\\\033[0;36m'; RED='\\\\033[0;31m'; NC='\\\\033[0m'\nelse\n GREEN=''; YELLOW=''; CYAN=''; RED=''; NC=''\nfi\ninfo() { echo -e \"\\${CYAN}i $*\\${NC}\"; }\nok() { echo -e \"\\${GREEN}✓ $*\\${NC}\"; }\nwarn() { echo -e \"\\${YELLOW}⚠ $*\\${NC}\"; }\nerr() { echo -e \"\\${RED}✗ $*\\${NC}\" >&2; }\n\n# ── Check git ───────────────────────────────────────────────────────────────\nif ! command -v git &> /dev/null; then\n err \"git is not installed. Please install git first.\"\n exit 1\nfi\n\nmkdir -p \"$REPOS_DIR\"\n\nclone_or_update() {\n local name=\"$1\" url=\"$2\" branch=\"\\${3:-}\"\n local dir=\"$REPOS_DIR/$name\"\n\n if [ -d \"$dir/.git\" ]; then\n info \"Updating $name...\"\n git -C \"$dir\" pull --ff-only 2>/dev/null || warn \"Could not fast-forward $name (you may have local changes)\"\n else\n info \"Cloning $name...\"\n if [ -n \"$branch\" ]; then\n git clone --depth 1 --branch \"$branch\" \"$url\" \"$dir\"\n else\n git clone --depth 1 \"$url\" \"$dir\"\n fi\n fi\n}\n\necho \"\"\ninfo \"Cloning/updating SaaS boilerplate repositories...\"\necho \"\"\n\n${bashEntries}\n\necho \"\"\nok \"All repositories ready.\"\n`;\n\n\t// ── scripts/clone-repos.ps1 ────────────────────────────────────────────\n\n\tconst psEntries = gitServices\n\t\t.map((s) => {\n\t\t\tconst gs = s.definition.gitSource!;\n\t\t\tconst branchArg = gs.branch ? ` -Branch \"${gs.branch}\"` : \"\";\n\t\t\tlet block = `Clone-OrUpdate -Name \"${s.definition.id}\" -Url \"${gs.repoUrl}\"${branchArg}`;\n\t\t\tif (gs.postCloneCommands && gs.postCloneCommands.length > 0) {\n\t\t\t\tconst subdir = gs.subdirectory ? `/${gs.subdirectory}` : \"\";\n\t\t\t\tconst cmds = gs.postCloneCommands\n\t\t\t\t\t.map((cmd) => `Push-Location \"$ReposDir/${s.definition.id}${subdir}\"; ${cmd}; Pop-Location`)\n\t\t\t\t\t.join(\"\\n\");\n\t\t\t\tblock += `\\n${cmds}`;\n\t\t\t}\n\t\t\treturn block;\n\t\t})\n\t\t.join(\"\\n\\n\");\n\n\tfiles[\"scripts/clone-repos.ps1\"] = `#Requires -Version 5.1\n<#\n.SYNOPSIS\n Clone/update git-based service repositories.\n Idempotent: clones if missing, pulls if already present.\n#>\n$ErrorActionPreference = \"Stop\"\n\n$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path\n$ProjectDir = Split-Path -Parent $ScriptDir\n$ReposDir = Join-Path $ProjectDir \"repos\"\n\nif (-not (Get-Command git -ErrorAction SilentlyContinue)) {\n Write-Error \"git is not installed. Please install git first.\"\n exit 1\n}\n\nif (-not (Test-Path $ReposDir)) { New-Item -ItemType Directory -Path $ReposDir -Force | Out-Null }\n\nfunction Clone-OrUpdate {\n param(\n [string]$Name,\n [string]$Url,\n [string]$Branch = \"\"\n )\n $dir = Join-Path $ReposDir $Name\n\n if (Test-Path (Join-Path $dir \".git\")) {\n Write-Host \" Updating $Name...\" -ForegroundColor Cyan\n git -C $dir pull --ff-only 2>$null\n if ($LASTEXITCODE -ne 0) { Write-Warning \"Could not fast-forward $Name\" }\n } else {\n Write-Host \" Cloning $Name...\" -ForegroundColor Cyan\n if ($Branch) {\n git clone --depth 1 --branch $Branch $Url $dir\n } else {\n git clone --depth 1 $Url $dir\n }\n }\n}\n\nWrite-Host \"\"\nWrite-Host \"Cloning/updating SaaS boilerplate repositories...\" -ForegroundColor Cyan\nWrite-Host \"\"\n\n${psEntries}\n\nWrite-Host \"\"\nWrite-Host \"All repositories ready.\" -ForegroundColor Green\n`;\n\n\treturn files;\n}\n"],"mappings":";;;;;AAMA,SAAgB,qBAAqB,UAAkD;CACtF,MAAM,cAAc,SAAS,SAAS,QACpC,MAAM,EAAE,WAAW,aAAa,EAAE,WAAW,aAC9C;AAED,KAAI,YAAY,WAAW,EAAG,QAAO,EAAE;CAEvC,MAAM,QAAgC,EAAE;AAmBxC,OAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAfd,YAClB,KAAK,MAAM;EACX,MAAM,KAAK,EAAE,WAAW;EACxB,MAAM,YAAY,GAAG,SAAS,IAAI,GAAG,OAAO,KAAK;EACjD,IAAI,QAAQ,oBAAoB,EAAE,WAAW,GAAG,KAAK,GAAG,QAAQ,IAAI;AACpE,MAAI,GAAG,qBAAqB,GAAG,kBAAkB,SAAS,GAAG;GAC5D,MAAM,OAAO,GAAG,kBACd,KAAK,QAAQ,qBAAqB,EAAE,WAAW,KAAK,GAAG,eAAe,IAAI,GAAG,iBAAiB,GAAG,OAAO,IAAI,GAAG,CAC/G,KAAK,KAAK;AACZ,YAAS,KAAK;;AAEf,SAAO;GACN,CACD,KAAK,OAAO,CAoDD;;;;;AAwBb,OAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAhBjB,YAChB,KAAK,MAAM;EACX,MAAM,KAAK,EAAE,WAAW;EACxB,MAAM,YAAY,GAAG,SAAS,aAAa,GAAG,OAAO,KAAK;EAC1D,IAAI,QAAQ,yBAAyB,EAAE,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG;AAC7E,MAAI,GAAG,qBAAqB,GAAG,kBAAkB,SAAS,GAAG;GAC5D,MAAM,SAAS,GAAG,eAAe,IAAI,GAAG,iBAAiB;GACzD,MAAM,OAAO,GAAG,kBACd,KAAK,QAAQ,4BAA4B,EAAE,WAAW,KAAK,OAAO,KAAK,IAAI,gBAAgB,CAC3F,KAAK,KAAK;AACZ,YAAS,KAAK;;AAEf,SAAO;GACN,CACD,KAAK,OAAO,CA+CH;;;;;AAMX,QAAO"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
const require_vi_2VT5v0um = require("../vi.2VT5v0um-iVBt6Fyq.cjs");
|
|
2
|
+
const require_generators_clone_repos = require("./clone-repos.cjs");
|
|
3
|
+
//#region src/generators/clone-repos.test.ts
|
|
4
|
+
/** Minimal resolved output with no services */
|
|
5
|
+
function emptyResolved() {
|
|
6
|
+
return {
|
|
7
|
+
services: [],
|
|
8
|
+
addedDependencies: [],
|
|
9
|
+
removedConflicts: [],
|
|
10
|
+
warnings: [],
|
|
11
|
+
errors: [],
|
|
12
|
+
isValid: true,
|
|
13
|
+
estimatedMemoryMB: 0,
|
|
14
|
+
aiProviders: [],
|
|
15
|
+
gsdRuntimes: []
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/** Create a resolved output with image-based services only */
|
|
19
|
+
function imageOnlyResolved() {
|
|
20
|
+
return {
|
|
21
|
+
...emptyResolved(),
|
|
22
|
+
services: [{
|
|
23
|
+
definition: {
|
|
24
|
+
id: "redis",
|
|
25
|
+
name: "Redis",
|
|
26
|
+
description: "In-memory cache",
|
|
27
|
+
category: "database",
|
|
28
|
+
icon: "🔴",
|
|
29
|
+
image: "redis",
|
|
30
|
+
imageTag: "7-alpine",
|
|
31
|
+
ports: [],
|
|
32
|
+
volumes: [],
|
|
33
|
+
environment: [],
|
|
34
|
+
dependsOn: [],
|
|
35
|
+
restartPolicy: "unless-stopped",
|
|
36
|
+
networks: ["openclaw-network"],
|
|
37
|
+
skills: [],
|
|
38
|
+
openclawEnvVars: [],
|
|
39
|
+
docsUrl: "https://redis.io",
|
|
40
|
+
tags: [],
|
|
41
|
+
maturity: "stable",
|
|
42
|
+
requires: [],
|
|
43
|
+
recommends: [],
|
|
44
|
+
conflictsWith: [],
|
|
45
|
+
gpuRequired: false
|
|
46
|
+
},
|
|
47
|
+
addedBy: "user"
|
|
48
|
+
}]
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Create a resolved output with a git-based service */
|
|
52
|
+
function gitServiceResolved() {
|
|
53
|
+
return {
|
|
54
|
+
...emptyResolved(),
|
|
55
|
+
services: [{
|
|
56
|
+
definition: {
|
|
57
|
+
id: "open-saas",
|
|
58
|
+
name: "Open SaaS",
|
|
59
|
+
description: "SaaS boilerplate",
|
|
60
|
+
category: "saas-boilerplate",
|
|
61
|
+
icon: "🚀",
|
|
62
|
+
gitSource: {
|
|
63
|
+
repoUrl: "https://github.com/wasp-lang/open-saas.git",
|
|
64
|
+
branch: "main",
|
|
65
|
+
subdirectory: "template",
|
|
66
|
+
postCloneCommands: ["cp .env.example .env"]
|
|
67
|
+
},
|
|
68
|
+
buildContext: {
|
|
69
|
+
dockerfile: "Dockerfile",
|
|
70
|
+
context: "."
|
|
71
|
+
},
|
|
72
|
+
ports: [{
|
|
73
|
+
host: 3100,
|
|
74
|
+
container: 3e3,
|
|
75
|
+
description: "Web app",
|
|
76
|
+
exposed: true
|
|
77
|
+
}],
|
|
78
|
+
volumes: [],
|
|
79
|
+
environment: [],
|
|
80
|
+
dependsOn: [],
|
|
81
|
+
restartPolicy: "unless-stopped",
|
|
82
|
+
networks: ["openclaw-network"],
|
|
83
|
+
skills: [],
|
|
84
|
+
openclawEnvVars: [],
|
|
85
|
+
docsUrl: "https://opensaas.sh/docs",
|
|
86
|
+
tags: [],
|
|
87
|
+
maturity: "beta",
|
|
88
|
+
requires: [],
|
|
89
|
+
recommends: [],
|
|
90
|
+
conflictsWith: [],
|
|
91
|
+
gpuRequired: false
|
|
92
|
+
},
|
|
93
|
+
addedBy: "user"
|
|
94
|
+
}]
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
require_vi_2VT5v0um.describe("generateCloneScripts", () => {
|
|
98
|
+
require_vi_2VT5v0um.it("returns empty object when no git-based services exist", () => {
|
|
99
|
+
require_vi_2VT5v0um.globalExpect(require_generators_clone_repos.generateCloneScripts(emptyResolved())).toEqual({});
|
|
100
|
+
});
|
|
101
|
+
require_vi_2VT5v0um.it("returns empty object when only image-based services exist", () => {
|
|
102
|
+
require_vi_2VT5v0um.globalExpect(require_generators_clone_repos.generateCloneScripts(imageOnlyResolved())).toEqual({});
|
|
103
|
+
});
|
|
104
|
+
require_vi_2VT5v0um.it("generates bash and PowerShell scripts for git-based services", () => {
|
|
105
|
+
const result = require_generators_clone_repos.generateCloneScripts(gitServiceResolved());
|
|
106
|
+
require_vi_2VT5v0um.globalExpect(Object.keys(result)).toHaveLength(2);
|
|
107
|
+
require_vi_2VT5v0um.globalExpect(result).toHaveProperty("scripts/clone-repos.sh");
|
|
108
|
+
require_vi_2VT5v0um.globalExpect(result).toHaveProperty("scripts/clone-repos.ps1");
|
|
109
|
+
});
|
|
110
|
+
require_vi_2VT5v0um.it("bash script contains clone command with repo URL", () => {
|
|
111
|
+
const bash = require_generators_clone_repos.generateCloneScripts(gitServiceResolved())["scripts/clone-repos.sh"];
|
|
112
|
+
require_vi_2VT5v0um.globalExpect(bash).toContain("https://github.com/wasp-lang/open-saas.git");
|
|
113
|
+
require_vi_2VT5v0um.globalExpect(bash).toContain("\"open-saas\"");
|
|
114
|
+
require_vi_2VT5v0um.globalExpect(bash).toContain("\"main\"");
|
|
115
|
+
});
|
|
116
|
+
require_vi_2VT5v0um.it("bash script includes postCloneCommands", () => {
|
|
117
|
+
const bash = require_generators_clone_repos.generateCloneScripts(gitServiceResolved())["scripts/clone-repos.sh"];
|
|
118
|
+
require_vi_2VT5v0um.globalExpect(bash).toContain("cp .env.example .env");
|
|
119
|
+
});
|
|
120
|
+
require_vi_2VT5v0um.it("bash script includes git check and idempotency logic", () => {
|
|
121
|
+
const bash = require_generators_clone_repos.generateCloneScripts(gitServiceResolved())["scripts/clone-repos.sh"];
|
|
122
|
+
require_vi_2VT5v0um.globalExpect(bash).toContain("command -v git");
|
|
123
|
+
require_vi_2VT5v0um.globalExpect(bash).toContain("clone_or_update");
|
|
124
|
+
require_vi_2VT5v0um.globalExpect(bash).toContain("pull --ff-only");
|
|
125
|
+
require_vi_2VT5v0um.globalExpect(bash).toContain("git clone --depth 1");
|
|
126
|
+
});
|
|
127
|
+
require_vi_2VT5v0um.it("PowerShell script contains clone command with repo URL", () => {
|
|
128
|
+
const ps = require_generators_clone_repos.generateCloneScripts(gitServiceResolved())["scripts/clone-repos.ps1"];
|
|
129
|
+
require_vi_2VT5v0um.globalExpect(ps).toContain("https://github.com/wasp-lang/open-saas.git");
|
|
130
|
+
require_vi_2VT5v0um.globalExpect(ps).toContain("\"open-saas\"");
|
|
131
|
+
require_vi_2VT5v0um.globalExpect(ps).toContain("Clone-OrUpdate");
|
|
132
|
+
});
|
|
133
|
+
require_vi_2VT5v0um.it("bash script is executable (starts with shebang)", () => {
|
|
134
|
+
const bash = require_generators_clone_repos.generateCloneScripts(gitServiceResolved())["scripts/clone-repos.sh"];
|
|
135
|
+
require_vi_2VT5v0um.globalExpect(bash).toMatch(/^#!/);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
//#endregion
|
|
139
|
+
|
|
140
|
+
//# sourceMappingURL=clone-repos.test.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone-repos.test.cjs","names":["describe","generateCloneScripts"],"sources":["../../src/generators/clone-repos.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generateCloneScripts } from \"./clone-repos.js\";\nimport type { ResolverOutput } from \"../types.js\";\n\n/** Minimal resolved output with no services */\nfunction emptyResolved(): ResolverOutput {\n\treturn {\n\t\tservices: [],\n\t\taddedDependencies: [],\n\t\tremovedConflicts: [],\n\t\twarnings: [],\n\t\terrors: [],\n\t\tisValid: true,\n\t\testimatedMemoryMB: 0,\n\t\taiProviders: [],\n\t\tgsdRuntimes: [],\n\t};\n}\n\n/** Create a resolved output with image-based services only */\nfunction imageOnlyResolved(): ResolverOutput {\n\treturn {\n\t\t...emptyResolved(),\n\t\tservices: [\n\t\t\t{\n\t\t\t\tdefinition: {\n\t\t\t\t\tid: \"redis\",\n\t\t\t\t\tname: \"Redis\",\n\t\t\t\t\tdescription: \"In-memory cache\",\n\t\t\t\t\tcategory: \"database\",\n\t\t\t\t\ticon: \"🔴\",\n\t\t\t\t\timage: \"redis\",\n\t\t\t\t\timageTag: \"7-alpine\",\n\t\t\t\t\tports: [],\n\t\t\t\t\tvolumes: [],\n\t\t\t\t\tenvironment: [],\n\t\t\t\t\tdependsOn: [],\n\t\t\t\t\trestartPolicy: \"unless-stopped\",\n\t\t\t\t\tnetworks: [\"openclaw-network\"],\n\t\t\t\t\tskills: [],\n\t\t\t\t\topenclawEnvVars: [],\n\t\t\t\t\tdocsUrl: \"https://redis.io\",\n\t\t\t\t\ttags: [],\n\t\t\t\t\tmaturity: \"stable\",\n\t\t\t\t\trequires: [],\n\t\t\t\t\trecommends: [],\n\t\t\t\t\tconflictsWith: [],\n\t\t\t\t\tgpuRequired: false,\n\t\t\t\t},\n\t\t\t\taddedBy: \"user\",\n\t\t\t},\n\t\t],\n\t};\n}\n\n/** Create a resolved output with a git-based service */\nfunction gitServiceResolved(): ResolverOutput {\n\treturn {\n\t\t...emptyResolved(),\n\t\tservices: [\n\t\t\t{\n\t\t\t\tdefinition: {\n\t\t\t\t\tid: \"open-saas\",\n\t\t\t\t\tname: \"Open SaaS\",\n\t\t\t\t\tdescription: \"SaaS boilerplate\",\n\t\t\t\t\tcategory: \"saas-boilerplate\",\n\t\t\t\t\ticon: \"🚀\",\n\t\t\t\t\tgitSource: {\n\t\t\t\t\t\trepoUrl: \"https://github.com/wasp-lang/open-saas.git\",\n\t\t\t\t\t\tbranch: \"main\",\n\t\t\t\t\t\tsubdirectory: \"template\",\n\t\t\t\t\t\tpostCloneCommands: [\"cp .env.example .env\"],\n\t\t\t\t\t},\n\t\t\t\t\tbuildContext: {\n\t\t\t\t\t\tdockerfile: \"Dockerfile\",\n\t\t\t\t\t\tcontext: \".\",\n\t\t\t\t\t},\n\t\t\t\t\tports: [{ host: 3100, container: 3000, description: \"Web app\", exposed: true }],\n\t\t\t\t\tvolumes: [],\n\t\t\t\t\tenvironment: [],\n\t\t\t\t\tdependsOn: [],\n\t\t\t\t\trestartPolicy: \"unless-stopped\",\n\t\t\t\t\tnetworks: [\"openclaw-network\"],\n\t\t\t\t\tskills: [],\n\t\t\t\t\topenclawEnvVars: [],\n\t\t\t\t\tdocsUrl: \"https://opensaas.sh/docs\",\n\t\t\t\t\ttags: [],\n\t\t\t\t\tmaturity: \"beta\",\n\t\t\t\t\trequires: [],\n\t\t\t\t\trecommends: [],\n\t\t\t\t\tconflictsWith: [],\n\t\t\t\t\tgpuRequired: false,\n\t\t\t\t},\n\t\t\t\taddedBy: \"user\",\n\t\t\t},\n\t\t],\n\t};\n}\n\ndescribe(\"generateCloneScripts\", () => {\n\tit(\"returns empty object when no git-based services exist\", () => {\n\t\tconst result = generateCloneScripts(emptyResolved());\n\t\texpect(result).toEqual({});\n\t});\n\n\tit(\"returns empty object when only image-based services exist\", () => {\n\t\tconst result = generateCloneScripts(imageOnlyResolved());\n\t\texpect(result).toEqual({});\n\t});\n\n\tit(\"generates bash and PowerShell scripts for git-based services\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\texpect(Object.keys(result)).toHaveLength(2);\n\t\texpect(result).toHaveProperty(\"scripts/clone-repos.sh\");\n\t\texpect(result).toHaveProperty(\"scripts/clone-repos.ps1\");\n\t});\n\n\tit(\"bash script contains clone command with repo URL\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst bash = result[\"scripts/clone-repos.sh\"];\n\t\texpect(bash).toContain(\"https://github.com/wasp-lang/open-saas.git\");\n\t\texpect(bash).toContain('\"open-saas\"');\n\t\texpect(bash).toContain('\"main\"');\n\t});\n\n\tit(\"bash script includes postCloneCommands\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst bash = result[\"scripts/clone-repos.sh\"];\n\t\texpect(bash).toContain(\"cp .env.example .env\");\n\t});\n\n\tit(\"bash script includes git check and idempotency logic\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst bash = result[\"scripts/clone-repos.sh\"];\n\t\texpect(bash).toContain(\"command -v git\");\n\t\texpect(bash).toContain(\"clone_or_update\");\n\t\texpect(bash).toContain(\"pull --ff-only\");\n\t\texpect(bash).toContain(\"git clone --depth 1\");\n\t});\n\n\tit(\"PowerShell script contains clone command with repo URL\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst ps = result[\"scripts/clone-repos.ps1\"];\n\t\texpect(ps).toContain(\"https://github.com/wasp-lang/open-saas.git\");\n\t\texpect(ps).toContain('\"open-saas\"');\n\t\texpect(ps).toContain(\"Clone-OrUpdate\");\n\t});\n\n\tit(\"bash script is executable (starts with shebang)\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst bash = result[\"scripts/clone-repos.sh\"];\n\t\texpect(bash).toMatch(/^#!/);\n\t});\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { n as describe, r as it, t as globalExpect } from "../vi.2VT5v0um-C_jmO7m2.mjs";
|
|
2
|
+
import { generateCloneScripts } from "./clone-repos.mjs";
|
|
3
|
+
//#region src/generators/clone-repos.test.ts
|
|
4
|
+
/** Minimal resolved output with no services */
|
|
5
|
+
function emptyResolved() {
|
|
6
|
+
return {
|
|
7
|
+
services: [],
|
|
8
|
+
addedDependencies: [],
|
|
9
|
+
removedConflicts: [],
|
|
10
|
+
warnings: [],
|
|
11
|
+
errors: [],
|
|
12
|
+
isValid: true,
|
|
13
|
+
estimatedMemoryMB: 0,
|
|
14
|
+
aiProviders: [],
|
|
15
|
+
gsdRuntimes: []
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/** Create a resolved output with image-based services only */
|
|
19
|
+
function imageOnlyResolved() {
|
|
20
|
+
return {
|
|
21
|
+
...emptyResolved(),
|
|
22
|
+
services: [{
|
|
23
|
+
definition: {
|
|
24
|
+
id: "redis",
|
|
25
|
+
name: "Redis",
|
|
26
|
+
description: "In-memory cache",
|
|
27
|
+
category: "database",
|
|
28
|
+
icon: "🔴",
|
|
29
|
+
image: "redis",
|
|
30
|
+
imageTag: "7-alpine",
|
|
31
|
+
ports: [],
|
|
32
|
+
volumes: [],
|
|
33
|
+
environment: [],
|
|
34
|
+
dependsOn: [],
|
|
35
|
+
restartPolicy: "unless-stopped",
|
|
36
|
+
networks: ["openclaw-network"],
|
|
37
|
+
skills: [],
|
|
38
|
+
openclawEnvVars: [],
|
|
39
|
+
docsUrl: "https://redis.io",
|
|
40
|
+
tags: [],
|
|
41
|
+
maturity: "stable",
|
|
42
|
+
requires: [],
|
|
43
|
+
recommends: [],
|
|
44
|
+
conflictsWith: [],
|
|
45
|
+
gpuRequired: false
|
|
46
|
+
},
|
|
47
|
+
addedBy: "user"
|
|
48
|
+
}]
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Create a resolved output with a git-based service */
|
|
52
|
+
function gitServiceResolved() {
|
|
53
|
+
return {
|
|
54
|
+
...emptyResolved(),
|
|
55
|
+
services: [{
|
|
56
|
+
definition: {
|
|
57
|
+
id: "open-saas",
|
|
58
|
+
name: "Open SaaS",
|
|
59
|
+
description: "SaaS boilerplate",
|
|
60
|
+
category: "saas-boilerplate",
|
|
61
|
+
icon: "🚀",
|
|
62
|
+
gitSource: {
|
|
63
|
+
repoUrl: "https://github.com/wasp-lang/open-saas.git",
|
|
64
|
+
branch: "main",
|
|
65
|
+
subdirectory: "template",
|
|
66
|
+
postCloneCommands: ["cp .env.example .env"]
|
|
67
|
+
},
|
|
68
|
+
buildContext: {
|
|
69
|
+
dockerfile: "Dockerfile",
|
|
70
|
+
context: "."
|
|
71
|
+
},
|
|
72
|
+
ports: [{
|
|
73
|
+
host: 3100,
|
|
74
|
+
container: 3e3,
|
|
75
|
+
description: "Web app",
|
|
76
|
+
exposed: true
|
|
77
|
+
}],
|
|
78
|
+
volumes: [],
|
|
79
|
+
environment: [],
|
|
80
|
+
dependsOn: [],
|
|
81
|
+
restartPolicy: "unless-stopped",
|
|
82
|
+
networks: ["openclaw-network"],
|
|
83
|
+
skills: [],
|
|
84
|
+
openclawEnvVars: [],
|
|
85
|
+
docsUrl: "https://opensaas.sh/docs",
|
|
86
|
+
tags: [],
|
|
87
|
+
maturity: "beta",
|
|
88
|
+
requires: [],
|
|
89
|
+
recommends: [],
|
|
90
|
+
conflictsWith: [],
|
|
91
|
+
gpuRequired: false
|
|
92
|
+
},
|
|
93
|
+
addedBy: "user"
|
|
94
|
+
}]
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
describe("generateCloneScripts", () => {
|
|
98
|
+
it("returns empty object when no git-based services exist", () => {
|
|
99
|
+
globalExpect(generateCloneScripts(emptyResolved())).toEqual({});
|
|
100
|
+
});
|
|
101
|
+
it("returns empty object when only image-based services exist", () => {
|
|
102
|
+
globalExpect(generateCloneScripts(imageOnlyResolved())).toEqual({});
|
|
103
|
+
});
|
|
104
|
+
it("generates bash and PowerShell scripts for git-based services", () => {
|
|
105
|
+
const result = generateCloneScripts(gitServiceResolved());
|
|
106
|
+
globalExpect(Object.keys(result)).toHaveLength(2);
|
|
107
|
+
globalExpect(result).toHaveProperty("scripts/clone-repos.sh");
|
|
108
|
+
globalExpect(result).toHaveProperty("scripts/clone-repos.ps1");
|
|
109
|
+
});
|
|
110
|
+
it("bash script contains clone command with repo URL", () => {
|
|
111
|
+
const bash = generateCloneScripts(gitServiceResolved())["scripts/clone-repos.sh"];
|
|
112
|
+
globalExpect(bash).toContain("https://github.com/wasp-lang/open-saas.git");
|
|
113
|
+
globalExpect(bash).toContain("\"open-saas\"");
|
|
114
|
+
globalExpect(bash).toContain("\"main\"");
|
|
115
|
+
});
|
|
116
|
+
it("bash script includes postCloneCommands", () => {
|
|
117
|
+
const bash = generateCloneScripts(gitServiceResolved())["scripts/clone-repos.sh"];
|
|
118
|
+
globalExpect(bash).toContain("cp .env.example .env");
|
|
119
|
+
});
|
|
120
|
+
it("bash script includes git check and idempotency logic", () => {
|
|
121
|
+
const bash = generateCloneScripts(gitServiceResolved())["scripts/clone-repos.sh"];
|
|
122
|
+
globalExpect(bash).toContain("command -v git");
|
|
123
|
+
globalExpect(bash).toContain("clone_or_update");
|
|
124
|
+
globalExpect(bash).toContain("pull --ff-only");
|
|
125
|
+
globalExpect(bash).toContain("git clone --depth 1");
|
|
126
|
+
});
|
|
127
|
+
it("PowerShell script contains clone command with repo URL", () => {
|
|
128
|
+
const ps = generateCloneScripts(gitServiceResolved())["scripts/clone-repos.ps1"];
|
|
129
|
+
globalExpect(ps).toContain("https://github.com/wasp-lang/open-saas.git");
|
|
130
|
+
globalExpect(ps).toContain("\"open-saas\"");
|
|
131
|
+
globalExpect(ps).toContain("Clone-OrUpdate");
|
|
132
|
+
});
|
|
133
|
+
it("bash script is executable (starts with shebang)", () => {
|
|
134
|
+
const bash = generateCloneScripts(gitServiceResolved())["scripts/clone-repos.sh"];
|
|
135
|
+
globalExpect(bash).toMatch(/^#!/);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
//#endregion
|
|
139
|
+
export {};
|
|
140
|
+
|
|
141
|
+
//# sourceMappingURL=clone-repos.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone-repos.test.mjs","names":[],"sources":["../../src/generators/clone-repos.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generateCloneScripts } from \"./clone-repos.js\";\nimport type { ResolverOutput } from \"../types.js\";\n\n/** Minimal resolved output with no services */\nfunction emptyResolved(): ResolverOutput {\n\treturn {\n\t\tservices: [],\n\t\taddedDependencies: [],\n\t\tremovedConflicts: [],\n\t\twarnings: [],\n\t\terrors: [],\n\t\tisValid: true,\n\t\testimatedMemoryMB: 0,\n\t\taiProviders: [],\n\t\tgsdRuntimes: [],\n\t};\n}\n\n/** Create a resolved output with image-based services only */\nfunction imageOnlyResolved(): ResolverOutput {\n\treturn {\n\t\t...emptyResolved(),\n\t\tservices: [\n\t\t\t{\n\t\t\t\tdefinition: {\n\t\t\t\t\tid: \"redis\",\n\t\t\t\t\tname: \"Redis\",\n\t\t\t\t\tdescription: \"In-memory cache\",\n\t\t\t\t\tcategory: \"database\",\n\t\t\t\t\ticon: \"🔴\",\n\t\t\t\t\timage: \"redis\",\n\t\t\t\t\timageTag: \"7-alpine\",\n\t\t\t\t\tports: [],\n\t\t\t\t\tvolumes: [],\n\t\t\t\t\tenvironment: [],\n\t\t\t\t\tdependsOn: [],\n\t\t\t\t\trestartPolicy: \"unless-stopped\",\n\t\t\t\t\tnetworks: [\"openclaw-network\"],\n\t\t\t\t\tskills: [],\n\t\t\t\t\topenclawEnvVars: [],\n\t\t\t\t\tdocsUrl: \"https://redis.io\",\n\t\t\t\t\ttags: [],\n\t\t\t\t\tmaturity: \"stable\",\n\t\t\t\t\trequires: [],\n\t\t\t\t\trecommends: [],\n\t\t\t\t\tconflictsWith: [],\n\t\t\t\t\tgpuRequired: false,\n\t\t\t\t},\n\t\t\t\taddedBy: \"user\",\n\t\t\t},\n\t\t],\n\t};\n}\n\n/** Create a resolved output with a git-based service */\nfunction gitServiceResolved(): ResolverOutput {\n\treturn {\n\t\t...emptyResolved(),\n\t\tservices: [\n\t\t\t{\n\t\t\t\tdefinition: {\n\t\t\t\t\tid: \"open-saas\",\n\t\t\t\t\tname: \"Open SaaS\",\n\t\t\t\t\tdescription: \"SaaS boilerplate\",\n\t\t\t\t\tcategory: \"saas-boilerplate\",\n\t\t\t\t\ticon: \"🚀\",\n\t\t\t\t\tgitSource: {\n\t\t\t\t\t\trepoUrl: \"https://github.com/wasp-lang/open-saas.git\",\n\t\t\t\t\t\tbranch: \"main\",\n\t\t\t\t\t\tsubdirectory: \"template\",\n\t\t\t\t\t\tpostCloneCommands: [\"cp .env.example .env\"],\n\t\t\t\t\t},\n\t\t\t\t\tbuildContext: {\n\t\t\t\t\t\tdockerfile: \"Dockerfile\",\n\t\t\t\t\t\tcontext: \".\",\n\t\t\t\t\t},\n\t\t\t\t\tports: [{ host: 3100, container: 3000, description: \"Web app\", exposed: true }],\n\t\t\t\t\tvolumes: [],\n\t\t\t\t\tenvironment: [],\n\t\t\t\t\tdependsOn: [],\n\t\t\t\t\trestartPolicy: \"unless-stopped\",\n\t\t\t\t\tnetworks: [\"openclaw-network\"],\n\t\t\t\t\tskills: [],\n\t\t\t\t\topenclawEnvVars: [],\n\t\t\t\t\tdocsUrl: \"https://opensaas.sh/docs\",\n\t\t\t\t\ttags: [],\n\t\t\t\t\tmaturity: \"beta\",\n\t\t\t\t\trequires: [],\n\t\t\t\t\trecommends: [],\n\t\t\t\t\tconflictsWith: [],\n\t\t\t\t\tgpuRequired: false,\n\t\t\t\t},\n\t\t\t\taddedBy: \"user\",\n\t\t\t},\n\t\t],\n\t};\n}\n\ndescribe(\"generateCloneScripts\", () => {\n\tit(\"returns empty object when no git-based services exist\", () => {\n\t\tconst result = generateCloneScripts(emptyResolved());\n\t\texpect(result).toEqual({});\n\t});\n\n\tit(\"returns empty object when only image-based services exist\", () => {\n\t\tconst result = generateCloneScripts(imageOnlyResolved());\n\t\texpect(result).toEqual({});\n\t});\n\n\tit(\"generates bash and PowerShell scripts for git-based services\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\texpect(Object.keys(result)).toHaveLength(2);\n\t\texpect(result).toHaveProperty(\"scripts/clone-repos.sh\");\n\t\texpect(result).toHaveProperty(\"scripts/clone-repos.ps1\");\n\t});\n\n\tit(\"bash script contains clone command with repo URL\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst bash = result[\"scripts/clone-repos.sh\"];\n\t\texpect(bash).toContain(\"https://github.com/wasp-lang/open-saas.git\");\n\t\texpect(bash).toContain('\"open-saas\"');\n\t\texpect(bash).toContain('\"main\"');\n\t});\n\n\tit(\"bash script includes postCloneCommands\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst bash = result[\"scripts/clone-repos.sh\"];\n\t\texpect(bash).toContain(\"cp .env.example .env\");\n\t});\n\n\tit(\"bash script includes git check and idempotency logic\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst bash = result[\"scripts/clone-repos.sh\"];\n\t\texpect(bash).toContain(\"command -v git\");\n\t\texpect(bash).toContain(\"clone_or_update\");\n\t\texpect(bash).toContain(\"pull --ff-only\");\n\t\texpect(bash).toContain(\"git clone --depth 1\");\n\t});\n\n\tit(\"PowerShell script contains clone command with repo URL\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst ps = result[\"scripts/clone-repos.ps1\"];\n\t\texpect(ps).toContain(\"https://github.com/wasp-lang/open-saas.git\");\n\t\texpect(ps).toContain('\"open-saas\"');\n\t\texpect(ps).toContain(\"Clone-OrUpdate\");\n\t});\n\n\tit(\"bash script is executable (starts with shebang)\", () => {\n\t\tconst result = generateCloneScripts(gitServiceResolved());\n\t\tconst bash = result[\"scripts/clone-repos.sh\"];\n\t\texpect(bash).toMatch(/^#!/);\n\t});\n});\n"],"mappings":"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"}
|
package/dist/generators/env.cjs
CHANGED
|
@@ -104,12 +104,84 @@ function generateEnvFiles(resolved, options) {
|
|
|
104
104
|
exampleValue: "",
|
|
105
105
|
actualValue: ""
|
|
106
106
|
});
|
|
107
|
+
lines.push({
|
|
108
|
+
comment: formatComment("Alternative auth: gateway password (use token OR password, not both)", "OpenClaw Core", false, true),
|
|
109
|
+
key: "OPENCLAW_GATEWAY_PASSWORD",
|
|
110
|
+
exampleValue: "",
|
|
111
|
+
actualValue: ""
|
|
112
|
+
});
|
|
113
|
+
lines.push({
|
|
114
|
+
comment: formatComment("Override state directory path (default: ~/.openclaw)", "OpenClaw Core", false, false),
|
|
115
|
+
key: "OPENCLAW_STATE_DIR",
|
|
116
|
+
exampleValue: "",
|
|
117
|
+
actualValue: ""
|
|
118
|
+
});
|
|
119
|
+
lines.push({
|
|
120
|
+
comment: formatComment("Override config file path (default: ~/.openclaw/openclaw.json)", "OpenClaw Core", false, false),
|
|
121
|
+
key: "OPENCLAW_CONFIG_PATH",
|
|
122
|
+
exampleValue: "",
|
|
123
|
+
actualValue: ""
|
|
124
|
+
});
|
|
125
|
+
lines.push({
|
|
126
|
+
comment: formatComment("Import missing keys from login shell profile (set to 1 to enable)", "OpenClaw Core", false, false),
|
|
127
|
+
key: "OPENCLAW_LOAD_SHELL_ENV",
|
|
128
|
+
exampleValue: "",
|
|
129
|
+
actualValue: ""
|
|
130
|
+
});
|
|
107
131
|
if (options.domain) lines.push({
|
|
108
132
|
comment: formatComment("Primary domain for service routing", "OpenClaw Core", false, false),
|
|
109
133
|
key: "OPENCLAW_DOMAIN",
|
|
110
134
|
exampleValue: "example.com",
|
|
111
135
|
actualValue: options.domain
|
|
112
136
|
});
|
|
137
|
+
lines.push({
|
|
138
|
+
comment: "\n# ═══════════════════════════════════════════════════════════════════════════════\n# Tools API Keys (web search, fetch, voice)\n# ═══════════════════════════════════════════════════════════════════════════════",
|
|
139
|
+
key: "",
|
|
140
|
+
exampleValue: "",
|
|
141
|
+
actualValue: ""
|
|
142
|
+
});
|
|
143
|
+
lines.push({
|
|
144
|
+
comment: formatComment("Brave Search API key for web search tool (default provider)", "OpenClaw Tools", false, true),
|
|
145
|
+
key: "BRAVE_API_KEY",
|
|
146
|
+
exampleValue: "your_brave_api_key_here",
|
|
147
|
+
actualValue: ""
|
|
148
|
+
});
|
|
149
|
+
lines.push({
|
|
150
|
+
comment: formatComment("Perplexity API key for web search tool (alternative provider)", "OpenClaw Tools", false, true),
|
|
151
|
+
key: "PERPLEXITY_API_KEY",
|
|
152
|
+
exampleValue: "",
|
|
153
|
+
actualValue: ""
|
|
154
|
+
});
|
|
155
|
+
lines.push({
|
|
156
|
+
comment: formatComment("Firecrawl API key for enhanced web fetch fallback", "OpenClaw Tools", false, true),
|
|
157
|
+
key: "FIRECRAWL_API_KEY",
|
|
158
|
+
exampleValue: "",
|
|
159
|
+
actualValue: ""
|
|
160
|
+
});
|
|
161
|
+
lines.push({
|
|
162
|
+
comment: formatComment("ElevenLabs API key for Talk mode (text-to-speech)", "OpenClaw Tools", false, true),
|
|
163
|
+
key: "ELEVENLABS_API_KEY",
|
|
164
|
+
exampleValue: "",
|
|
165
|
+
actualValue: ""
|
|
166
|
+
});
|
|
167
|
+
lines.push({
|
|
168
|
+
comment: "\n# ═══════════════════════════════════════════════════════════════════════════════\n# Swarm / Remote Gateway Connection\n# ═══════════════════════════════════════════════════════════════════════════════",
|
|
169
|
+
key: "",
|
|
170
|
+
exampleValue: "",
|
|
171
|
+
actualValue: ""
|
|
172
|
+
});
|
|
173
|
+
lines.push({
|
|
174
|
+
comment: formatComment("Auth token for connecting to a remote OpenClaw gateway (swarm upstream)", "OpenClaw Swarm", false, true),
|
|
175
|
+
key: "OPENCLAW_REMOTE_GATEWAY_TOKEN",
|
|
176
|
+
exampleValue: "",
|
|
177
|
+
actualValue: ""
|
|
178
|
+
});
|
|
179
|
+
lines.push({
|
|
180
|
+
comment: formatComment("Password for remote gateway auth (alternative to token)", "OpenClaw Swarm", false, true),
|
|
181
|
+
key: "OPENCLAW_REMOTE_GATEWAY_PASSWORD",
|
|
182
|
+
exampleValue: "",
|
|
183
|
+
actualValue: ""
|
|
184
|
+
});
|
|
113
185
|
if (resolved.aiProviders && resolved.aiProviders.length > 0) {
|
|
114
186
|
lines.push({
|
|
115
187
|
comment: "\n# ═══════════════════════════════════════════════════════════════════════════════\n# AI Provider API Keys\n# ═══════════════════════════════════════════════════════════════════════════════",
|
|
@@ -186,7 +258,17 @@ function generateEnvFiles(resolved, options) {
|
|
|
186
258
|
"OPENCLAW_EXTRA_MOUNTS",
|
|
187
259
|
"OPENCLAW_HOME_VOLUME",
|
|
188
260
|
"OPENCLAW_DOCKER_APT_PACKAGES",
|
|
261
|
+
"OPENCLAW_GATEWAY_PASSWORD",
|
|
262
|
+
"OPENCLAW_STATE_DIR",
|
|
263
|
+
"OPENCLAW_CONFIG_PATH",
|
|
264
|
+
"OPENCLAW_LOAD_SHELL_ENV",
|
|
189
265
|
"OPENCLAW_DOMAIN",
|
|
266
|
+
"BRAVE_API_KEY",
|
|
267
|
+
"PERPLEXITY_API_KEY",
|
|
268
|
+
"FIRECRAWL_API_KEY",
|
|
269
|
+
"ELEVENLABS_API_KEY",
|
|
270
|
+
"OPENCLAW_REMOTE_GATEWAY_TOKEN",
|
|
271
|
+
"OPENCLAW_REMOTE_GATEWAY_PASSWORD",
|
|
190
272
|
"CLAUDE_AI_SESSION_KEY",
|
|
191
273
|
"CLAUDE_WEB_SESSION_KEY",
|
|
192
274
|
"CLAUDE_WEB_COOKIE",
|
|
@@ -230,6 +312,7 @@ function generateEnvFiles(resolved, options) {
|
|
|
230
312
|
"# ═══════════════════════════════════════════════════════════════════════════════",
|
|
231
313
|
"# OpenClaw Environment Configuration",
|
|
232
314
|
`# Generated at ${(/* @__PURE__ */ new Date()).toISOString()}`,
|
|
315
|
+
"# Docs: https://better-openclaw.dev/docs | Cloud: https://clawexa.net",
|
|
233
316
|
"# ═══════════════════════════════════════════════════════════════════════════════",
|
|
234
317
|
""
|
|
235
318
|
].join("\n");
|
|
@@ -284,6 +367,69 @@ function getStructuredEnvVars(resolved) {
|
|
|
284
367
|
secret: false,
|
|
285
368
|
required: true,
|
|
286
369
|
defaultValue: "18789"
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
key: "OPENCLAW_GATEWAY_PASSWORD",
|
|
373
|
+
description: "Alternative auth: gateway password (use token OR password)",
|
|
374
|
+
secret: true,
|
|
375
|
+
required: false,
|
|
376
|
+
defaultValue: ""
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
key: "OPENCLAW_STATE_DIR",
|
|
380
|
+
description: "Override state directory path (default: ~/.openclaw)",
|
|
381
|
+
secret: false,
|
|
382
|
+
required: false,
|
|
383
|
+
defaultValue: ""
|
|
384
|
+
},
|
|
385
|
+
{
|
|
386
|
+
key: "OPENCLAW_CONFIG_PATH",
|
|
387
|
+
description: "Override config file path (default: ~/.openclaw/openclaw.json)",
|
|
388
|
+
secret: false,
|
|
389
|
+
required: false,
|
|
390
|
+
defaultValue: ""
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
key: "BRAVE_API_KEY",
|
|
394
|
+
description: "Brave Search API key for web search tool (default provider)",
|
|
395
|
+
secret: true,
|
|
396
|
+
required: false,
|
|
397
|
+
defaultValue: ""
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
key: "PERPLEXITY_API_KEY",
|
|
401
|
+
description: "Perplexity API key for web search (alternative provider)",
|
|
402
|
+
secret: true,
|
|
403
|
+
required: false,
|
|
404
|
+
defaultValue: ""
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
key: "FIRECRAWL_API_KEY",
|
|
408
|
+
description: "Firecrawl API key for enhanced web fetch fallback",
|
|
409
|
+
secret: true,
|
|
410
|
+
required: false,
|
|
411
|
+
defaultValue: ""
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
key: "ELEVENLABS_API_KEY",
|
|
415
|
+
description: "ElevenLabs API key for Talk mode (text-to-speech)",
|
|
416
|
+
secret: true,
|
|
417
|
+
required: false,
|
|
418
|
+
defaultValue: ""
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
key: "OPENCLAW_REMOTE_GATEWAY_TOKEN",
|
|
422
|
+
description: "Auth token for connecting to a remote OpenClaw gateway (swarm upstream)",
|
|
423
|
+
secret: true,
|
|
424
|
+
required: false,
|
|
425
|
+
defaultValue: ""
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
key: "OPENCLAW_REMOTE_GATEWAY_PASSWORD",
|
|
429
|
+
description: "Password for remote gateway auth (alternative to token)",
|
|
430
|
+
secret: true,
|
|
431
|
+
required: false,
|
|
432
|
+
defaultValue: ""
|
|
287
433
|
}
|
|
288
434
|
];
|
|
289
435
|
for (const v of coreVars) seenKeys.add(v.key);
|