@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,63 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import {
3
+ partitionBareMetal,
4
+ platformToNativePlatform,
5
+ resolvedWithOnlyServices,
6
+ } from "./bare-metal-partition.js";
7
+ import { resolve } from "./resolver.js";
8
+
9
+ describe("bare-metal partition", () => {
10
+ it("platformToNativePlatform maps platform to native", () => {
11
+ expect(platformToNativePlatform("linux/amd64")).toBe("linux");
12
+ expect(platformToNativePlatform("linux/arm64")).toBe("linux");
13
+ expect(platformToNativePlatform("windows/amd64")).toBe("windows");
14
+ expect(platformToNativePlatform("macos/arm64")).toBe("macos");
15
+ });
16
+
17
+ it("partitions redis as native on Linux when redis has native recipe", () => {
18
+ const resolved = resolve({
19
+ services: ["redis"],
20
+ skillPacks: [],
21
+ proxy: "none",
22
+ gpu: false,
23
+ platform: "linux/amd64",
24
+ monitoring: false,
25
+ });
26
+ const result = partitionBareMetal(resolved, "linux/amd64");
27
+ expect(result.nativeIds.has("redis")).toBe(true);
28
+ expect(result.nativeServices.length).toBe(1);
29
+ expect(result.nativeServices[0].definition.id).toBe("redis");
30
+ expect(result.dockerOnlyServices.length).toBe(0);
31
+ });
32
+
33
+ it("partitions n8n as Docker-only (no native recipe)", () => {
34
+ const resolved = resolve({
35
+ services: ["n8n"],
36
+ skillPacks: [],
37
+ proxy: "none",
38
+ gpu: false,
39
+ platform: "linux/amd64",
40
+ monitoring: false,
41
+ });
42
+ const result = partitionBareMetal(resolved, "linux/amd64");
43
+ expect(result.nativeIds.has("n8n")).toBe(false);
44
+ expect(result.nativeServices.length).toBe(0);
45
+ expect(result.dockerOnlyServices.length).toBeGreaterThanOrEqual(1);
46
+ expect(result.dockerOnlyServices.some((s) => s.definition.id === "n8n")).toBe(true);
47
+ });
48
+
49
+ it("resolvedWithOnlyServices filters to given service list", () => {
50
+ const resolved = resolve({
51
+ services: ["redis", "n8n"],
52
+ skillPacks: [],
53
+ proxy: "none",
54
+ gpu: false,
55
+ platform: "linux/amd64",
56
+ monitoring: false,
57
+ });
58
+ const partition = partitionBareMetal(resolved, "linux/amd64");
59
+ const filtered = resolvedWithOnlyServices(resolved, partition.dockerOnlyServices);
60
+ expect(filtered.services.every((s) => s.definition.id !== "redis")).toBe(true);
61
+ expect(filtered.services.some((s) => s.definition.id === "n8n")).toBe(true);
62
+ });
63
+ });
@@ -0,0 +1,64 @@
1
+ import type { NativePlatform, Platform, ResolvedService, ResolverOutput } from "./types.js";
2
+
3
+ /**
4
+ * Maps Platform (e.g. linux/amd64) to NativePlatform (linux, windows, macos).
5
+ */
6
+ export function platformToNativePlatform(platform: Platform): NativePlatform {
7
+ if (platform.startsWith("linux/")) return "linux";
8
+ if (platform.startsWith("windows/")) return "windows";
9
+ if (platform.startsWith("macos/")) return "macos";
10
+ return "linux";
11
+ }
12
+
13
+ export interface BareMetalPartitionResult {
14
+ nativeServices: ResolvedService[];
15
+ dockerOnlyServices: ResolvedService[];
16
+ nativeIds: Set<string>;
17
+ }
18
+
19
+ /**
20
+ * Partitions resolved services into native (run on host via scripts) vs Docker-only.
21
+ * Gateway and CLI are never native; services with nativeSupported and a matching
22
+ * nativeRecipe for the platform go to native, rest to Docker.
23
+ */
24
+ export function partitionBareMetal(
25
+ resolved: ResolverOutput,
26
+ platform: Platform,
27
+ ): BareMetalPartitionResult {
28
+ const nativePlatform = platformToNativePlatform(platform);
29
+ const nativeServices: ResolvedService[] = [];
30
+ const dockerOnlyServices: ResolvedService[] = [];
31
+ const nativeIds = new Set<string>();
32
+
33
+ for (const entry of resolved.services) {
34
+ const def = entry.definition;
35
+ const hasNativeRecipe =
36
+ def.nativeSupported === true &&
37
+ def.nativeRecipes?.length &&
38
+ def.nativeRecipes.some((r) => r.platform === nativePlatform);
39
+
40
+ if (hasNativeRecipe) {
41
+ nativeServices.push(entry);
42
+ nativeIds.add(def.id);
43
+ } else {
44
+ dockerOnlyServices.push(entry);
45
+ }
46
+ }
47
+
48
+ return { nativeServices, dockerOnlyServices, nativeIds };
49
+ }
50
+
51
+ /**
52
+ * Returns a new ResolverOutput containing only the given service list (same order).
53
+ * Used to build compose for Docker-only subset when bare-metal has native services.
54
+ */
55
+ export function resolvedWithOnlyServices(
56
+ resolved: ResolverOutput,
57
+ services: ResolvedService[],
58
+ ): ResolverOutput {
59
+ const idSet = new Set(services.map((s) => s.definition.id));
60
+ return {
61
+ ...resolved,
62
+ services: resolved.services.filter((s) => idSet.has(s.definition.id)),
63
+ };
64
+ }
@@ -0,0 +1,87 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { composeMultiFile } from "./composer.js";
3
+ import { resolve } from "./resolver.js";
4
+
5
+ function generateForPreset(services: string[], skillPacks: string[] = []) {
6
+ const resolved = resolve({ services, skillPacks });
7
+ return composeMultiFile(resolved, {
8
+ projectName: "test-stack",
9
+ proxy: "none",
10
+ gpu: false,
11
+ platform: "linux/amd64",
12
+ deployment: "local",
13
+ openclawVersion: "latest",
14
+ });
15
+ }
16
+
17
+ describe("compose snapshot tests", () => {
18
+ it("minimal preset (redis only)", () => {
19
+ const result = generateForPreset(["redis"]);
20
+ expect(result.files["docker-compose.yml"]).toMatchSnapshot();
21
+ });
22
+
23
+ it("creator preset (ffmpeg + remotion + minio + redis)", () => {
24
+ const result = generateForPreset(["ffmpeg", "remotion", "minio", "redis"], ["video-creator"]);
25
+ expect(result.files["docker-compose.yml"]).toMatchSnapshot();
26
+ if (result.files["docker-compose.media.yml"]) {
27
+ expect(result.files["docker-compose.media.yml"]).toMatchSnapshot();
28
+ }
29
+ });
30
+
31
+ it("researcher preset (qdrant + searxng + browserless + redis)", () => {
32
+ const result = generateForPreset(
33
+ ["qdrant", "searxng", "browserless", "redis"],
34
+ ["research-agent"],
35
+ );
36
+ expect(result.files["docker-compose.yml"]).toMatchSnapshot();
37
+ });
38
+
39
+ it("devops preset (n8n + postgresql + redis + monitoring)", () => {
40
+ const result = generateForPreset(
41
+ ["n8n", "postgresql", "redis", "uptime-kuma", "grafana", "prometheus"],
42
+ ["dev-ops"],
43
+ );
44
+ expect(result.files["docker-compose.yml"]).toMatchSnapshot();
45
+ if (result.files["docker-compose.monitoring.yml"]) {
46
+ expect(result.files["docker-compose.monitoring.yml"]).toMatchSnapshot();
47
+ }
48
+ });
49
+
50
+ it("full preset (many services)", () => {
51
+ const result = generateForPreset([
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
+ expect(result.files["docker-compose.yml"]).toMatchSnapshot();
71
+ expect(result.profiles.length).toBeGreaterThan(0);
72
+ // Verify multiple compose files were created
73
+ expect(Object.keys(result.files).length).toBeGreaterThan(1);
74
+ });
75
+
76
+ it("multi-file output has correct profile assignments", () => {
77
+ const result = generateForPreset(["redis", "ollama", "open-webui", "grafana", "prometheus"]);
78
+ // AI services should be in the ai profile file
79
+ if (result.files["docker-compose.ai.yml"]) {
80
+ expect(result.files["docker-compose.ai.yml"]).toContain("profiles:");
81
+ }
82
+ // Monitoring should be in the monitoring profile file
83
+ if (result.files["docker-compose.monitoring.yml"]) {
84
+ expect(result.files["docker-compose.monitoring.yml"]).toContain("profiles:");
85
+ }
86
+ });
87
+ });
@@ -0,0 +1,224 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { parse } from "yaml";
3
+ import { compose } from "./composer.js";
4
+ import { resolve } from "./resolver.js";
5
+ import type { ComposeOptions, ResolverOutput } from "./types.js";
6
+
7
+ const defaultOptions: ComposeOptions = {
8
+ projectName: "test-project",
9
+ proxy: "none",
10
+ gpu: false,
11
+ platform: "linux/amd64",
12
+ deployment: "local",
13
+ openclawVersion: "latest",
14
+ };
15
+
16
+ describe("compose", () => {
17
+ it("generates minimal stack with just OpenClaw gateway when no companions", () => {
18
+ const resolved = resolve({ services: [], skillPacks: [] });
19
+ const yaml = compose(resolved, defaultOptions);
20
+ const parsed = parse(yaml);
21
+
22
+ // Should have the gateway service
23
+ expect(parsed.services).toHaveProperty("openclaw-gateway");
24
+ expect(parsed.services["openclaw-gateway"].image).toContain("ghcr.io/openclaw/openclaw");
25
+
26
+ // Gateway should have core environment
27
+ expect(parsed.services["openclaw-gateway"].environment.HOME).toBe("/home/node");
28
+ expect(parsed.services["openclaw-gateway"].environment.TERM).toBe("xterm-256color");
29
+
30
+ // Gateway uses bind-mount volumes (not named volumes in top-level volumes section)
31
+ const gwVolumes = parsed.services["openclaw-gateway"].volumes as string[];
32
+ expect(gwVolumes.some((v: string) => v.includes(".openclaw"))).toBe(true);
33
+
34
+ // Should have network
35
+ expect(parsed.networks).toHaveProperty("openclaw-network");
36
+ expect(parsed.networks["openclaw-network"].driver).toBe("bridge");
37
+
38
+ // Should have CLI companion service
39
+ expect(parsed.services).toHaveProperty("openclaw-cli");
40
+
41
+ // Gateway should have no depends_on (no companions)
42
+ expect(parsed.services["openclaw-gateway"]).not.toHaveProperty("depends_on");
43
+
44
+ // Gateway should have restart policy
45
+ expect(parsed.services["openclaw-gateway"].restart).toBe("unless-stopped");
46
+ });
47
+
48
+ it("generates Redis companion with proper gateway depends_on", () => {
49
+ const resolved = resolve({ services: ["redis"], skillPacks: [] });
50
+ const yaml = compose(resolved, defaultOptions);
51
+ const parsed = parse(yaml);
52
+
53
+ // Should have gateway and redis services
54
+ expect(parsed.services).toHaveProperty("openclaw-gateway");
55
+ expect(parsed.services).toHaveProperty("redis");
56
+
57
+ // Redis service should have correct image
58
+ expect(parsed.services.redis.image).toBe("redis:7-alpine");
59
+
60
+ // Gateway depends_on should include redis with service_healthy (redis has healthcheck)
61
+ expect(parsed.services["openclaw-gateway"].depends_on).toHaveProperty("redis");
62
+ expect(parsed.services["openclaw-gateway"].depends_on.redis.condition).toBe("service_healthy");
63
+
64
+ // Redis should have a healthcheck
65
+ expect(parsed.services.redis.healthcheck).toBeDefined();
66
+ expect(parsed.services.redis.healthcheck.test).toContain("redis-cli ping");
67
+
68
+ // Redis should have restart policy
69
+ expect(parsed.services.redis.restart).toBe("unless-stopped");
70
+
71
+ // Redis should be on openclaw-network
72
+ expect(parsed.services.redis.networks).toContain("openclaw-network");
73
+
74
+ // Gateway environment should include redis-related openclawEnvVars
75
+ expect(parsed.services["openclaw-gateway"].environment).toHaveProperty("REDIS_HOST");
76
+ expect(parsed.services["openclaw-gateway"].environment.REDIS_HOST).toBe("redis");
77
+ });
78
+
79
+ it("generates parseable YAML for a multi-service stack", () => {
80
+ const resolved = resolve({ services: ["redis", "n8n"], skillPacks: [] });
81
+ const yaml = compose(resolved, defaultOptions);
82
+
83
+ // Should not throw when parsing
84
+ expect(() => parse(yaml)).not.toThrow();
85
+
86
+ const parsed = parse(yaml);
87
+ expect(parsed).toHaveProperty("services");
88
+ expect(parsed).toHaveProperty("volumes");
89
+ expect(parsed).toHaveProperty("networks");
90
+
91
+ // Should have gateway + redis + n8n + postgresql (n8n requires postgresql)
92
+ expect(parsed.services).toHaveProperty("openclaw-gateway");
93
+ expect(parsed.services).toHaveProperty("redis");
94
+ expect(parsed.services).toHaveProperty("n8n");
95
+ expect(parsed.services).toHaveProperty("postgresql");
96
+ });
97
+
98
+ it("includes all service volumes in top-level volumes section", () => {
99
+ const resolved = resolve({ services: ["redis", "n8n"], skillPacks: [] });
100
+ const yaml = compose(resolved, defaultOptions);
101
+ const parsed = parse(yaml);
102
+
103
+ // Collect all volume names from all resolved services
104
+ const serviceVolumeNames = new Set<string>();
105
+ for (const rs of resolved.services) {
106
+ for (const vol of rs.definition.volumes) {
107
+ serviceVolumeNames.add(vol.name);
108
+ }
109
+ }
110
+
111
+ // All service volumes must appear in top-level volumes
112
+ for (const volName of serviceVolumeNames) {
113
+ expect(parsed.volumes).toHaveProperty(volName);
114
+ }
115
+
116
+ // Gateway uses bind-mount volumes (not in top-level volumes section)
117
+ const gwVols = parsed.services["openclaw-gateway"].volumes as string[];
118
+ expect(gwVols.some((v: string) => v.includes(".openclaw"))).toBe(true);
119
+ });
120
+
121
+ it("includes GPU passthrough when gpu=true and service requires it", () => {
122
+ const resolved = resolve({ services: ["ollama"], skillPacks: [] });
123
+
124
+ // Modify resolved output to simulate a GPU-required service
125
+ const gpuResolved: ResolverOutput = {
126
+ ...resolved,
127
+ services: resolved.services.map((s) => ({
128
+ ...s,
129
+ definition: { ...s.definition, gpuRequired: true },
130
+ })),
131
+ };
132
+
133
+ const yaml = compose(gpuResolved, { ...defaultOptions, gpu: true });
134
+ const parsed = parse(yaml);
135
+
136
+ // Ollama service should have GPU device reservation
137
+ const ollamaService = parsed.services.ollama;
138
+ expect(ollamaService.deploy).toBeDefined();
139
+ expect(ollamaService.deploy.resources.reservations.devices).toEqual([
140
+ {
141
+ driver: "nvidia",
142
+ count: "all",
143
+ capabilities: ["gpu"],
144
+ },
145
+ ]);
146
+ });
147
+
148
+ it("does not include GPU passthrough when gpu=false", () => {
149
+ const resolved = resolve({ services: ["ollama"], skillPacks: [] });
150
+
151
+ // Even if service requires GPU, gpu option is false
152
+ const gpuResolved: ResolverOutput = {
153
+ ...resolved,
154
+ services: resolved.services.map((s) => ({
155
+ ...s,
156
+ definition: { ...s.definition, gpuRequired: true },
157
+ })),
158
+ };
159
+
160
+ const yaml = compose(gpuResolved, { ...defaultOptions, gpu: false });
161
+ const parsed = parse(yaml);
162
+
163
+ // Should NOT have deploy with GPU devices
164
+ const ollamaService = parsed.services.ollama;
165
+ expect(ollamaService.deploy?.resources?.reservations?.devices).toBeUndefined();
166
+ });
167
+
168
+ it("does not map internal-only ports to host", () => {
169
+ const resolved = resolve({ services: ["redis"], skillPacks: [] });
170
+
171
+ // Modify redis to have an internal-only port
172
+ const modifiedResolved: ResolverOutput = {
173
+ ...resolved,
174
+ services: resolved.services.map((s) => ({
175
+ ...s,
176
+ definition: {
177
+ ...s.definition,
178
+ ports: [
179
+ ...s.definition.ports,
180
+ { host: 16379, container: 16379, description: "Redis cluster bus", exposed: false },
181
+ ],
182
+ },
183
+ })),
184
+ };
185
+
186
+ const yaml = compose(modifiedResolved, defaultOptions);
187
+ const parsed = parse(yaml);
188
+
189
+ // Should only have the exposed port, not the internal one
190
+ const redisPorts = parsed.services.redis.ports;
191
+ expect(redisPorts).toHaveLength(1);
192
+ expect(redisPorts[0]).toContain("6379");
193
+ expect(redisPorts[0]).not.toContain("16379");
194
+ });
195
+
196
+ it("uses service_started condition for services without healthcheck", () => {
197
+ const resolved = resolve({ services: ["minio"], skillPacks: [] });
198
+
199
+ const yaml = compose(resolved, defaultOptions);
200
+ const parsed = parse(yaml);
201
+
202
+ // Minio may or may not have a healthcheck – the gateway depends_on
203
+ // condition should reflect the definition accurately
204
+ const gatewayDeps = parsed.services["openclaw-gateway"].depends_on;
205
+ for (const [id, dep] of Object.entries(gatewayDeps)) {
206
+ const svc = resolved.services.find((s) => s.definition.id === id);
207
+ if (svc?.definition.healthcheck) {
208
+ expect((dep as { condition: string }).condition).toBe("service_healthy");
209
+ } else {
210
+ expect((dep as { condition: string }).condition).toBe("service_started");
211
+ }
212
+ }
213
+ });
214
+
215
+ it("gateway is always the first service in the output", () => {
216
+ const resolved = resolve({ services: ["redis", "ollama"], skillPacks: [] });
217
+ const yaml = compose(resolved, defaultOptions);
218
+ const parsed = parse(yaml);
219
+
220
+ // First key in services should be openclaw-gateway
221
+ const serviceKeys = Object.keys(parsed.services);
222
+ expect(serviceKeys[0]).toBe("openclaw-gateway");
223
+ });
224
+ });