@better-openclaw/core 1.0.5 → 1.0.6

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 (474) hide show
  1. package/.github/workflows/publish-core.yml +32 -34
  2. package/dist/anything-llm-DIIPhz6K.mjs +44 -0
  3. package/dist/anything-llm-DIIPhz6K.mjs.map +1 -0
  4. package/dist/appflowy-DdoE-dKg.mjs +45 -0
  5. package/dist/appflowy-DdoE-dKg.mjs.map +1 -0
  6. package/dist/bare-metal-install-DpYZDoGq.mjs +224 -0
  7. package/dist/bare-metal-install-DpYZDoGq.mjs.map +1 -0
  8. package/dist/bare-metal-partition-CYlOxf9B.mjs +48 -0
  9. package/dist/bare-metal-partition-CYlOxf9B.mjs.map +1 -0
  10. package/dist/bare-metal-partition.d.mts +27 -0
  11. package/dist/bare-metal-partition.d.mts.map +1 -0
  12. package/dist/bare-metal-partition.mjs +3 -0
  13. package/dist/bare-metal-partition.test.d.mts +1 -0
  14. package/dist/bare-metal-partition.test.mjs +58 -0
  15. package/dist/bare-metal-partition.test.mjs.map +1 -0
  16. package/dist/beszel-DHAG1zl0.mjs +45 -0
  17. package/dist/beszel-DHAG1zl0.mjs.map +1 -0
  18. package/dist/browserless-gUuvGmMD.mjs +85 -0
  19. package/dist/browserless-gUuvGmMD.mjs.map +1 -0
  20. package/dist/caddy-BJDrqnmw.mjs +77 -0
  21. package/dist/caddy-BJDrqnmw.mjs.map +1 -0
  22. package/dist/caddy-_NIdWKrf.mjs +52 -0
  23. package/dist/caddy-_NIdWKrf.mjs.map +1 -0
  24. package/dist/chromadb-g4rIsfAl.mjs +63 -0
  25. package/dist/chromadb-g4rIsfAl.mjs.map +1 -0
  26. package/dist/claude-code-DPRA1fy_.mjs +52 -0
  27. package/dist/claude-code-DPRA1fy_.mjs.map +1 -0
  28. package/dist/code-server-BdZZxxm5.mjs +66 -0
  29. package/dist/code-server-BdZZxxm5.mjs.map +1 -0
  30. package/dist/codex-DFVzfrfX.mjs +45 -0
  31. package/dist/codex-DFVzfrfX.mjs.map +1 -0
  32. package/dist/composer-CSM5YycB.mjs +287 -0
  33. package/dist/composer-CSM5YycB.mjs.map +1 -0
  34. package/dist/composer.d.mts +22 -0
  35. package/dist/composer.d.mts.map +1 -0
  36. package/dist/composer.mjs +3 -0
  37. package/dist/composer.snapshot.test.d.mts +1 -0
  38. package/dist/composer.snapshot.test.mjs +92 -0
  39. package/dist/composer.snapshot.test.mjs.map +1 -0
  40. package/dist/composer.test.d.mts +1 -0
  41. package/dist/composer.test.mjs +166 -0
  42. package/dist/composer.test.mjs.map +1 -0
  43. package/dist/coolify-Z5_zDgM3.mjs +49 -0
  44. package/dist/coolify-Z5_zDgM3.mjs.map +1 -0
  45. package/dist/definitions-BXpb1kzs.mjs +138 -0
  46. package/dist/definitions-BXpb1kzs.mjs.map +1 -0
  47. package/dist/dify-jDc9U6Ku.mjs +81 -0
  48. package/dist/dify-jDc9U6Ku.mjs.map +1 -0
  49. package/dist/docsgpt-BXM1c2JC.mjs +45 -0
  50. package/dist/docsgpt-BXM1c2JC.mjs.map +1 -0
  51. package/dist/dokploy-Ci8_fb0_.mjs +49 -0
  52. package/dist/dokploy-Ci8_fb0_.mjs.map +1 -0
  53. package/dist/dozzle-fAt2sLRL.mjs +41 -0
  54. package/dist/dozzle-fAt2sLRL.mjs.map +1 -0
  55. package/dist/env-D2h46lHT.mjs +250 -0
  56. package/dist/env-D2h46lHT.mjs.map +1 -0
  57. package/dist/ffmpeg-BCtnA8m_.mjs +66 -0
  58. package/dist/ffmpeg-BCtnA8m_.mjs.map +1 -0
  59. package/dist/flowise-CJTTBa7J.mjs +45 -0
  60. package/dist/flowise-CJTTBa7J.mjs.map +1 -0
  61. package/dist/gemini-cli-Bfwv6hYe.mjs +46 -0
  62. package/dist/gemini-cli-Bfwv6hYe.mjs.map +1 -0
  63. package/dist/generate.d.mts +13 -0
  64. package/dist/generate.d.mts.map +1 -0
  65. package/dist/generate.mjs +169 -0
  66. package/dist/generate.mjs.map +1 -0
  67. package/dist/generate.test.d.mts +1 -0
  68. package/dist/generate.test.mjs +283 -0
  69. package/dist/generate.test.mjs.map +1 -0
  70. package/dist/generators/bare-metal-install.d.mts +19 -0
  71. package/dist/generators/bare-metal-install.d.mts.map +1 -0
  72. package/dist/generators/bare-metal-install.mjs +3 -0
  73. package/dist/generators/bare-metal-install.test.d.mts +1 -0
  74. package/dist/generators/bare-metal-install.test.mjs +48 -0
  75. package/dist/generators/bare-metal-install.test.mjs.map +1 -0
  76. package/dist/generators/caddy.d.mts +19 -0
  77. package/dist/generators/caddy.d.mts.map +1 -0
  78. package/dist/generators/caddy.mjs +3 -0
  79. package/dist/generators/env.d.mts +47 -0
  80. package/dist/generators/env.d.mts.map +1 -0
  81. package/dist/generators/env.mjs +3 -0
  82. package/dist/generators/grafana.d.mts +22 -0
  83. package/dist/generators/grafana.d.mts.map +1 -0
  84. package/dist/generators/grafana.mjs +3 -0
  85. package/dist/generators/n8n-workflows.d.mts +13 -0
  86. package/dist/generators/n8n-workflows.d.mts.map +1 -0
  87. package/dist/generators/n8n-workflows.mjs +3 -0
  88. package/dist/generators/native-services.d.mts +18 -0
  89. package/dist/generators/native-services.d.mts.map +1 -0
  90. package/dist/generators/native-services.mjs +3 -0
  91. package/dist/generators/postgres-init.d.mts +31 -0
  92. package/dist/generators/postgres-init.d.mts.map +1 -0
  93. package/dist/generators/postgres-init.mjs +3 -0
  94. package/dist/generators/prometheus.d.mts +16 -0
  95. package/dist/generators/prometheus.d.mts.map +1 -0
  96. package/dist/generators/prometheus.mjs +3 -0
  97. package/dist/generators/readme.d.mts +26 -0
  98. package/dist/generators/readme.d.mts.map +1 -0
  99. package/dist/generators/readme.mjs +3 -0
  100. package/dist/generators/scripts.d.mts +10 -0
  101. package/dist/generators/scripts.d.mts.map +1 -0
  102. package/dist/generators/scripts.mjs +3 -0
  103. package/dist/generators/skills.d.mts +16 -0
  104. package/dist/generators/skills.d.mts.map +1 -0
  105. package/dist/generators/skills.mjs +3 -0
  106. package/dist/gitea-BGkqa-sD.mjs +49 -0
  107. package/dist/gitea-BGkqa-sD.mjs.map +1 -0
  108. package/dist/gotify-D7p8oNM3.mjs +62 -0
  109. package/dist/gotify-D7p8oNM3.mjs.map +1 -0
  110. package/dist/grafana-BlnWc6js.mjs +63 -0
  111. package/dist/grafana-BlnWc6js.mjs.map +1 -0
  112. package/dist/grafana-D3kIm8RX.mjs +293 -0
  113. package/dist/grafana-D3kIm8RX.mjs.map +1 -0
  114. package/dist/index.d.mts +21 -0
  115. package/dist/index.mjs +22 -0
  116. package/dist/kimi-BFu1v1sU.mjs +46 -0
  117. package/dist/kimi-BFu1v1sU.mjs.map +1 -0
  118. package/dist/lasuite-meet-agents-nlPhMEaN.mjs +36 -0
  119. package/dist/lasuite-meet-agents-nlPhMEaN.mjs.map +1 -0
  120. package/dist/lasuite-meet-backend-9H7rZ8Pc.mjs +134 -0
  121. package/dist/lasuite-meet-backend-9H7rZ8Pc.mjs.map +1 -0
  122. package/dist/lasuite-meet-frontend-B4xNbnBa.mjs +48 -0
  123. package/dist/lasuite-meet-frontend-B4xNbnBa.mjs.map +1 -0
  124. package/dist/librechat-CoPIHXKK.mjs +50 -0
  125. package/dist/librechat-CoPIHXKK.mjs.map +1 -0
  126. package/dist/lightpanda-QchAPgNX.mjs +59 -0
  127. package/dist/lightpanda-QchAPgNX.mjs.map +1 -0
  128. package/dist/litellm-Dgl6iTry.mjs +47 -0
  129. package/dist/litellm-Dgl6iTry.mjs.map +1 -0
  130. package/dist/livekit-C13SxlVB.mjs +56 -0
  131. package/dist/livekit-C13SxlVB.mjs.map +1 -0
  132. package/dist/magic-string.es-Dew0Rnsa.mjs +1014 -0
  133. package/dist/magic-string.es-Dew0Rnsa.mjs.map +1 -0
  134. package/dist/matomo-CiOoggYl.mjs +80 -0
  135. package/dist/matomo-CiOoggYl.mjs.map +1 -0
  136. package/dist/matrix-synapse-CP20A7NN.mjs +88 -0
  137. package/dist/matrix-synapse-CP20A7NN.mjs.map +1 -0
  138. package/dist/mattermost-CeFVuhIr.mjs +61 -0
  139. package/dist/mattermost-CeFVuhIr.mjs.map +1 -0
  140. package/dist/meilisearch-CLiQiTdN.mjs +78 -0
  141. package/dist/meilisearch-CLiQiTdN.mjs.map +1 -0
  142. package/dist/minio-_QuguAeo.mjs +102 -0
  143. package/dist/minio-_QuguAeo.mjs.map +1 -0
  144. package/dist/mixpost-eSFPM9XK.mjs +87 -0
  145. package/dist/mixpost-eSFPM9XK.mjs.map +1 -0
  146. package/dist/motion-canvas-Bk1ruvuX.mjs +52 -0
  147. package/dist/motion-canvas-Bk1ruvuX.mjs.map +1 -0
  148. package/dist/n8n-W5qeU34C.mjs +154 -0
  149. package/dist/n8n-W5qeU34C.mjs.map +1 -0
  150. package/dist/n8n-workflows-BPmKVx8z.mjs +75 -0
  151. package/dist/n8n-workflows-BPmKVx8z.mjs.map +1 -0
  152. package/dist/native-services-CwOCM-Xz.mjs +78 -0
  153. package/dist/native-services-CwOCM-Xz.mjs.map +1 -0
  154. package/dist/nocodb-DQNbSYh_.mjs +45 -0
  155. package/dist/nocodb-DQNbSYh_.mjs.map +1 -0
  156. package/dist/ntfy-B8_cZAx2.mjs +63 -0
  157. package/dist/ntfy-B8_cZAx2.mjs.map +1 -0
  158. package/dist/ollama-BiKAypcO.mjs +66 -0
  159. package/dist/ollama-BiKAypcO.mjs.map +1 -0
  160. package/dist/open-webui-DZOG4_xL.mjs +50 -0
  161. package/dist/open-webui-DZOG4_xL.mjs.map +1 -0
  162. package/dist/opencode-Dvfh5KvA.mjs +50 -0
  163. package/dist/opencode-Dvfh5KvA.mjs.map +1 -0
  164. package/dist/openpanel-BuWHhDze.mjs +46 -0
  165. package/dist/openpanel-BuWHhDze.mjs.map +1 -0
  166. package/dist/outline-Dy-YzdYS.mjs +74 -0
  167. package/dist/outline-Dy-YzdYS.mjs.map +1 -0
  168. package/dist/paperless-ngx-DVtWWpKg.mjs +93 -0
  169. package/dist/paperless-ngx-DVtWWpKg.mjs.map +1 -0
  170. package/dist/playwright-server-Boiz8--G.mjs +42 -0
  171. package/dist/playwright-server-Boiz8--G.mjs.map +1 -0
  172. package/dist/portainer-D9MU96UI.mjs +49 -0
  173. package/dist/portainer-D9MU96UI.mjs.map +1 -0
  174. package/dist/postgres-init-BiM-xZtq.mjs +151 -0
  175. package/dist/postgres-init-BiM-xZtq.mjs.map +1 -0
  176. package/dist/postgresql-s65Z9RqR.mjs +84 -0
  177. package/dist/postgresql-s65Z9RqR.mjs.map +1 -0
  178. package/dist/postiz-U6EK23EY.mjs +83 -0
  179. package/dist/postiz-U6EK23EY.mjs.map +1 -0
  180. package/dist/presets/registry.d.mts +10 -0
  181. package/dist/presets/registry.d.mts.map +1 -0
  182. package/dist/presets/registry.mjs +159 -0
  183. package/dist/presets/registry.mjs.map +1 -0
  184. package/dist/presets/registry.test.d.mts +1 -0
  185. package/dist/presets/registry.test.mjs +34 -0
  186. package/dist/presets/registry.test.mjs.map +1 -0
  187. package/dist/prometheus-WOlk-a1G.mjs +107 -0
  188. package/dist/prometheus-WOlk-a1G.mjs.map +1 -0
  189. package/dist/prometheus-x901F67p.mjs +52 -0
  190. package/dist/prometheus-x901F67p.mjs.map +1 -0
  191. package/dist/qdrant-DZW9uW4e.mjs +77 -0
  192. package/dist/qdrant-DZW9uW4e.mjs.map +1 -0
  193. package/dist/readme-C7M3QE9a.mjs +199 -0
  194. package/dist/readme-C7M3QE9a.mjs.map +1 -0
  195. package/dist/redis-DPMOf237.mjs +91 -0
  196. package/dist/redis-DPMOf237.mjs.map +1 -0
  197. package/dist/registry-CqLarEm5.mjs +30 -0
  198. package/dist/registry-CqLarEm5.mjs.map +1 -0
  199. package/dist/registry-DLX9Q4VQ.mjs +215 -0
  200. package/dist/registry-DLX9Q4VQ.mjs.map +1 -0
  201. package/dist/remotion-COkr0wpr.mjs +55 -0
  202. package/dist/remotion-COkr0wpr.mjs.map +1 -0
  203. package/dist/resolver-Dl5clk-d.mjs +194 -0
  204. package/dist/resolver-Dl5clk-d.mjs.map +1 -0
  205. package/dist/resolver.d.mts +23 -0
  206. package/dist/resolver.d.mts.map +1 -0
  207. package/dist/resolver.mjs +3 -0
  208. package/dist/resolver.test.d.mts +1 -0
  209. package/dist/resolver.test.mjs +237 -0
  210. package/dist/resolver.test.mjs.map +1 -0
  211. package/dist/rocketchat-BebQT1MZ.mjs +57 -0
  212. package/dist/rocketchat-BebQT1MZ.mjs.map +1 -0
  213. package/dist/schema-PSUY6yJU.d.mts +700 -0
  214. package/dist/schema-PSUY6yJU.d.mts.map +1 -0
  215. package/dist/schema.d.mts +2 -0
  216. package/dist/schema.mjs +258 -0
  217. package/dist/schema.mjs.map +1 -0
  218. package/dist/schema.test.d.mts +1 -0
  219. package/dist/schema.test.mjs +264 -0
  220. package/dist/schema.test.mjs.map +1 -0
  221. package/dist/scripts-DsljWbP4.mjs +351 -0
  222. package/dist/scripts-DsljWbP4.mjs.map +1 -0
  223. package/dist/searxng-tJpBkchC.mjs +65 -0
  224. package/dist/searxng-tJpBkchC.mjs.map +1 -0
  225. package/dist/services/definitions/anything-llm.d.mts +8 -0
  226. package/dist/services/definitions/anything-llm.d.mts.map +1 -0
  227. package/dist/services/definitions/anything-llm.mjs +3 -0
  228. package/dist/services/definitions/appflowy.d.mts +8 -0
  229. package/dist/services/definitions/appflowy.d.mts.map +1 -0
  230. package/dist/services/definitions/appflowy.mjs +3 -0
  231. package/dist/services/definitions/beszel.d.mts +8 -0
  232. package/dist/services/definitions/beszel.d.mts.map +1 -0
  233. package/dist/services/definitions/beszel.mjs +3 -0
  234. package/dist/services/definitions/browserless.d.mts +8 -0
  235. package/dist/services/definitions/browserless.d.mts.map +1 -0
  236. package/dist/services/definitions/browserless.mjs +3 -0
  237. package/dist/services/definitions/caddy.d.mts +8 -0
  238. package/dist/services/definitions/caddy.d.mts.map +1 -0
  239. package/dist/services/definitions/caddy.mjs +3 -0
  240. package/dist/services/definitions/chromadb.d.mts +8 -0
  241. package/dist/services/definitions/chromadb.d.mts.map +1 -0
  242. package/dist/services/definitions/chromadb.mjs +3 -0
  243. package/dist/services/definitions/claude-code.d.mts +8 -0
  244. package/dist/services/definitions/claude-code.d.mts.map +1 -0
  245. package/dist/services/definitions/claude-code.mjs +3 -0
  246. package/dist/services/definitions/code-server.d.mts +8 -0
  247. package/dist/services/definitions/code-server.d.mts.map +1 -0
  248. package/dist/services/definitions/code-server.mjs +3 -0
  249. package/dist/services/definitions/codex.d.mts +8 -0
  250. package/dist/services/definitions/codex.d.mts.map +1 -0
  251. package/dist/services/definitions/codex.mjs +3 -0
  252. package/dist/services/definitions/coolify.d.mts +8 -0
  253. package/dist/services/definitions/coolify.d.mts.map +1 -0
  254. package/dist/services/definitions/coolify.mjs +3 -0
  255. package/dist/services/definitions/dify.d.mts +8 -0
  256. package/dist/services/definitions/dify.d.mts.map +1 -0
  257. package/dist/services/definitions/dify.mjs +3 -0
  258. package/dist/services/definitions/docsgpt.d.mts +8 -0
  259. package/dist/services/definitions/docsgpt.d.mts.map +1 -0
  260. package/dist/services/definitions/docsgpt.mjs +3 -0
  261. package/dist/services/definitions/dokploy.d.mts +8 -0
  262. package/dist/services/definitions/dokploy.d.mts.map +1 -0
  263. package/dist/services/definitions/dokploy.mjs +3 -0
  264. package/dist/services/definitions/dozzle.d.mts +8 -0
  265. package/dist/services/definitions/dozzle.d.mts.map +1 -0
  266. package/dist/services/definitions/dozzle.mjs +3 -0
  267. package/dist/services/definitions/ffmpeg.d.mts +8 -0
  268. package/dist/services/definitions/ffmpeg.d.mts.map +1 -0
  269. package/dist/services/definitions/ffmpeg.mjs +3 -0
  270. package/dist/services/definitions/flowise.d.mts +8 -0
  271. package/dist/services/definitions/flowise.d.mts.map +1 -0
  272. package/dist/services/definitions/flowise.mjs +3 -0
  273. package/dist/services/definitions/gemini-cli.d.mts +8 -0
  274. package/dist/services/definitions/gemini-cli.d.mts.map +1 -0
  275. package/dist/services/definitions/gemini-cli.mjs +3 -0
  276. package/dist/services/definitions/gitea.d.mts +8 -0
  277. package/dist/services/definitions/gitea.d.mts.map +1 -0
  278. package/dist/services/definitions/gitea.mjs +3 -0
  279. package/dist/services/definitions/gotify.d.mts +8 -0
  280. package/dist/services/definitions/gotify.d.mts.map +1 -0
  281. package/dist/services/definitions/gotify.mjs +3 -0
  282. package/dist/services/definitions/grafana.d.mts +8 -0
  283. package/dist/services/definitions/grafana.d.mts.map +1 -0
  284. package/dist/services/definitions/grafana.mjs +3 -0
  285. package/dist/services/definitions/index.d.mts +73 -0
  286. package/dist/services/definitions/index.d.mts.map +1 -0
  287. package/dist/services/definitions/index.mjs +68 -0
  288. package/dist/services/definitions/kimi.d.mts +8 -0
  289. package/dist/services/definitions/kimi.d.mts.map +1 -0
  290. package/dist/services/definitions/kimi.mjs +3 -0
  291. package/dist/services/definitions/lasuite-meet-agents.d.mts +8 -0
  292. package/dist/services/definitions/lasuite-meet-agents.d.mts.map +1 -0
  293. package/dist/services/definitions/lasuite-meet-agents.mjs +3 -0
  294. package/dist/services/definitions/lasuite-meet-backend.d.mts +8 -0
  295. package/dist/services/definitions/lasuite-meet-backend.d.mts.map +1 -0
  296. package/dist/services/definitions/lasuite-meet-backend.mjs +3 -0
  297. package/dist/services/definitions/lasuite-meet-frontend.d.mts +8 -0
  298. package/dist/services/definitions/lasuite-meet-frontend.d.mts.map +1 -0
  299. package/dist/services/definitions/lasuite-meet-frontend.mjs +3 -0
  300. package/dist/services/definitions/librechat.d.mts +8 -0
  301. package/dist/services/definitions/librechat.d.mts.map +1 -0
  302. package/dist/services/definitions/librechat.mjs +3 -0
  303. package/dist/services/definitions/lightpanda.d.mts +8 -0
  304. package/dist/services/definitions/lightpanda.d.mts.map +1 -0
  305. package/dist/services/definitions/lightpanda.mjs +3 -0
  306. package/dist/services/definitions/litellm.d.mts +8 -0
  307. package/dist/services/definitions/litellm.d.mts.map +1 -0
  308. package/dist/services/definitions/litellm.mjs +3 -0
  309. package/dist/services/definitions/livekit.d.mts +8 -0
  310. package/dist/services/definitions/livekit.d.mts.map +1 -0
  311. package/dist/services/definitions/livekit.mjs +3 -0
  312. package/dist/services/definitions/matomo.d.mts +8 -0
  313. package/dist/services/definitions/matomo.d.mts.map +1 -0
  314. package/dist/services/definitions/matomo.mjs +3 -0
  315. package/dist/services/definitions/matrix-synapse.d.mts +8 -0
  316. package/dist/services/definitions/matrix-synapse.d.mts.map +1 -0
  317. package/dist/services/definitions/matrix-synapse.mjs +3 -0
  318. package/dist/services/definitions/mattermost.d.mts +8 -0
  319. package/dist/services/definitions/mattermost.d.mts.map +1 -0
  320. package/dist/services/definitions/mattermost.mjs +3 -0
  321. package/dist/services/definitions/meilisearch.d.mts +8 -0
  322. package/dist/services/definitions/meilisearch.d.mts.map +1 -0
  323. package/dist/services/definitions/meilisearch.mjs +3 -0
  324. package/dist/services/definitions/minio.d.mts +8 -0
  325. package/dist/services/definitions/minio.d.mts.map +1 -0
  326. package/dist/services/definitions/minio.mjs +3 -0
  327. package/dist/services/definitions/mixpost.d.mts +8 -0
  328. package/dist/services/definitions/mixpost.d.mts.map +1 -0
  329. package/dist/services/definitions/mixpost.mjs +3 -0
  330. package/dist/services/definitions/motion-canvas.d.mts +8 -0
  331. package/dist/services/definitions/motion-canvas.d.mts.map +1 -0
  332. package/dist/services/definitions/motion-canvas.mjs +3 -0
  333. package/dist/services/definitions/n8n.d.mts +8 -0
  334. package/dist/services/definitions/n8n.d.mts.map +1 -0
  335. package/dist/services/definitions/n8n.mjs +3 -0
  336. package/dist/services/definitions/nocodb.d.mts +8 -0
  337. package/dist/services/definitions/nocodb.d.mts.map +1 -0
  338. package/dist/services/definitions/nocodb.mjs +3 -0
  339. package/dist/services/definitions/ntfy.d.mts +8 -0
  340. package/dist/services/definitions/ntfy.d.mts.map +1 -0
  341. package/dist/services/definitions/ntfy.mjs +3 -0
  342. package/dist/services/definitions/ollama.d.mts +8 -0
  343. package/dist/services/definitions/ollama.d.mts.map +1 -0
  344. package/dist/services/definitions/ollama.mjs +3 -0
  345. package/dist/services/definitions/open-webui.d.mts +8 -0
  346. package/dist/services/definitions/open-webui.d.mts.map +1 -0
  347. package/dist/services/definitions/open-webui.mjs +3 -0
  348. package/dist/services/definitions/opencode.d.mts +8 -0
  349. package/dist/services/definitions/opencode.d.mts.map +1 -0
  350. package/dist/services/definitions/opencode.mjs +3 -0
  351. package/dist/services/definitions/openpanel.d.mts +8 -0
  352. package/dist/services/definitions/openpanel.d.mts.map +1 -0
  353. package/dist/services/definitions/openpanel.mjs +3 -0
  354. package/dist/services/definitions/outline.d.mts +8 -0
  355. package/dist/services/definitions/outline.d.mts.map +1 -0
  356. package/dist/services/definitions/outline.mjs +3 -0
  357. package/dist/services/definitions/paperless-ngx.d.mts +8 -0
  358. package/dist/services/definitions/paperless-ngx.d.mts.map +1 -0
  359. package/dist/services/definitions/paperless-ngx.mjs +3 -0
  360. package/dist/services/definitions/playwright-server.d.mts +8 -0
  361. package/dist/services/definitions/playwright-server.d.mts.map +1 -0
  362. package/dist/services/definitions/playwright-server.mjs +3 -0
  363. package/dist/services/definitions/portainer.d.mts +8 -0
  364. package/dist/services/definitions/portainer.d.mts.map +1 -0
  365. package/dist/services/definitions/portainer.mjs +3 -0
  366. package/dist/services/definitions/postgresql.d.mts +8 -0
  367. package/dist/services/definitions/postgresql.d.mts.map +1 -0
  368. package/dist/services/definitions/postgresql.mjs +3 -0
  369. package/dist/services/definitions/postiz.d.mts +8 -0
  370. package/dist/services/definitions/postiz.d.mts.map +1 -0
  371. package/dist/services/definitions/postiz.mjs +3 -0
  372. package/dist/services/definitions/prometheus.d.mts +8 -0
  373. package/dist/services/definitions/prometheus.d.mts.map +1 -0
  374. package/dist/services/definitions/prometheus.mjs +3 -0
  375. package/dist/services/definitions/qdrant.d.mts +8 -0
  376. package/dist/services/definitions/qdrant.d.mts.map +1 -0
  377. package/dist/services/definitions/qdrant.mjs +3 -0
  378. package/dist/services/definitions/redis.d.mts +8 -0
  379. package/dist/services/definitions/redis.d.mts.map +1 -0
  380. package/dist/services/definitions/redis.mjs +3 -0
  381. package/dist/services/definitions/remotion.d.mts +8 -0
  382. package/dist/services/definitions/remotion.d.mts.map +1 -0
  383. package/dist/services/definitions/remotion.mjs +3 -0
  384. package/dist/services/definitions/rocketchat.d.mts +8 -0
  385. package/dist/services/definitions/rocketchat.d.mts.map +1 -0
  386. package/dist/services/definitions/rocketchat.mjs +3 -0
  387. package/dist/services/definitions/searxng.d.mts +8 -0
  388. package/dist/services/definitions/searxng.d.mts.map +1 -0
  389. package/dist/services/definitions/searxng.mjs +3 -0
  390. package/dist/services/definitions/stable-diffusion.d.mts +8 -0
  391. package/dist/services/definitions/stable-diffusion.d.mts.map +1 -0
  392. package/dist/services/definitions/stable-diffusion.mjs +3 -0
  393. package/dist/services/definitions/steel-browser.d.mts +8 -0
  394. package/dist/services/definitions/steel-browser.d.mts.map +1 -0
  395. package/dist/services/definitions/steel-browser.mjs +3 -0
  396. package/dist/services/definitions/tailscale.d.mts +8 -0
  397. package/dist/services/definitions/tailscale.d.mts.map +1 -0
  398. package/dist/services/definitions/tailscale.mjs +3 -0
  399. package/dist/services/definitions/temporal.d.mts +8 -0
  400. package/dist/services/definitions/temporal.d.mts.map +1 -0
  401. package/dist/services/definitions/temporal.mjs +3 -0
  402. package/dist/services/definitions/traefik.d.mts +8 -0
  403. package/dist/services/definitions/traefik.d.mts.map +1 -0
  404. package/dist/services/definitions/traefik.mjs +3 -0
  405. package/dist/services/definitions/umami.d.mts +8 -0
  406. package/dist/services/definitions/umami.d.mts.map +1 -0
  407. package/dist/services/definitions/umami.mjs +3 -0
  408. package/dist/services/definitions/uptime-kuma.d.mts +8 -0
  409. package/dist/services/definitions/uptime-kuma.d.mts.map +1 -0
  410. package/dist/services/definitions/uptime-kuma.mjs +3 -0
  411. package/dist/services/definitions/valkey.d.mts +8 -0
  412. package/dist/services/definitions/valkey.d.mts.map +1 -0
  413. package/dist/services/definitions/valkey.mjs +3 -0
  414. package/dist/services/definitions/watchtower.d.mts +8 -0
  415. package/dist/services/definitions/watchtower.d.mts.map +1 -0
  416. package/dist/services/definitions/watchtower.mjs +3 -0
  417. package/dist/services/definitions/weaviate.d.mts +8 -0
  418. package/dist/services/definitions/weaviate.d.mts.map +1 -0
  419. package/dist/services/definitions/weaviate.mjs +3 -0
  420. package/dist/services/definitions/whisper.d.mts +8 -0
  421. package/dist/services/definitions/whisper.d.mts.map +1 -0
  422. package/dist/services/definitions/whisper.mjs +3 -0
  423. package/dist/services/registry.d.mts +17 -0
  424. package/dist/services/registry.d.mts.map +1 -0
  425. package/dist/services/registry.mjs +3 -0
  426. package/dist/services/registry.test.d.mts +1 -0
  427. package/dist/services/registry.test.mjs +64 -0
  428. package/dist/services/registry.test.mjs.map +1 -0
  429. package/dist/skills/registry.d.mts +12 -0
  430. package/dist/skills/registry.d.mts.map +1 -0
  431. package/dist/skills/registry.mjs +3 -0
  432. package/dist/skills-DWG72Y3X.mjs +587 -0
  433. package/dist/skills-DWG72Y3X.mjs.map +1 -0
  434. package/dist/stable-diffusion-BulAzkyT.mjs +48 -0
  435. package/dist/stable-diffusion-BulAzkyT.mjs.map +1 -0
  436. package/dist/steel-browser-Cc0bYBjM.mjs +77 -0
  437. package/dist/steel-browser-Cc0bYBjM.mjs.map +1 -0
  438. package/dist/tailscale-CrM4EZlF.mjs +69 -0
  439. package/dist/tailscale-CrM4EZlF.mjs.map +1 -0
  440. package/dist/temporal-49gA0msh.mjs +100 -0
  441. package/dist/temporal-49gA0msh.mjs.map +1 -0
  442. package/dist/traefik-Da-c1f55.mjs +58 -0
  443. package/dist/traefik-Da-c1f55.mjs.map +1 -0
  444. package/dist/types.d.mts +64 -0
  445. package/dist/types.d.mts.map +1 -0
  446. package/dist/types.mjs +92 -0
  447. package/dist/types.mjs.map +1 -0
  448. package/dist/umami-csBSsHqO.mjs +46 -0
  449. package/dist/umami-csBSsHqO.mjs.map +1 -0
  450. package/dist/uptime-kuma-D0NvVuXD.mjs +51 -0
  451. package/dist/uptime-kuma-D0NvVuXD.mjs.map +1 -0
  452. package/dist/validator-2FspYNva.mjs +111 -0
  453. package/dist/validator-2FspYNva.mjs.map +1 -0
  454. package/dist/validator.d.mts +21 -0
  455. package/dist/validator.d.mts.map +1 -0
  456. package/dist/validator.mjs +3 -0
  457. package/dist/validator.test.d.mts +1 -0
  458. package/dist/validator.test.mjs +65 -0
  459. package/dist/validator.test.mjs.map +1 -0
  460. package/dist/valkey-BCZqGJ0L.mjs +61 -0
  461. package/dist/valkey-BCZqGJ0L.mjs.map +1 -0
  462. package/dist/version-manager.d.mts +15 -0
  463. package/dist/version-manager.d.mts.map +1 -0
  464. package/dist/version-manager.mjs +55 -0
  465. package/dist/version-manager.mjs.map +1 -0
  466. package/dist/vi.2VT5v0um-Cs3Z_fCB.mjs +12916 -0
  467. package/dist/vi.2VT5v0um-Cs3Z_fCB.mjs.map +1 -0
  468. package/dist/watchtower-BWuvFGpA.mjs +47 -0
  469. package/dist/watchtower-BWuvFGpA.mjs.map +1 -0
  470. package/dist/weaviate-DttY1Hn7.mjs +90 -0
  471. package/dist/weaviate-DttY1Hn7.mjs.map +1 -0
  472. package/dist/whisper-CLu7-Vd8.mjs +62 -0
  473. package/dist/whisper-CLu7-Vd8.mjs.map +1 -0
  474. package/package.json +4 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.mjs","names":[],"sources":["../src/generate.ts"],"sourcesContent":["import {\n\tpartitionBareMetal,\n\tplatformToNativePlatform,\n\tresolvedWithOnlyServices,\n} from \"./bare-metal-partition.js\";\nimport { composeMultiFile } from \"./composer.js\";\nimport { generateBareMetalInstall } from \"./generators/bare-metal-install.js\";\nimport { generateCaddyfile } from \"./generators/caddy.js\";\nimport { generateEnvFiles } from \"./generators/env.js\";\nimport { generateGrafanaConfig, generateGrafanaDashboard } from \"./generators/grafana.js\";\nimport { generateN8nWorkflows } from \"./generators/n8n-workflows.js\";\nimport { generateNativeInstallScripts } from \"./generators/native-services.js\";\nimport { generatePostgresInit } from \"./generators/postgres-init.js\";\nimport { generatePrometheusConfig } from \"./generators/prometheus.js\";\nimport { generateReadme } from \"./generators/readme.js\";\nimport { generateScripts } from \"./generators/scripts.js\";\nimport { generateSkillFiles } from \"./generators/skills.js\";\nimport { resolve } from \"./resolver.js\";\nimport type {\n\tGeneratedFiles,\n\tGenerationInput,\n\tGenerationResult,\n\tPlatform,\n\tResolverInput,\n} from \"./types.js\";\nimport { validate } from \"./validator.js\";\n\n/** Resolver/compose only support linux image platforms; normalize for bare-metal (windows/macos). */\nfunction getComposePlatform(platform: Platform): \"linux/amd64\" | \"linux/arm64\" {\n\tif (platform === \"linux/amd64\" || platform === \"linux/arm64\") return platform;\n\treturn \"linux/amd64\";\n}\n\n/**\n * Main orchestration function: takes generation input, resolves dependencies,\n * generates all files, validates, and returns the complete file tree.\n */\nexport function generate(input: GenerationInput): GenerationResult {\n\tconst composePlatform = getComposePlatform(input.platform);\n\n\t// 1. Resolve dependencies\n\tconst resolverInput: ResolverInput = {\n\t\tservices: input.services,\n\t\tskillPacks: input.skillPacks,\n\t\tproxy: input.proxy,\n\t\tgpu: input.gpu,\n\t\tplatform: composePlatform,\n\t\tmonitoring: input.monitoring,\n\t};\n\tconst resolved = resolve(resolverInput);\n\n\tif (!resolved.isValid) {\n\t\tthrow new Error(\n\t\t\t`Invalid stack configuration: ${resolved.errors.map((e) => e.message).join(\"; \")}`,\n\t\t);\n\t}\n\n\tconst isBareMetal = input.deploymentType === \"bare-metal\";\n\tlet resolvedForCompose = resolved;\n\tlet nativeIds = new Set<string>();\n\tlet nativeServices: typeof resolved.services = [];\n\tlet dockerOnlyServices: typeof resolved.services = [];\n\n\tif (isBareMetal) {\n\t\tconst partition = partitionBareMetal(resolved, input.platform);\n\t\tnativeServices = partition.nativeServices;\n\t\tdockerOnlyServices = partition.dockerOnlyServices;\n\t\tnativeIds = partition.nativeIds;\n\t\tif (nativeServices.length > 0) {\n\t\t\tresolvedForCompose = resolvedWithOnlyServices(resolved, dockerOnlyServices);\n\t\t}\n\t}\n\n\t// 2. Generate Docker Compose YAML (multi-file)\n\tconst composeOptions = {\n\t\tprojectName: input.projectName,\n\t\tproxy: input.proxy,\n\t\tdomain: input.domain,\n\t\tgpu: input.gpu,\n\t\tplatform: composePlatform,\n\t\tdeployment: input.deployment,\n\t\topenclawVersion: input.openclawVersion,\n\t\tbareMetalNativeHost: isBareMetal && nativeIds.size > 0,\n\t};\n\tconst composeResult = composeMultiFile(resolvedForCompose, composeOptions);\n\n\t// 3. Validate (using the base docker-compose.yml)\n\tconst validation = validate(resolvedForCompose, composeResult.files[\"docker-compose.yml\"] ?? \"\", {\n\t\tdomain: input.domain,\n\t\tgenerateSecrets: input.generateSecrets,\n\t});\n\tif (!validation.valid) {\n\t\tthrow new Error(`Validation failed: ${validation.errors.map((e) => e.message).join(\"; \")}`);\n\t}\n\n\t// 4. Generate all files\n\tconst files: GeneratedFiles = {};\n\n\t// Docker Compose (multi-file output)\n\tfor (const [filename, content] of Object.entries(composeResult.files)) {\n\t\tfiles[filename] = content;\n\t}\n\n\t// Environment files (when bare-metal with native services, host vars use host.docker.internal)\n\tconst envFiles = generateEnvFiles(resolved, {\n\t\tgenerateSecrets: input.generateSecrets,\n\t\tdomain: input.domain,\n\t\topenclawVersion: input.openclawVersion,\n\t\tnativeServiceIds: isBareMetal ? nativeIds : undefined,\n\t});\n\tfiles[\".env.example\"] = envFiles.envExample;\n\tfiles[\".env\"] = envFiles.env;\n\n\t// .gitignore\n\tfiles[\".gitignore\"] = [\n\t\t\".env\",\n\t\t\".env.local\",\n\t\t\".env.*.local\",\n\t\t\"*.log\",\n\t\t\"docker-compose.override.yml\",\n\t].join(\"\\n\");\n\n\t// Skills\n\tconst skillFiles = generateSkillFiles(resolved);\n\tfor (const [path, content] of Object.entries(skillFiles)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// README\n\tfiles[\"README.md\"] = generateReadme(resolved, {\n\t\tprojectName: input.projectName,\n\t\tdomain: input.domain,\n\t\tproxy: input.proxy,\n\t\tdeploymentType: input.deploymentType,\n\t\thasNativeServices: isBareMetal && nativeServices.length > 0,\n\t});\n\n\t// Scripts\n\tconst scripts = generateScripts();\n\tfor (const [path, content] of Object.entries(scripts)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// n8n workflows\n\tconst n8nWorkflows = generateN8nWorkflows(resolved);\n\tfor (const [path, content] of Object.entries(n8nWorkflows)) {\n\t\tfiles[path] = content;\n\t}\n\n\t// PostgreSQL init script (creates per-service databases and users)\n\tconst postgresInit = generatePostgresInit(resolved);\n\tif (postgresInit) {\n\t\tfiles[\"postgres/init-databases.sh\"] = postgresInit;\n\t}\n\n\t// Caddy config\n\tif (input.proxy === \"caddy\" && input.domain) {\n\t\tfiles[\"caddy/Caddyfile\"] = generateCaddyfile(resolved, input.domain);\n\t}\n\n\t// Prometheus config\n\tconst hasPrometheus = resolved.services.some((s) => s.definition.id === \"prometheus\");\n\tif (hasPrometheus) {\n\t\tfiles[\"prometheus/prometheus.yml\"] = generatePrometheusConfig(resolved);\n\t}\n\n\t// Grafana config\n\tconst hasGrafana = resolved.services.some((s) => s.definition.id === \"grafana\");\n\tif (hasGrafana) {\n\t\tconst grafanaFiles = generateGrafanaConfig();\n\t\tfor (const [path, content] of Object.entries(grafanaFiles)) {\n\t\t\tfiles[path] = content;\n\t\t}\n\t\t// Grafana dashboard\n\t\tfiles[\"config/grafana/dashboards/openclaw-stack-overview.json\"] = generateGrafanaDashboard();\n\t}\n\n\t// Docker Compose override (empty template)\n\tfiles[\"docker-compose.override.yml\"] = [\n\t\t\"# Local overrides for docker-compose.yml\",\n\t\t\"# This file is gitignored — use it for personal port changes, extra volumes, etc.\",\n\t\t\"services: {}\",\n\t\t\"\",\n\t].join(\"\\n\");\n\n\t// SERVICES.md documentation\n\tfiles[\"docs/SERVICES.md\"] = generateServicesDoc(resolved);\n\n\t// Bare-metal: native install scripts + top-level installer\n\tif (isBareMetal) {\n\t\tif (nativeServices.length > 0) {\n\t\t\tconst nativePlatform = platformToNativePlatform(input.platform);\n\t\t\tconst nativeScripts = generateNativeInstallScripts({\n\t\t\t\tnativeServices,\n\t\t\t\tplatform: nativePlatform,\n\t\t\t\tprojectName: input.projectName,\n\t\t\t});\n\t\t\tfor (const [path, content] of Object.entries(nativeScripts)) {\n\t\t\t\tfiles[path] = content;\n\t\t\t}\n\t\t}\n\t\tconst bareMetalFiles = generateBareMetalInstall({\n\t\t\tplatform: input.platform,\n\t\t\tprojectName: input.projectName,\n\t\t\thasNativeServices: nativeServices.length > 0,\n\t\t});\n\t\tfor (const [path, content] of Object.entries(bareMetalFiles)) {\n\t\t\tfiles[path] = content;\n\t\t}\n\t}\n\n\t// 5. Calculate metadata\n\tconst skillCount = resolved.services.reduce((sum, s) => sum + s.definition.skills.length, 0);\n\n\treturn {\n\t\tfiles,\n\t\tmetadata: {\n\t\t\tserviceCount: resolved.services.length,\n\t\t\tskillCount,\n\t\t\testimatedMemoryMB: resolved.estimatedMemoryMB,\n\t\t\tgeneratedAt: new Date().toISOString(),\n\t\t},\n\t};\n}\n\nfunction generateServicesDoc(resolved: import(\"./types.js\").ResolverOutput): string {\n\tconst lines: string[] = [\n\t\t\"# Service Reference\",\n\t\t\"\",\n\t\t\"This document describes all companion services in your OpenClaw stack.\",\n\t\t\"\",\n\t];\n\n\tfor (const svc of resolved.services) {\n\t\tconst def = svc.definition;\n\t\tlines.push(`## ${def.icon} ${def.name}`);\n\t\tlines.push(\"\");\n\t\tlines.push(def.description);\n\t\tlines.push(\"\");\n\t\tlines.push(`- **Image**: \\`${def.image}:${def.imageTag}\\``);\n\t\tlines.push(`- **Category**: ${def.category}`);\n\t\tlines.push(`- **Maturity**: ${def.maturity}`);\n\t\tif (def.minMemoryMB) {\n\t\t\tlines.push(`- **Min Memory**: ${def.minMemoryMB}MB`);\n\t\t}\n\t\tif (def.ports.length > 0) {\n\t\t\tlines.push(\"- **Ports**:\");\n\t\t\tfor (const p of def.ports) {\n\t\t\t\tlines.push(\n\t\t\t\t\t` - \\`${p.container}\\` — ${p.description}${p.exposed ? \"\" : \" (internal only)\"}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tlines.push(`- **Docs**: ${def.docsUrl}`);\n\t\tlines.push(\"\");\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,283 @@
1
+ import { n as describe, r as it, t as globalExpect } from "./vi.2VT5v0um-Cs3Z_fCB.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,19 @@
1
+ import "../schema-PSUY6yJU.mjs";
2
+ import { Platform } from "../types.mjs";
3
+
4
+ //#region src/generators/bare-metal-install.d.ts
5
+
6
+ interface BareMetalInstallOptions {
7
+ platform: Platform;
8
+ projectName: string;
9
+ /** When true, top-level script runs native/install-*.sh|ps1 first, then Docker + compose. */
10
+ hasNativeServices?: boolean;
11
+ }
12
+ /**
13
+ * Returns one file: install.sh (Linux/macOS) or install.ps1 (Windows).
14
+ * When hasNativeServices is true, the script runs the native installer first, then Docker + compose.
15
+ */
16
+ declare function generateBareMetalInstall(options: BareMetalInstallOptions): Record<string, string>;
17
+ //#endregion
18
+ export { BareMetalInstallOptions, generateBareMetalInstall };
19
+ //# 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"],"sourcesContent":[],"mappings":";;;;;UAuNiB,uBAAA;YACN;;;;;;;;;iBAUK,wBAAA,UAAkC,0BAA0B"}
@@ -0,0 +1,3 @@
1
+ import { t as generateBareMetalInstall } from "../bare-metal-install-DpYZDoGq.mjs";
2
+
3
+ export { generateBareMetalInstall };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,48 @@
1
+ import { n as describe, r as it, t as globalExpect } from "../vi.2VT5v0um-Cs3Z_fCB.mjs";
2
+ import { t as generateBareMetalInstall } from "../bare-metal-install-DpYZDoGq.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"}
@@ -0,0 +1,19 @@
1
+ import "../schema-PSUY6yJU.mjs";
2
+ import { ResolverOutput } from "../types.mjs";
3
+
4
+ //#region src/generators/caddy.d.ts
5
+
6
+ /**
7
+ * Generates a Caddyfile with reverse proxy entries for each exposed service.
8
+ *
9
+ * Each service with exposed ports gets a subdomain route under the provided domain.
10
+ * Services without exposed ports are skipped.
11
+ *
12
+ * @param resolved - The resolved service configuration
13
+ * @param domain - The main domain for routing (e.g. "example.com")
14
+ * @returns The Caddyfile content as a string
15
+ */
16
+ declare function generateCaddyfile(resolved: ResolverOutput, domain: string): string;
17
+ //#endregion
18
+ export { generateCaddyfile };
19
+ //# sourceMappingURL=caddy.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caddy.d.mts","names":[],"sources":["../../src/generators/caddy.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAYA;;;;;;;iBAAgB,iBAAA,WAA4B"}
@@ -0,0 +1,3 @@
1
+ import { t as generateCaddyfile } from "../caddy-BJDrqnmw.mjs";
2
+
3
+ export { generateCaddyfile };
@@ -0,0 +1,47 @@
1
+ import "../schema-PSUY6yJU.mjs";
2
+ import { ResolverOutput } from "../types.mjs";
3
+
4
+ //#region src/generators/env.d.ts
5
+ /**
6
+ * Options for environment file generation.
7
+ */
8
+ interface EnvGeneratorOptions {
9
+ generateSecrets: boolean;
10
+ domain?: string;
11
+ openclawVersion?: string;
12
+ /** When set, host-like vars (e.g. REDIS_HOST) for these services use host.docker.internal so gateway in Docker can reach native services on host. */
13
+ nativeServiceIds?: Set<string>;
14
+ }
15
+ /**
16
+ * Generates `.env.example` and `.env` file contents from resolved services.
17
+ *
18
+ * - `.env.example`: every env var with descriptive comments, placeholders for secrets
19
+ * - `.env`: same vars but secrets filled with cryptographically random values when generateSecrets is true
20
+ */
21
+ declare function generateEnvFiles(resolved: ResolverOutput, options: EnvGeneratorOptions): {
22
+ envExample: string;
23
+ env: string;
24
+ };
25
+ interface EnvVarGroup {
26
+ serviceName: string;
27
+ serviceIcon: string;
28
+ serviceId: string;
29
+ vars: {
30
+ key: string;
31
+ description: string;
32
+ secret: boolean;
33
+ required: boolean;
34
+ defaultValue: string;
35
+ }[];
36
+ }
37
+ /**
38
+ * Returns environment variables grouped by service, suitable for UI rendering.
39
+ *
40
+ * - First group is always "OpenClaw Core" with base variables.
41
+ * - Subsequent groups correspond to each resolved service.
42
+ * - Variables are deduplicated across groups (first occurrence wins).
43
+ */
44
+ declare function getStructuredEnvVars(resolved: ResolverOutput): EnvVarGroup[];
45
+ //#endregion
46
+ export { EnvGeneratorOptions, EnvVarGroup, generateEnvFiles, getStructuredEnvVars };
47
+ //# sourceMappingURL=env.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.mts","names":[],"sources":["../../src/generators/env.ts"],"sourcesContent":[],"mappings":";;;;;;;AAOiB,UAAA,mBAAA,CAAmB;EAcpB,eAAA,EAAA,OAAgB;EAqSf,MAAA,CAAA,EAAA,MAAW;EAoBZ,eAAA,CAAA,EAAA,MAAoB;;qBAlUhB;;;;;;;;iBASJ,gBAAA,WACL,yBACD;;;;UAmSO,WAAA;;;;;;;;;;;;;;;;;;;iBAoBD,oBAAA,WAA+B,iBAAiB"}
@@ -0,0 +1,3 @@
1
+ import { n as getStructuredEnvVars, t as generateEnvFiles } from "../env-D2h46lHT.mjs";
2
+
3
+ export { generateEnvFiles, getStructuredEnvVars };
@@ -0,0 +1,22 @@
1
+ //#region src/generators/grafana.d.ts
2
+ /**
3
+ * Generates Grafana provisioning configuration files.
4
+ *
5
+ * Returns a map of file paths (relative to project root) to file contents.
6
+ * Includes datasource provisioning YAML for the Prometheus connection.
7
+ */
8
+ declare function generateGrafanaConfig(): Record<string, string>;
9
+ /**
10
+ * Generates a Grafana dashboard JSON for the OpenClaw stack overview.
11
+ *
12
+ * The dashboard includes:
13
+ * - Service Health (stat panel)
14
+ * - Memory Usage (gauge)
15
+ * - Request Rate (graph)
16
+ *
17
+ * Uses Prometheus as the datasource.
18
+ */
19
+ declare function generateGrafanaDashboard(): string;
20
+ //#endregion
21
+ export { generateGrafanaConfig, generateGrafanaDashboard };
22
+ //# sourceMappingURL=grafana.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grafana.d.mts","names":[],"sources":["../../src/generators/grafana.ts"],"sourcesContent":[],"mappings":";;AAMA;AAiGA;;;;iBAjGgB,qBAAA,CAAA,GAAyB;;;;;;;;;;;iBAiGzB,wBAAA,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { n as generateGrafanaDashboard, t as generateGrafanaConfig } from "../grafana-D3kIm8RX.mjs";
2
+
3
+ export { generateGrafanaConfig, generateGrafanaDashboard };
@@ -0,0 +1,13 @@
1
+ import "../schema-PSUY6yJU.mjs";
2
+ import { ResolverOutput } from "../types.mjs";
3
+
4
+ //#region src/generators/n8n-workflows.d.ts
5
+
6
+ /**
7
+ * Generates n8n workflow template files.
8
+ * Returns a map of file paths to JSON content strings.
9
+ */
10
+ declare function generateN8nWorkflows(resolved: ResolverOutput): Record<string, string>;
11
+ //#endregion
12
+ export { generateN8nWorkflows };
13
+ //# sourceMappingURL=n8n-workflows.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"n8n-workflows.d.mts","names":[],"sources":["../../src/generators/n8n-workflows.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAMA;iBAAgB,oBAAA,WAA+B,iBAAiB"}
@@ -0,0 +1,3 @@
1
+ import { t as generateN8nWorkflows } from "../n8n-workflows-BPmKVx8z.mjs";
2
+
3
+ export { generateN8nWorkflows };
@@ -0,0 +1,18 @@
1
+ import "../schema-PSUY6yJU.mjs";
2
+ import { NativePlatform, ResolvedService } from "../types.mjs";
3
+
4
+ //#region src/generators/native-services.d.ts
5
+ interface NativeServicesGeneratorOptions {
6
+ nativeServices: ResolvedService[];
7
+ platform: NativePlatform;
8
+ projectName: string;
9
+ }
10
+ /**
11
+ * Generates native install/run scripts for services that have a native recipe.
12
+ * Returns e.g. native/install-linux.sh (or native/install.ps1 for Windows).
13
+ * Scripts source .env and run install steps then start commands in dependency order.
14
+ */
15
+ declare function generateNativeInstallScripts(options: NativeServicesGeneratorOptions): Record<string, string>;
16
+ //#endregion
17
+ export { NativeServicesGeneratorOptions, generateNativeInstallScripts };
18
+ //# sourceMappingURL=native-services.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-services.d.mts","names":[],"sources":["../../src/generators/native-services.ts"],"sourcesContent":[],"mappings":";;;;UAEiB,8BAAA;kBACA;YACN;EAFM,WAAA,EAAA,MAAA;AAWjB;;;;;;iBAAgB,4BAAA,UACN,iCACP"}
@@ -0,0 +1,3 @@
1
+ import { t as generateNativeInstallScripts } from "../native-services-CwOCM-Xz.mjs";
2
+
3
+ export { generateNativeInstallScripts };
@@ -0,0 +1,31 @@
1
+ import "../schema-PSUY6yJU.mjs";
2
+ import { ResolverOutput } from "../types.mjs";
3
+
4
+ //#region src/generators/postgres-init.d.ts
5
+ /**
6
+ * Database requirement descriptor for a service.
7
+ */
8
+ interface DbRequirement {
9
+ serviceId: string;
10
+ serviceName: string;
11
+ dbName: string;
12
+ dbUser: string;
13
+ passwordEnvVar: string;
14
+ }
15
+ /**
16
+ * Get the list of database requirements for all resolved services.
17
+ * Exported so other generators (env, composer) can access the same data.
18
+ */
19
+ declare function getDbRequirements(resolved: ResolverOutput): DbRequirement[];
20
+ /**
21
+ * Generates a PostgreSQL initialization script that creates databases and users
22
+ * for all companion services that need their own DB.
23
+ *
24
+ * Returns null if PostgreSQL is not in the resolved stack or no services need extra DBs.
25
+ * The script is designed to be mounted at /docker-entrypoint-initdb.d/init-databases.sh
26
+ * and runs automatically during PostgreSQL's first initialization.
27
+ */
28
+ declare function generatePostgresInit(resolved: ResolverOutput): string | null;
29
+ //#endregion
30
+ export { generatePostgresInit, getDbRequirements };
31
+ //# sourceMappingURL=postgres-init.d.mts.map