@better-openclaw/core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/.turbo/turbo-lint.log +360 -0
  3. package/.turbo/turbo-typecheck.log +4 -0
  4. package/dist/bare-metal-partition.d.ts +22 -0
  5. package/dist/bare-metal-partition.d.ts.map +1 -0
  6. package/dist/bare-metal-partition.js +49 -0
  7. package/dist/bare-metal-partition.js.map +1 -0
  8. package/dist/composer.d.ts +17 -0
  9. package/dist/composer.d.ts.map +1 -0
  10. package/dist/composer.js +305 -0
  11. package/dist/composer.js.map +1 -0
  12. package/dist/generate.d.ts +7 -0
  13. package/dist/generate.d.ts.map +1 -0
  14. package/dist/generate.js +218 -0
  15. package/dist/generate.js.map +1 -0
  16. package/dist/generators/bare-metal-install.d.ts +18 -0
  17. package/dist/generators/bare-metal-install.d.ts.map +1 -0
  18. package/dist/generators/bare-metal-install.js +228 -0
  19. package/dist/generators/bare-metal-install.js.map +1 -0
  20. package/dist/generators/caddy.d.ts +13 -0
  21. package/dist/generators/caddy.d.ts.map +1 -0
  22. package/dist/generators/caddy.js +85 -0
  23. package/dist/generators/caddy.js.map +1 -0
  24. package/dist/generators/env.d.ts +42 -0
  25. package/dist/generators/env.d.ts.map +1 -0
  26. package/dist/generators/env.js +276 -0
  27. package/dist/generators/env.js.map +1 -0
  28. package/dist/generators/grafana.d.ts +19 -0
  29. package/dist/generators/grafana.d.ts.map +1 -0
  30. package/dist/generators/grafana.js +247 -0
  31. package/dist/generators/grafana.js.map +1 -0
  32. package/dist/generators/n8n-workflows.d.ts +7 -0
  33. package/dist/generators/n8n-workflows.d.ts.map +1 -0
  34. package/dist/generators/n8n-workflows.js +78 -0
  35. package/dist/generators/n8n-workflows.js.map +1 -0
  36. package/dist/generators/native-services.d.ts +13 -0
  37. package/dist/generators/native-services.d.ts.map +1 -0
  38. package/dist/generators/native-services.js +85 -0
  39. package/dist/generators/native-services.js.map +1 -0
  40. package/dist/generators/postgres-init.d.ts +27 -0
  41. package/dist/generators/postgres-init.d.ts.map +1 -0
  42. package/dist/generators/postgres-init.js +119 -0
  43. package/dist/generators/postgres-init.js.map +1 -0
  44. package/dist/generators/prometheus.d.ts +10 -0
  45. package/dist/generators/prometheus.d.ts.map +1 -0
  46. package/dist/generators/prometheus.js +79 -0
  47. package/dist/generators/prometheus.js.map +1 -0
  48. package/dist/generators/readme.d.ts +21 -0
  49. package/dist/generators/readme.d.ts.map +1 -0
  50. package/dist/generators/readme.js +224 -0
  51. package/dist/generators/readme.js.map +1 -0
  52. package/dist/generators/scripts.d.ts +7 -0
  53. package/dist/generators/scripts.d.ts.map +1 -0
  54. package/dist/generators/scripts.js +352 -0
  55. package/dist/generators/scripts.js.map +1 -0
  56. package/dist/generators/skills.d.ts +10 -0
  57. package/dist/generators/skills.d.ts.map +1 -0
  58. package/dist/generators/skills.js +596 -0
  59. package/dist/generators/skills.js.map +1 -0
  60. package/dist/index.d.ts +24 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +27 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/presets/registry.d.ts +5 -0
  65. package/dist/presets/registry.d.ts.map +1 -0
  66. package/dist/presets/registry.js +121 -0
  67. package/dist/presets/registry.js.map +1 -0
  68. package/dist/resolver.d.ts +17 -0
  69. package/dist/resolver.d.ts.map +1 -0
  70. package/dist/resolver.js +254 -0
  71. package/dist/resolver.js.map +1 -0
  72. package/dist/schema.d.ts +2426 -0
  73. package/dist/schema.d.ts.map +1 -0
  74. package/dist/schema.js +259 -0
  75. package/dist/schema.js.map +1 -0
  76. package/dist/services/definitions/anything-llm.d.ts +3 -0
  77. package/dist/services/definitions/anything-llm.d.ts.map +1 -0
  78. package/dist/services/definitions/anything-llm.js +39 -0
  79. package/dist/services/definitions/anything-llm.js.map +1 -0
  80. package/dist/services/definitions/appflowy.d.ts +3 -0
  81. package/dist/services/definitions/appflowy.d.ts.map +1 -0
  82. package/dist/services/definitions/appflowy.js +39 -0
  83. package/dist/services/definitions/appflowy.js.map +1 -0
  84. package/dist/services/definitions/beszel.d.ts +3 -0
  85. package/dist/services/definitions/beszel.d.ts.map +1 -0
  86. package/dist/services/definitions/beszel.js +39 -0
  87. package/dist/services/definitions/beszel.js.map +1 -0
  88. package/dist/services/definitions/browserless.d.ts +3 -0
  89. package/dist/services/definitions/browserless.d.ts.map +1 -0
  90. package/dist/services/definitions/browserless.js +77 -0
  91. package/dist/services/definitions/browserless.js.map +1 -0
  92. package/dist/services/definitions/caddy.d.ts +3 -0
  93. package/dist/services/definitions/caddy.d.ts.map +1 -0
  94. package/dist/services/definitions/caddy.js +50 -0
  95. package/dist/services/definitions/caddy.js.map +1 -0
  96. package/dist/services/definitions/chromadb.d.ts +3 -0
  97. package/dist/services/definitions/chromadb.d.ts.map +1 -0
  98. package/dist/services/definitions/chromadb.js +61 -0
  99. package/dist/services/definitions/chromadb.js.map +1 -0
  100. package/dist/services/definitions/claude-code.d.ts +3 -0
  101. package/dist/services/definitions/claude-code.d.ts.map +1 -0
  102. package/dist/services/definitions/claude-code.js +49 -0
  103. package/dist/services/definitions/claude-code.js.map +1 -0
  104. package/dist/services/definitions/code-server.d.ts +3 -0
  105. package/dist/services/definitions/code-server.d.ts.map +1 -0
  106. package/dist/services/definitions/code-server.js +61 -0
  107. package/dist/services/definitions/code-server.js.map +1 -0
  108. package/dist/services/definitions/codex.d.ts +3 -0
  109. package/dist/services/definitions/codex.d.ts.map +1 -0
  110. package/dist/services/definitions/codex.js +41 -0
  111. package/dist/services/definitions/codex.js.map +1 -0
  112. package/dist/services/definitions/coolify.d.ts +3 -0
  113. package/dist/services/definitions/coolify.d.ts.map +1 -0
  114. package/dist/services/definitions/coolify.js +44 -0
  115. package/dist/services/definitions/coolify.js.map +1 -0
  116. package/dist/services/definitions/dify.d.ts +3 -0
  117. package/dist/services/definitions/dify.d.ts.map +1 -0
  118. package/dist/services/definitions/dify.js +75 -0
  119. package/dist/services/definitions/dify.js.map +1 -0
  120. package/dist/services/definitions/docsgpt.d.ts +3 -0
  121. package/dist/services/definitions/docsgpt.d.ts.map +1 -0
  122. package/dist/services/definitions/docsgpt.js +39 -0
  123. package/dist/services/definitions/docsgpt.js.map +1 -0
  124. package/dist/services/definitions/dokploy.d.ts +3 -0
  125. package/dist/services/definitions/dokploy.d.ts.map +1 -0
  126. package/dist/services/definitions/dokploy.js +44 -0
  127. package/dist/services/definitions/dokploy.js.map +1 -0
  128. package/dist/services/definitions/dozzle.d.ts +3 -0
  129. package/dist/services/definitions/dozzle.d.ts.map +1 -0
  130. package/dist/services/definitions/dozzle.js +33 -0
  131. package/dist/services/definitions/dozzle.js.map +1 -0
  132. package/dist/services/definitions/ffmpeg.d.ts +3 -0
  133. package/dist/services/definitions/ffmpeg.d.ts.map +1 -0
  134. package/dist/services/definitions/ffmpeg.js +63 -0
  135. package/dist/services/definitions/ffmpeg.js.map +1 -0
  136. package/dist/services/definitions/flowise.d.ts +3 -0
  137. package/dist/services/definitions/flowise.d.ts.map +1 -0
  138. package/dist/services/definitions/flowise.js +39 -0
  139. package/dist/services/definitions/flowise.js.map +1 -0
  140. package/dist/services/definitions/gemini-cli.d.ts +3 -0
  141. package/dist/services/definitions/gemini-cli.d.ts.map +1 -0
  142. package/dist/services/definitions/gemini-cli.js +41 -0
  143. package/dist/services/definitions/gemini-cli.js.map +1 -0
  144. package/dist/services/definitions/gitea.d.ts +3 -0
  145. package/dist/services/definitions/gitea.d.ts.map +1 -0
  146. package/dist/services/definitions/gitea.js +45 -0
  147. package/dist/services/definitions/gitea.js.map +1 -0
  148. package/dist/services/definitions/gotify.d.ts +3 -0
  149. package/dist/services/definitions/gotify.d.ts.map +1 -0
  150. package/dist/services/definitions/gotify.js +60 -0
  151. package/dist/services/definitions/gotify.js.map +1 -0
  152. package/dist/services/definitions/grafana.d.ts +3 -0
  153. package/dist/services/definitions/grafana.d.ts.map +1 -0
  154. package/dist/services/definitions/grafana.js +61 -0
  155. package/dist/services/definitions/grafana.js.map +1 -0
  156. package/dist/services/definitions/index.d.ts +68 -0
  157. package/dist/services/definitions/index.d.ts.map +1 -0
  158. package/dist/services/definitions/index.js +198 -0
  159. package/dist/services/definitions/index.js.map +1 -0
  160. package/dist/services/definitions/kimi.d.ts +3 -0
  161. package/dist/services/definitions/kimi.d.ts.map +1 -0
  162. package/dist/services/definitions/kimi.js +41 -0
  163. package/dist/services/definitions/kimi.js.map +1 -0
  164. package/dist/services/definitions/lasuite-meet-agents.d.ts +3 -0
  165. package/dist/services/definitions/lasuite-meet-agents.d.ts.map +1 -0
  166. package/dist/services/definitions/lasuite-meet-agents.js +26 -0
  167. package/dist/services/definitions/lasuite-meet-agents.js.map +1 -0
  168. package/dist/services/definitions/lasuite-meet-backend.d.ts +3 -0
  169. package/dist/services/definitions/lasuite-meet-backend.d.ts.map +1 -0
  170. package/dist/services/definitions/lasuite-meet-backend.js +118 -0
  171. package/dist/services/definitions/lasuite-meet-backend.js.map +1 -0
  172. package/dist/services/definitions/lasuite-meet-frontend.d.ts +3 -0
  173. package/dist/services/definitions/lasuite-meet-frontend.d.ts.map +1 -0
  174. package/dist/services/definitions/lasuite-meet-frontend.js +31 -0
  175. package/dist/services/definitions/lasuite-meet-frontend.js.map +1 -0
  176. package/dist/services/definitions/librechat.d.ts +3 -0
  177. package/dist/services/definitions/librechat.d.ts.map +1 -0
  178. package/dist/services/definitions/librechat.js +47 -0
  179. package/dist/services/definitions/librechat.js.map +1 -0
  180. package/dist/services/definitions/lightpanda.d.ts +3 -0
  181. package/dist/services/definitions/lightpanda.d.ts.map +1 -0
  182. package/dist/services/definitions/lightpanda.js +59 -0
  183. package/dist/services/definitions/lightpanda.js.map +1 -0
  184. package/dist/services/definitions/litellm.d.ts +3 -0
  185. package/dist/services/definitions/litellm.d.ts.map +1 -0
  186. package/dist/services/definitions/litellm.js +41 -0
  187. package/dist/services/definitions/litellm.js.map +1 -0
  188. package/dist/services/definitions/livekit.d.ts +3 -0
  189. package/dist/services/definitions/livekit.d.ts.map +1 -0
  190. package/dist/services/definitions/livekit.js +31 -0
  191. package/dist/services/definitions/livekit.js.map +1 -0
  192. package/dist/services/definitions/matomo.d.ts +3 -0
  193. package/dist/services/definitions/matomo.d.ts.map +1 -0
  194. package/dist/services/definitions/matomo.js +75 -0
  195. package/dist/services/definitions/matomo.js.map +1 -0
  196. package/dist/services/definitions/matrix-synapse.d.ts +3 -0
  197. package/dist/services/definitions/matrix-synapse.d.ts.map +1 -0
  198. package/dist/services/definitions/matrix-synapse.js +82 -0
  199. package/dist/services/definitions/matrix-synapse.js.map +1 -0
  200. package/dist/services/definitions/mattermost.d.ts +3 -0
  201. package/dist/services/definitions/mattermost.d.ts.map +1 -0
  202. package/dist/services/definitions/mattermost.js +59 -0
  203. package/dist/services/definitions/mattermost.js.map +1 -0
  204. package/dist/services/definitions/meilisearch.d.ts +3 -0
  205. package/dist/services/definitions/meilisearch.d.ts.map +1 -0
  206. package/dist/services/definitions/meilisearch.js +76 -0
  207. package/dist/services/definitions/meilisearch.js.map +1 -0
  208. package/dist/services/definitions/minio.d.ts +3 -0
  209. package/dist/services/definitions/minio.d.ts.map +1 -0
  210. package/dist/services/definitions/minio.js +98 -0
  211. package/dist/services/definitions/minio.js.map +1 -0
  212. package/dist/services/definitions/mixpost.d.ts +3 -0
  213. package/dist/services/definitions/mixpost.d.ts.map +1 -0
  214. package/dist/services/definitions/mixpost.js +82 -0
  215. package/dist/services/definitions/mixpost.js.map +1 -0
  216. package/dist/services/definitions/motion-canvas.d.ts +3 -0
  217. package/dist/services/definitions/motion-canvas.d.ts.map +1 -0
  218. package/dist/services/definitions/motion-canvas.js +48 -0
  219. package/dist/services/definitions/motion-canvas.js.map +1 -0
  220. package/dist/services/definitions/n8n.d.ts +3 -0
  221. package/dist/services/definitions/n8n.d.ts.map +1 -0
  222. package/dist/services/definitions/n8n.js +146 -0
  223. package/dist/services/definitions/n8n.js.map +1 -0
  224. package/dist/services/definitions/nocodb.d.ts +3 -0
  225. package/dist/services/definitions/nocodb.d.ts.map +1 -0
  226. package/dist/services/definitions/nocodb.js +39 -0
  227. package/dist/services/definitions/nocodb.js.map +1 -0
  228. package/dist/services/definitions/ntfy.d.ts +3 -0
  229. package/dist/services/definitions/ntfy.d.ts.map +1 -0
  230. package/dist/services/definitions/ntfy.js +61 -0
  231. package/dist/services/definitions/ntfy.js.map +1 -0
  232. package/dist/services/definitions/ollama.d.ts +3 -0
  233. package/dist/services/definitions/ollama.d.ts.map +1 -0
  234. package/dist/services/definitions/ollama.js +61 -0
  235. package/dist/services/definitions/ollama.js.map +1 -0
  236. package/dist/services/definitions/open-webui.d.ts +3 -0
  237. package/dist/services/definitions/open-webui.d.ts.map +1 -0
  238. package/dist/services/definitions/open-webui.js +47 -0
  239. package/dist/services/definitions/open-webui.js.map +1 -0
  240. package/dist/services/definitions/opencode.d.ts +3 -0
  241. package/dist/services/definitions/opencode.d.ts.map +1 -0
  242. package/dist/services/definitions/opencode.js +47 -0
  243. package/dist/services/definitions/opencode.js.map +1 -0
  244. package/dist/services/definitions/openpanel.d.ts +3 -0
  245. package/dist/services/definitions/openpanel.d.ts.map +1 -0
  246. package/dist/services/definitions/openpanel.js +41 -0
  247. package/dist/services/definitions/openpanel.js.map +1 -0
  248. package/dist/services/definitions/outline.d.ts +3 -0
  249. package/dist/services/definitions/outline.d.ts.map +1 -0
  250. package/dist/services/definitions/outline.js +68 -0
  251. package/dist/services/definitions/outline.js.map +1 -0
  252. package/dist/services/definitions/paperless-ngx.d.ts +3 -0
  253. package/dist/services/definitions/paperless-ngx.d.ts.map +1 -0
  254. package/dist/services/definitions/paperless-ngx.js +85 -0
  255. package/dist/services/definitions/paperless-ngx.js.map +1 -0
  256. package/dist/services/definitions/playwright-server.d.ts +3 -0
  257. package/dist/services/definitions/playwright-server.d.ts.map +1 -0
  258. package/dist/services/definitions/playwright-server.js +34 -0
  259. package/dist/services/definitions/playwright-server.js.map +1 -0
  260. package/dist/services/definitions/portainer.d.ts +3 -0
  261. package/dist/services/definitions/portainer.d.ts.map +1 -0
  262. package/dist/services/definitions/portainer.js +44 -0
  263. package/dist/services/definitions/portainer.js.map +1 -0
  264. package/dist/services/definitions/postgresql.d.ts +3 -0
  265. package/dist/services/definitions/postgresql.d.ts.map +1 -0
  266. package/dist/services/definitions/postgresql.js +83 -0
  267. package/dist/services/definitions/postgresql.js.map +1 -0
  268. package/dist/services/definitions/postiz.d.ts +3 -0
  269. package/dist/services/definitions/postiz.d.ts.map +1 -0
  270. package/dist/services/definitions/postiz.js +79 -0
  271. package/dist/services/definitions/postiz.js.map +1 -0
  272. package/dist/services/definitions/prometheus.d.ts +3 -0
  273. package/dist/services/definitions/prometheus.d.ts.map +1 -0
  274. package/dist/services/definitions/prometheus.js +47 -0
  275. package/dist/services/definitions/prometheus.js.map +1 -0
  276. package/dist/services/definitions/qdrant.d.ts +3 -0
  277. package/dist/services/definitions/qdrant.d.ts.map +1 -0
  278. package/dist/services/definitions/qdrant.js +75 -0
  279. package/dist/services/definitions/qdrant.js.map +1 -0
  280. package/dist/services/definitions/redis.d.ts +3 -0
  281. package/dist/services/definitions/redis.d.ts.map +1 -0
  282. package/dist/services/definitions/redis.js +90 -0
  283. package/dist/services/definitions/redis.js.map +1 -0
  284. package/dist/services/definitions/remotion.d.ts +3 -0
  285. package/dist/services/definitions/remotion.d.ts.map +1 -0
  286. package/dist/services/definitions/remotion.js +48 -0
  287. package/dist/services/definitions/remotion.js.map +1 -0
  288. package/dist/services/definitions/rocketchat.d.ts +3 -0
  289. package/dist/services/definitions/rocketchat.d.ts.map +1 -0
  290. package/dist/services/definitions/rocketchat.js +54 -0
  291. package/dist/services/definitions/rocketchat.js.map +1 -0
  292. package/dist/services/definitions/searxng.d.ts +3 -0
  293. package/dist/services/definitions/searxng.d.ts.map +1 -0
  294. package/dist/services/definitions/searxng.js +61 -0
  295. package/dist/services/definitions/searxng.js.map +1 -0
  296. package/dist/services/definitions/stable-diffusion.d.ts +3 -0
  297. package/dist/services/definitions/stable-diffusion.d.ts.map +1 -0
  298. package/dist/services/definitions/stable-diffusion.js +44 -0
  299. package/dist/services/definitions/stable-diffusion.js.map +1 -0
  300. package/dist/services/definitions/steel-browser.d.ts +3 -0
  301. package/dist/services/definitions/steel-browser.d.ts.map +1 -0
  302. package/dist/services/definitions/steel-browser.js +68 -0
  303. package/dist/services/definitions/steel-browser.js.map +1 -0
  304. package/dist/services/definitions/tailscale.d.ts +3 -0
  305. package/dist/services/definitions/tailscale.d.ts.map +1 -0
  306. package/dist/services/definitions/tailscale.js +62 -0
  307. package/dist/services/definitions/tailscale.js.map +1 -0
  308. package/dist/services/definitions/temporal.d.ts +3 -0
  309. package/dist/services/definitions/temporal.d.ts.map +1 -0
  310. package/dist/services/definitions/temporal.js +97 -0
  311. package/dist/services/definitions/temporal.js.map +1 -0
  312. package/dist/services/definitions/traefik.d.ts +3 -0
  313. package/dist/services/definitions/traefik.d.ts.map +1 -0
  314. package/dist/services/definitions/traefik.js +52 -0
  315. package/dist/services/definitions/traefik.js.map +1 -0
  316. package/dist/services/definitions/umami.d.ts +3 -0
  317. package/dist/services/definitions/umami.d.ts.map +1 -0
  318. package/dist/services/definitions/umami.js +41 -0
  319. package/dist/services/definitions/umami.js.map +1 -0
  320. package/dist/services/definitions/uptime-kuma.d.ts +3 -0
  321. package/dist/services/definitions/uptime-kuma.d.ts.map +1 -0
  322. package/dist/services/definitions/uptime-kuma.js +46 -0
  323. package/dist/services/definitions/uptime-kuma.js.map +1 -0
  324. package/dist/services/definitions/valkey.d.ts +3 -0
  325. package/dist/services/definitions/valkey.d.ts.map +1 -0
  326. package/dist/services/definitions/valkey.js +60 -0
  327. package/dist/services/definitions/valkey.js.map +1 -0
  328. package/dist/services/definitions/watchtower.d.ts +3 -0
  329. package/dist/services/definitions/watchtower.d.ts.map +1 -0
  330. package/dist/services/definitions/watchtower.js +41 -0
  331. package/dist/services/definitions/watchtower.js.map +1 -0
  332. package/dist/services/definitions/weaviate.d.ts +3 -0
  333. package/dist/services/definitions/weaviate.d.ts.map +1 -0
  334. package/dist/services/definitions/weaviate.js +89 -0
  335. package/dist/services/definitions/weaviate.js.map +1 -0
  336. package/dist/services/definitions/whisper.d.ts +3 -0
  337. package/dist/services/definitions/whisper.d.ts.map +1 -0
  338. package/dist/services/definitions/whisper.js +55 -0
  339. package/dist/services/definitions/whisper.js.map +1 -0
  340. package/dist/services/registry.d.ts +12 -0
  341. package/dist/services/registry.d.ts.map +1 -0
  342. package/dist/services/registry.js +28 -0
  343. package/dist/services/registry.js.map +1 -0
  344. package/dist/skills/registry.d.ts +7 -0
  345. package/dist/skills/registry.d.ts.map +1 -0
  346. package/dist/skills/registry.js +111 -0
  347. package/dist/skills/registry.js.map +1 -0
  348. package/dist/types.d.ts +60 -0
  349. package/dist/types.d.ts.map +1 -0
  350. package/dist/types.js +20 -0
  351. package/dist/types.js.map +1 -0
  352. package/dist/validator.d.ts +16 -0
  353. package/dist/validator.d.ts.map +1 -0
  354. package/dist/validator.js +142 -0
  355. package/dist/validator.js.map +1 -0
  356. package/dist/version-manager.d.ts +10 -0
  357. package/dist/version-manager.d.ts.map +1 -0
  358. package/dist/version-manager.js +60 -0
  359. package/dist/version-manager.js.map +1 -0
  360. package/package.json +37 -0
  361. package/src/__snapshots__/composer.snapshot.test.ts.snap +903 -0
  362. package/src/bare-metal-partition.test.ts +63 -0
  363. package/src/bare-metal-partition.ts +64 -0
  364. package/src/composer.snapshot.test.ts +87 -0
  365. package/src/composer.test.ts +224 -0
  366. package/src/composer.ts +403 -0
  367. package/src/generate.test.ts +349 -0
  368. package/src/generate.ts +259 -0
  369. package/src/generators/bare-metal-install.test.ts +43 -0
  370. package/src/generators/bare-metal-install.ts +249 -0
  371. package/src/generators/caddy.ts +99 -0
  372. package/src/generators/env.ts +405 -0
  373. package/src/generators/grafana.ts +255 -0
  374. package/src/generators/n8n-workflows.ts +88 -0
  375. package/src/generators/native-services.ts +103 -0
  376. package/src/generators/postgres-init.ts +137 -0
  377. package/src/generators/prometheus.ts +89 -0
  378. package/src/generators/readme.ts +274 -0
  379. package/src/generators/scripts.ts +362 -0
  380. package/src/generators/skills.ts +628 -0
  381. package/src/index.ts +118 -0
  382. package/src/presets/registry.test.ts +32 -0
  383. package/src/presets/registry.ts +126 -0
  384. package/src/resolver.test.ts +204 -0
  385. package/src/resolver.ts +282 -0
  386. package/src/schema.test.ts +295 -0
  387. package/src/schema.ts +307 -0
  388. package/src/services/definitions/anything-llm.ts +46 -0
  389. package/src/services/definitions/appflowy.ts +46 -0
  390. package/src/services/definitions/beszel.ts +46 -0
  391. package/src/services/definitions/browserless.ts +84 -0
  392. package/src/services/definitions/caddy.ts +57 -0
  393. package/src/services/definitions/chromadb.ts +68 -0
  394. package/src/services/definitions/claude-code.ts +56 -0
  395. package/src/services/definitions/code-server.ts +67 -0
  396. package/src/services/definitions/codex.ts +48 -0
  397. package/src/services/definitions/coolify.ts +51 -0
  398. package/src/services/definitions/dify.ts +82 -0
  399. package/src/services/definitions/docsgpt.ts +45 -0
  400. package/src/services/definitions/dokploy.ts +51 -0
  401. package/src/services/definitions/dozzle.ts +40 -0
  402. package/src/services/definitions/ffmpeg.ts +70 -0
  403. package/src/services/definitions/flowise.ts +45 -0
  404. package/src/services/definitions/gemini-cli.ts +48 -0
  405. package/src/services/definitions/gitea.ts +52 -0
  406. package/src/services/definitions/gotify.ts +67 -0
  407. package/src/services/definitions/grafana.ts +68 -0
  408. package/src/services/definitions/index.ts +200 -0
  409. package/src/services/definitions/kimi.ts +48 -0
  410. package/src/services/definitions/lasuite-meet-agents.ts +33 -0
  411. package/src/services/definitions/lasuite-meet-backend.ts +125 -0
  412. package/src/services/definitions/lasuite-meet-frontend.ts +38 -0
  413. package/src/services/definitions/librechat.ts +54 -0
  414. package/src/services/definitions/lightpanda.ts +61 -0
  415. package/src/services/definitions/litellm.ts +48 -0
  416. package/src/services/definitions/livekit.ts +38 -0
  417. package/src/services/definitions/matomo.ts +82 -0
  418. package/src/services/definitions/matrix-synapse.ts +89 -0
  419. package/src/services/definitions/mattermost.ts +67 -0
  420. package/src/services/definitions/meilisearch.ts +83 -0
  421. package/src/services/definitions/minio.ts +105 -0
  422. package/src/services/definitions/mixpost.ts +89 -0
  423. package/src/services/definitions/motion-canvas.ts +55 -0
  424. package/src/services/definitions/n8n.ts +153 -0
  425. package/src/services/definitions/nocodb.ts +46 -0
  426. package/src/services/definitions/ntfy.ts +68 -0
  427. package/src/services/definitions/ollama.ts +68 -0
  428. package/src/services/definitions/open-webui.ts +54 -0
  429. package/src/services/definitions/opencode.ts +54 -0
  430. package/src/services/definitions/openpanel.ts +48 -0
  431. package/src/services/definitions/outline.ts +75 -0
  432. package/src/services/definitions/paperless-ngx.ts +92 -0
  433. package/src/services/definitions/playwright-server.ts +41 -0
  434. package/src/services/definitions/portainer.ts +50 -0
  435. package/src/services/definitions/postgresql.ts +90 -0
  436. package/src/services/definitions/postiz.ts +86 -0
  437. package/src/services/definitions/prometheus.ts +54 -0
  438. package/src/services/definitions/qdrant.ts +82 -0
  439. package/src/services/definitions/redis.ts +99 -0
  440. package/src/services/definitions/remotion.ts +55 -0
  441. package/src/services/definitions/rocketchat.ts +61 -0
  442. package/src/services/definitions/searxng.ts +68 -0
  443. package/src/services/definitions/stable-diffusion.ts +50 -0
  444. package/src/services/definitions/steel-browser.ts +70 -0
  445. package/src/services/definitions/tailscale.ts +69 -0
  446. package/src/services/definitions/temporal.ts +104 -0
  447. package/src/services/definitions/traefik.ts +60 -0
  448. package/src/services/definitions/umami.ts +48 -0
  449. package/src/services/definitions/uptime-kuma.ts +53 -0
  450. package/src/services/definitions/valkey.ts +67 -0
  451. package/src/services/definitions/watchtower.ts +47 -0
  452. package/src/services/definitions/weaviate.ts +96 -0
  453. package/src/services/definitions/whisper.ts +62 -0
  454. package/src/services/registry.test.ts +98 -0
  455. package/src/services/registry.ts +37 -0
  456. package/src/skills/registry.ts +126 -0
  457. package/src/types.ts +123 -0
  458. package/src/validator.test.ts +66 -0
  459. package/src/validator.ts +166 -0
  460. package/src/version-manager.ts +65 -0
  461. package/tsconfig.json +9 -0
@@ -0,0 +1,88 @@
1
+ import type { ResolverOutput } from "../types.js";
2
+
3
+ /**
4
+ * Generates n8n workflow template files.
5
+ * Returns a map of file paths to JSON content strings.
6
+ */
7
+ export function generateN8nWorkflows(resolved: ResolverOutput): Record<string, string> {
8
+ const files: Record<string, string> = {};
9
+
10
+ // Only generate if n8n is in the stack
11
+ const hasN8n = resolved.services.some((s) => s.definition.id === "n8n");
12
+ if (!hasN8n) return files;
13
+
14
+ files["n8n/workflows/openclaw-webhook-handler.json"] = JSON.stringify(
15
+ createWebhookHandlerWorkflow(resolved),
16
+ null,
17
+ 2,
18
+ );
19
+
20
+ return files;
21
+ }
22
+
23
+ function createWebhookHandlerWorkflow(resolved: ResolverOutput) {
24
+ // Create a basic n8n workflow JSON that:
25
+ // 1. Has a Webhook trigger node listening on /openclaw-webhook
26
+ // 2. Has a Function node that processes the payload
27
+ // 3. Outputs to a Respond to Webhook node
28
+ const serviceNames = resolved.services.map((s) => s.definition.name).join(", ");
29
+
30
+ return {
31
+ name: "OpenClaw Webhook Handler",
32
+ nodes: [
33
+ {
34
+ parameters: {
35
+ httpMethod: "POST",
36
+ path: "openclaw-webhook",
37
+ responseMode: "responseNode",
38
+ options: {},
39
+ },
40
+ id: "webhook-trigger",
41
+ name: "Webhook",
42
+ type: "n8n-nodes-base.webhook",
43
+ typeVersion: 2,
44
+ position: [250, 300],
45
+ },
46
+ {
47
+ parameters: {
48
+ jsCode:
49
+ "// Process OpenClaw webhook payload\n" +
50
+ "const payload = $input.all()[0].json;\n" +
51
+ "\n" +
52
+ "// Available services in this stack:\n" +
53
+ `// ${serviceNames}\n` +
54
+ "\n" +
55
+ "return [{ json: { received: true, timestamp: new Date().toISOString(), payload } }];",
56
+ },
57
+ id: "process-payload",
58
+ name: "Process Payload",
59
+ type: "n8n-nodes-base.code",
60
+ typeVersion: 2,
61
+ position: [470, 300],
62
+ },
63
+ {
64
+ parameters: {
65
+ respondWith: "json",
66
+ responseBody: "={{ JSON.stringify($json) }}",
67
+ options: {},
68
+ },
69
+ id: "respond",
70
+ name: "Respond to Webhook",
71
+ type: "n8n-nodes-base.respondToWebhook",
72
+ typeVersion: 1,
73
+ position: [690, 300],
74
+ },
75
+ ],
76
+ connections: {
77
+ Webhook: {
78
+ main: [[{ node: "Process Payload", type: "main", index: 0 }]],
79
+ },
80
+ "Process Payload": {
81
+ main: [[{ node: "Respond to Webhook", type: "main", index: 0 }]],
82
+ },
83
+ },
84
+ active: false,
85
+ settings: { executionOrder: "v1" },
86
+ tags: [{ name: "openclaw" }],
87
+ };
88
+ }
@@ -0,0 +1,103 @@
1
+ import type { NativePlatform, ResolvedService } from "../types.js";
2
+
3
+ export interface NativeServicesGeneratorOptions {
4
+ nativeServices: ResolvedService[];
5
+ platform: NativePlatform;
6
+ projectName: string;
7
+ }
8
+
9
+ /**
10
+ * Generates native install/run scripts for services that have a native recipe.
11
+ * Returns e.g. native/install-linux.sh (or native/install.ps1 for Windows).
12
+ * Scripts source .env and run install steps then start commands in dependency order.
13
+ */
14
+ export function generateNativeInstallScripts(
15
+ options: NativeServicesGeneratorOptions,
16
+ ): Record<string, string> {
17
+ const { nativeServices, platform } = options;
18
+ const files: Record<string, string> = {};
19
+
20
+ if (platform === "linux") {
21
+ files["native/install-linux.sh"] = buildLinuxNativeScript(nativeServices);
22
+ } else if (platform === "windows") {
23
+ files["native/install-windows.ps1"] = buildWindowsNativeScript(nativeServices);
24
+ } else {
25
+ // macos: use bash script similar to linux
26
+ files["native/install-macos.sh"] = buildLinuxNativeScript(nativeServices);
27
+ }
28
+
29
+ return files;
30
+ }
31
+
32
+ function buildLinuxNativeScript(nativeServices: ResolvedService[]): string {
33
+ const lines: string[] = [
34
+ "#!/usr/bin/env bash",
35
+ "set -euo pipefail",
36
+ "# OpenClaw native services — install and start (Linux). Run from project root. Source .env first.",
37
+ "",
38
+ 'SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"',
39
+ 'PROJECT_DIR="$(dirname "$SCRIPT_DIR")"',
40
+ 'cd "$PROJECT_DIR"',
41
+ "",
42
+ "if [ -f .env ]; then set -a; source .env; set +a; fi",
43
+ "",
44
+ ];
45
+
46
+ for (const { definition: def } of nativeServices) {
47
+ const recipe = def.nativeRecipes?.find((r) => r.platform === "linux");
48
+ if (!recipe) continue;
49
+
50
+ lines.push(`# ─── ${def.icon} ${def.name} ─────────────────────────────────────────`);
51
+ lines.push("");
52
+
53
+ if (recipe.configPath && recipe.configTemplate) {
54
+ const delim = `ENDOF_${def.id.toUpperCase().replace(/-/g, "_")}_CONF`;
55
+ lines.push(`# Write config for ${def.id}`);
56
+ lines.push(`sudo mkdir -p "$(dirname "${recipe.configPath}")" 2>/dev/null || true`);
57
+ lines.push(`sudo tee "${recipe.configPath}" > /dev/null << ${delim}`);
58
+ lines.push(recipe.configTemplate.trim());
59
+ lines.push(delim);
60
+ lines.push("");
61
+ }
62
+
63
+ for (const step of recipe.installSteps) {
64
+ lines.push(`# Install: ${def.id}`);
65
+ lines.push(step);
66
+ lines.push("");
67
+ }
68
+
69
+ lines.push(`# Start: ${def.id}`);
70
+ lines.push(recipe.startCommand);
71
+ lines.push("");
72
+ }
73
+
74
+ lines.push("echo 'Native services started.'");
75
+ return lines.join("\n");
76
+ }
77
+
78
+ function buildWindowsNativeScript(nativeServices: ResolvedService[]): string {
79
+ const lines: string[] = [
80
+ "# OpenClaw native services — install and start (Windows). Run from project root.",
81
+ "$ErrorActionPreference = 'Stop'",
82
+ "$ProjectDir = (Get-Item $PSScriptRoot).Parent.FullName",
83
+ "Set-Location $ProjectDir",
84
+ "",
85
+ "if (Test-Path .env) { Get-Content .env | ForEach-Object { if ($_ -match '^([^#=]+)=(.*)$') { [System.Environment]::SetEnvironmentVariable($matches[1].Trim(), $matches[2].Trim(), 'Process') } } }",
86
+ "",
87
+ ];
88
+
89
+ for (const { definition: def } of nativeServices) {
90
+ const recipe = def.nativeRecipes?.find((r) => r.platform === "windows");
91
+ if (!recipe) continue;
92
+
93
+ lines.push(`# ${def.name}`);
94
+ for (const step of recipe.installSteps) {
95
+ lines.push(`Invoke-Expression "${step.replace(/"/g, '`"')}"`);
96
+ }
97
+ lines.push(recipe.startCommand);
98
+ lines.push("");
99
+ }
100
+
101
+ lines.push("Write-Host 'Native services started.'");
102
+ return lines.join("\n");
103
+ }
@@ -0,0 +1,137 @@
1
+ import type { ResolverOutput } from "../types.js";
2
+
3
+ /**
4
+ * Database requirement descriptor for a service.
5
+ */
6
+ interface DbRequirement {
7
+ serviceId: string;
8
+ serviceName: string;
9
+ dbName: string;
10
+ dbUser: string;
11
+ passwordEnvVar: string;
12
+ }
13
+
14
+ /**
15
+ * Known database requirements for services that need their own PostgreSQL database.
16
+ * Maps service ID to the DB name, user, and password env var they expect.
17
+ */
18
+ const DB_REQUIREMENTS: Record<string, Omit<DbRequirement, "serviceId" | "serviceName">> = {
19
+ n8n: { dbName: "n8n", dbUser: "n8n", passwordEnvVar: "N8N_DB_PASSWORD" },
20
+ postiz: { dbName: "postiz", dbUser: "postiz", passwordEnvVar: "POSTIZ_DB_PASSWORD" },
21
+ outline: { dbName: "outline", dbUser: "outline", passwordEnvVar: "OUTLINE_DB_PASSWORD" },
22
+ dify: { dbName: "dify", dbUser: "dify", passwordEnvVar: "DIFY_DB_PASSWORD" },
23
+ temporal: { dbName: "temporal", dbUser: "temporal", passwordEnvVar: "TEMPORAL_DB_PASSWORD" },
24
+ mattermost: {
25
+ dbName: "mattermost",
26
+ dbUser: "mattermost",
27
+ passwordEnvVar: "MATTERMOST_DB_PASSWORD",
28
+ },
29
+ "matrix-synapse": { dbName: "synapse", dbUser: "synapse", passwordEnvVar: "SYNAPSE_DB_PASSWORD" },
30
+ "paperless-ngx": {
31
+ dbName: "paperless",
32
+ dbUser: "paperless",
33
+ passwordEnvVar: "PAPERLESS_DB_PASSWORD",
34
+ },
35
+ umami: { dbName: "umami", dbUser: "umami", passwordEnvVar: "UMAMI_DB_PASSWORD" },
36
+ matomo: { dbName: "matomo", dbUser: "matomo", passwordEnvVar: "MATOMO_DB_PASSWORD" },
37
+ mixpost: { dbName: "mixpost", dbUser: "mixpost", passwordEnvVar: "MIXPOST_DB_PASSWORD" },
38
+ };
39
+
40
+ /**
41
+ * Get the list of database requirements for all resolved services.
42
+ * Exported so other generators (env, composer) can access the same data.
43
+ */
44
+ export function getDbRequirements(resolved: ResolverOutput): DbRequirement[] {
45
+ const reqs: DbRequirement[] = [];
46
+ for (const { definition } of resolved.services) {
47
+ const req = DB_REQUIREMENTS[definition.id];
48
+ if (req) {
49
+ reqs.push({
50
+ serviceId: definition.id,
51
+ serviceName: definition.name,
52
+ ...req,
53
+ });
54
+ }
55
+ }
56
+ return reqs;
57
+ }
58
+
59
+ /**
60
+ * Generates a PostgreSQL initialization script that creates databases and users
61
+ * for all companion services that need their own DB.
62
+ *
63
+ * Returns null if PostgreSQL is not in the resolved stack or no services need extra DBs.
64
+ * The script is designed to be mounted at /docker-entrypoint-initdb.d/init-databases.sh
65
+ * and runs automatically during PostgreSQL's first initialization.
66
+ */
67
+ export function generatePostgresInit(resolved: ResolverOutput): string | null {
68
+ const hasPostgres = resolved.services.some((s) => s.definition.id === "postgresql");
69
+ if (!hasPostgres) return null;
70
+
71
+ const reqs = getDbRequirements(resolved);
72
+ if (reqs.length === 0) return null;
73
+
74
+ const createCalls = reqs
75
+ .map(
76
+ (r) =>
77
+ `create_db_and_user "${r.dbName}" "${r.dbUser}" "\${${r.passwordEnvVar}:-$POSTGRES_PASSWORD}"`,
78
+ )
79
+ .join("\n");
80
+
81
+ return `#!/bin/bash
82
+ set -e
83
+
84
+ # ═══════════════════════════════════════════════════════════════════════════════
85
+ # PostgreSQL Initialization Script
86
+ # Generated by better-openclaw
87
+ #
88
+ # This script runs automatically during PostgreSQL's first initialization.
89
+ # It creates databases and users for all companion services in your stack.
90
+ # ═══════════════════════════════════════════════════════════════════════════════
91
+
92
+ create_db_and_user() {
93
+ local db="$1"
94
+ local user="$2"
95
+ local password="$3"
96
+
97
+ echo ">>> Creating database '$db' with user '$user'..."
98
+
99
+ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
100
+ -- Create user if not exists
101
+ DO \\$\\$
102
+ BEGIN
103
+ IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = '$user') THEN
104
+ CREATE ROLE "$user" WITH LOGIN PASSWORD '$password';
105
+ RAISE NOTICE 'Created user: $user';
106
+ ELSE
107
+ -- Update password in case it changed
108
+ ALTER ROLE "$user" WITH PASSWORD '$password';
109
+ RAISE NOTICE 'User already exists, updated password: $user';
110
+ END IF;
111
+ END
112
+ \\$\\$;
113
+
114
+ -- Create database if not exists
115
+ SELECT 'CREATE DATABASE "$db" OWNER "$user"'
116
+ WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '$db')\\gexec
117
+
118
+ -- Grant privileges
119
+ GRANT ALL PRIVILEGES ON DATABASE "$db" TO "$user";
120
+ EOSQL
121
+
122
+ echo ">>> Done: database '$db' with user '$user'"
123
+ }
124
+
125
+ echo "═══════════════════════════════════════════════════════════"
126
+ echo " Initializing databases for companion services..."
127
+ echo "═══════════════════════════════════════════════════════════"
128
+
129
+ ${createCalls}
130
+
131
+ echo ""
132
+ echo "═══════════════════════════════════════════════════════════"
133
+ echo " All databases initialized successfully!"
134
+ echo " Services: ${reqs.map((r) => r.serviceName).join(", ")}"
135
+ echo "═══════════════════════════════════════════════════════════"
136
+ `;
137
+ }
@@ -0,0 +1,89 @@
1
+ import type { ResolverOutput } from "../types.js";
2
+
3
+ /**
4
+ * Well-known metrics endpoints for services.
5
+ *
6
+ * Services that expose Prometheus-compatible metrics are listed here
7
+ * with their metrics path and port.
8
+ */
9
+ const metricsEndpoints: Record<string, { path: string; port: number }> = {
10
+ redis: { path: "/metrics", port: 9121 },
11
+ postgresql: { path: "/metrics", port: 9187 },
12
+ minio: { path: "/minio/v2/metrics/cluster", port: 9000 },
13
+ n8n: { path: "/metrics", port: 5678 },
14
+ grafana: { path: "/metrics", port: 3000 },
15
+ caddy: { path: "/metrics", port: 2019 },
16
+ traefik: { path: "/metrics", port: 8082 },
17
+ qdrant: { path: "/metrics", port: 6333 },
18
+ "uptime-kuma": { path: "/metrics", port: 3001 },
19
+ ollama: { path: "/metrics", port: 11434 },
20
+ };
21
+
22
+ /**
23
+ * Generates a Prometheus configuration YAML file with scrape configs
24
+ * for all services that expose metrics endpoints.
25
+ *
26
+ * @param resolved - The resolved service configuration
27
+ * @returns The prometheus.yml content as a string
28
+ */
29
+ export function generatePrometheusConfig(resolved: ResolverOutput): string {
30
+ const sections: string[] = [];
31
+
32
+ // ── Header ──────────────────────────────────────────────────────────────
33
+
34
+ sections.push(`# ═══════════════════════════════════════════════════════════════════════════════
35
+ # Prometheus Configuration — Auto-generated by OpenClaw
36
+ # ═══════════════════════════════════════════════════════════════════════════════
37
+
38
+ global:
39
+ scrape_interval: 15s
40
+ evaluation_interval: 15s
41
+ scrape_timeout: 10s
42
+
43
+ # ─── Scrape Configs ──────────────────────────────────────────────────────────
44
+
45
+ scrape_configs:
46
+ # Prometheus self-monitoring
47
+ - job_name: "prometheus"
48
+ static_configs:
49
+ - targets: ["localhost:9090"]
50
+ labels:
51
+ service: "prometheus"
52
+ component: "monitoring"`);
53
+
54
+ // ── Service Scrape Configs ───────────────────────────────────────────────
55
+
56
+ for (const { definition } of resolved.services) {
57
+ // Skip prometheus itself (already included above)
58
+ if (definition.id === "prometheus") continue;
59
+
60
+ const endpoint = metricsEndpoints[definition.id];
61
+ if (!endpoint) continue;
62
+
63
+ sections.push(`
64
+ # ${definition.icon} ${definition.name}
65
+ - job_name: "${definition.id}"
66
+ metrics_path: "${endpoint.path}"
67
+ static_configs:
68
+ - targets: ["${definition.id}:${endpoint.port}"]
69
+ labels:
70
+ service: "${definition.id}"
71
+ component: "${definition.category}"`);
72
+ }
73
+
74
+ // ── OpenClaw Gateway Metrics ────────────────────────────────────────────
75
+
76
+ sections.push(`
77
+ # 🐾 OpenClaw Gateway
78
+ - job_name: "openclaw-gateway"
79
+ metrics_path: "/metrics"
80
+ static_configs:
81
+ - targets: ["openclaw:18789"]
82
+ labels:
83
+ service: "openclaw"
84
+ component: "core"`);
85
+
86
+ sections.push("");
87
+
88
+ return sections.join("\n");
89
+ }
@@ -0,0 +1,274 @@
1
+ import type { ResolverOutput } from "../types.js";
2
+
3
+ /**
4
+ * Options for README generation.
5
+ */
6
+ export interface ReadmeOptions {
7
+ projectName: string;
8
+ domain?: string;
9
+ proxy?: string;
10
+ /** When "bare-metal", the stack uses native + Docker hybrid. */
11
+ deploymentType?: "docker" | "bare-metal";
12
+ /** True when some services run natively on the host (bare-metal only). */
13
+ hasNativeServices?: boolean;
14
+ }
15
+
16
+ /**
17
+ * Generates a comprehensive README.md for the OpenClaw project.
18
+ *
19
+ * Includes: project description, service table, quick start instructions,
20
+ * service URLs, skill packs, and scripts documentation.
21
+ */
22
+ export function generateReadme(resolved: ResolverOutput, options: ReadmeOptions): string {
23
+ const { projectName, domain, proxy, deploymentType, hasNativeServices } = options;
24
+ const sections: string[] = [];
25
+
26
+ // ── Title & Description ─────────────────────────────────────────────────
27
+
28
+ sections.push(`# ${projectName}
29
+
30
+ > Self-hosted AI agent infrastructure powered by [OpenClaw](https://openclaw.dev).
31
+
32
+ This project provides a fully configured Docker Compose stack with ${resolved.services.length} services, ready to deploy on any server.
33
+ ${deploymentType === "bare-metal" && hasNativeServices ? "\n\n**Bare-metal (native + Docker):** Some services run natively on the host; the rest (including the OpenClaw gateway) run in Docker. Use the top-level `install.sh` or `install.ps1` to install/start native services first, then start the Docker stack." : ""}
34
+
35
+ ---`);
36
+
37
+ // ── Service Table ────────────────────────────────────────────────────────
38
+
39
+ const serviceRows = resolved.services
40
+ .map(({ definition }) => {
41
+ const mainPort = definition.ports.find((p) => p.exposed);
42
+ const url = mainPort
43
+ ? domain
44
+ ? `https://${definition.id}.${domain}`
45
+ : `http://localhost:${mainPort.host}`
46
+ : "N/A (internal)";
47
+ return `| ${definition.icon} | **${definition.name}** | ${url} | ${definition.description} |`;
48
+ })
49
+ .join("\n");
50
+
51
+ sections.push(`## Services
52
+
53
+ | | Service | URL | Description |
54
+ |---|---------|-----|-------------|
55
+ ${serviceRows}
56
+ `);
57
+
58
+ // ── Quick Start ──────────────────────────────────────────────────────────
59
+
60
+ sections.push(`## Quick Start
61
+
62
+ ### Prerequisites
63
+
64
+ - [Docker](https://docs.docker.com/get-docker/) (v24+)
65
+ - [Docker Compose](https://docs.docker.com/compose/install/) (v2+)
66
+ - At least ${Math.ceil(resolved.estimatedMemoryMB / 1024)}GB of RAM available
67
+
68
+ ### 1. Extract the ZIP
69
+
70
+ \`\`\`bash
71
+ unzip ${projectName}.zip
72
+ cd ${projectName}
73
+ \`\`\`
74
+
75
+ ### 2. Configure Environment
76
+
77
+ \`\`\`bash
78
+ cp .env.example .env
79
+ \`\`\`
80
+
81
+ Edit \`.env\` and update any values as needed. Secret values have been pre-generated — review and change them for production use.
82
+
83
+ ### 3. Start Services
84
+
85
+ \`\`\`bash
86
+ docker compose up -d
87
+ \`\`\`
88
+
89
+ Or use the provided start script:
90
+
91
+ \`\`\`bash
92
+ chmod +x scripts/*.sh
93
+ ./scripts/start.sh
94
+ \`\`\`
95
+
96
+ ### 4. Check Status
97
+
98
+ \`\`\`bash
99
+ docker compose ps
100
+ \`\`\`
101
+
102
+ ### 5. View Logs
103
+
104
+ \`\`\`bash
105
+ docker compose logs -f openclaw-gateway
106
+ \`\`\`
107
+
108
+ All services should show a healthy status within 1–2 minutes.
109
+ `);
110
+
111
+ // ── Docker Compose Profiles ──────────────────────────────────────────────
112
+
113
+ sections.push(`## Using Docker Compose Profiles
114
+
115
+ Your stack may include profile-based compose files for optional service groups. Only the base services start by default — use profiles to activate additional groups:
116
+
117
+ \`\`\`bash
118
+ # Start base services only
119
+ docker compose up -d
120
+
121
+ # Start base + AI services (Ollama, Open WebUI, etc.)
122
+ docker compose -f docker-compose.yml -f docker-compose.ai.yml --profile ai up -d
123
+
124
+ # Start base + monitoring (Grafana, Prometheus, Uptime Kuma)
125
+ docker compose -f docker-compose.yml -f docker-compose.monitoring.yml --profile monitoring up -d
126
+
127
+ # Start base + AI + dev tools
128
+ docker compose -f docker-compose.yml -f docker-compose.ai.yml -f docker-compose.tools.yml --profile ai --profile tools up -d
129
+ \`\`\`
130
+
131
+ Available profile files (if generated):
132
+ | File | Profile | Services |
133
+ |------|---------|----------|
134
+ | \`docker-compose.ai.yml\` | \`ai\` | AI models, chat UIs, LLM platforms |
135
+ | \`docker-compose.media.yml\` | \`media\` | FFmpeg, Remotion, Motion Canvas |
136
+ | \`docker-compose.monitoring.yml\` | \`monitoring\` | Grafana, Prometheus, Uptime Kuma, analytics |
137
+ | \`docker-compose.tools.yml\` | \`tools\` | Gitea, code-server, Portainer, coding agents |
138
+ | \`docker-compose.social.yml\` | \`social\` | Postiz, Mixpost |
139
+ | \`docker-compose.knowledge.yml\` | \`knowledge\` | Outline, Paperless-ngx, NocoDB |
140
+ | \`docker-compose.communication.yml\` | \`communication\` | Matrix, Rocket.Chat, Mattermost |
141
+ `);
142
+
143
+ // ── Service URLs & Ports ─────────────────────────────────────────────────
144
+
145
+ const portRows = resolved.services
146
+ .filter(({ definition }) => definition.ports.length > 0)
147
+ .map(({ definition }) => {
148
+ const ports = definition.ports
149
+ .map((p) => `\`${p.host}\` → \`${p.container}\` (${p.description})`)
150
+ .join(", ");
151
+ return `| ${definition.icon} ${definition.name} | ${ports} |`;
152
+ })
153
+ .join("\n");
154
+
155
+ if (portRows) {
156
+ sections.push(`## Ports
157
+
158
+ | Service | Ports |
159
+ |---------|-------|
160
+ ${portRows}
161
+ `);
162
+ }
163
+
164
+ // ── Skill Packs ─────────────────────────────────────────────────────────
165
+
166
+ const allSkills = resolved.services.flatMap(({ definition }) =>
167
+ definition.skills.map((s) => ({
168
+ skillId: s.skillId,
169
+ serviceName: definition.name,
170
+ serviceIcon: definition.icon,
171
+ })),
172
+ );
173
+
174
+ if (allSkills.length > 0) {
175
+ const skillRows = allSkills
176
+ .map((s) => `| \`${s.skillId}\` | ${s.serviceIcon} ${s.serviceName} |`)
177
+ .join("\n");
178
+
179
+ sections.push(`## Skills
180
+
181
+ The following OpenClaw skills are automatically installed:
182
+
183
+ | Skill | Service |
184
+ |-------|---------|
185
+ ${skillRows}
186
+
187
+ Skills are located in \`openclaw/workspace/skills/\`. Each skill provides a \`SKILL.md\` with usage instructions.
188
+ `);
189
+ }
190
+
191
+ // ── Proxy Configuration ─────────────────────────────────────────────────
192
+
193
+ if (proxy && proxy !== "none") {
194
+ const proxyName = proxy === "caddy" ? "Caddy" : "Traefik";
195
+ sections.push(`## Reverse Proxy
196
+
197
+ This stack uses **${proxyName}** as a reverse proxy.${domain ? ` All services are available under \`${domain}\`.` : ""}
198
+
199
+ ${proxy === "caddy" ? "The Caddyfile is located at `config/Caddyfile`." : "Traefik configuration is handled via Docker labels."}
200
+ `);
201
+ }
202
+
203
+ // ── Scripts ──────────────────────────────────────────────────────────────
204
+
205
+ sections.push(`## Management Scripts
206
+
207
+ \`\`\`bash
208
+ chmod +x scripts/*.sh # Make scripts executable (first time only)
209
+ \`\`\`
210
+
211
+ | Script | Description |
212
+ |--------|-------------|
213
+ | \`./scripts/start.sh\` | Validates .env, auto-generates gateway token, creates dirs, starts all services with health checks |
214
+ | \`./scripts/stop.sh\` | Gracefully stops all services |
215
+ | \`./scripts/update.sh\` | Pulls latest Docker images and restarts services |
216
+ | \`./scripts/backup.sh\` | Backs up all named Docker volumes to timestamped archives |
217
+ | \`./scripts/status.sh\` | Shows current service status, resource usage, and disk |
218
+ `);
219
+
220
+ // ── Data & Volumes ──────────────────────────────────────────────────────
221
+
222
+ const volumeRows = resolved.services.flatMap(({ definition }) =>
223
+ definition.volumes.map((v) => ({
224
+ name: v.name,
225
+ path: v.containerPath,
226
+ description: v.description,
227
+ serviceName: definition.name,
228
+ })),
229
+ );
230
+
231
+ if (volumeRows.length > 0) {
232
+ const rows = volumeRows
233
+ .map((v) => `| \`${v.name}\` | ${v.serviceName} | ${v.description} |`)
234
+ .join("\n");
235
+
236
+ sections.push(`## Volumes
237
+
238
+ | Volume | Service | Description |
239
+ |--------|---------|-------------|
240
+ ${rows}
241
+
242
+ > **Tip:** Use \`scripts/backup.sh\` to back up all volumes before updates.
243
+ `);
244
+ }
245
+
246
+ // ── Estimated Resources ─────────────────────────────────────────────────
247
+
248
+ sections.push(`## Resource Estimates
249
+
250
+ - **Services:** ${resolved.services.length}
251
+ - **Estimated RAM:** ~${(resolved.estimatedMemoryMB / 1024).toFixed(1)}GB
252
+ - **Recommended minimum:** ${Math.ceil(resolved.estimatedMemoryMB / 1024) + 2}GB RAM
253
+ `);
254
+
255
+ // ── Warnings ─────────────────────────────────────────────────────────────
256
+
257
+ if (resolved.warnings.length > 0) {
258
+ const warningList = resolved.warnings.map((w) => `- ⚠️ ${w.message}`).join("\n");
259
+
260
+ sections.push(`## Warnings
261
+
262
+ ${warningList}
263
+ `);
264
+ }
265
+
266
+ // ── Footer ──────────────────────────────────────────────────────────────
267
+
268
+ sections.push(`---
269
+
270
+ Generated by [OpenClaw](https://openclaw.dev) • ${new Date().toISOString().split("T")[0]}
271
+ `);
272
+
273
+ return sections.join("\n");
274
+ }