@better-openclaw/core 1.0.23 → 1.0.25

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.
Files changed (335) hide show
  1. package/dist/addon-stack.cjs +673 -0
  2. package/dist/addon-stack.cjs.map +1 -0
  3. package/dist/addon-stack.d.cts +23 -0
  4. package/dist/addon-stack.d.cts.map +1 -0
  5. package/dist/addon-stack.d.mts +23 -0
  6. package/dist/addon-stack.d.mts.map +1 -0
  7. package/dist/addon-stack.mjs +671 -0
  8. package/dist/addon-stack.mjs.map +1 -0
  9. package/dist/addon-stack.test.cjs +349 -0
  10. package/dist/addon-stack.test.cjs.map +1 -0
  11. package/dist/addon-stack.test.d.cts +1 -0
  12. package/dist/addon-stack.test.d.mts +1 -0
  13. package/dist/addon-stack.test.mjs +349 -0
  14. package/dist/addon-stack.test.mjs.map +1 -0
  15. package/dist/bare-metal-partition.test.cjs +20 -21
  16. package/dist/bare-metal-partition.test.cjs.map +1 -1
  17. package/dist/bare-metal-partition.test.mjs +4 -5
  18. package/dist/bare-metal-partition.test.mjs.map +1 -1
  19. package/dist/composer.cjs +17 -1
  20. package/dist/composer.cjs.map +1 -1
  21. package/dist/composer.d.cts +24 -1
  22. package/dist/composer.d.cts.map +1 -1
  23. package/dist/composer.d.mts +24 -1
  24. package/dist/composer.d.mts.map +1 -1
  25. package/dist/composer.mjs +14 -2
  26. package/dist/composer.mjs.map +1 -1
  27. package/dist/composer.snapshot.test.cjs +20 -20
  28. package/dist/composer.snapshot.test.cjs.map +1 -1
  29. package/dist/composer.snapshot.test.mjs +2 -2
  30. package/dist/composer.test.cjs +53 -52
  31. package/dist/composer.test.cjs.map +1 -1
  32. package/dist/composer.test.mjs +4 -3
  33. package/dist/composer.test.mjs.map +1 -1
  34. package/dist/deployers/strip-host-ports.test.cjs +26 -26
  35. package/dist/deployers/strip-host-ports.test.cjs.map +1 -1
  36. package/dist/deployers/strip-host-ports.test.mjs +1 -1
  37. package/dist/generate.cjs +8 -4
  38. package/dist/generate.cjs.map +1 -1
  39. package/dist/generate.d.cts.map +1 -1
  40. package/dist/generate.d.mts.map +1 -1
  41. package/dist/generate.mjs +9 -5
  42. package/dist/generate.mjs.map +1 -1
  43. package/dist/generate.test.cjs +55 -55
  44. package/dist/generate.test.cjs.map +1 -1
  45. package/dist/generate.test.mjs +2 -2
  46. package/dist/generate.test.mjs.map +1 -1
  47. package/dist/generators/bare-metal-install.test.cjs +18 -18
  48. package/dist/generators/bare-metal-install.test.cjs.map +1 -1
  49. package/dist/generators/bare-metal-install.test.mjs +1 -1
  50. package/dist/generators/caddy.test.cjs +13 -13
  51. package/dist/generators/caddy.test.cjs.map +1 -1
  52. package/dist/generators/caddy.test.mjs +1 -1
  53. package/dist/generators/clone-repos.cjs +140 -0
  54. package/dist/generators/clone-repos.cjs.map +1 -0
  55. package/dist/generators/clone-repos.d.cts +11 -0
  56. package/dist/generators/clone-repos.d.cts.map +1 -0
  57. package/dist/generators/clone-repos.d.mts +11 -0
  58. package/dist/generators/clone-repos.d.mts.map +1 -0
  59. package/dist/generators/clone-repos.mjs +139 -0
  60. package/dist/generators/clone-repos.mjs.map +1 -0
  61. package/dist/generators/clone-repos.test.cjs +140 -0
  62. package/dist/generators/clone-repos.test.cjs.map +1 -0
  63. package/dist/generators/clone-repos.test.d.cts +1 -0
  64. package/dist/generators/clone-repos.test.d.mts +1 -0
  65. package/dist/generators/clone-repos.test.mjs +141 -0
  66. package/dist/generators/clone-repos.test.mjs.map +1 -0
  67. package/dist/generators/env.test.cjs +17 -17
  68. package/dist/generators/env.test.cjs.map +1 -1
  69. package/dist/generators/env.test.mjs +1 -1
  70. package/dist/generators/health-check.test.cjs +39 -39
  71. package/dist/generators/health-check.test.cjs.map +1 -1
  72. package/dist/generators/health-check.test.mjs +1 -1
  73. package/dist/generators/postgres-init.cjs +20 -0
  74. package/dist/generators/postgres-init.cjs.map +1 -1
  75. package/dist/generators/postgres-init.d.cts.map +1 -1
  76. package/dist/generators/postgres-init.d.mts.map +1 -1
  77. package/dist/generators/postgres-init.mjs +20 -0
  78. package/dist/generators/postgres-init.mjs.map +1 -1
  79. package/dist/generators/scripts.cjs +332 -3
  80. package/dist/generators/scripts.cjs.map +1 -1
  81. package/dist/generators/scripts.d.cts +3 -1
  82. package/dist/generators/scripts.d.cts.map +1 -1
  83. package/dist/generators/scripts.d.mts +3 -1
  84. package/dist/generators/scripts.d.mts.map +1 -1
  85. package/dist/generators/scripts.mjs +332 -3
  86. package/dist/generators/scripts.mjs.map +1 -1
  87. package/dist/generators/scripts.test.cjs +57 -23
  88. package/dist/generators/scripts.test.cjs.map +1 -1
  89. package/dist/generators/scripts.test.mjs +39 -5
  90. package/dist/generators/scripts.test.mjs.map +1 -1
  91. package/dist/generators/stack-manifest.cjs +1 -0
  92. package/dist/generators/stack-manifest.cjs.map +1 -1
  93. package/dist/generators/stack-manifest.d.cts +3 -2
  94. package/dist/generators/stack-manifest.d.cts.map +1 -1
  95. package/dist/generators/stack-manifest.d.mts +3 -2
  96. package/dist/generators/stack-manifest.d.mts.map +1 -1
  97. package/dist/generators/stack-manifest.mjs +1 -0
  98. package/dist/generators/stack-manifest.mjs.map +1 -1
  99. package/dist/generators/traefik.test.cjs +32 -32
  100. package/dist/generators/traefik.test.cjs.map +1 -1
  101. package/dist/generators/traefik.test.mjs +1 -1
  102. package/dist/index.cjs +28 -5
  103. package/dist/index.d.cts +7 -4
  104. package/dist/index.d.mts +7 -4
  105. package/dist/index.mjs +10 -7
  106. package/dist/migrations.test.cjs +16 -16
  107. package/dist/migrations.test.cjs.map +1 -1
  108. package/dist/migrations.test.mjs +1 -1
  109. package/dist/presets/registry.cjs.map +1 -1
  110. package/dist/presets/registry.d.cts.map +1 -1
  111. package/dist/presets/registry.d.mts.map +1 -1
  112. package/dist/presets/registry.mjs.map +1 -1
  113. package/dist/presets/registry.test.cjs +14 -14
  114. package/dist/presets/registry.test.cjs.map +1 -1
  115. package/dist/presets/registry.test.mjs +1 -1
  116. package/dist/resolver.cjs +8 -0
  117. package/dist/resolver.cjs.map +1 -1
  118. package/dist/resolver.mjs +9 -1
  119. package/dist/resolver.mjs.map +1 -1
  120. package/dist/resolver.test.cjs +125 -90
  121. package/dist/resolver.test.cjs.map +1 -1
  122. package/dist/resolver.test.mjs +47 -12
  123. package/dist/resolver.test.mjs.map +1 -1
  124. package/dist/{schema-B4c64P8N.d.cts → schema-CKBRu-Rt.d.cts} +355 -8
  125. package/dist/schema-CKBRu-Rt.d.cts.map +1 -0
  126. package/dist/{schema-CXNhYci1.d.mts → schema-Dn-_Jpb6.d.mts} +355 -8
  127. package/dist/schema-Dn-_Jpb6.d.mts.map +1 -0
  128. package/dist/schema.cjs +160 -5
  129. package/dist/schema.cjs.map +1 -1
  130. package/dist/schema.d.cts +2 -2
  131. package/dist/schema.d.mts +2 -2
  132. package/dist/schema.mjs +150 -6
  133. package/dist/schema.mjs.map +1 -1
  134. package/dist/schema.test.cjs +86 -86
  135. package/dist/schema.test.cjs.map +1 -1
  136. package/dist/schema.test.mjs +1 -1
  137. package/dist/services/definitions/apptension-saas.cjs +87 -0
  138. package/dist/services/definitions/apptension-saas.cjs.map +1 -0
  139. package/dist/services/definitions/apptension-saas.d.cts +7 -0
  140. package/dist/services/definitions/apptension-saas.d.cts.map +1 -0
  141. package/dist/services/definitions/apptension-saas.d.mts +7 -0
  142. package/dist/services/definitions/apptension-saas.d.mts.map +1 -0
  143. package/dist/services/definitions/apptension-saas.mjs +86 -0
  144. package/dist/services/definitions/apptension-saas.mjs.map +1 -0
  145. package/dist/services/definitions/boxyhq-saas.cjs +88 -0
  146. package/dist/services/definitions/boxyhq-saas.cjs.map +1 -0
  147. package/dist/services/definitions/boxyhq-saas.d.cts +7 -0
  148. package/dist/services/definitions/boxyhq-saas.d.cts.map +1 -0
  149. package/dist/services/definitions/boxyhq-saas.d.mts +7 -0
  150. package/dist/services/definitions/boxyhq-saas.d.mts.map +1 -0
  151. package/dist/services/definitions/boxyhq-saas.mjs +87 -0
  152. package/dist/services/definitions/boxyhq-saas.mjs.map +1 -0
  153. package/dist/services/definitions/browserless.cjs +4 -1
  154. package/dist/services/definitions/browserless.cjs.map +1 -1
  155. package/dist/services/definitions/browserless.mjs +4 -1
  156. package/dist/services/definitions/browserless.mjs.map +1 -1
  157. package/dist/services/definitions/cmsaas-starter.cjs +86 -0
  158. package/dist/services/definitions/cmsaas-starter.cjs.map +1 -0
  159. package/dist/services/definitions/cmsaas-starter.d.cts +7 -0
  160. package/dist/services/definitions/cmsaas-starter.d.cts.map +1 -0
  161. package/dist/services/definitions/cmsaas-starter.d.mts +7 -0
  162. package/dist/services/definitions/cmsaas-starter.d.mts.map +1 -0
  163. package/dist/services/definitions/cmsaas-starter.mjs +85 -0
  164. package/dist/services/definitions/cmsaas-starter.mjs.map +1 -0
  165. package/dist/services/definitions/convex.cjs +43 -1
  166. package/dist/services/definitions/convex.cjs.map +1 -1
  167. package/dist/services/definitions/convex.mjs +43 -1
  168. package/dist/services/definitions/convex.mjs.map +1 -1
  169. package/dist/services/definitions/grafana.cjs +11 -1
  170. package/dist/services/definitions/grafana.cjs.map +1 -1
  171. package/dist/services/definitions/grafana.mjs +11 -1
  172. package/dist/services/definitions/grafana.mjs.map +1 -1
  173. package/dist/services/definitions/index.cjs +51 -36
  174. package/dist/services/definitions/index.cjs.map +1 -1
  175. package/dist/services/definitions/index.d.cts +30 -25
  176. package/dist/services/definitions/index.d.cts.map +1 -1
  177. package/dist/services/definitions/index.d.mts +30 -25
  178. package/dist/services/definitions/index.d.mts.map +1 -1
  179. package/dist/services/definitions/index.mjs +47 -37
  180. package/dist/services/definitions/index.mjs.map +1 -1
  181. package/dist/services/definitions/ixartz-saas.cjs +88 -0
  182. package/dist/services/definitions/ixartz-saas.cjs.map +1 -0
  183. package/dist/services/definitions/ixartz-saas.d.cts +7 -0
  184. package/dist/services/definitions/ixartz-saas.d.cts.map +1 -0
  185. package/dist/services/definitions/ixartz-saas.d.mts +7 -0
  186. package/dist/services/definitions/ixartz-saas.d.mts.map +1 -0
  187. package/dist/services/definitions/ixartz-saas.mjs +87 -0
  188. package/dist/services/definitions/ixartz-saas.mjs.map +1 -0
  189. package/dist/services/definitions/meilisearch.cjs +11 -1
  190. package/dist/services/definitions/meilisearch.cjs.map +1 -1
  191. package/dist/services/definitions/meilisearch.mjs +11 -1
  192. package/dist/services/definitions/meilisearch.mjs.map +1 -1
  193. package/dist/services/definitions/minio.cjs +3 -1
  194. package/dist/services/definitions/minio.cjs.map +1 -1
  195. package/dist/services/definitions/minio.mjs +3 -1
  196. package/dist/services/definitions/minio.mjs.map +1 -1
  197. package/dist/services/definitions/mission-control.cjs +16 -2
  198. package/dist/services/definitions/mission-control.cjs.map +1 -1
  199. package/dist/services/definitions/mission-control.mjs +16 -2
  200. package/dist/services/definitions/mission-control.mjs.map +1 -1
  201. package/dist/services/definitions/n8n.cjs +11 -1
  202. package/dist/services/definitions/n8n.cjs.map +1 -1
  203. package/dist/services/definitions/n8n.mjs +11 -1
  204. package/dist/services/definitions/n8n.mjs.map +1 -1
  205. package/dist/services/definitions/ollama.cjs +3 -1
  206. package/dist/services/definitions/ollama.cjs.map +1 -1
  207. package/dist/services/definitions/ollama.mjs +3 -1
  208. package/dist/services/definitions/ollama.mjs.map +1 -1
  209. package/dist/services/definitions/open-saas.cjs +81 -0
  210. package/dist/services/definitions/open-saas.cjs.map +1 -0
  211. package/dist/services/definitions/open-saas.d.cts +7 -0
  212. package/dist/services/definitions/open-saas.d.cts.map +1 -0
  213. package/dist/services/definitions/open-saas.d.mts +7 -0
  214. package/dist/services/definitions/open-saas.d.mts.map +1 -0
  215. package/dist/services/definitions/open-saas.mjs +80 -0
  216. package/dist/services/definitions/open-saas.mjs.map +1 -0
  217. package/dist/services/definitions/qdrant.cjs +3 -1
  218. package/dist/services/definitions/qdrant.cjs.map +1 -1
  219. package/dist/services/definitions/qdrant.mjs +3 -1
  220. package/dist/services/definitions/qdrant.mjs.map +1 -1
  221. package/dist/services/definitions/searxng.cjs +8 -1
  222. package/dist/services/definitions/searxng.cjs.map +1 -1
  223. package/dist/services/definitions/searxng.mjs +8 -1
  224. package/dist/services/definitions/searxng.mjs.map +1 -1
  225. package/dist/services/definitions/uptime-kuma.cjs +8 -1
  226. package/dist/services/definitions/uptime-kuma.cjs.map +1 -1
  227. package/dist/services/definitions/uptime-kuma.mjs +8 -1
  228. package/dist/services/definitions/uptime-kuma.mjs.map +1 -1
  229. package/dist/services/registry.cjs +3 -0
  230. package/dist/services/registry.cjs.map +1 -1
  231. package/dist/services/registry.d.cts.map +1 -1
  232. package/dist/services/registry.d.mts.map +1 -1
  233. package/dist/services/registry.mjs +3 -0
  234. package/dist/services/registry.mjs.map +1 -1
  235. package/dist/services/registry.test.cjs +40 -33
  236. package/dist/services/registry.test.cjs.map +1 -1
  237. package/dist/services/registry.test.mjs +8 -1
  238. package/dist/services/registry.test.mjs.map +1 -1
  239. package/dist/{skill-manifest-BVUXU0__.mjs → skill-manifest-6XhrhWsG.mjs} +49 -1
  240. package/dist/{skill-manifest--IgY9REK.cjs.map → skill-manifest-6XhrhWsG.mjs.map} +1 -1
  241. package/dist/{skill-manifest--IgY9REK.cjs → skill-manifest-B8znSsym.cjs} +49 -1
  242. package/dist/{skill-manifest-BVUXU0__.mjs.map → skill-manifest-B8znSsym.cjs.map} +1 -1
  243. package/dist/skills/registry.cjs +3 -3
  244. package/dist/skills/registry.cjs.map +1 -1
  245. package/dist/skills/registry.mjs +3 -3
  246. package/dist/skills/registry.mjs.map +1 -1
  247. package/dist/skills/skill-manifest.cjs +1 -1
  248. package/dist/skills/skill-manifest.mjs +1 -1
  249. package/dist/{vi.2VT5v0um-DvC3SVNc.mjs → test.CTcmp4Su-ClCHJ3FA.mjs} +6793 -6403
  250. package/dist/test.CTcmp4Su-ClCHJ3FA.mjs.map +1 -0
  251. package/dist/{vi.2VT5v0um-CRqXre87.cjs → test.CTcmp4Su-DlzTarwH.cjs} +6793 -6403
  252. package/dist/test.CTcmp4Su-DlzTarwH.cjs.map +1 -0
  253. package/dist/track-analytics.cjs +50 -0
  254. package/dist/track-analytics.cjs.map +1 -0
  255. package/dist/track-analytics.d.cts +34 -0
  256. package/dist/track-analytics.d.cts.map +1 -0
  257. package/dist/track-analytics.d.mts +34 -0
  258. package/dist/track-analytics.d.mts.map +1 -0
  259. package/dist/track-analytics.mjs +48 -0
  260. package/dist/track-analytics.mjs.map +1 -0
  261. package/dist/track-analytics.test.cjs +91 -0
  262. package/dist/track-analytics.test.cjs.map +1 -0
  263. package/dist/track-analytics.test.d.cts +1 -0
  264. package/dist/track-analytics.test.d.mts +1 -0
  265. package/dist/track-analytics.test.mjs +92 -0
  266. package/dist/track-analytics.test.mjs.map +1 -0
  267. package/dist/types.cjs +7 -0
  268. package/dist/types.cjs.map +1 -1
  269. package/dist/types.d.cts +12 -2
  270. package/dist/types.d.cts.map +1 -1
  271. package/dist/types.d.mts +12 -2
  272. package/dist/types.d.mts.map +1 -1
  273. package/dist/types.mjs +7 -0
  274. package/dist/types.mjs.map +1 -1
  275. package/dist/validator.test.cjs +15 -15
  276. package/dist/validator.test.cjs.map +1 -1
  277. package/dist/validator.test.mjs +2 -2
  278. package/dist/version-manager.cjs +1 -1
  279. package/dist/version-manager.cjs.map +1 -1
  280. package/dist/version-manager.mjs +1 -1
  281. package/dist/version-manager.mjs.map +1 -1
  282. package/dist/version-manager.test.cjs +40 -38
  283. package/dist/version-manager.test.cjs.map +1 -1
  284. package/dist/version-manager.test.mjs +7 -5
  285. package/dist/version-manager.test.mjs.map +1 -1
  286. package/package.json +4 -4
  287. package/src/__snapshots__/composer.snapshot.test.ts.snap +160 -0
  288. package/src/addon-stack.test.ts +490 -0
  289. package/src/addon-stack.ts +998 -0
  290. package/src/bare-metal-partition.test.ts +4 -3
  291. package/src/composer.test.ts +4 -2
  292. package/src/composer.ts +24 -5
  293. package/src/generate.test.ts +2 -1
  294. package/src/generate.ts +10 -1
  295. package/src/generators/clone-repos.test.ts +154 -0
  296. package/src/generators/clone-repos.ts +159 -0
  297. package/src/generators/postgres-init.ts +17 -0
  298. package/src/generators/scripts.test.ts +52 -4
  299. package/src/generators/scripts.ts +351 -3
  300. package/src/generators/stack-manifest.ts +4 -2
  301. package/src/index.ts +28 -2
  302. package/src/presets/registry.ts +241 -329
  303. package/src/resolver.test.ts +53 -15
  304. package/src/resolver.ts +13 -1
  305. package/src/schema.ts +216 -4
  306. package/src/services/definitions/apptension-saas.ts +84 -0
  307. package/src/services/definitions/boxyhq-saas.ts +84 -0
  308. package/src/services/definitions/browserless.ts +3 -0
  309. package/src/services/definitions/cmsaas-starter.ts +84 -0
  310. package/src/services/definitions/convex.ts +31 -0
  311. package/src/services/definitions/grafana.ts +9 -0
  312. package/src/services/definitions/index.ts +90 -70
  313. package/src/services/definitions/ixartz-saas.ts +84 -0
  314. package/src/services/definitions/meilisearch.ts +9 -0
  315. package/src/services/definitions/minio.ts +2 -0
  316. package/src/services/definitions/mission-control.ts +19 -2
  317. package/src/services/definitions/n8n.ts +9 -0
  318. package/src/services/definitions/ollama.ts +2 -0
  319. package/src/services/definitions/open-saas.ts +79 -0
  320. package/src/services/definitions/qdrant.ts +2 -0
  321. package/src/services/definitions/searxng.ts +3 -0
  322. package/src/services/definitions/uptime-kuma.ts +3 -0
  323. package/src/services/registry.test.ts +8 -0
  324. package/src/services/registry.ts +7 -0
  325. package/src/skills/manifest.json +64 -0
  326. package/src/skills/registry.ts +3 -3
  327. package/src/track-analytics.test.ts +82 -0
  328. package/src/track-analytics.ts +76 -0
  329. package/src/types.ts +29 -0
  330. package/src/version-manager.test.ts +10 -5
  331. package/src/version-manager.ts +1 -1
  332. package/dist/schema-B4c64P8N.d.cts.map +0 -1
  333. package/dist/schema-CXNhYci1.d.mts.map +0 -1
  334. package/dist/vi.2VT5v0um-CRqXre87.cjs.map +0 -1
  335. package/dist/vi.2VT5v0um-DvC3SVNc.mjs.map +0 -1
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * Returns a map of file paths (relative to project root) to file contents.
5
5
  */
6
- export function generateScripts(): Record<string, string> {
6
+ export function generateScripts(options?: { hasGitServices?: boolean }): Record<string, string> {
7
+ const hasGit = options?.hasGitServices ?? false;
7
8
  const files: Record<string, string> = {};
8
9
 
9
10
  // ── scripts/start.sh ────────────────────────────────────────────────────
@@ -136,6 +137,14 @@ if [ "$EMPTY_SECRETS" -gt 0 ]; then
136
137
  echo ""
137
138
  fi
138
139
 
140
+ # ── Clone git-based repositories (if any) ────────────────────────────────────
141
+
142
+ if [ -f "$SCRIPT_DIR/clone-repos.sh" ]; then
143
+ info "Cloning/updating SaaS boilerplate repositories..."
144
+ bash "$SCRIPT_DIR/clone-repos.sh"
145
+ ok "Repositories ready."
146
+ fi
147
+
139
148
  # ── Pull and start ───────────────────────────────────────────────────────────
140
149
 
141
150
  echo ""
@@ -144,7 +153,7 @@ docker compose pull --quiet 2>/dev/null || docker compose pull
144
153
 
145
154
  echo ""
146
155
  info "Starting services..."
147
- docker compose up -d --remove-orphans
156
+ docker compose up -d --remove-orphans${hasGit ? " --build" : ""}
148
157
 
149
158
  # ── Health-check loop ────────────────────────────────────────────────────────
150
159
 
@@ -243,13 +252,19 @@ cd "$PROJECT_DIR"
243
252
  echo "🐾 OpenClaw — Updating services..."
244
253
  echo ""
245
254
 
255
+ # Update git-based repositories (if any)
256
+ if [ -f "$SCRIPT_DIR/clone-repos.sh" ]; then
257
+ echo "📂 Updating SaaS boilerplate repositories..."
258
+ bash "$SCRIPT_DIR/clone-repos.sh"
259
+ fi
260
+
246
261
  # Pull latest images
247
262
  echo "📦 Pulling latest images..."
248
263
  docker compose pull
249
264
 
250
265
  echo ""
251
266
  echo "🔄 Restarting services with new images..."
252
- docker compose up -d --remove-orphans
267
+ docker compose up -d --remove-orphans${hasGit ? " --build" : ""}
253
268
 
254
269
  echo ""
255
270
  echo "⏳ Waiting for services to stabilize..."
@@ -356,6 +371,339 @@ echo "── Network ───────────────────
356
371
  echo ""
357
372
 
358
373
  docker network ls --filter "name=openclaw" --format "table {{.Name}}\\t{{.Driver}}\\t{{.Scope}}" 2>/dev/null || true
374
+ `;
375
+
376
+ // ═══════════════════════════════════════════════════════════════════════
377
+ // PowerShell equivalents
378
+ // ═══════════════════════════════════════════════════════════════════════
379
+
380
+ // ── scripts/start.ps1 ───────────────────────────────────────────────────
381
+
382
+ files["scripts/start.ps1"] = `#Requires -Version 5.1
383
+ <#
384
+ .SYNOPSIS
385
+ OpenClaw Start Script — validates prerequisites, auto-generates secrets,
386
+ creates required directories, and starts all services via Docker Compose.
387
+ #>
388
+
389
+ $ErrorActionPreference = 'Stop'
390
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
391
+ $ProjectDir = Split-Path -Parent $ScriptDir
392
+ Set-Location $ProjectDir
393
+
394
+ function Info { param($Msg) Write-Host " i $Msg" -ForegroundColor Cyan }
395
+ function Ok { param($Msg) Write-Host " + $Msg" -ForegroundColor Green }
396
+ function Warn { param($Msg) Write-Host " ! $Msg" -ForegroundColor Yellow }
397
+ function Err { param($Msg) Write-Host " x $Msg" -ForegroundColor Red }
398
+
399
+ Write-Host ""
400
+ Write-Host "OpenClaw - Starting services..." -ForegroundColor White
401
+ Write-Host ""
402
+
403
+ # ── Prerequisite checks ─────────────────────────────────────────────────
404
+ if (-not (Get-Command docker -ErrorAction SilentlyContinue)) {
405
+ Err "Docker is not installed. Please install Docker Desktop."
406
+ Write-Host " https://docs.docker.com/desktop/install/windows-install/"
407
+ exit 1
408
+ }
409
+
410
+ $composeCheck = docker compose version 2>&1
411
+ if ($LASTEXITCODE -ne 0) {
412
+ Err "Docker Compose (v2) is not available."
413
+ Write-Host " https://docs.docker.com/compose/install/"
414
+ exit 1
415
+ }
416
+
417
+ $dockerInfo = docker info 2>&1
418
+ if ($LASTEXITCODE -ne 0) {
419
+ Err "Docker daemon is not running. Please start Docker Desktop."
420
+ exit 1
421
+ }
422
+
423
+ # ── Source .env if it exists ─────────────────────────────────────────────
424
+ if (Test-Path ".env") {
425
+ Info "Loading existing .env file..."
426
+ Get-Content ".env" | ForEach-Object {
427
+ if ($_ -match '^([^#=]+)=(.*)$') {
428
+ [Environment]::SetEnvironmentVariable($Matches[1].Trim(), $Matches[2].Trim(), 'Process')
429
+ }
430
+ }
431
+ } else {
432
+ Warn ".env file not found - will create one from .env.example if available."
433
+ if (Test-Path ".env.example") {
434
+ Copy-Item ".env.example" ".env"
435
+ Info "Created .env from .env.example"
436
+ Get-Content ".env" | ForEach-Object {
437
+ if ($_ -match '^([^#=]+)=(.*)$') {
438
+ [Environment]::SetEnvironmentVariable($Matches[1].Trim(), $Matches[2].Trim(), 'Process')
439
+ }
440
+ }
441
+ }
442
+ }
443
+
444
+ # ── Auto-generate OPENCLAW_GATEWAY_TOKEN if missing ──────────────────────
445
+ if (-not $env:OPENCLAW_GATEWAY_TOKEN) {
446
+ Info "Generating OPENCLAW_GATEWAY_TOKEN..."
447
+ $bytes = New-Object byte[] 32
448
+ [System.Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($bytes)
449
+ $env:OPENCLAW_GATEWAY_TOKEN = ($bytes | ForEach-Object { $_.ToString("x2") }) -join ''
450
+
451
+ if (Test-Path ".env") {
452
+ $envContent = Get-Content ".env" -Raw
453
+ if ($envContent -match '(?m)^OPENCLAW_GATEWAY_TOKEN=') {
454
+ $envContent = $envContent -replace '(?m)^OPENCLAW_GATEWAY_TOKEN=.*', "OPENCLAW_GATEWAY_TOKEN=$($env:OPENCLAW_GATEWAY_TOKEN)"
455
+ Set-Content ".env" $envContent -NoNewline
456
+ } else {
457
+ Add-Content ".env" "OPENCLAW_GATEWAY_TOKEN=$($env:OPENCLAW_GATEWAY_TOKEN)"
458
+ }
459
+ }
460
+ Ok "Gateway token generated and saved."
461
+ }
462
+
463
+ # ── Apply defaults ───────────────────────────────────────────────────────
464
+ if (-not $env:OPENCLAW_VERSION) { $env:OPENCLAW_VERSION = "latest" }
465
+ if (-not $env:OPENCLAW_GATEWAY_PORT) { $env:OPENCLAW_GATEWAY_PORT = "18789" }
466
+ if (-not $env:OPENCLAW_BRIDGE_PORT) { $env:OPENCLAW_BRIDGE_PORT = "18790" }
467
+ if (-not $env:OPENCLAW_GATEWAY_BIND) { $env:OPENCLAW_GATEWAY_BIND = "lan" }
468
+ if (-not $env:OPENCLAW_CONFIG_DIR) { $env:OPENCLAW_CONFIG_DIR = "./openclaw/config" }
469
+ if (-not $env:OPENCLAW_WORKSPACE_DIR) { $env:OPENCLAW_WORKSPACE_DIR = "./openclaw/workspace" }
470
+
471
+ # ── Create required host directories ────────────────────────────────────
472
+ Info "Ensuring host directories exist..."
473
+ New-Item -ItemType Directory -Force -Path $env:OPENCLAW_CONFIG_DIR | Out-Null
474
+ New-Item -ItemType Directory -Force -Path $env:OPENCLAW_WORKSPACE_DIR | Out-Null
475
+ Ok "Directories ready: $($env:OPENCLAW_CONFIG_DIR), $($env:OPENCLAW_WORKSPACE_DIR)"
476
+
477
+ # ── Clone git-based repositories (if any) ─────────────────────────────
478
+ $cloneScript = Join-Path $ScriptDir "clone-repos.ps1"
479
+ if (Test-Path $cloneScript) {
480
+ Info "Cloning/updating SaaS boilerplate repositories..."
481
+ & $cloneScript
482
+ Ok "Repositories ready."
483
+ }
484
+
485
+ # ── Pull and start ───────────────────────────────────────────────────────
486
+ Write-Host ""
487
+ Info "Pulling latest images..."
488
+ docker compose pull 2>$null
489
+ if ($LASTEXITCODE -ne 0) { docker compose pull }
490
+
491
+ Write-Host ""
492
+ Info "Starting services..."
493
+ docker compose up -d --remove-orphans${hasGit ? " --build" : ""}
494
+
495
+ # ── Health-check loop ────────────────────────────────────────────────────
496
+ Write-Host ""
497
+ Info "Waiting for services to become healthy..."
498
+ Start-Sleep -Seconds 5
499
+
500
+ $retries = 0
501
+ $maxRetries = 30
502
+ while ($retries -lt $maxRetries) {
503
+ $psOutput = docker compose ps --format json 2>$null
504
+ $unhealthy = ($psOutput | Select-String -Pattern '"unhealthy"' -SimpleMatch).Count
505
+ $starting = ($psOutput | Select-String -Pattern '"starting"' -SimpleMatch).Count
506
+ if ($unhealthy -eq 0 -and $starting -eq 0) { break }
507
+ $retries++
508
+ Start-Sleep -Seconds 2
509
+ }
510
+
511
+ Write-Host ""
512
+ docker compose ps
513
+ Write-Host ""
514
+
515
+ if ($retries -ge $maxRetries) {
516
+ Warn "Some services may still be starting. Check: docker compose ps"
517
+ } else {
518
+ Ok "All services are running!"
519
+ }
520
+
521
+ # ── Print service URLs & token ───────────────────────────────────────────
522
+ $gatewayHost = if ($env:OPENCLAW_GATEWAY_BIND -eq "lan") { "0.0.0.0" } else { "localhost" }
523
+
524
+ Write-Host ""
525
+ Write-Host "==============================================================================="
526
+ Write-Host " OpenClaw is ready!"
527
+ Write-Host "==============================================================================="
528
+ Write-Host ""
529
+ Write-Host " Gateway URL: http://\${gatewayHost}:$($env:OPENCLAW_GATEWAY_PORT)"
530
+ Write-Host " Bridge (WebSocket): ws://\${gatewayHost}:$($env:OPENCLAW_BRIDGE_PORT)"
531
+ Write-Host " Config directory: $($env:OPENCLAW_CONFIG_DIR)"
532
+ Write-Host " Workspace directory: $($env:OPENCLAW_WORKSPACE_DIR)"
533
+ Write-Host ""
534
+ Write-Host " Gateway Token: $($env:OPENCLAW_GATEWAY_TOKEN)"
535
+ Write-Host ""
536
+ Write-Host " Manage:"
537
+ Write-Host " Stop: .\\scripts\\stop.ps1"
538
+ Write-Host " Status: .\\scripts\\status.ps1"
539
+ Write-Host " Update: .\\scripts\\update.ps1"
540
+ Write-Host " Logs: docker compose logs -f"
541
+ Write-Host ""
542
+ Write-Host "==============================================================================="
543
+ `;
544
+
545
+ // ── scripts/stop.ps1 ────────────────────────────────────────────────────
546
+
547
+ files["scripts/stop.ps1"] = `#Requires -Version 5.1
548
+ <#
549
+ .SYNOPSIS
550
+ OpenClaw Stop Script — gracefully stops all services.
551
+ #>
552
+
553
+ $ErrorActionPreference = 'Stop'
554
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
555
+ $ProjectDir = Split-Path -Parent $ScriptDir
556
+ Set-Location $ProjectDir
557
+
558
+ Write-Host ""
559
+ Write-Host "OpenClaw - Stopping services..." -ForegroundColor White
560
+ Write-Host ""
561
+
562
+ docker compose down --timeout 30
563
+
564
+ Write-Host ""
565
+ Write-Host " + All services stopped." -ForegroundColor Green
566
+ `;
567
+
568
+ // ── scripts/update.ps1 ──────────────────────────────────────────────────
569
+
570
+ files["scripts/update.ps1"] = `#Requires -Version 5.1
571
+ <#
572
+ .SYNOPSIS
573
+ OpenClaw Update Script — pulls latest images and restarts services.
574
+ #>
575
+
576
+ $ErrorActionPreference = 'Stop'
577
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
578
+ $ProjectDir = Split-Path -Parent $ScriptDir
579
+ Set-Location $ProjectDir
580
+
581
+ Write-Host ""
582
+ Write-Host "OpenClaw - Updating services..." -ForegroundColor White
583
+ Write-Host ""
584
+
585
+ # Update git-based repositories (if any)
586
+ $cloneScript = Join-Path $ScriptDir "clone-repos.ps1"
587
+ if (Test-Path $cloneScript) {
588
+ Write-Host " Updating SaaS boilerplate repositories..." -ForegroundColor Cyan
589
+ & $cloneScript
590
+ }
591
+
592
+ Write-Host " Pulling latest images..." -ForegroundColor Cyan
593
+ docker compose pull
594
+
595
+ Write-Host ""
596
+ Write-Host " Restarting services with new images..." -ForegroundColor Cyan
597
+ docker compose up -d --remove-orphans${hasGit ? " --build" : ""}
598
+
599
+ Write-Host ""
600
+ Write-Host " Waiting for services to stabilize..." -ForegroundColor Cyan
601
+ Start-Sleep -Seconds 10
602
+
603
+ docker compose ps
604
+
605
+ Write-Host ""
606
+ Write-Host " + Update complete!" -ForegroundColor Green
607
+ `;
608
+
609
+ // ── scripts/backup.ps1 ──────────────────────────────────────────────────
610
+
611
+ files["scripts/backup.ps1"] = `#Requires -Version 5.1
612
+ <#
613
+ .SYNOPSIS
614
+ OpenClaw Backup Script — backs up all named Docker volumes to a timestamped directory.
615
+ #>
616
+
617
+ $ErrorActionPreference = 'Stop'
618
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
619
+ $ProjectDir = Split-Path -Parent $ScriptDir
620
+ Set-Location $ProjectDir
621
+
622
+ $timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
623
+ $backupDir = Join-Path $ProjectDir "backups\\$timestamp"
624
+ New-Item -ItemType Directory -Force -Path $backupDir | Out-Null
625
+
626
+ Write-Host ""
627
+ Write-Host "OpenClaw - Backing up volumes..." -ForegroundColor White
628
+ Write-Host " Backup directory: $backupDir"
629
+ Write-Host ""
630
+
631
+ # Get project name from docker compose
632
+ $projectName = "openclaw"
633
+ try {
634
+ $configJson = docker compose config --format json 2>$null | ConvertFrom-Json
635
+ if ($configJson.name) { $projectName = $configJson.name }
636
+ } catch {}
637
+
638
+ # List all volumes for this project
639
+ $volumes = docker volume ls --filter "name=$projectName" --format "{{.Name}}" 2>$null
640
+ if (-not $volumes) {
641
+ Write-Host " ! No volumes found for project: $projectName" -ForegroundColor Yellow
642
+ Write-Host " Trying to list all openclaw volumes..."
643
+ $volumes = docker volume ls --filter "name=openclaw" --format "{{.Name}}" 2>$null
644
+ }
645
+
646
+ if (-not $volumes) {
647
+ Write-Host " x No volumes found to back up." -ForegroundColor Red
648
+ exit 1
649
+ }
650
+
651
+ $backedUp = 0
652
+ foreach ($volume in $volumes) {
653
+ $vol = $volume.Trim()
654
+ if (-not $vol) { continue }
655
+ Write-Host " Backing up: $vol" -ForegroundColor Cyan
656
+ docker run --rm -v "\${vol}:/source:ro" -v "\${backupDir}:/backup" alpine tar czf "/backup/$vol.tar.gz" -C /source .
657
+ $size = (Get-Item (Join-Path $backupDir "$vol.tar.gz")).Length / 1MB
658
+ Write-Host " + $vol ($([math]::Round($size, 1))MB)" -ForegroundColor Green
659
+ $backedUp++
660
+ }
661
+
662
+ $totalSize = ((Get-ChildItem $backupDir -Recurse | Measure-Object -Property Length -Sum).Sum) / 1MB
663
+ Write-Host ""
664
+ Write-Host " + Backed up $backedUp volume(s) ($([math]::Round($totalSize, 1))MB total)" -ForegroundColor Green
665
+ Write-Host " Location: $backupDir"
666
+ `;
667
+
668
+ // ── scripts/status.ps1 ──────────────────────────────────────────────────
669
+
670
+ files["scripts/status.ps1"] = `#Requires -Version 5.1
671
+ <#
672
+ .SYNOPSIS
673
+ OpenClaw Status Script — shows the current status of all services.
674
+ #>
675
+
676
+ $ErrorActionPreference = 'Stop'
677
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
678
+ $ProjectDir = Split-Path -Parent $ScriptDir
679
+ Set-Location $ProjectDir
680
+
681
+ Write-Host ""
682
+ Write-Host "OpenClaw - Service Status" -ForegroundColor White
683
+ Write-Host ""
684
+
685
+ # Show compose status
686
+ docker compose ps
687
+
688
+ Write-Host ""
689
+ Write-Host "-- Resource Usage ----------------------------------------------------------"
690
+ Write-Host ""
691
+
692
+ try { docker compose top 2>$null } catch {}
693
+
694
+ Write-Host ""
695
+ Write-Host "-- Disk Usage --------------------------------------------------------------"
696
+ Write-Host ""
697
+
698
+ try { docker system df 2>$null } catch {}
699
+
700
+ Write-Host ""
701
+ Write-Host "-- Network -----------------------------------------------------------------"
702
+ Write-Host ""
703
+
704
+ try {
705
+ docker network ls --filter "name=openclaw" --format "table {{.Name}}\\t{{.Driver}}\\t{{.Scope}}" 2>$null
706
+ } catch {}
359
707
  `;
360
708
 
361
709
  return files;
@@ -13,8 +13,9 @@ export interface StackManifestService {
13
13
  name: string;
14
14
  category: string;
15
15
  icon: string;
16
- image: string;
17
- imageTag: string;
16
+ image?: string;
17
+ imageTag?: string;
18
+ gitRepoUrl?: string;
18
19
  ports: { container: number; host?: number; exposed: boolean; description: string }[];
19
20
  docsUrl: string;
20
21
  addedBy: string;
@@ -72,6 +73,7 @@ export function generateStackManifest(
72
73
  icon: def.icon,
73
74
  image: def.image,
74
75
  imageTag: def.imageTag,
76
+ gitRepoUrl: def.gitSource?.repoUrl,
75
77
  ports: def.ports.map((p) => ({
76
78
  container: p.container,
77
79
  host: p.host,
package/src/index.ts CHANGED
@@ -1,4 +1,5 @@
1
- // ─── Schemas ────────────────────────────────────────────────────────────────
1
+ // ─── Addon Stack (Clawexa) ──────────────────────────────────────────────────
2
+ export { generateAddonStack, updateAddonStack } from "./addon-stack.js";
2
3
 
3
4
  // ─── Core Engines ───────────────────────────────────────────────────────────
4
5
  export {
@@ -7,7 +8,7 @@ export {
7
8
  resolvedWithOnlyServices,
8
9
  } from "./bare-metal-partition.js";
9
10
  export type { ComposeResult } from "./composer.js";
10
- export { compose, composeMultiFile } from "./composer.js";
11
+ export { buildCompanionService, buildPostgresSetup, compose, composeMultiFile, quotedStr, YAML_OPTIONS } from "./composer.js";
11
12
  // ─── PaaS Deployers ─────────────────────────────────────────────────────────
12
13
  export type {
13
14
  DeployInput as PaasDeployInput,
@@ -28,6 +29,7 @@ export {
28
29
  export { StackConfigError, ValidationError } from "./errors.js";
29
30
  export { generate, generateServicesDoc } from "./generate.js";
30
31
  export { generateCaddyfile } from "./generators/caddy.js";
32
+ export { generateCloneScripts } from "./generators/clone-repos.js";
31
33
  export type { EnvVarGroup } from "./generators/env.js";
32
34
  export { generateEnvFiles, getStructuredEnvVars } from "./generators/env.js";
33
35
  export {
@@ -44,6 +46,9 @@ export { generatePrometheusConfig } from "./generators/prometheus.js";
44
46
  export { generateReadme } from "./generators/readme.js";
45
47
  export { generateScripts } from "./generators/scripts.js";
46
48
  export { generateSkillFiles } from "./generators/skills.js";
49
+ // ─── Analytics ─────────────────────────────────────────────────────────────
50
+ export type { AnalyticsPayload } from "./track-analytics.js";
51
+ export { buildAnalyticsPayload, trackAnalytics } from "./track-analytics.js";
47
52
  export type {
48
53
  StackManifest,
49
54
  StackManifestService,
@@ -67,16 +72,24 @@ export {
67
72
  } from "./presets/registry.js";
68
73
  export { resolve } from "./resolver.js";
69
74
  export {
75
+ AddonStackInputSchema,
76
+ AddonStackResultSchema,
77
+ AddonStackUpdateInputSchema,
78
+ AddonStackUpdateResultSchema,
70
79
  AddedDependencySchema,
71
80
  ApiErrorSchema,
81
+ BuildContextSchema,
72
82
  ComposeOptionsSchema,
73
83
  DeploymentTargetSchema,
74
84
  DeploymentTypeSchema,
75
85
  DeploySchema,
76
86
  DeployTargetSchema,
87
+ EnvQuirkFixSchema,
88
+ EnvQuirkSchema,
77
89
  EnvVariableSchema,
78
90
  ErrorSchema,
79
91
  GenerationInputSchema,
92
+ GitSourceSchema,
80
93
  HealthCheckSchema,
81
94
  MaturitySchema,
82
95
  NativePlatformSchema,
@@ -87,6 +100,7 @@ export {
87
100
  PlatformSchema,
88
101
  PortMappingSchema,
89
102
  PresetSchema,
103
+ ProxyRouteSchema,
90
104
  ProxyTypeSchema,
91
105
  ResolvedServiceSchema,
92
106
  ResolverOutputSchema,
@@ -96,6 +110,8 @@ export {
96
110
  ServiceDefinitionSchema,
97
111
  SkillBindingSchema,
98
112
  SkillPackSchema,
113
+ SkippedServiceReasonSchema,
114
+ SkippedServiceSchema,
99
115
  ValidateRequestSchema,
100
116
  ValidateResponseSchema,
101
117
  VolumeMappingSchema,
@@ -124,20 +140,28 @@ export {
124
140
  } from "./skills/skill-manifest.js";
125
141
  // ─── Types ──────────────────────────────────────────────────────────────────
126
142
  export type {
143
+ AddonStackInput,
144
+ AddonStackResult,
145
+ AddonStackUpdateInput,
146
+ AddonStackUpdateResult,
127
147
  AddedDependency,
128
148
  AiProvider,
129
149
  ApiError,
150
+ BuildContext,
130
151
  CategoryInfo,
131
152
  ComposeOptions,
132
153
  Deploy,
133
154
  DeploymentTarget,
134
155
  DeploymentType,
135
156
  DeployTarget,
157
+ EnvQuirk,
158
+ EnvQuirkFix,
136
159
  EnvVariable,
137
160
  GeneratedFiles,
138
161
  GenerationInput,
139
162
  GenerationMetadata,
140
163
  GenerationResult,
164
+ GitSource,
141
165
  GsdRuntime,
142
166
  HealthCheck,
143
167
  Maturity,
@@ -149,6 +173,7 @@ export type {
149
173
  Platform,
150
174
  PortMapping,
151
175
  Preset,
176
+ ProxyRoute,
152
177
  ProxyType,
153
178
  ResolvedService,
154
179
  ResolverError,
@@ -160,6 +185,7 @@ export type {
160
185
  ServiceDefinition,
161
186
  SkillBinding,
162
187
  SkillPack,
188
+ SkippedService,
163
189
  ValidateRequest,
164
190
  ValidateResponse,
165
191
  VolumeMapping,