@better-openclaw/core 1.0.5 → 1.0.7
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/.github/workflows/publish-core.yml +32 -34
- package/dist/bare-metal-partition.d.mts +26 -0
- package/dist/bare-metal-partition.d.mts.map +1 -0
- package/dist/bare-metal-partition.mjs +48 -0
- package/dist/bare-metal-partition.mjs.map +1 -0
- package/dist/bare-metal-partition.test.d.mts +1 -0
- package/dist/bare-metal-partition.test.mjs +58 -0
- package/dist/bare-metal-partition.test.mjs.map +1 -0
- package/dist/composer.d.mts +21 -0
- package/dist/composer.d.mts.map +1 -0
- package/dist/composer.mjs +287 -0
- package/dist/composer.mjs.map +1 -0
- package/dist/composer.snapshot.test.d.mts +1 -0
- package/dist/composer.snapshot.test.mjs +92 -0
- package/dist/composer.snapshot.test.mjs.map +1 -0
- package/dist/composer.test.d.mts +1 -0
- package/dist/composer.test.mjs +166 -0
- package/dist/composer.test.mjs.map +1 -0
- package/dist/generate.d.mts +11 -0
- package/dist/generate.d.mts.map +1 -0
- package/dist/generate.mjs +169 -0
- package/dist/generate.mjs.map +1 -0
- package/dist/generate.test.d.mts +1 -0
- package/dist/generate.test.mjs +283 -0
- package/dist/generate.test.mjs.map +1 -0
- package/dist/generators/bare-metal-install.d.mts +17 -0
- package/dist/generators/bare-metal-install.d.mts.map +1 -0
- package/dist/generators/bare-metal-install.mjs +224 -0
- package/dist/generators/bare-metal-install.mjs.map +1 -0
- package/dist/generators/bare-metal-install.test.d.mts +1 -0
- package/dist/generators/bare-metal-install.test.mjs +48 -0
- package/dist/generators/bare-metal-install.test.mjs.map +1 -0
- package/dist/generators/caddy.d.mts +17 -0
- package/dist/generators/caddy.d.mts.map +1 -0
- package/dist/generators/caddy.mjs +77 -0
- package/dist/generators/caddy.mjs.map +1 -0
- package/dist/generators/env.d.mts +46 -0
- package/dist/generators/env.d.mts.map +1 -0
- package/dist/generators/env.mjs +250 -0
- package/dist/generators/env.mjs.map +1 -0
- package/dist/generators/grafana.d.mts +22 -0
- package/dist/generators/grafana.d.mts.map +1 -0
- package/dist/generators/grafana.mjs +293 -0
- package/dist/generators/grafana.mjs.map +1 -0
- package/dist/generators/n8n-workflows.d.mts +11 -0
- package/dist/generators/n8n-workflows.d.mts.map +1 -0
- package/dist/generators/n8n-workflows.mjs +75 -0
- package/dist/generators/n8n-workflows.mjs.map +1 -0
- package/dist/generators/native-services.d.mts +17 -0
- package/dist/generators/native-services.d.mts.map +1 -0
- package/dist/generators/native-services.mjs +78 -0
- package/dist/generators/native-services.mjs.map +1 -0
- package/dist/generators/postgres-init.d.mts +30 -0
- package/dist/generators/postgres-init.d.mts.map +1 -0
- package/dist/generators/postgres-init.mjs +151 -0
- package/dist/generators/postgres-init.mjs.map +1 -0
- package/dist/generators/prometheus.d.mts +14 -0
- package/dist/generators/prometheus.d.mts.map +1 -0
- package/dist/generators/prometheus.mjs +107 -0
- package/dist/generators/prometheus.mjs.map +1 -0
- package/dist/generators/readme.d.mts +25 -0
- package/dist/generators/readme.d.mts.map +1 -0
- package/dist/generators/readme.mjs +199 -0
- package/dist/generators/readme.mjs.map +1 -0
- package/dist/generators/scripts.d.mts +10 -0
- package/dist/generators/scripts.d.mts.map +1 -0
- package/dist/generators/scripts.mjs +351 -0
- package/dist/generators/scripts.mjs.map +1 -0
- package/dist/generators/skills.d.mts +14 -0
- package/dist/generators/skills.d.mts.map +1 -0
- package/dist/generators/skills.mjs +587 -0
- package/dist/generators/skills.mjs.map +1 -0
- package/dist/index.d.mts +21 -0
- package/dist/index.mjs +22 -0
- package/dist/magic-string.es-1uTtupLe.mjs +1014 -0
- package/dist/magic-string.es-1uTtupLe.mjs.map +1 -0
- package/dist/presets/registry.d.mts +9 -0
- package/dist/presets/registry.d.mts.map +1 -0
- package/dist/presets/registry.mjs +159 -0
- package/dist/presets/registry.mjs.map +1 -0
- package/dist/presets/registry.test.d.mts +1 -0
- package/dist/presets/registry.test.mjs +34 -0
- package/dist/presets/registry.test.mjs.map +1 -0
- package/dist/resolver.d.mts +21 -0
- package/dist/resolver.d.mts.map +1 -0
- package/dist/resolver.mjs +194 -0
- package/dist/resolver.mjs.map +1 -0
- package/dist/resolver.test.d.mts +1 -0
- package/dist/resolver.test.mjs +237 -0
- package/dist/resolver.test.mjs.map +1 -0
- package/dist/schema.d.mts +706 -0
- package/dist/schema.d.mts.map +1 -0
- package/dist/schema.mjs +260 -0
- package/dist/schema.mjs.map +1 -0
- package/dist/schema.test.d.mts +1 -0
- package/dist/schema.test.mjs +264 -0
- package/dist/schema.test.mjs.map +1 -0
- package/dist/services/definitions/anything-llm.d.mts +7 -0
- package/dist/services/definitions/anything-llm.d.mts.map +1 -0
- package/dist/services/definitions/anything-llm.mjs +44 -0
- package/dist/services/definitions/anything-llm.mjs.map +1 -0
- package/dist/services/definitions/appflowy.d.mts +7 -0
- package/dist/services/definitions/appflowy.d.mts.map +1 -0
- package/dist/services/definitions/appflowy.mjs +45 -0
- package/dist/services/definitions/appflowy.mjs.map +1 -0
- package/dist/services/definitions/beszel.d.mts +7 -0
- package/dist/services/definitions/beszel.d.mts.map +1 -0
- package/dist/services/definitions/beszel.mjs +45 -0
- package/dist/services/definitions/beszel.mjs.map +1 -0
- package/dist/services/definitions/browserless.d.mts +7 -0
- package/dist/services/definitions/browserless.d.mts.map +1 -0
- package/dist/services/definitions/browserless.mjs +85 -0
- package/dist/services/definitions/browserless.mjs.map +1 -0
- package/dist/services/definitions/caddy.d.mts +7 -0
- package/dist/services/definitions/caddy.d.mts.map +1 -0
- package/dist/services/definitions/caddy.mjs +52 -0
- package/dist/services/definitions/caddy.mjs.map +1 -0
- package/dist/services/definitions/chromadb.d.mts +7 -0
- package/dist/services/definitions/chromadb.d.mts.map +1 -0
- package/dist/services/definitions/chromadb.mjs +63 -0
- package/dist/services/definitions/chromadb.mjs.map +1 -0
- package/dist/services/definitions/claude-code.d.mts +7 -0
- package/dist/services/definitions/claude-code.d.mts.map +1 -0
- package/dist/services/definitions/claude-code.mjs +52 -0
- package/dist/services/definitions/claude-code.mjs.map +1 -0
- package/dist/services/definitions/code-server.d.mts +7 -0
- package/dist/services/definitions/code-server.d.mts.map +1 -0
- package/dist/services/definitions/code-server.mjs +66 -0
- package/dist/services/definitions/code-server.mjs.map +1 -0
- package/dist/services/definitions/codex.d.mts +7 -0
- package/dist/services/definitions/codex.d.mts.map +1 -0
- package/dist/services/definitions/codex.mjs +45 -0
- package/dist/services/definitions/codex.mjs.map +1 -0
- package/dist/services/definitions/convex-dashboard.d.mts +7 -0
- package/dist/services/definitions/convex-dashboard.d.mts.map +1 -0
- package/dist/services/definitions/convex-dashboard.mjs +46 -0
- package/dist/services/definitions/convex-dashboard.mjs.map +1 -0
- package/dist/services/definitions/convex.d.mts +7 -0
- package/dist/services/definitions/convex.d.mts.map +1 -0
- package/dist/services/definitions/convex.mjs +118 -0
- package/dist/services/definitions/convex.mjs.map +1 -0
- package/dist/services/definitions/coolify.d.mts +7 -0
- package/dist/services/definitions/coolify.d.mts.map +1 -0
- package/dist/services/definitions/coolify.mjs +49 -0
- package/dist/services/definitions/coolify.mjs.map +1 -0
- package/dist/services/definitions/dify.d.mts +7 -0
- package/dist/services/definitions/dify.d.mts.map +1 -0
- package/dist/services/definitions/dify.mjs +81 -0
- package/dist/services/definitions/dify.mjs.map +1 -0
- package/dist/services/definitions/docsgpt.d.mts +7 -0
- package/dist/services/definitions/docsgpt.d.mts.map +1 -0
- package/dist/services/definitions/docsgpt.mjs +45 -0
- package/dist/services/definitions/docsgpt.mjs.map +1 -0
- package/dist/services/definitions/dokploy.d.mts +7 -0
- package/dist/services/definitions/dokploy.d.mts.map +1 -0
- package/dist/services/definitions/dokploy.mjs +49 -0
- package/dist/services/definitions/dokploy.mjs.map +1 -0
- package/dist/services/definitions/dozzle.d.mts +7 -0
- package/dist/services/definitions/dozzle.d.mts.map +1 -0
- package/dist/services/definitions/dozzle.mjs +41 -0
- package/dist/services/definitions/dozzle.mjs.map +1 -0
- package/dist/services/definitions/ffmpeg.d.mts +7 -0
- package/dist/services/definitions/ffmpeg.d.mts.map +1 -0
- package/dist/services/definitions/ffmpeg.mjs +66 -0
- package/dist/services/definitions/ffmpeg.mjs.map +1 -0
- package/dist/services/definitions/flowise.d.mts +7 -0
- package/dist/services/definitions/flowise.d.mts.map +1 -0
- package/dist/services/definitions/flowise.mjs +45 -0
- package/dist/services/definitions/flowise.mjs.map +1 -0
- package/dist/services/definitions/gemini-cli.d.mts +7 -0
- package/dist/services/definitions/gemini-cli.d.mts.map +1 -0
- package/dist/services/definitions/gemini-cli.mjs +46 -0
- package/dist/services/definitions/gemini-cli.mjs.map +1 -0
- package/dist/services/definitions/gitea.d.mts +7 -0
- package/dist/services/definitions/gitea.d.mts.map +1 -0
- package/dist/services/definitions/gitea.mjs +49 -0
- package/dist/services/definitions/gitea.mjs.map +1 -0
- package/dist/services/definitions/gotify.d.mts +7 -0
- package/dist/services/definitions/gotify.d.mts.map +1 -0
- package/dist/services/definitions/gotify.mjs +62 -0
- package/dist/services/definitions/gotify.mjs.map +1 -0
- package/dist/services/definitions/grafana.d.mts +7 -0
- package/dist/services/definitions/grafana.d.mts.map +1 -0
- package/dist/services/definitions/grafana.mjs +63 -0
- package/dist/services/definitions/grafana.mjs.map +1 -0
- package/dist/services/definitions/index.d.mts +76 -0
- package/dist/services/definitions/index.d.mts.map +1 -0
- package/dist/services/definitions/index.mjs +146 -0
- package/dist/services/definitions/index.mjs.map +1 -0
- package/dist/services/definitions/kimi.d.mts +7 -0
- package/dist/services/definitions/kimi.d.mts.map +1 -0
- package/dist/services/definitions/kimi.mjs +46 -0
- package/dist/services/definitions/kimi.mjs.map +1 -0
- package/dist/services/definitions/lasuite-meet-agents.d.mts +7 -0
- package/dist/services/definitions/lasuite-meet-agents.d.mts.map +1 -0
- package/dist/services/definitions/lasuite-meet-agents.mjs +36 -0
- package/dist/services/definitions/lasuite-meet-agents.mjs.map +1 -0
- package/dist/services/definitions/lasuite-meet-backend.d.mts +7 -0
- package/dist/services/definitions/lasuite-meet-backend.d.mts.map +1 -0
- package/dist/services/definitions/lasuite-meet-backend.mjs +134 -0
- package/dist/services/definitions/lasuite-meet-backend.mjs.map +1 -0
- package/dist/services/definitions/lasuite-meet-frontend.d.mts +7 -0
- package/dist/services/definitions/lasuite-meet-frontend.d.mts.map +1 -0
- package/dist/services/definitions/lasuite-meet-frontend.mjs +48 -0
- package/dist/services/definitions/lasuite-meet-frontend.mjs.map +1 -0
- package/dist/services/definitions/librechat.d.mts +7 -0
- package/dist/services/definitions/librechat.d.mts.map +1 -0
- package/dist/services/definitions/librechat.mjs +50 -0
- package/dist/services/definitions/librechat.mjs.map +1 -0
- package/dist/services/definitions/lightpanda.d.mts +7 -0
- package/dist/services/definitions/lightpanda.d.mts.map +1 -0
- package/dist/services/definitions/lightpanda.mjs +59 -0
- package/dist/services/definitions/lightpanda.mjs.map +1 -0
- package/dist/services/definitions/litellm.d.mts +7 -0
- package/dist/services/definitions/litellm.d.mts.map +1 -0
- package/dist/services/definitions/litellm.mjs +47 -0
- package/dist/services/definitions/litellm.mjs.map +1 -0
- package/dist/services/definitions/livekit.d.mts +7 -0
- package/dist/services/definitions/livekit.d.mts.map +1 -0
- package/dist/services/definitions/livekit.mjs +56 -0
- package/dist/services/definitions/livekit.mjs.map +1 -0
- package/dist/services/definitions/matomo.d.mts +7 -0
- package/dist/services/definitions/matomo.d.mts.map +1 -0
- package/dist/services/definitions/matomo.mjs +80 -0
- package/dist/services/definitions/matomo.mjs.map +1 -0
- package/dist/services/definitions/matrix-synapse.d.mts +7 -0
- package/dist/services/definitions/matrix-synapse.d.mts.map +1 -0
- package/dist/services/definitions/matrix-synapse.mjs +88 -0
- package/dist/services/definitions/matrix-synapse.mjs.map +1 -0
- package/dist/services/definitions/mattermost.d.mts +7 -0
- package/dist/services/definitions/mattermost.d.mts.map +1 -0
- package/dist/services/definitions/mattermost.mjs +61 -0
- package/dist/services/definitions/mattermost.mjs.map +1 -0
- package/dist/services/definitions/meilisearch.d.mts +7 -0
- package/dist/services/definitions/meilisearch.d.mts.map +1 -0
- package/dist/services/definitions/meilisearch.mjs +78 -0
- package/dist/services/definitions/meilisearch.mjs.map +1 -0
- package/dist/services/definitions/minio.d.mts +7 -0
- package/dist/services/definitions/minio.d.mts.map +1 -0
- package/dist/services/definitions/minio.mjs +102 -0
- package/dist/services/definitions/minio.mjs.map +1 -0
- package/dist/services/definitions/mission-control.d.mts +7 -0
- package/dist/services/definitions/mission-control.d.mts.map +1 -0
- package/dist/services/definitions/mission-control.mjs +67 -0
- package/dist/services/definitions/mission-control.mjs.map +1 -0
- package/dist/services/definitions/mixpost.d.mts +7 -0
- package/dist/services/definitions/mixpost.d.mts.map +1 -0
- package/dist/services/definitions/mixpost.mjs +87 -0
- package/dist/services/definitions/mixpost.mjs.map +1 -0
- package/dist/services/definitions/motion-canvas.d.mts +7 -0
- package/dist/services/definitions/motion-canvas.d.mts.map +1 -0
- package/dist/services/definitions/motion-canvas.mjs +52 -0
- package/dist/services/definitions/motion-canvas.mjs.map +1 -0
- package/dist/services/definitions/n8n.d.mts +7 -0
- package/dist/services/definitions/n8n.d.mts.map +1 -0
- package/dist/services/definitions/n8n.mjs +154 -0
- package/dist/services/definitions/n8n.mjs.map +1 -0
- package/dist/services/definitions/nocodb.d.mts +7 -0
- package/dist/services/definitions/nocodb.d.mts.map +1 -0
- package/dist/services/definitions/nocodb.mjs +45 -0
- package/dist/services/definitions/nocodb.mjs.map +1 -0
- package/dist/services/definitions/ntfy.d.mts +7 -0
- package/dist/services/definitions/ntfy.d.mts.map +1 -0
- package/dist/services/definitions/ntfy.mjs +63 -0
- package/dist/services/definitions/ntfy.mjs.map +1 -0
- package/dist/services/definitions/ollama.d.mts +7 -0
- package/dist/services/definitions/ollama.d.mts.map +1 -0
- package/dist/services/definitions/ollama.mjs +66 -0
- package/dist/services/definitions/ollama.mjs.map +1 -0
- package/dist/services/definitions/open-webui.d.mts +7 -0
- package/dist/services/definitions/open-webui.d.mts.map +1 -0
- package/dist/services/definitions/open-webui.mjs +50 -0
- package/dist/services/definitions/open-webui.mjs.map +1 -0
- package/dist/services/definitions/opencode.d.mts +7 -0
- package/dist/services/definitions/opencode.d.mts.map +1 -0
- package/dist/services/definitions/opencode.mjs +50 -0
- package/dist/services/definitions/opencode.mjs.map +1 -0
- package/dist/services/definitions/openpanel.d.mts +7 -0
- package/dist/services/definitions/openpanel.d.mts.map +1 -0
- package/dist/services/definitions/openpanel.mjs +46 -0
- package/dist/services/definitions/openpanel.mjs.map +1 -0
- package/dist/services/definitions/outline.d.mts +7 -0
- package/dist/services/definitions/outline.d.mts.map +1 -0
- package/dist/services/definitions/outline.mjs +74 -0
- package/dist/services/definitions/outline.mjs.map +1 -0
- package/dist/services/definitions/paperless-ngx.d.mts +7 -0
- package/dist/services/definitions/paperless-ngx.d.mts.map +1 -0
- package/dist/services/definitions/paperless-ngx.mjs +93 -0
- package/dist/services/definitions/paperless-ngx.mjs.map +1 -0
- package/dist/services/definitions/playwright-server.d.mts +7 -0
- package/dist/services/definitions/playwright-server.d.mts.map +1 -0
- package/dist/services/definitions/playwright-server.mjs +42 -0
- package/dist/services/definitions/playwright-server.mjs.map +1 -0
- package/dist/services/definitions/portainer.d.mts +7 -0
- package/dist/services/definitions/portainer.d.mts.map +1 -0
- package/dist/services/definitions/portainer.mjs +49 -0
- package/dist/services/definitions/portainer.mjs.map +1 -0
- package/dist/services/definitions/postgresql.d.mts +7 -0
- package/dist/services/definitions/postgresql.d.mts.map +1 -0
- package/dist/services/definitions/postgresql.mjs +84 -0
- package/dist/services/definitions/postgresql.mjs.map +1 -0
- package/dist/services/definitions/postiz.d.mts +7 -0
- package/dist/services/definitions/postiz.d.mts.map +1 -0
- package/dist/services/definitions/postiz.mjs +83 -0
- package/dist/services/definitions/postiz.mjs.map +1 -0
- package/dist/services/definitions/prometheus.d.mts +7 -0
- package/dist/services/definitions/prometheus.d.mts.map +1 -0
- package/dist/services/definitions/prometheus.mjs +52 -0
- package/dist/services/definitions/prometheus.mjs.map +1 -0
- package/dist/services/definitions/qdrant.d.mts +7 -0
- package/dist/services/definitions/qdrant.d.mts.map +1 -0
- package/dist/services/definitions/qdrant.mjs +77 -0
- package/dist/services/definitions/qdrant.mjs.map +1 -0
- package/dist/services/definitions/redis.d.mts +7 -0
- package/dist/services/definitions/redis.d.mts.map +1 -0
- package/dist/services/definitions/redis.mjs +91 -0
- package/dist/services/definitions/redis.mjs.map +1 -0
- package/dist/services/definitions/remotion.d.mts +7 -0
- package/dist/services/definitions/remotion.d.mts.map +1 -0
- package/dist/services/definitions/remotion.mjs +55 -0
- package/dist/services/definitions/remotion.mjs.map +1 -0
- package/dist/services/definitions/rocketchat.d.mts +7 -0
- package/dist/services/definitions/rocketchat.d.mts.map +1 -0
- package/dist/services/definitions/rocketchat.mjs +57 -0
- package/dist/services/definitions/rocketchat.mjs.map +1 -0
- package/dist/services/definitions/searxng.d.mts +7 -0
- package/dist/services/definitions/searxng.d.mts.map +1 -0
- package/dist/services/definitions/searxng.mjs +65 -0
- package/dist/services/definitions/searxng.mjs.map +1 -0
- package/dist/services/definitions/stable-diffusion.d.mts +7 -0
- package/dist/services/definitions/stable-diffusion.d.mts.map +1 -0
- package/dist/services/definitions/stable-diffusion.mjs +48 -0
- package/dist/services/definitions/stable-diffusion.mjs.map +1 -0
- package/dist/services/definitions/steel-browser.d.mts +7 -0
- package/dist/services/definitions/steel-browser.d.mts.map +1 -0
- package/dist/services/definitions/steel-browser.mjs +77 -0
- package/dist/services/definitions/steel-browser.mjs.map +1 -0
- package/dist/services/definitions/tailscale.d.mts +7 -0
- package/dist/services/definitions/tailscale.d.mts.map +1 -0
- package/dist/services/definitions/tailscale.mjs +70 -0
- package/dist/services/definitions/tailscale.mjs.map +1 -0
- package/dist/services/definitions/temporal.d.mts +7 -0
- package/dist/services/definitions/temporal.d.mts.map +1 -0
- package/dist/services/definitions/temporal.mjs +100 -0
- package/dist/services/definitions/temporal.mjs.map +1 -0
- package/dist/services/definitions/traefik.d.mts +7 -0
- package/dist/services/definitions/traefik.d.mts.map +1 -0
- package/dist/services/definitions/traefik.mjs +58 -0
- package/dist/services/definitions/traefik.mjs.map +1 -0
- package/dist/services/definitions/umami.d.mts +7 -0
- package/dist/services/definitions/umami.d.mts.map +1 -0
- package/dist/services/definitions/umami.mjs +46 -0
- package/dist/services/definitions/umami.mjs.map +1 -0
- package/dist/services/definitions/uptime-kuma.d.mts +7 -0
- package/dist/services/definitions/uptime-kuma.d.mts.map +1 -0
- package/dist/services/definitions/uptime-kuma.mjs +51 -0
- package/dist/services/definitions/uptime-kuma.mjs.map +1 -0
- package/dist/services/definitions/usesend.d.mts +7 -0
- package/dist/services/definitions/usesend.d.mts.map +1 -0
- package/dist/services/definitions/usesend.mjs +99 -0
- package/dist/services/definitions/usesend.mjs.map +1 -0
- package/dist/services/definitions/valkey.d.mts +7 -0
- package/dist/services/definitions/valkey.d.mts.map +1 -0
- package/dist/services/definitions/valkey.mjs +61 -0
- package/dist/services/definitions/valkey.mjs.map +1 -0
- package/dist/services/definitions/watchtower.d.mts +7 -0
- package/dist/services/definitions/watchtower.d.mts.map +1 -0
- package/dist/services/definitions/watchtower.mjs +47 -0
- package/dist/services/definitions/watchtower.mjs.map +1 -0
- package/dist/services/definitions/weaviate.d.mts +7 -0
- package/dist/services/definitions/weaviate.d.mts.map +1 -0
- package/dist/services/definitions/weaviate.mjs +90 -0
- package/dist/services/definitions/weaviate.mjs.map +1 -0
- package/dist/services/definitions/whisper.d.mts +7 -0
- package/dist/services/definitions/whisper.d.mts.map +1 -0
- package/dist/services/definitions/whisper.mjs +62 -0
- package/dist/services/definitions/whisper.mjs.map +1 -0
- package/dist/services/registry.d.mts +16 -0
- package/dist/services/registry.d.mts.map +1 -0
- package/dist/services/registry.mjs +30 -0
- package/dist/services/registry.mjs.map +1 -0
- package/dist/services/registry.test.d.mts +1 -0
- package/dist/services/registry.test.mjs +64 -0
- package/dist/services/registry.test.mjs.map +1 -0
- package/dist/skills/registry.d.mts +11 -0
- package/dist/skills/registry.d.mts.map +1 -0
- package/dist/skills/registry.mjs +215 -0
- package/dist/skills/registry.mjs.map +1 -0
- package/dist/types.d.mts +64 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +92 -0
- package/dist/types.mjs.map +1 -0
- package/dist/validator.d.mts +20 -0
- package/dist/validator.d.mts.map +1 -0
- package/dist/validator.mjs +111 -0
- package/dist/validator.mjs.map +1 -0
- package/dist/validator.test.d.mts +1 -0
- package/dist/validator.test.mjs +65 -0
- package/dist/validator.test.mjs.map +1 -0
- package/dist/version-manager.d.mts +14 -0
- package/dist/version-manager.d.mts.map +1 -0
- package/dist/version-manager.mjs +55 -0
- package/dist/version-manager.mjs.map +1 -0
- package/dist/vi.2VT5v0um-Qk6MgAnK.mjs +12916 -0
- package/dist/vi.2VT5v0um-Qk6MgAnK.mjs.map +1 -0
- package/package.json +17 -17
- package/src/schema.ts +2 -1
- package/src/services/definitions/convex-dashboard.ts +48 -0
- package/src/services/definitions/convex.ts +123 -0
- package/src/services/definitions/index.ts +12 -0
- package/src/services/definitions/mission-control.ts +71 -0
- package/src/services/definitions/tailscale.ts +2 -0
- package/src/services/definitions/usesend.ts +98 -0
- package/tsdown.config.ts +1 -0
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { n as describe, r as it, t as globalExpect } from "./vi.2VT5v0um-Qk6MgAnK.mjs";
|
|
2
|
+
import { generate } from "./generate.mjs";
|
|
3
|
+
import { parse } from "yaml";
|
|
4
|
+
|
|
5
|
+
//#region src/generate.test.ts
|
|
6
|
+
describe("generate (end-to-end)", () => {
|
|
7
|
+
it("generates a minimal stack (redis only)", () => {
|
|
8
|
+
const result = generate({
|
|
9
|
+
projectName: "test-stack",
|
|
10
|
+
services: ["redis"],
|
|
11
|
+
skillPacks: [],
|
|
12
|
+
proxy: "none",
|
|
13
|
+
gpu: false,
|
|
14
|
+
platform: "linux/amd64",
|
|
15
|
+
deployment: "local",
|
|
16
|
+
generateSecrets: true,
|
|
17
|
+
openclawVersion: "latest"
|
|
18
|
+
});
|
|
19
|
+
globalExpect(result.files).toHaveProperty("docker-compose.yml");
|
|
20
|
+
globalExpect(result.files).toHaveProperty(".env.example");
|
|
21
|
+
globalExpect(result.files).toHaveProperty(".env");
|
|
22
|
+
globalExpect(result.files).toHaveProperty("README.md");
|
|
23
|
+
globalExpect(parse(result.files["docker-compose.yml"])).toHaveProperty("services");
|
|
24
|
+
globalExpect(result.files[".env.example"]).toContain("REDIS_PASSWORD");
|
|
25
|
+
globalExpect(result.files["README.md"]).toContain("test-stack");
|
|
26
|
+
globalExpect(result.metadata.serviceCount).toBeGreaterThanOrEqual(1);
|
|
27
|
+
});
|
|
28
|
+
it("generates research-agent stack from skill pack", () => {
|
|
29
|
+
const result = generate({
|
|
30
|
+
projectName: "research-stack",
|
|
31
|
+
services: [],
|
|
32
|
+
skillPacks: ["research-agent"],
|
|
33
|
+
proxy: "none",
|
|
34
|
+
gpu: false,
|
|
35
|
+
platform: "linux/amd64",
|
|
36
|
+
deployment: "local",
|
|
37
|
+
generateSecrets: true,
|
|
38
|
+
openclawVersion: "latest"
|
|
39
|
+
});
|
|
40
|
+
globalExpect(result.files).toHaveProperty("openclaw/workspace/skills/qdrant-memory/SKILL.md");
|
|
41
|
+
globalExpect(result.files).toHaveProperty("openclaw/workspace/skills/searxng-search/SKILL.md");
|
|
42
|
+
globalExpect(result.files).toHaveProperty("openclaw/workspace/skills/browserless-browse/SKILL.md");
|
|
43
|
+
const composed = parse(result.files["docker-compose.yml"]);
|
|
44
|
+
globalExpect(composed.services).toHaveProperty("qdrant");
|
|
45
|
+
globalExpect(composed.services).toHaveProperty("searxng");
|
|
46
|
+
globalExpect(composed.services).toHaveProperty("browserless");
|
|
47
|
+
});
|
|
48
|
+
it("generates full preset stack", () => {
|
|
49
|
+
const result = generate({
|
|
50
|
+
projectName: "full-stack",
|
|
51
|
+
services: [
|
|
52
|
+
"redis",
|
|
53
|
+
"postgresql",
|
|
54
|
+
"qdrant",
|
|
55
|
+
"n8n",
|
|
56
|
+
"ffmpeg",
|
|
57
|
+
"remotion",
|
|
58
|
+
"minio",
|
|
59
|
+
"caddy",
|
|
60
|
+
"browserless",
|
|
61
|
+
"searxng",
|
|
62
|
+
"meilisearch",
|
|
63
|
+
"uptime-kuma",
|
|
64
|
+
"grafana",
|
|
65
|
+
"prometheus",
|
|
66
|
+
"ollama",
|
|
67
|
+
"whisper",
|
|
68
|
+
"gotify"
|
|
69
|
+
],
|
|
70
|
+
skillPacks: [
|
|
71
|
+
"video-creator",
|
|
72
|
+
"research-agent",
|
|
73
|
+
"social-media",
|
|
74
|
+
"dev-ops",
|
|
75
|
+
"knowledge-base",
|
|
76
|
+
"local-ai"
|
|
77
|
+
],
|
|
78
|
+
proxy: "caddy",
|
|
79
|
+
domain: "example.com",
|
|
80
|
+
gpu: false,
|
|
81
|
+
platform: "linux/amd64",
|
|
82
|
+
deployment: "local",
|
|
83
|
+
generateSecrets: true,
|
|
84
|
+
openclawVersion: "latest"
|
|
85
|
+
});
|
|
86
|
+
const fileCount = Object.keys(result.files).length;
|
|
87
|
+
globalExpect(fileCount).toBeGreaterThan(10);
|
|
88
|
+
globalExpect(result.files).toHaveProperty("scripts/start.sh");
|
|
89
|
+
globalExpect(result.metadata.serviceCount).toBeGreaterThan(5);
|
|
90
|
+
});
|
|
91
|
+
it("generates caddy config when proxy is caddy", () => {
|
|
92
|
+
const result = generate({
|
|
93
|
+
projectName: "caddy-stack",
|
|
94
|
+
services: ["redis"],
|
|
95
|
+
skillPacks: [],
|
|
96
|
+
proxy: "caddy",
|
|
97
|
+
domain: "example.com",
|
|
98
|
+
gpu: false,
|
|
99
|
+
platform: "linux/amd64",
|
|
100
|
+
deployment: "local",
|
|
101
|
+
generateSecrets: true,
|
|
102
|
+
openclawVersion: "latest"
|
|
103
|
+
});
|
|
104
|
+
globalExpect(result.files).toHaveProperty("caddy/Caddyfile");
|
|
105
|
+
globalExpect(result.files["caddy/Caddyfile"].length).toBeGreaterThan(0);
|
|
106
|
+
});
|
|
107
|
+
it("generates prometheus config when monitoring enabled", () => {
|
|
108
|
+
const result = generate({
|
|
109
|
+
projectName: "monitored-stack",
|
|
110
|
+
services: [],
|
|
111
|
+
skillPacks: [],
|
|
112
|
+
proxy: "none",
|
|
113
|
+
gpu: false,
|
|
114
|
+
platform: "linux/amd64",
|
|
115
|
+
deployment: "local",
|
|
116
|
+
generateSecrets: true,
|
|
117
|
+
openclawVersion: "latest",
|
|
118
|
+
monitoring: true
|
|
119
|
+
});
|
|
120
|
+
globalExpect(result.files).toHaveProperty("prometheus/prometheus.yml");
|
|
121
|
+
globalExpect(parse(result.files["prometheus/prometheus.yml"])).toBeDefined();
|
|
122
|
+
});
|
|
123
|
+
it("generates La Suite Meet stack with all expected services", () => {
|
|
124
|
+
const lasuiteMeetServices = [
|
|
125
|
+
"postgresql",
|
|
126
|
+
"redis",
|
|
127
|
+
"livekit",
|
|
128
|
+
"lasuite-meet-backend",
|
|
129
|
+
"lasuite-meet-frontend",
|
|
130
|
+
"lasuite-meet-agents"
|
|
131
|
+
];
|
|
132
|
+
const result = generate({
|
|
133
|
+
projectName: "lasuite-meet-stack",
|
|
134
|
+
services: lasuiteMeetServices,
|
|
135
|
+
skillPacks: [],
|
|
136
|
+
proxy: "none",
|
|
137
|
+
gpu: false,
|
|
138
|
+
platform: "linux/amd64",
|
|
139
|
+
deployment: "local",
|
|
140
|
+
generateSecrets: true,
|
|
141
|
+
openclawVersion: "latest"
|
|
142
|
+
});
|
|
143
|
+
const allServiceIds = /* @__PURE__ */ new Set();
|
|
144
|
+
for (const [filename, content] of Object.entries(result.files)) if (filename.endsWith(".yml") && content) {
|
|
145
|
+
const doc = parse(content);
|
|
146
|
+
if (doc?.services && typeof doc.services === "object") for (const id of Object.keys(doc.services)) allServiceIds.add(id);
|
|
147
|
+
}
|
|
148
|
+
for (const id of lasuiteMeetServices) globalExpect(allServiceIds.has(id), `missing service ${id}`).toBe(true);
|
|
149
|
+
globalExpect(result.metadata.serviceCount).toBe(lasuiteMeetServices.length);
|
|
150
|
+
});
|
|
151
|
+
it("generates bare-metal installer for Windows (install.ps1)", () => {
|
|
152
|
+
const result = generate({
|
|
153
|
+
projectName: "win-stack",
|
|
154
|
+
services: ["redis"],
|
|
155
|
+
skillPacks: [],
|
|
156
|
+
proxy: "none",
|
|
157
|
+
gpu: false,
|
|
158
|
+
platform: "windows/amd64",
|
|
159
|
+
deployment: "local",
|
|
160
|
+
deploymentType: "bare-metal",
|
|
161
|
+
generateSecrets: true,
|
|
162
|
+
openclawVersion: "latest"
|
|
163
|
+
});
|
|
164
|
+
globalExpect(result.files).toHaveProperty("install.ps1");
|
|
165
|
+
globalExpect(result.files["install.ps1"]).toContain("docker compose");
|
|
166
|
+
globalExpect(result.files["install.ps1"]).toContain("PowerShell");
|
|
167
|
+
});
|
|
168
|
+
it("generates bare-metal installer for Linux/macOS (install.sh)", () => {
|
|
169
|
+
const result = generate({
|
|
170
|
+
projectName: "linux-stack",
|
|
171
|
+
services: ["redis"],
|
|
172
|
+
skillPacks: [],
|
|
173
|
+
proxy: "none",
|
|
174
|
+
gpu: false,
|
|
175
|
+
platform: "linux/amd64",
|
|
176
|
+
deployment: "local",
|
|
177
|
+
deploymentType: "bare-metal",
|
|
178
|
+
generateSecrets: true,
|
|
179
|
+
openclawVersion: "latest"
|
|
180
|
+
});
|
|
181
|
+
globalExpect(result.files).toHaveProperty("install.sh");
|
|
182
|
+
globalExpect(result.files["install.sh"]).toContain("docker");
|
|
183
|
+
globalExpect(result.files["install.sh"]).toContain("compose");
|
|
184
|
+
});
|
|
185
|
+
it("bare-metal with redis on Linux: native script, compose excludes redis, gateway has extra_hosts", () => {
|
|
186
|
+
const result = generate({
|
|
187
|
+
projectName: "bare-metal-redis",
|
|
188
|
+
services: ["redis"],
|
|
189
|
+
skillPacks: [],
|
|
190
|
+
proxy: "none",
|
|
191
|
+
gpu: false,
|
|
192
|
+
platform: "linux/amd64",
|
|
193
|
+
deployment: "local",
|
|
194
|
+
deploymentType: "bare-metal",
|
|
195
|
+
generateSecrets: true,
|
|
196
|
+
openclawVersion: "latest"
|
|
197
|
+
});
|
|
198
|
+
globalExpect(result.files).toHaveProperty("native/install-linux.sh");
|
|
199
|
+
globalExpect(result.files["native/install-linux.sh"]).toContain("redis");
|
|
200
|
+
const composed = parse(result.files["docker-compose.yml"]);
|
|
201
|
+
globalExpect(composed.services).not.toHaveProperty("redis");
|
|
202
|
+
globalExpect(composed.services).toHaveProperty("openclaw-gateway");
|
|
203
|
+
const gateway = composed.services["openclaw-gateway"];
|
|
204
|
+
globalExpect(gateway).toBeDefined();
|
|
205
|
+
globalExpect(gateway.extra_hosts).toBeDefined();
|
|
206
|
+
globalExpect(gateway.extra_hosts.some((h) => h.includes("host.docker.internal") && h.includes("host-gateway"))).toBe(true);
|
|
207
|
+
globalExpect(result.files[".env"]).toContain("REDIS_HOST=host.docker.internal");
|
|
208
|
+
});
|
|
209
|
+
it("throws on conflicting services", () => {
|
|
210
|
+
globalExpect(() => generate({
|
|
211
|
+
projectName: "conflict-stack",
|
|
212
|
+
services: ["redis", "valkey"],
|
|
213
|
+
skillPacks: [],
|
|
214
|
+
proxy: "none",
|
|
215
|
+
gpu: false,
|
|
216
|
+
platform: "linux/amd64",
|
|
217
|
+
deployment: "local",
|
|
218
|
+
generateSecrets: true,
|
|
219
|
+
openclawVersion: "latest"
|
|
220
|
+
})).toThrow();
|
|
221
|
+
});
|
|
222
|
+
it("generates scripts directory", () => {
|
|
223
|
+
const result = generate({
|
|
224
|
+
projectName: "scripts-stack",
|
|
225
|
+
services: ["redis"],
|
|
226
|
+
skillPacks: [],
|
|
227
|
+
proxy: "none",
|
|
228
|
+
gpu: false,
|
|
229
|
+
platform: "linux/amd64",
|
|
230
|
+
deployment: "local",
|
|
231
|
+
generateSecrets: true,
|
|
232
|
+
openclawVersion: "latest"
|
|
233
|
+
});
|
|
234
|
+
for (const script of [
|
|
235
|
+
"scripts/start.sh",
|
|
236
|
+
"scripts/stop.sh",
|
|
237
|
+
"scripts/update.sh",
|
|
238
|
+
"scripts/backup.sh",
|
|
239
|
+
"scripts/status.sh"
|
|
240
|
+
]) {
|
|
241
|
+
globalExpect(result.files).toHaveProperty(script);
|
|
242
|
+
globalExpect(result.files[script].length).toBeGreaterThan(0);
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
it("all generated .env.example vars have comments", () => {
|
|
246
|
+
const lines = generate({
|
|
247
|
+
projectName: "env-comments-stack",
|
|
248
|
+
services: [
|
|
249
|
+
"redis",
|
|
250
|
+
"qdrant",
|
|
251
|
+
"n8n"
|
|
252
|
+
],
|
|
253
|
+
skillPacks: [],
|
|
254
|
+
proxy: "none",
|
|
255
|
+
gpu: false,
|
|
256
|
+
platform: "linux/amd64",
|
|
257
|
+
deployment: "local",
|
|
258
|
+
generateSecrets: true,
|
|
259
|
+
openclawVersion: "latest"
|
|
260
|
+
}).files[".env.example"].split("\n");
|
|
261
|
+
for (let i = 0; i < lines.length; i++) {
|
|
262
|
+
const line = lines[i].trim();
|
|
263
|
+
if (line === "" || line.startsWith("#")) continue;
|
|
264
|
+
if (line.includes("=")) {
|
|
265
|
+
let foundComment = false;
|
|
266
|
+
for (let j = i - 1; j >= 0; j--) {
|
|
267
|
+
const prev = lines[j].trim();
|
|
268
|
+
if (prev === "") continue;
|
|
269
|
+
if (prev.startsWith("#")) {
|
|
270
|
+
foundComment = true;
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
break;
|
|
274
|
+
}
|
|
275
|
+
globalExpect(foundComment).toBe(true);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
//#endregion
|
|
282
|
+
export { };
|
|
283
|
+
//# sourceMappingURL=generate.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.test.mjs","names":[],"sources":["../src/generate.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { parse } from \"yaml\";\nimport { generate } from \"./generate.js\";\n\ndescribe(\"generate (end-to-end)\", () => {\n\tit(\"generates a minimal stack (redis only)\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"test-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Core files must be present\n\t\texpect(result.files).toHaveProperty(\"docker-compose.yml\");\n\t\texpect(result.files).toHaveProperty(\".env.example\");\n\t\texpect(result.files).toHaveProperty(\".env\");\n\t\texpect(result.files).toHaveProperty(\"README.md\");\n\n\t\t// docker-compose.yml must be valid YAML\n\t\tconst composed = parse(result.files[\"docker-compose.yml\"]!);\n\t\texpect(composed).toHaveProperty(\"services\");\n\n\t\t// .env.example should reference REDIS_PASSWORD\n\t\texpect(result.files[\".env.example\"]).toContain(\"REDIS_PASSWORD\");\n\n\t\t// README should mention the project name\n\t\texpect(result.files[\"README.md\"]).toContain(\"test-stack\");\n\n\t\t// At least one service resolved\n\t\texpect(result.metadata.serviceCount).toBeGreaterThanOrEqual(1);\n\t});\n\n\tit(\"generates research-agent stack from skill pack\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"research-stack\",\n\t\t\tservices: [],\n\t\t\tskillPacks: [\"research-agent\"],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Skill SKILL.md files for each skill in the research-agent pack\n\t\texpect(result.files).toHaveProperty(\"openclaw/workspace/skills/qdrant-memory/SKILL.md\");\n\t\texpect(result.files).toHaveProperty(\"openclaw/workspace/skills/searxng-search/SKILL.md\");\n\t\texpect(result.files).toHaveProperty(\"openclaw/workspace/skills/browserless-browse/SKILL.md\");\n\n\t\t// docker-compose.yml should contain the expected services\n\t\tconst composed = parse(result.files[\"docker-compose.yml\"]!);\n\t\texpect(composed.services).toHaveProperty(\"qdrant\");\n\t\texpect(composed.services).toHaveProperty(\"searxng\");\n\t\texpect(composed.services).toHaveProperty(\"browserless\");\n\t});\n\n\tit(\"generates full preset stack\", () => {\n\t\tconst fullServices = [\n\t\t\t\"redis\",\n\t\t\t\"postgresql\",\n\t\t\t\"qdrant\",\n\t\t\t\"n8n\",\n\t\t\t\"ffmpeg\",\n\t\t\t\"remotion\",\n\t\t\t\"minio\",\n\t\t\t\"caddy\",\n\t\t\t\"browserless\",\n\t\t\t\"searxng\",\n\t\t\t\"meilisearch\",\n\t\t\t\"uptime-kuma\",\n\t\t\t\"grafana\",\n\t\t\t\"prometheus\",\n\t\t\t\"ollama\",\n\t\t\t\"whisper\",\n\t\t\t\"gotify\",\n\t\t];\n\n\t\tconst result = generate({\n\t\t\tprojectName: \"full-stack\",\n\t\t\tservices: fullServices,\n\t\t\tskillPacks: [\n\t\t\t\t\"video-creator\",\n\t\t\t\t\"research-agent\",\n\t\t\t\t\"social-media\",\n\t\t\t\t\"dev-ops\",\n\t\t\t\t\"knowledge-base\",\n\t\t\t\t\"local-ai\",\n\t\t\t],\n\t\t\tproxy: \"caddy\",\n\t\t\tdomain: \"example.com\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Should have many files\n\t\tconst fileCount = Object.keys(result.files).length;\n\t\texpect(fileCount).toBeGreaterThan(10);\n\n\t\t// Should include the start script\n\t\texpect(result.files).toHaveProperty(\"scripts/start.sh\");\n\n\t\t// Should not throw (it already didn't if we got here)\n\t\texpect(result.metadata.serviceCount).toBeGreaterThan(5);\n\t});\n\n\tit(\"generates caddy config when proxy is caddy\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"caddy-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"caddy\",\n\t\t\tdomain: \"example.com\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\texpect(result.files).toHaveProperty(\"caddy/Caddyfile\");\n\t\texpect(result.files[\"caddy/Caddyfile\"]!.length).toBeGreaterThan(0);\n\t});\n\n\tit(\"generates prometheus config when monitoring enabled\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"monitored-stack\",\n\t\t\tservices: [],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t\tmonitoring: true,\n\t\t});\n\n\t\texpect(result.files).toHaveProperty(\"prometheus/prometheus.yml\");\n\t\t// Verify it's valid YAML\n\t\tconst promConfig = parse(result.files[\"prometheus/prometheus.yml\"]!);\n\t\texpect(promConfig).toBeDefined();\n\t});\n\n\tit(\"generates La Suite Meet stack with all expected services\", () => {\n\t\tconst lasuiteMeetServices = [\n\t\t\t\"postgresql\",\n\t\t\t\"redis\",\n\t\t\t\"livekit\",\n\t\t\t\"lasuite-meet-backend\",\n\t\t\t\"lasuite-meet-frontend\",\n\t\t\t\"lasuite-meet-agents\",\n\t\t];\n\t\tconst result = generate({\n\t\t\tprojectName: \"lasuite-meet-stack\",\n\t\t\tservices: lasuiteMeetServices,\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Services may be split across main and profile compose files\n\t\tconst allServiceIds = new Set<string>();\n\t\tfor (const [filename, content] of Object.entries(result.files)) {\n\t\t\tif (filename.endsWith(\".yml\") && content) {\n\t\t\t\tconst doc = parse(content);\n\t\t\t\tif (doc?.services && typeof doc.services === \"object\") {\n\t\t\t\t\tfor (const id of Object.keys(doc.services)) {\n\t\t\t\t\t\tallServiceIds.add(id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const id of lasuiteMeetServices) {\n\t\t\texpect(allServiceIds.has(id), `missing service ${id}`).toBe(true);\n\t\t}\n\t\texpect(result.metadata.serviceCount).toBe(lasuiteMeetServices.length);\n\t});\n\n\tit(\"generates bare-metal installer for Windows (install.ps1)\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"win-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"windows/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tdeploymentType: \"bare-metal\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\t\texpect(result.files).toHaveProperty(\"install.ps1\");\n\t\texpect(result.files[\"install.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result.files[\"install.ps1\"]).toContain(\"PowerShell\");\n\t});\n\n\tit(\"generates bare-metal installer for Linux/macOS (install.sh)\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"linux-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tdeploymentType: \"bare-metal\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\t\texpect(result.files).toHaveProperty(\"install.sh\");\n\t\texpect(result.files[\"install.sh\"]).toContain(\"docker\");\n\t\texpect(result.files[\"install.sh\"]).toContain(\"compose\");\n\t});\n\n\tit(\"bare-metal with redis on Linux: native script, compose excludes redis, gateway has extra_hosts\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"bare-metal-redis\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tdeploymentType: \"bare-metal\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\t// Native install script for Linux\n\t\texpect(result.files).toHaveProperty(\"native/install-linux.sh\");\n\t\texpect(result.files[\"native/install-linux.sh\"]).toContain(\"redis\");\n\n\t\t// Docker compose must NOT include redis (native); only gateway/openclaw\n\t\tconst composed = parse(result.files[\"docker-compose.yml\"]!);\n\t\texpect(composed.services).not.toHaveProperty(\"redis\");\n\t\texpect(composed.services).toHaveProperty(\"openclaw-gateway\");\n\n\t\t// Gateway must have extra_hosts for host.docker.internal\n\t\tconst gateway = composed.services[\"openclaw-gateway\"];\n\t\texpect(gateway).toBeDefined();\n\t\texpect(gateway.extra_hosts).toBeDefined();\n\t\texpect(\n\t\t\t(gateway.extra_hosts as string[]).some(\n\t\t\t\t(h: string) => h.includes(\"host.docker.internal\") && h.includes(\"host-gateway\"),\n\t\t\t),\n\t\t).toBe(true);\n\n\t\t// .env should set REDIS_HOST to host.docker.internal for gateway to reach native Redis\n\t\texpect(result.files[\".env\"]).toContain(\"REDIS_HOST=host.docker.internal\");\n\t});\n\n\tit(\"throws on conflicting services\", () => {\n\t\texpect(() =>\n\t\t\tgenerate({\n\t\t\t\tprojectName: \"conflict-stack\",\n\t\t\t\tservices: [\"redis\", \"valkey\"],\n\t\t\t\tskillPacks: [],\n\t\t\t\tproxy: \"none\",\n\t\t\t\tgpu: false,\n\t\t\t\tplatform: \"linux/amd64\",\n\t\t\t\tdeployment: \"local\",\n\t\t\t\tgenerateSecrets: true,\n\t\t\t\topenclawVersion: \"latest\",\n\t\t\t}),\n\t\t).toThrow();\n\t});\n\n\tit(\"generates scripts directory\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"scripts-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\tconst expectedScripts = [\n\t\t\t\"scripts/start.sh\",\n\t\t\t\"scripts/stop.sh\",\n\t\t\t\"scripts/update.sh\",\n\t\t\t\"scripts/backup.sh\",\n\t\t\t\"scripts/status.sh\",\n\t\t];\n\n\t\tfor (const script of expectedScripts) {\n\t\t\texpect(result.files).toHaveProperty(script);\n\t\t\texpect(result.files[script]!.length).toBeGreaterThan(0);\n\t\t}\n\t});\n\n\tit(\"all generated .env.example vars have comments\", () => {\n\t\tconst result = generate({\n\t\t\tprojectName: \"env-comments-stack\",\n\t\t\tservices: [\"redis\", \"qdrant\", \"n8n\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tdeployment: \"local\",\n\t\t\tgenerateSecrets: true,\n\t\t\topenclawVersion: \"latest\",\n\t\t});\n\n\t\tconst envExample = result.files[\".env.example\"]!;\n\t\tconst lines = envExample.split(\"\\n\");\n\n\t\t// Walk through lines: every non-empty, non-comment KEY=VALUE line should\n\t\t// have a preceding comment line (starting with #).\n\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\tconst line = lines[i]!.trim();\n\t\t\tif (line === \"\" || line.startsWith(\"#\")) continue;\n\n\t\t\t// This line looks like KEY=VALUE\n\t\t\tif (line.includes(\"=\")) {\n\t\t\t\t// There must be a comment somewhere before it (look backwards for a # line)\n\t\t\t\tlet foundComment = false;\n\t\t\t\tfor (let j = i - 1; j >= 0; j--) {\n\t\t\t\t\tconst prev = lines[j]!.trim();\n\t\t\t\t\tif (prev === \"\") continue; // skip blank lines\n\t\t\t\t\tif (prev.startsWith(\"#\")) {\n\t\t\t\t\t\tfoundComment = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// Hit another non-comment, non-empty line — no comment found\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\texpect(foundComment).toBe(true);\n\t\t\t}\n\t\t}\n\t});\n});\n"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Platform } from "../types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/generators/bare-metal-install.d.ts
|
|
4
|
+
interface BareMetalInstallOptions {
|
|
5
|
+
platform: Platform;
|
|
6
|
+
projectName: string;
|
|
7
|
+
/** When true, top-level script runs native/install-*.sh|ps1 first, then Docker + compose. */
|
|
8
|
+
hasNativeServices?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Returns one file: install.sh (Linux/macOS) or install.ps1 (Windows).
|
|
12
|
+
* When hasNativeServices is true, the script runs the native installer first, then Docker + compose.
|
|
13
|
+
*/
|
|
14
|
+
declare function generateBareMetalInstall(options: BareMetalInstallOptions): Record<string, string>;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { BareMetalInstallOptions, generateBareMetalInstall };
|
|
17
|
+
//# sourceMappingURL=bare-metal-install.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bare-metal-install.d.mts","names":[],"sources":["../../src/generators/bare-metal-install.ts"],"mappings":";;;UAuNiB,uBAAA;EAChB,QAAA,EAAU,QAAA;EACV,WAAA;EAAA;EAEA,iBAAA;AAAA;;AAOD;;;iBAAgB,wBAAA,CAAyB,OAAA,EAAS,uBAAA,GAA0B,MAAA"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
//#region src/generators/bare-metal-install.ts
|
|
2
|
+
const LINUX_SCRIPT_PREFIX_NATIVE = `
|
|
3
|
+
# Native services (install/start on host first)
|
|
4
|
+
if [ -f "native/install-linux.sh" ]; then
|
|
5
|
+
info "Installing and starting native services..."
|
|
6
|
+
bash native/install-linux.sh
|
|
7
|
+
ok "Native services ready."
|
|
8
|
+
fi
|
|
9
|
+
`;
|
|
10
|
+
const LINUX_SCRIPT = `#!/usr/bin/env bash
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
|
|
13
|
+
# OpenClaw bare-metal installer (Linux)
|
|
14
|
+
# Optionally runs native services script, then Docker + Compose.
|
|
15
|
+
# Idempotent: safe to re-run.
|
|
16
|
+
|
|
17
|
+
SCRIPT_DIR="$(cd "$(dirname "\${BASH_SOURCE[0]}")" && pwd)"
|
|
18
|
+
cd "$SCRIPT_DIR"
|
|
19
|
+
|
|
20
|
+
if [ -t 1 ]; then
|
|
21
|
+
RED='\\033[0;31m'; GREEN='\\033[0;32m'; YELLOW='\\033[1;33m'; CYAN='\\033[0;36m'; NC='\\033[0m'
|
|
22
|
+
else
|
|
23
|
+
RED=''; GREEN=''; YELLOW=''; CYAN=''; NC=''
|
|
24
|
+
fi
|
|
25
|
+
info() { echo -e "\${CYAN}ℹ $*\${NC}"; }
|
|
26
|
+
ok() { echo -e "\${GREEN}✅ $*\${NC}"; }
|
|
27
|
+
warn() { echo -e "\${YELLOW}⚠️ $*\${NC}"; }
|
|
28
|
+
err() { echo -e "\${RED}❌ $*\${NC}" >&2; }
|
|
29
|
+
__NATIVE_BLOCK__
|
|
30
|
+
# Install Docker if missing
|
|
31
|
+
if ! command -v docker &> /dev/null; then
|
|
32
|
+
info "Installing Docker..."
|
|
33
|
+
if command -v apt-get &> /dev/null; then
|
|
34
|
+
sudo apt-get update -qq
|
|
35
|
+
sudo apt-get install -y -qq ca-certificates curl
|
|
36
|
+
curl -fsSL https://get.docker.com | sudo sh
|
|
37
|
+
sudo usermod -aG docker "$USER" 2>/dev/null || true
|
|
38
|
+
ok "Docker installed. You may need to log out and back in for group changes."
|
|
39
|
+
elif command -v dnf &> /dev/null || command -v yum &> /dev/null; then
|
|
40
|
+
sudo dnf install -y dnf-plugins-core 2>/dev/null || sudo yum install -y yum-utils
|
|
41
|
+
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 2>/dev/null || sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
|
|
42
|
+
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin 2>/dev/null || sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
|
|
43
|
+
sudo systemctl enable --now docker
|
|
44
|
+
sudo usermod -aG docker "$USER" 2>/dev/null || true
|
|
45
|
+
ok "Docker installed."
|
|
46
|
+
else
|
|
47
|
+
err "Unsupported package manager. Install Docker manually: https://docs.docker.com/engine/install/"
|
|
48
|
+
exit 1
|
|
49
|
+
fi
|
|
50
|
+
else
|
|
51
|
+
ok "Docker already installed."
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
if ! docker compose version &> /dev/null; then
|
|
55
|
+
err "Docker Compose (v2) plugin not found. Install it: https://docs.docker.com/compose/install/"
|
|
56
|
+
exit 1
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
if ! docker info &> /dev/null 2>&1; then
|
|
60
|
+
err "Docker daemon not running. Start it (e.g. sudo systemctl start docker) and re-run this script."
|
|
61
|
+
exit 1
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
# Use project start script if present, else docker compose up
|
|
65
|
+
if [ -f "scripts/start.sh" ]; then
|
|
66
|
+
info "Starting stack via scripts/start.sh..."
|
|
67
|
+
bash scripts/start.sh
|
|
68
|
+
else
|
|
69
|
+
if [ -f ".env.example" ] && [ ! -f ".env" ]; then cp .env.example .env; fi
|
|
70
|
+
info "Starting stack..."
|
|
71
|
+
docker compose up -d --remove-orphans
|
|
72
|
+
echo ""
|
|
73
|
+
ok "Stack started. Gateway: http://localhost:\${OPENCLAW_GATEWAY_PORT:-18789}"
|
|
74
|
+
fi
|
|
75
|
+
`;
|
|
76
|
+
const MACOS_SCRIPT_PREFIX_NATIVE = `
|
|
77
|
+
if [ -f "native/install-macos.sh" ]; then
|
|
78
|
+
info "Installing and starting native services..."
|
|
79
|
+
bash native/install-macos.sh
|
|
80
|
+
ok "Native services ready."
|
|
81
|
+
fi
|
|
82
|
+
`;
|
|
83
|
+
const MACOS_SCRIPT = `#!/usr/bin/env bash
|
|
84
|
+
set -euo pipefail
|
|
85
|
+
|
|
86
|
+
# OpenClaw bare-metal installer (macOS)
|
|
87
|
+
# Optionally runs native services, then Docker Desktop + compose.
|
|
88
|
+
# Idempotent: safe to re-run.
|
|
89
|
+
|
|
90
|
+
SCRIPT_DIR="$(cd "$(dirname "\${BASH_SOURCE[0]}")" && pwd)"
|
|
91
|
+
cd "$SCRIPT_DIR"
|
|
92
|
+
|
|
93
|
+
if [ -t 1 ]; then
|
|
94
|
+
RED='\\033[0;31m'; GREEN='\\033[0;32m'; YELLOW='\\033[1;33m'; CYAN='\\033[0;36m'; NC='\\033[0m'
|
|
95
|
+
else
|
|
96
|
+
RED=''; GREEN=''; YELLOW=''; CYAN=''; NC=''
|
|
97
|
+
fi
|
|
98
|
+
info() { echo -e "\${CYAN}ℹ $*\${NC}"; }
|
|
99
|
+
ok() { echo -e "\${GREEN}✅ $*\${NC}"; }
|
|
100
|
+
warn() { echo -e "\${YELLOW}⚠️ $*\${NC}"; }
|
|
101
|
+
err() { echo -e "\${RED}❌ $*\${NC}" >&2; }
|
|
102
|
+
__NATIVE_BLOCK__
|
|
103
|
+
if ! command -v docker &> /dev/null; then
|
|
104
|
+
if command -v brew &> /dev/null; then
|
|
105
|
+
info "Installing Docker via Homebrew..."
|
|
106
|
+
brew install --cask docker
|
|
107
|
+
warn "Docker Desktop was installed. Please open Docker from Applications, then re-run this script."
|
|
108
|
+
exit 0
|
|
109
|
+
else
|
|
110
|
+
err "Docker not found. Install Docker Desktop from https://docs.docker.com/desktop/install/mac-install/ or run: brew install --cask docker"
|
|
111
|
+
exit 1
|
|
112
|
+
fi
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
if ! docker info &> /dev/null 2>&1; then
|
|
116
|
+
err "Docker daemon not running. Open Docker Desktop from Applications, then re-run this script."
|
|
117
|
+
exit 1
|
|
118
|
+
fi
|
|
119
|
+
|
|
120
|
+
if ! docker compose version &> /dev/null; then
|
|
121
|
+
err "Docker Compose (v2) not available. Ensure Docker Desktop is up to date."
|
|
122
|
+
exit 1
|
|
123
|
+
fi
|
|
124
|
+
|
|
125
|
+
if [ -f "scripts/start.sh" ]; then
|
|
126
|
+
info "Starting stack via scripts/start.sh..."
|
|
127
|
+
bash scripts/start.sh
|
|
128
|
+
else
|
|
129
|
+
if [ -f ".env.example" ] && [ ! -f ".env" ]; then cp .env.example .env; fi
|
|
130
|
+
info "Starting stack..."
|
|
131
|
+
docker compose up -d --remove-orphans
|
|
132
|
+
echo ""
|
|
133
|
+
ok "Stack started. Gateway: http://localhost:\${OPENCLAW_GATEWAY_PORT:-18789}"
|
|
134
|
+
fi
|
|
135
|
+
`;
|
|
136
|
+
const WINDOWS_SCRIPT_PREFIX_NATIVE = `
|
|
137
|
+
if (Test-Path "native/install-windows.ps1") {
|
|
138
|
+
Info "Installing and starting native services..."
|
|
139
|
+
& .\\native\\install-windows.ps1
|
|
140
|
+
Ok "Native services ready."
|
|
141
|
+
}
|
|
142
|
+
`;
|
|
143
|
+
const WINDOWS_SCRIPT = `# OpenClaw bare-metal installer (Windows PowerShell)
|
|
144
|
+
# Optionally runs native services, then Docker Desktop + compose.
|
|
145
|
+
# Idempotent: safe to re-run. Run in PowerShell as Administrator if installing Docker.
|
|
146
|
+
|
|
147
|
+
$ErrorActionPreference = "Stop"
|
|
148
|
+
$ProjectDir = $PSScriptRoot
|
|
149
|
+
Set-Location $ProjectDir
|
|
150
|
+
|
|
151
|
+
function Info { Write-Host " $args" -ForegroundColor Cyan }
|
|
152
|
+
function Ok { Write-Host " $args" -ForegroundColor Green }
|
|
153
|
+
function Warn { Write-Host " $args" -ForegroundColor Yellow }
|
|
154
|
+
function Err { Write-Host " $args" -ForegroundColor Red; exit 1 }
|
|
155
|
+
__NATIVE_BLOCK__
|
|
156
|
+
# Check Docker
|
|
157
|
+
$docker = Get-Command docker -ErrorAction SilentlyContinue
|
|
158
|
+
if (-not $docker) {
|
|
159
|
+
Write-Host ""
|
|
160
|
+
Write-Host " Docker not found." -ForegroundColor Red
|
|
161
|
+
Write-Host " Install Docker Desktop from: https://docs.docker.com/desktop/install/windows-install/"
|
|
162
|
+
Write-Host " Then restart PowerShell and run this script again."
|
|
163
|
+
exit 1
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
try { docker info 2>$null | Out-Null } catch {
|
|
167
|
+
Write-Host ""
|
|
168
|
+
Write-Host " Docker daemon is not running." -ForegroundColor Red
|
|
169
|
+
Write-Host " Start Docker Desktop from the Start menu, then run this script again."
|
|
170
|
+
exit 1
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
try { docker compose version 2>$null | Out-Null } catch {
|
|
174
|
+
Write-Host ""
|
|
175
|
+
Write-Host " Docker Compose (v2) not available. Update Docker Desktop." -ForegroundColor Red
|
|
176
|
+
exit 1
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
Ok "Docker is ready."
|
|
180
|
+
|
|
181
|
+
# Prepare .env
|
|
182
|
+
if (-not (Test-Path ".env")) {
|
|
183
|
+
if (Test-Path ".env.example") {
|
|
184
|
+
Copy-Item ".env.example" ".env"
|
|
185
|
+
Info "Created .env from .env.example"
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
# Create dirs
|
|
190
|
+
$configDir = if ($env:OPENCLAW_CONFIG_DIR) { $env:OPENCLAW_CONFIG_DIR } else { "./openclaw/config" }
|
|
191
|
+
$workspaceDir = if ($env:OPENCLAW_WORKSPACE_DIR) { $env:OPENCLAW_WORKSPACE_DIR } else { "./openclaw/workspace" }
|
|
192
|
+
New-Item -ItemType Directory -Force -Path $configDir | Out-Null
|
|
193
|
+
New-Item -ItemType Directory -Force -Path $workspaceDir | Out-Null
|
|
194
|
+
Ok "Directories ready."
|
|
195
|
+
|
|
196
|
+
# Start stack
|
|
197
|
+
Info "Starting stack..."
|
|
198
|
+
docker compose up -d --remove-orphans
|
|
199
|
+
|
|
200
|
+
$port = if ($env:OPENCLAW_GATEWAY_PORT) { $env:OPENCLAW_GATEWAY_PORT } else { "18789" }
|
|
201
|
+
Write-Host ""
|
|
202
|
+
Ok "Stack started. Gateway: http://localhost:$port"
|
|
203
|
+
`;
|
|
204
|
+
/**
|
|
205
|
+
* Returns one file: install.sh (Linux/macOS) or install.ps1 (Windows).
|
|
206
|
+
* When hasNativeServices is true, the script runs the native installer first, then Docker + compose.
|
|
207
|
+
*/
|
|
208
|
+
function generateBareMetalInstall(options) {
|
|
209
|
+
const { platform, hasNativeServices } = options;
|
|
210
|
+
const files = {};
|
|
211
|
+
if (platform === "windows/amd64") {
|
|
212
|
+
files["install.ps1"] = hasNativeServices ? WINDOWS_SCRIPT.replace("__NATIVE_BLOCK__", WINDOWS_SCRIPT_PREFIX_NATIVE) : WINDOWS_SCRIPT.replace("__NATIVE_BLOCK__", "");
|
|
213
|
+
return files;
|
|
214
|
+
}
|
|
215
|
+
const isMac = platform.startsWith("macos/");
|
|
216
|
+
const baseScript = isMac ? MACOS_SCRIPT : LINUX_SCRIPT;
|
|
217
|
+
const prefix = hasNativeServices ? isMac ? MACOS_SCRIPT_PREFIX_NATIVE : LINUX_SCRIPT_PREFIX_NATIVE : "";
|
|
218
|
+
files["install.sh"] = baseScript.replace("__NATIVE_BLOCK__", prefix);
|
|
219
|
+
return files;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
//#endregion
|
|
223
|
+
export { generateBareMetalInstall };
|
|
224
|
+
//# sourceMappingURL=bare-metal-install.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bare-metal-install.mjs","names":[],"sources":["../../src/generators/bare-metal-install.ts"],"sourcesContent":["/**\n * Generates platform-specific installer scripts for bare-metal (VPS, computer) deployment.\n * Each script ensures Docker and Docker Compose are installed, then runs the stack.\n * Returns a map of one file: install.sh (Linux/macOS) or install.ps1 (Windows).\n */\nimport type { Platform } from \"../types.js\";\n\nconst LINUX_SCRIPT_PREFIX_NATIVE = `\n# Native services (install/start on host first)\nif [ -f \"native/install-linux.sh\" ]; then\n info \"Installing and starting native services...\"\n bash native/install-linux.sh\n ok \"Native services ready.\"\nfi\n`;\n\nconst LINUX_SCRIPT = `#!/usr/bin/env bash\nset -euo pipefail\n\n# OpenClaw bare-metal installer (Linux)\n# Optionally runs native services script, then Docker + Compose.\n# Idempotent: safe to re-run.\n\nSCRIPT_DIR=\"$(cd \"$(dirname \"\\${BASH_SOURCE[0]}\")\" && pwd)\"\ncd \"$SCRIPT_DIR\"\n\nif [ -t 1 ]; then\n RED='\\\\033[0;31m'; GREEN='\\\\033[0;32m'; YELLOW='\\\\033[1;33m'; CYAN='\\\\033[0;36m'; NC='\\\\033[0m'\nelse\n RED=''; GREEN=''; YELLOW=''; CYAN=''; NC=''\nfi\ninfo() { echo -e \"\\${CYAN}ℹ $*\\${NC}\"; }\nok() { echo -e \"\\${GREEN}✅ $*\\${NC}\"; }\nwarn() { echo -e \"\\${YELLOW}⚠️ $*\\${NC}\"; }\nerr() { echo -e \"\\${RED}❌ $*\\${NC}\" >&2; }\n__NATIVE_BLOCK__\n# Install Docker if missing\nif ! command -v docker &> /dev/null; then\n info \"Installing Docker...\"\n if command -v apt-get &> /dev/null; then\n sudo apt-get update -qq\n sudo apt-get install -y -qq ca-certificates curl\n curl -fsSL https://get.docker.com | sudo sh\n sudo usermod -aG docker \"$USER\" 2>/dev/null || true\n ok \"Docker installed. You may need to log out and back in for group changes.\"\n elif command -v dnf &> /dev/null || command -v yum &> /dev/null; then\n sudo dnf install -y dnf-plugins-core 2>/dev/null || sudo yum install -y yum-utils\n sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 2>/dev/null || sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo\n sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin 2>/dev/null || sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin\n sudo systemctl enable --now docker\n sudo usermod -aG docker \"$USER\" 2>/dev/null || true\n ok \"Docker installed.\"\n else\n err \"Unsupported package manager. Install Docker manually: https://docs.docker.com/engine/install/\"\n exit 1\n fi\nelse\n ok \"Docker already installed.\"\nfi\n\nif ! docker compose version &> /dev/null; then\n err \"Docker Compose (v2) plugin not found. Install it: https://docs.docker.com/compose/install/\"\n exit 1\nfi\n\nif ! docker info &> /dev/null 2>&1; then\n err \"Docker daemon not running. Start it (e.g. sudo systemctl start docker) and re-run this script.\"\n exit 1\nfi\n\n# Use project start script if present, else docker compose up\nif [ -f \"scripts/start.sh\" ]; then\n info \"Starting stack via scripts/start.sh...\"\n bash scripts/start.sh\nelse\n if [ -f \".env.example\" ] && [ ! -f \".env\" ]; then cp .env.example .env; fi\n info \"Starting stack...\"\n docker compose up -d --remove-orphans\n echo \"\"\n ok \"Stack started. Gateway: http://localhost:\\${OPENCLAW_GATEWAY_PORT:-18789}\"\nfi\n`;\n\nconst MACOS_SCRIPT_PREFIX_NATIVE = `\nif [ -f \"native/install-macos.sh\" ]; then\n info \"Installing and starting native services...\"\n bash native/install-macos.sh\n ok \"Native services ready.\"\nfi\n`;\n\nconst MACOS_SCRIPT = `#!/usr/bin/env bash\nset -euo pipefail\n\n# OpenClaw bare-metal installer (macOS)\n# Optionally runs native services, then Docker Desktop + compose.\n# Idempotent: safe to re-run.\n\nSCRIPT_DIR=\"$(cd \"$(dirname \"\\${BASH_SOURCE[0]}\")\" && pwd)\"\ncd \"$SCRIPT_DIR\"\n\nif [ -t 1 ]; then\n RED='\\\\033[0;31m'; GREEN='\\\\033[0;32m'; YELLOW='\\\\033[1;33m'; CYAN='\\\\033[0;36m'; NC='\\\\033[0m'\nelse\n RED=''; GREEN=''; YELLOW=''; CYAN=''; NC=''\nfi\ninfo() { echo -e \"\\${CYAN}ℹ $*\\${NC}\"; }\nok() { echo -e \"\\${GREEN}✅ $*\\${NC}\"; }\nwarn() { echo -e \"\\${YELLOW}⚠️ $*\\${NC}\"; }\nerr() { echo -e \"\\${RED}❌ $*\\${NC}\" >&2; }\n__NATIVE_BLOCK__\nif ! command -v docker &> /dev/null; then\n if command -v brew &> /dev/null; then\n info \"Installing Docker via Homebrew...\"\n brew install --cask docker\n warn \"Docker Desktop was installed. Please open Docker from Applications, then re-run this script.\"\n exit 0\n else\n err \"Docker not found. Install Docker Desktop from https://docs.docker.com/desktop/install/mac-install/ or run: brew install --cask docker\"\n exit 1\n fi\nfi\n\nif ! docker info &> /dev/null 2>&1; then\n err \"Docker daemon not running. Open Docker Desktop from Applications, then re-run this script.\"\n exit 1\nfi\n\nif ! docker compose version &> /dev/null; then\n err \"Docker Compose (v2) not available. Ensure Docker Desktop is up to date.\"\n exit 1\nfi\n\nif [ -f \"scripts/start.sh\" ]; then\n info \"Starting stack via scripts/start.sh...\"\n bash scripts/start.sh\nelse\n if [ -f \".env.example\" ] && [ ! -f \".env\" ]; then cp .env.example .env; fi\n info \"Starting stack...\"\n docker compose up -d --remove-orphans\n echo \"\"\n ok \"Stack started. Gateway: http://localhost:\\${OPENCLAW_GATEWAY_PORT:-18789}\"\nfi\n`;\n\nconst WINDOWS_SCRIPT_PREFIX_NATIVE = `\nif (Test-Path \"native/install-windows.ps1\") {\n Info \"Installing and starting native services...\"\n & .\\\\native\\\\install-windows.ps1\n Ok \"Native services ready.\"\n}\n`;\n\nconst WINDOWS_SCRIPT = `# OpenClaw bare-metal installer (Windows PowerShell)\n# Optionally runs native services, then Docker Desktop + compose.\n# Idempotent: safe to re-run. Run in PowerShell as Administrator if installing Docker.\n\n$ErrorActionPreference = \"Stop\"\n$ProjectDir = $PSScriptRoot\nSet-Location $ProjectDir\n\nfunction Info { Write-Host \" $args\" -ForegroundColor Cyan }\nfunction Ok { Write-Host \" $args\" -ForegroundColor Green }\nfunction Warn { Write-Host \" $args\" -ForegroundColor Yellow }\nfunction Err { Write-Host \" $args\" -ForegroundColor Red; exit 1 }\n__NATIVE_BLOCK__\n# Check Docker\n$docker = Get-Command docker -ErrorAction SilentlyContinue\nif (-not $docker) {\n Write-Host \"\"\n Write-Host \" Docker not found.\" -ForegroundColor Red\n Write-Host \" Install Docker Desktop from: https://docs.docker.com/desktop/install/windows-install/\"\n Write-Host \" Then restart PowerShell and run this script again.\"\n exit 1\n}\n\ntry { docker info 2>$null | Out-Null } catch {\n Write-Host \"\"\n Write-Host \" Docker daemon is not running.\" -ForegroundColor Red\n Write-Host \" Start Docker Desktop from the Start menu, then run this script again.\"\n exit 1\n}\n\ntry { docker compose version 2>$null | Out-Null } catch {\n Write-Host \"\"\n Write-Host \" Docker Compose (v2) not available. Update Docker Desktop.\" -ForegroundColor Red\n exit 1\n}\n\nOk \"Docker is ready.\"\n\n# Prepare .env\nif (-not (Test-Path \".env\")) {\n if (Test-Path \".env.example\") {\n Copy-Item \".env.example\" \".env\"\n Info \"Created .env from .env.example\"\n }\n}\n\n# Create dirs\n$configDir = if ($env:OPENCLAW_CONFIG_DIR) { $env:OPENCLAW_CONFIG_DIR } else { \"./openclaw/config\" }\n$workspaceDir = if ($env:OPENCLAW_WORKSPACE_DIR) { $env:OPENCLAW_WORKSPACE_DIR } else { \"./openclaw/workspace\" }\nNew-Item -ItemType Directory -Force -Path $configDir | Out-Null\nNew-Item -ItemType Directory -Force -Path $workspaceDir | Out-Null\nOk \"Directories ready.\"\n\n# Start stack\nInfo \"Starting stack...\"\ndocker compose up -d --remove-orphans\n\n$port = if ($env:OPENCLAW_GATEWAY_PORT) { $env:OPENCLAW_GATEWAY_PORT } else { \"18789\" }\nWrite-Host \"\"\nOk \"Stack started. Gateway: http://localhost:$port\"\n`;\n\nexport interface BareMetalInstallOptions {\n\tplatform: Platform;\n\tprojectName: string;\n\t/** When true, top-level script runs native/install-*.sh|ps1 first, then Docker + compose. */\n\thasNativeServices?: boolean;\n}\n\n/**\n * Returns one file: install.sh (Linux/macOS) or install.ps1 (Windows).\n * When hasNativeServices is true, the script runs the native installer first, then Docker + compose.\n */\nexport function generateBareMetalInstall(options: BareMetalInstallOptions): Record<string, string> {\n\tconst { platform, hasNativeServices } = options;\n\tconst files: Record<string, string> = {};\n\n\tif (platform === \"windows/amd64\") {\n\t\tconst script = hasNativeServices\n\t\t\t? WINDOWS_SCRIPT.replace(\"__NATIVE_BLOCK__\", WINDOWS_SCRIPT_PREFIX_NATIVE)\n\t\t\t: WINDOWS_SCRIPT.replace(\"__NATIVE_BLOCK__\", \"\");\n\t\tfiles[\"install.ps1\"] = script;\n\t\treturn files;\n\t}\n\n\tconst isMac = platform.startsWith(\"macos/\");\n\tconst baseScript = isMac ? MACOS_SCRIPT : LINUX_SCRIPT;\n\tconst prefix = hasNativeServices\n\t\t? isMac\n\t\t\t? MACOS_SCRIPT_PREFIX_NATIVE\n\t\t\t: LINUX_SCRIPT_PREFIX_NATIVE\n\t\t: \"\";\n\tconst script = baseScript.replace(\"__NATIVE_BLOCK__\", prefix);\n\tfiles[\"install.sh\"] = script;\n\treturn files;\n}\n"],"mappings":";AAOA,MAAM,6BAA6B;;;;;;;;AASnC,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmErB,MAAM,6BAA6B;;;;;;;AAQnC,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsDrB,MAAM,+BAA+B;;;;;;;AAQrC,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyEvB,SAAgB,yBAAyB,SAA0D;CAClG,MAAM,EAAE,UAAU,sBAAsB;CACxC,MAAM,QAAgC,EAAE;AAExC,KAAI,aAAa,iBAAiB;AAIjC,QAAM,iBAHS,oBACZ,eAAe,QAAQ,oBAAoB,6BAA6B,GACxE,eAAe,QAAQ,oBAAoB,GAAG;AAEjD,SAAO;;CAGR,MAAM,QAAQ,SAAS,WAAW,SAAS;CAC3C,MAAM,aAAa,QAAQ,eAAe;CAC1C,MAAM,SAAS,oBACZ,QACC,6BACA,6BACD;AAEH,OAAM,gBADS,WAAW,QAAQ,oBAAoB,OAAO;AAE7D,QAAO"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { n as describe, r as it, t as globalExpect } from "../vi.2VT5v0um-Qk6MgAnK.mjs";
|
|
2
|
+
import { generateBareMetalInstall } from "./bare-metal-install.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/generators/bare-metal-install.test.ts
|
|
5
|
+
describe("generateBareMetalInstall", () => {
|
|
6
|
+
it("returns install.ps1 for windows/amd64", () => {
|
|
7
|
+
const result = generateBareMetalInstall({
|
|
8
|
+
platform: "windows/amd64",
|
|
9
|
+
projectName: "my-stack"
|
|
10
|
+
});
|
|
11
|
+
globalExpect(result).toHaveProperty("install.ps1");
|
|
12
|
+
globalExpect(Object.keys(result)).toHaveLength(1);
|
|
13
|
+
globalExpect(result["install.ps1"]).toContain("docker compose");
|
|
14
|
+
globalExpect(result["install.ps1"]).toContain("PowerShell");
|
|
15
|
+
});
|
|
16
|
+
it("returns install.sh for linux/amd64", () => {
|
|
17
|
+
const result = generateBareMetalInstall({
|
|
18
|
+
platform: "linux/amd64",
|
|
19
|
+
projectName: "my-stack"
|
|
20
|
+
});
|
|
21
|
+
globalExpect(result).toHaveProperty("install.sh");
|
|
22
|
+
globalExpect(Object.keys(result)).toHaveLength(1);
|
|
23
|
+
globalExpect(result["install.sh"]).toContain("docker");
|
|
24
|
+
globalExpect(result["install.sh"]).toContain("compose");
|
|
25
|
+
});
|
|
26
|
+
it("returns install.sh for linux/arm64", () => {
|
|
27
|
+
const result = generateBareMetalInstall({
|
|
28
|
+
platform: "linux/arm64",
|
|
29
|
+
projectName: "my-stack"
|
|
30
|
+
});
|
|
31
|
+
globalExpect(result).toHaveProperty("install.sh");
|
|
32
|
+
globalExpect(result["install.sh"]).toContain("docker");
|
|
33
|
+
});
|
|
34
|
+
it("returns install.sh for macos/amd64 and macos/arm64", () => {
|
|
35
|
+
for (const platform of ["macos/amd64", "macos/arm64"]) {
|
|
36
|
+
const result = generateBareMetalInstall({
|
|
37
|
+
platform,
|
|
38
|
+
projectName: "my-stack"
|
|
39
|
+
});
|
|
40
|
+
globalExpect(result).toHaveProperty("install.sh");
|
|
41
|
+
globalExpect(result["install.sh"]).toContain("Docker");
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
//#endregion
|
|
47
|
+
export { };
|
|
48
|
+
//# sourceMappingURL=bare-metal-install.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bare-metal-install.test.mjs","names":[],"sources":["../../src/generators/bare-metal-install.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generateBareMetalInstall } from \"./bare-metal-install.js\";\n\ndescribe(\"generateBareMetalInstall\", () => {\n\tit(\"returns install.ps1 for windows/amd64\", () => {\n\t\tconst result = generateBareMetalInstall({\n\t\t\tplatform: \"windows/amd64\",\n\t\t\tprojectName: \"my-stack\",\n\t\t});\n\t\texpect(result).toHaveProperty(\"install.ps1\");\n\t\texpect(Object.keys(result)).toHaveLength(1);\n\t\texpect(result[\"install.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"install.ps1\"]).toContain(\"PowerShell\");\n\t});\n\n\tit(\"returns install.sh for linux/amd64\", () => {\n\t\tconst result = generateBareMetalInstall({\n\t\t\tplatform: \"linux/amd64\",\n\t\t\tprojectName: \"my-stack\",\n\t\t});\n\t\texpect(result).toHaveProperty(\"install.sh\");\n\t\texpect(Object.keys(result)).toHaveLength(1);\n\t\texpect(result[\"install.sh\"]).toContain(\"docker\");\n\t\texpect(result[\"install.sh\"]).toContain(\"compose\");\n\t});\n\n\tit(\"returns install.sh for linux/arm64\", () => {\n\t\tconst result = generateBareMetalInstall({\n\t\t\tplatform: \"linux/arm64\",\n\t\t\tprojectName: \"my-stack\",\n\t\t});\n\t\texpect(result).toHaveProperty(\"install.sh\");\n\t\texpect(result[\"install.sh\"]).toContain(\"docker\");\n\t});\n\n\tit(\"returns install.sh for macos/amd64 and macos/arm64\", () => {\n\t\tfor (const platform of [\"macos/amd64\", \"macos/arm64\"] as const) {\n\t\t\tconst result = generateBareMetalInstall({ platform, projectName: \"my-stack\" });\n\t\t\texpect(result).toHaveProperty(\"install.sh\");\n\t\t\texpect(result[\"install.sh\"]).toContain(\"Docker\");\n\t\t}\n\t});\n});\n"],"mappings":";;;;AAGA,SAAS,kCAAkC;AAC1C,IAAG,+CAA+C;EACjD,MAAM,SAAS,yBAAyB;GACvC,UAAU;GACV,aAAa;GACb,CAAC;AACF,eAAO,OAAO,CAAC,eAAe,cAAc;AAC5C,eAAO,OAAO,KAAK,OAAO,CAAC,CAAC,aAAa,EAAE;AAC3C,eAAO,OAAO,eAAe,CAAC,UAAU,iBAAiB;AACzD,eAAO,OAAO,eAAe,CAAC,UAAU,aAAa;GACpD;AAEF,IAAG,4CAA4C;EAC9C,MAAM,SAAS,yBAAyB;GACvC,UAAU;GACV,aAAa;GACb,CAAC;AACF,eAAO,OAAO,CAAC,eAAe,aAAa;AAC3C,eAAO,OAAO,KAAK,OAAO,CAAC,CAAC,aAAa,EAAE;AAC3C,eAAO,OAAO,cAAc,CAAC,UAAU,SAAS;AAChD,eAAO,OAAO,cAAc,CAAC,UAAU,UAAU;GAChD;AAEF,IAAG,4CAA4C;EAC9C,MAAM,SAAS,yBAAyB;GACvC,UAAU;GACV,aAAa;GACb,CAAC;AACF,eAAO,OAAO,CAAC,eAAe,aAAa;AAC3C,eAAO,OAAO,cAAc,CAAC,UAAU,SAAS;GAC/C;AAEF,IAAG,4DAA4D;AAC9D,OAAK,MAAM,YAAY,CAAC,eAAe,cAAc,EAAW;GAC/D,MAAM,SAAS,yBAAyB;IAAE;IAAU,aAAa;IAAY,CAAC;AAC9E,gBAAO,OAAO,CAAC,eAAe,aAAa;AAC3C,gBAAO,OAAO,cAAc,CAAC,UAAU,SAAS;;GAEhD;EACD"}
|