@better-openclaw/core 1.0.22 → 1.0.24

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 (697) hide show
  1. package/dist/bare-metal-partition.test.cjs +3 -4
  2. package/dist/bare-metal-partition.test.cjs.map +1 -1
  3. package/dist/bare-metal-partition.test.mjs +3 -4
  4. package/dist/bare-metal-partition.test.mjs.map +1 -1
  5. package/dist/composer.cjs +40 -14
  6. package/dist/composer.cjs.map +1 -1
  7. package/dist/composer.d.cts.map +1 -1
  8. package/dist/composer.d.mts.map +1 -1
  9. package/dist/composer.mjs +40 -14
  10. package/dist/composer.mjs.map +1 -1
  11. package/dist/composer.snapshot.test.cjs +1 -1
  12. package/dist/composer.snapshot.test.mjs +1 -1
  13. package/dist/composer.test.cjs +3 -2
  14. package/dist/composer.test.cjs.map +1 -1
  15. package/dist/composer.test.mjs +3 -2
  16. package/dist/composer.test.mjs.map +1 -1
  17. package/dist/deployers/strip-host-ports.test.cjs +1 -1
  18. package/dist/deployers/strip-host-ports.test.mjs +1 -1
  19. package/dist/generate.cjs +7 -2
  20. package/dist/generate.cjs.map +1 -1
  21. package/dist/generate.d.cts.map +1 -1
  22. package/dist/generate.d.mts.map +1 -1
  23. package/dist/generate.mjs +7 -2
  24. package/dist/generate.mjs.map +1 -1
  25. package/dist/generate.test.cjs +2 -2
  26. package/dist/generate.test.cjs.map +1 -1
  27. package/dist/generate.test.mjs +2 -2
  28. package/dist/generate.test.mjs.map +1 -1
  29. package/dist/generators/bare-metal-install.test.cjs +1 -1
  30. package/dist/generators/bare-metal-install.test.mjs +1 -1
  31. package/dist/generators/caddy.test.cjs +1 -1
  32. package/dist/generators/caddy.test.mjs +1 -1
  33. package/dist/generators/clone-repos.cjs +140 -0
  34. package/dist/generators/clone-repos.cjs.map +1 -0
  35. package/dist/generators/clone-repos.d.cts +11 -0
  36. package/dist/generators/clone-repos.d.cts.map +1 -0
  37. package/dist/generators/clone-repos.d.mts +11 -0
  38. package/dist/generators/clone-repos.d.mts.map +1 -0
  39. package/dist/generators/clone-repos.mjs +139 -0
  40. package/dist/generators/clone-repos.mjs.map +1 -0
  41. package/dist/generators/clone-repos.test.cjs +140 -0
  42. package/dist/generators/clone-repos.test.cjs.map +1 -0
  43. package/dist/generators/clone-repos.test.d.cts +1 -0
  44. package/dist/generators/clone-repos.test.d.mts +1 -0
  45. package/dist/generators/clone-repos.test.mjs +141 -0
  46. package/dist/generators/clone-repos.test.mjs.map +1 -0
  47. package/dist/generators/env.cjs +146 -0
  48. package/dist/generators/env.cjs.map +1 -1
  49. package/dist/generators/env.d.cts.map +1 -1
  50. package/dist/generators/env.d.mts.map +1 -1
  51. package/dist/generators/env.mjs +146 -0
  52. package/dist/generators/env.mjs.map +1 -1
  53. package/dist/generators/env.test.cjs +1 -1
  54. package/dist/generators/env.test.mjs +1 -1
  55. package/dist/generators/health-check.test.cjs +1 -1
  56. package/dist/generators/health-check.test.mjs +1 -1
  57. package/dist/generators/openclaw-json.cjs +102 -7
  58. package/dist/generators/openclaw-json.cjs.map +1 -1
  59. package/dist/generators/openclaw-json.mjs +102 -7
  60. package/dist/generators/openclaw-json.mjs.map +1 -1
  61. package/dist/generators/postgres-init.cjs +20 -0
  62. package/dist/generators/postgres-init.cjs.map +1 -1
  63. package/dist/generators/postgres-init.d.cts.map +1 -1
  64. package/dist/generators/postgres-init.d.mts.map +1 -1
  65. package/dist/generators/postgres-init.mjs +20 -0
  66. package/dist/generators/postgres-init.mjs.map +1 -1
  67. package/dist/generators/readme.cjs +2 -1
  68. package/dist/generators/readme.cjs.map +1 -1
  69. package/dist/generators/readme.mjs +2 -1
  70. package/dist/generators/readme.mjs.map +1 -1
  71. package/dist/generators/scripts.cjs +332 -3
  72. package/dist/generators/scripts.cjs.map +1 -1
  73. package/dist/generators/scripts.d.cts +3 -1
  74. package/dist/generators/scripts.d.cts.map +1 -1
  75. package/dist/generators/scripts.d.mts +3 -1
  76. package/dist/generators/scripts.d.mts.map +1 -1
  77. package/dist/generators/scripts.mjs +332 -3
  78. package/dist/generators/scripts.mjs.map +1 -1
  79. package/dist/generators/scripts.test.cjs +39 -5
  80. package/dist/generators/scripts.test.cjs.map +1 -1
  81. package/dist/generators/scripts.test.mjs +39 -5
  82. package/dist/generators/scripts.test.mjs.map +1 -1
  83. package/dist/generators/stack-manifest.cjs +1 -0
  84. package/dist/generators/stack-manifest.cjs.map +1 -1
  85. package/dist/generators/stack-manifest.d.cts +3 -2
  86. package/dist/generators/stack-manifest.d.cts.map +1 -1
  87. package/dist/generators/stack-manifest.d.mts +3 -2
  88. package/dist/generators/stack-manifest.d.mts.map +1 -1
  89. package/dist/generators/stack-manifest.mjs +1 -0
  90. package/dist/generators/stack-manifest.mjs.map +1 -1
  91. package/dist/generators/traefik.test.cjs +1 -1
  92. package/dist/generators/traefik.test.mjs +1 -1
  93. package/dist/index.cjs +8 -1
  94. package/dist/index.d.cts +5 -3
  95. package/dist/index.d.mts +5 -3
  96. package/dist/index.mjs +5 -3
  97. package/dist/migrations.test.cjs +1 -1
  98. package/dist/migrations.test.mjs +1 -1
  99. package/dist/presets/registry.cjs +19 -0
  100. package/dist/presets/registry.cjs.map +1 -1
  101. package/dist/presets/registry.d.cts.map +1 -1
  102. package/dist/presets/registry.d.mts.map +1 -1
  103. package/dist/presets/registry.mjs +19 -0
  104. package/dist/presets/registry.mjs.map +1 -1
  105. package/dist/presets/registry.test.cjs +1 -1
  106. package/dist/presets/registry.test.mjs +1 -1
  107. package/dist/resolver.cjs +8 -0
  108. package/dist/resolver.cjs.map +1 -1
  109. package/dist/resolver.mjs +9 -1
  110. package/dist/resolver.mjs.map +1 -1
  111. package/dist/resolver.test.cjs +47 -12
  112. package/dist/resolver.test.cjs.map +1 -1
  113. package/dist/resolver.test.mjs +47 -12
  114. package/dist/resolver.test.mjs.map +1 -1
  115. package/dist/{schema-C_hc7e4k.d.cts → schema-eX44HhRp.d.mts} +78 -8
  116. package/dist/schema-eX44HhRp.d.mts.map +1 -0
  117. package/dist/{schema-CaesJaS2.d.mts → schema-tn5RK8CM.d.cts} +78 -8
  118. package/dist/schema-tn5RK8CM.d.cts.map +1 -0
  119. package/dist/schema.cjs +26 -4
  120. package/dist/schema.cjs.map +1 -1
  121. package/dist/schema.d.cts +2 -2
  122. package/dist/schema.d.mts +2 -2
  123. package/dist/schema.mjs +25 -5
  124. package/dist/schema.mjs.map +1 -1
  125. package/dist/schema.test.cjs +1 -1
  126. package/dist/schema.test.mjs +1 -1
  127. package/dist/services/definitions/adguard-home.cjs +74 -0
  128. package/dist/services/definitions/adguard-home.cjs.map +1 -0
  129. package/dist/services/definitions/adguard-home.d.cts +7 -0
  130. package/dist/services/definitions/adguard-home.d.cts.map +1 -0
  131. package/dist/services/definitions/adguard-home.d.mts +7 -0
  132. package/dist/services/definitions/adguard-home.d.mts.map +1 -0
  133. package/dist/services/definitions/adguard-home.mjs +73 -0
  134. package/dist/services/definitions/adguard-home.mjs.map +1 -0
  135. package/dist/services/definitions/apptension-saas.cjs +87 -0
  136. package/dist/services/definitions/apptension-saas.cjs.map +1 -0
  137. package/dist/services/definitions/apptension-saas.d.cts +7 -0
  138. package/dist/services/definitions/apptension-saas.d.cts.map +1 -0
  139. package/dist/services/definitions/apptension-saas.d.mts +7 -0
  140. package/dist/services/definitions/apptension-saas.d.mts.map +1 -0
  141. package/dist/services/definitions/apptension-saas.mjs +86 -0
  142. package/dist/services/definitions/apptension-saas.mjs.map +1 -0
  143. package/dist/services/definitions/audiobookshelf.cjs +81 -0
  144. package/dist/services/definitions/audiobookshelf.cjs.map +1 -0
  145. package/dist/services/definitions/audiobookshelf.d.cts +7 -0
  146. package/dist/services/definitions/audiobookshelf.d.cts.map +1 -0
  147. package/dist/services/definitions/audiobookshelf.d.mts +7 -0
  148. package/dist/services/definitions/audiobookshelf.d.mts.map +1 -0
  149. package/dist/services/definitions/audiobookshelf.mjs +80 -0
  150. package/dist/services/definitions/audiobookshelf.mjs.map +1 -0
  151. package/dist/services/definitions/baserow.cjs +115 -0
  152. package/dist/services/definitions/baserow.cjs.map +1 -0
  153. package/dist/services/definitions/baserow.d.cts +7 -0
  154. package/dist/services/definitions/baserow.d.cts.map +1 -0
  155. package/dist/services/definitions/baserow.d.mts +7 -0
  156. package/dist/services/definitions/baserow.d.mts.map +1 -0
  157. package/dist/services/definitions/baserow.mjs +114 -0
  158. package/dist/services/definitions/baserow.mjs.map +1 -0
  159. package/dist/services/definitions/boxyhq-saas.cjs +88 -0
  160. package/dist/services/definitions/boxyhq-saas.cjs.map +1 -0
  161. package/dist/services/definitions/boxyhq-saas.d.cts +7 -0
  162. package/dist/services/definitions/boxyhq-saas.d.cts.map +1 -0
  163. package/dist/services/definitions/boxyhq-saas.d.mts +7 -0
  164. package/dist/services/definitions/boxyhq-saas.d.mts.map +1 -0
  165. package/dist/services/definitions/boxyhq-saas.mjs +87 -0
  166. package/dist/services/definitions/boxyhq-saas.mjs.map +1 -0
  167. package/dist/services/definitions/calibre-web.cjs +91 -0
  168. package/dist/services/definitions/calibre-web.cjs.map +1 -0
  169. package/dist/services/definitions/calibre-web.d.cts +7 -0
  170. package/dist/services/definitions/calibre-web.d.cts.map +1 -0
  171. package/dist/services/definitions/calibre-web.d.mts +7 -0
  172. package/dist/services/definitions/calibre-web.d.mts.map +1 -0
  173. package/dist/services/definitions/calibre-web.mjs +90 -0
  174. package/dist/services/definitions/calibre-web.mjs.map +1 -0
  175. package/dist/services/definitions/clickhouse.cjs +113 -0
  176. package/dist/services/definitions/clickhouse.cjs.map +1 -0
  177. package/dist/services/definitions/clickhouse.d.cts +7 -0
  178. package/dist/services/definitions/clickhouse.d.cts.map +1 -0
  179. package/dist/services/definitions/clickhouse.d.mts +7 -0
  180. package/dist/services/definitions/clickhouse.d.mts.map +1 -0
  181. package/dist/services/definitions/clickhouse.mjs +112 -0
  182. package/dist/services/definitions/clickhouse.mjs.map +1 -0
  183. package/dist/services/definitions/cloudflared.cjs +55 -0
  184. package/dist/services/definitions/cloudflared.cjs.map +1 -0
  185. package/dist/services/definitions/cloudflared.d.cts +7 -0
  186. package/dist/services/definitions/cloudflared.d.cts.map +1 -0
  187. package/dist/services/definitions/cloudflared.d.mts +7 -0
  188. package/dist/services/definitions/cloudflared.d.mts.map +1 -0
  189. package/dist/services/definitions/cloudflared.mjs +54 -0
  190. package/dist/services/definitions/cloudflared.mjs.map +1 -0
  191. package/dist/services/definitions/cmsaas-starter.cjs +86 -0
  192. package/dist/services/definitions/cmsaas-starter.cjs.map +1 -0
  193. package/dist/services/definitions/cmsaas-starter.d.cts +7 -0
  194. package/dist/services/definitions/cmsaas-starter.d.cts.map +1 -0
  195. package/dist/services/definitions/cmsaas-starter.d.mts +7 -0
  196. package/dist/services/definitions/cmsaas-starter.d.mts.map +1 -0
  197. package/dist/services/definitions/cmsaas-starter.mjs +85 -0
  198. package/dist/services/definitions/cmsaas-starter.mjs.map +1 -0
  199. package/dist/services/definitions/cockroachdb.cjs +70 -0
  200. package/dist/services/definitions/cockroachdb.cjs.map +1 -0
  201. package/dist/services/definitions/cockroachdb.d.cts +7 -0
  202. package/dist/services/definitions/cockroachdb.d.cts.map +1 -0
  203. package/dist/services/definitions/cockroachdb.d.mts +7 -0
  204. package/dist/services/definitions/cockroachdb.d.mts.map +1 -0
  205. package/dist/services/definitions/cockroachdb.mjs +69 -0
  206. package/dist/services/definitions/cockroachdb.mjs.map +1 -0
  207. package/dist/services/definitions/coder.cjs +64 -0
  208. package/dist/services/definitions/coder.cjs.map +1 -0
  209. package/dist/services/definitions/coder.d.cts +7 -0
  210. package/dist/services/definitions/coder.d.cts.map +1 -0
  211. package/dist/services/definitions/coder.d.mts +7 -0
  212. package/dist/services/definitions/coder.d.mts.map +1 -0
  213. package/dist/services/definitions/coder.mjs +63 -0
  214. package/dist/services/definitions/coder.mjs.map +1 -0
  215. package/dist/services/definitions/dragonfly.cjs +64 -0
  216. package/dist/services/definitions/dragonfly.cjs.map +1 -0
  217. package/dist/services/definitions/dragonfly.d.cts +7 -0
  218. package/dist/services/definitions/dragonfly.d.cts.map +1 -0
  219. package/dist/services/definitions/dragonfly.d.mts +7 -0
  220. package/dist/services/definitions/dragonfly.d.mts.map +1 -0
  221. package/dist/services/definitions/dragonfly.mjs +63 -0
  222. package/dist/services/definitions/dragonfly.mjs.map +1 -0
  223. package/dist/services/definitions/drone-ci.cjs +95 -0
  224. package/dist/services/definitions/drone-ci.cjs.map +1 -0
  225. package/dist/services/definitions/drone-ci.d.cts +7 -0
  226. package/dist/services/definitions/drone-ci.d.cts.map +1 -0
  227. package/dist/services/definitions/drone-ci.d.mts +7 -0
  228. package/dist/services/definitions/drone-ci.d.mts.map +1 -0
  229. package/dist/services/definitions/drone-ci.mjs +94 -0
  230. package/dist/services/definitions/drone-ci.mjs.map +1 -0
  231. package/dist/services/definitions/element-web.cjs +61 -0
  232. package/dist/services/definitions/element-web.cjs.map +1 -0
  233. package/dist/services/definitions/element-web.d.cts +7 -0
  234. package/dist/services/definitions/element-web.d.cts.map +1 -0
  235. package/dist/services/definitions/element-web.d.mts +7 -0
  236. package/dist/services/definitions/element-web.d.mts.map +1 -0
  237. package/dist/services/definitions/element-web.mjs +60 -0
  238. package/dist/services/definitions/element-web.mjs.map +1 -0
  239. package/dist/services/definitions/focalboard.cjs +65 -0
  240. package/dist/services/definitions/focalboard.cjs.map +1 -0
  241. package/dist/services/definitions/focalboard.d.cts +7 -0
  242. package/dist/services/definitions/focalboard.d.cts.map +1 -0
  243. package/dist/services/definitions/focalboard.d.mts +7 -0
  244. package/dist/services/definitions/focalboard.d.mts.map +1 -0
  245. package/dist/services/definitions/focalboard.mjs +64 -0
  246. package/dist/services/definitions/focalboard.mjs.map +1 -0
  247. package/dist/services/definitions/forgejo.cjs +108 -0
  248. package/dist/services/definitions/forgejo.cjs.map +1 -0
  249. package/dist/services/definitions/forgejo.d.cts +7 -0
  250. package/dist/services/definitions/forgejo.d.cts.map +1 -0
  251. package/dist/services/definitions/forgejo.d.mts +7 -0
  252. package/dist/services/definitions/forgejo.d.mts.map +1 -0
  253. package/dist/services/definitions/forgejo.mjs +107 -0
  254. package/dist/services/definitions/forgejo.mjs.map +1 -0
  255. package/dist/services/definitions/graylog.cjs +103 -0
  256. package/dist/services/definitions/graylog.cjs.map +1 -0
  257. package/dist/services/definitions/graylog.d.cts +7 -0
  258. package/dist/services/definitions/graylog.d.cts.map +1 -0
  259. package/dist/services/definitions/graylog.d.mts +7 -0
  260. package/dist/services/definitions/graylog.d.mts.map +1 -0
  261. package/dist/services/definitions/graylog.mjs +102 -0
  262. package/dist/services/definitions/graylog.mjs.map +1 -0
  263. package/dist/services/definitions/index.cjs +154 -1
  264. package/dist/services/definitions/index.cjs.map +1 -1
  265. package/dist/services/definitions/index.d.cts +52 -1
  266. package/dist/services/definitions/index.d.cts.map +1 -1
  267. package/dist/services/definitions/index.d.mts +52 -1
  268. package/dist/services/definitions/index.d.mts.map +1 -1
  269. package/dist/services/definitions/index.mjs +104 -2
  270. package/dist/services/definitions/index.mjs.map +1 -1
  271. package/dist/services/definitions/influxdb.cjs +105 -0
  272. package/dist/services/definitions/influxdb.cjs.map +1 -0
  273. package/dist/services/definitions/influxdb.d.cts +7 -0
  274. package/dist/services/definitions/influxdb.d.cts.map +1 -0
  275. package/dist/services/definitions/influxdb.d.mts +7 -0
  276. package/dist/services/definitions/influxdb.d.mts.map +1 -0
  277. package/dist/services/definitions/influxdb.mjs +104 -0
  278. package/dist/services/definitions/influxdb.mjs.map +1 -0
  279. package/dist/services/definitions/invoke-ai.cjs +70 -0
  280. package/dist/services/definitions/invoke-ai.cjs.map +1 -0
  281. package/dist/services/definitions/invoke-ai.d.cts +7 -0
  282. package/dist/services/definitions/invoke-ai.d.cts.map +1 -0
  283. package/dist/services/definitions/invoke-ai.d.mts +7 -0
  284. package/dist/services/definitions/invoke-ai.d.mts.map +1 -0
  285. package/dist/services/definitions/invoke-ai.mjs +69 -0
  286. package/dist/services/definitions/invoke-ai.mjs.map +1 -0
  287. package/dist/services/definitions/ixartz-saas.cjs +88 -0
  288. package/dist/services/definitions/ixartz-saas.cjs.map +1 -0
  289. package/dist/services/definitions/ixartz-saas.d.cts +7 -0
  290. package/dist/services/definitions/ixartz-saas.d.cts.map +1 -0
  291. package/dist/services/definitions/ixartz-saas.d.mts +7 -0
  292. package/dist/services/definitions/ixartz-saas.d.mts.map +1 -0
  293. package/dist/services/definitions/ixartz-saas.mjs +87 -0
  294. package/dist/services/definitions/ixartz-saas.mjs.map +1 -0
  295. package/dist/services/definitions/jaeger.cjs +95 -0
  296. package/dist/services/definitions/jaeger.cjs.map +1 -0
  297. package/dist/services/definitions/jaeger.d.cts +7 -0
  298. package/dist/services/definitions/jaeger.d.cts.map +1 -0
  299. package/dist/services/definitions/jaeger.d.mts +7 -0
  300. package/dist/services/definitions/jaeger.d.mts.map +1 -0
  301. package/dist/services/definitions/jaeger.mjs +94 -0
  302. package/dist/services/definitions/jaeger.mjs.map +1 -0
  303. package/dist/services/definitions/jan.cjs +64 -0
  304. package/dist/services/definitions/jan.cjs.map +1 -0
  305. package/dist/services/definitions/jan.d.cts +7 -0
  306. package/dist/services/definitions/jan.d.cts.map +1 -0
  307. package/dist/services/definitions/jan.d.mts +7 -0
  308. package/dist/services/definitions/jan.d.mts.map +1 -0
  309. package/dist/services/definitions/jan.mjs +63 -0
  310. package/dist/services/definitions/jan.mjs.map +1 -0
  311. package/dist/services/definitions/jitsi-meet.cjs +102 -0
  312. package/dist/services/definitions/jitsi-meet.cjs.map +1 -0
  313. package/dist/services/definitions/jitsi-meet.d.cts +7 -0
  314. package/dist/services/definitions/jitsi-meet.d.cts.map +1 -0
  315. package/dist/services/definitions/jitsi-meet.d.mts +7 -0
  316. package/dist/services/definitions/jitsi-meet.d.mts.map +1 -0
  317. package/dist/services/definitions/jitsi-meet.mjs +101 -0
  318. package/dist/services/definitions/jitsi-meet.mjs.map +1 -0
  319. package/dist/services/definitions/local-ai.cjs +86 -0
  320. package/dist/services/definitions/local-ai.cjs.map +1 -0
  321. package/dist/services/definitions/local-ai.d.cts +7 -0
  322. package/dist/services/definitions/local-ai.d.cts.map +1 -0
  323. package/dist/services/definitions/local-ai.d.mts +7 -0
  324. package/dist/services/definitions/local-ai.d.mts.map +1 -0
  325. package/dist/services/definitions/local-ai.mjs +85 -0
  326. package/dist/services/definitions/local-ai.mjs.map +1 -0
  327. package/dist/services/definitions/metabase.cjs +108 -0
  328. package/dist/services/definitions/metabase.cjs.map +1 -0
  329. package/dist/services/definitions/metabase.d.cts +7 -0
  330. package/dist/services/definitions/metabase.d.cts.map +1 -0
  331. package/dist/services/definitions/metabase.d.mts +7 -0
  332. package/dist/services/definitions/metabase.d.mts.map +1 -0
  333. package/dist/services/definitions/metabase.mjs +107 -0
  334. package/dist/services/definitions/metabase.mjs.map +1 -0
  335. package/dist/services/definitions/mission-control.cjs +16 -2
  336. package/dist/services/definitions/mission-control.cjs.map +1 -1
  337. package/dist/services/definitions/mission-control.mjs +16 -2
  338. package/dist/services/definitions/mission-control.mjs.map +1 -1
  339. package/dist/services/definitions/mosquitto.cjs +82 -0
  340. package/dist/services/definitions/mosquitto.cjs.map +1 -0
  341. package/dist/services/definitions/mosquitto.d.cts +7 -0
  342. package/dist/services/definitions/mosquitto.d.cts.map +1 -0
  343. package/dist/services/definitions/mosquitto.d.mts +7 -0
  344. package/dist/services/definitions/mosquitto.d.mts.map +1 -0
  345. package/dist/services/definitions/mosquitto.mjs +81 -0
  346. package/dist/services/definitions/mosquitto.mjs.map +1 -0
  347. package/dist/services/definitions/navidrome.cjs +90 -0
  348. package/dist/services/definitions/navidrome.cjs.map +1 -0
  349. package/dist/services/definitions/navidrome.d.cts +7 -0
  350. package/dist/services/definitions/navidrome.d.cts.map +1 -0
  351. package/dist/services/definitions/navidrome.d.mts +7 -0
  352. package/dist/services/definitions/navidrome.d.mts.map +1 -0
  353. package/dist/services/definitions/navidrome.mjs +89 -0
  354. package/dist/services/definitions/navidrome.mjs.map +1 -0
  355. package/dist/services/definitions/nginx-proxy-manager.cjs +71 -0
  356. package/dist/services/definitions/nginx-proxy-manager.cjs.map +1 -0
  357. package/dist/services/definitions/nginx-proxy-manager.d.cts +7 -0
  358. package/dist/services/definitions/nginx-proxy-manager.d.cts.map +1 -0
  359. package/dist/services/definitions/nginx-proxy-manager.d.mts +7 -0
  360. package/dist/services/definitions/nginx-proxy-manager.d.mts.map +1 -0
  361. package/dist/services/definitions/nginx-proxy-manager.mjs +70 -0
  362. package/dist/services/definitions/nginx-proxy-manager.mjs.map +1 -0
  363. package/dist/services/definitions/node-red.cjs +77 -0
  364. package/dist/services/definitions/node-red.cjs.map +1 -0
  365. package/dist/services/definitions/node-red.d.cts +7 -0
  366. package/dist/services/definitions/node-red.d.cts.map +1 -0
  367. package/dist/services/definitions/node-red.d.mts +7 -0
  368. package/dist/services/definitions/node-red.d.mts.map +1 -0
  369. package/dist/services/definitions/node-red.mjs +76 -0
  370. package/dist/services/definitions/node-red.mjs.map +1 -0
  371. package/dist/services/definitions/open-saas.cjs +81 -0
  372. package/dist/services/definitions/open-saas.cjs.map +1 -0
  373. package/dist/services/definitions/open-saas.d.cts +7 -0
  374. package/dist/services/definitions/open-saas.d.cts.map +1 -0
  375. package/dist/services/definitions/open-saas.d.mts +7 -0
  376. package/dist/services/definitions/open-saas.d.mts.map +1 -0
  377. package/dist/services/definitions/open-saas.mjs +80 -0
  378. package/dist/services/definitions/open-saas.mjs.map +1 -0
  379. package/dist/services/definitions/photoprism.cjs +126 -0
  380. package/dist/services/definitions/photoprism.cjs.map +1 -0
  381. package/dist/services/definitions/photoprism.d.cts +7 -0
  382. package/dist/services/definitions/photoprism.d.cts.map +1 -0
  383. package/dist/services/definitions/photoprism.d.mts +7 -0
  384. package/dist/services/definitions/photoprism.d.mts.map +1 -0
  385. package/dist/services/definitions/photoprism.mjs +125 -0
  386. package/dist/services/definitions/photoprism.mjs.map +1 -0
  387. package/dist/services/definitions/pihole.cjs +73 -0
  388. package/dist/services/definitions/pihole.cjs.map +1 -0
  389. package/dist/services/definitions/pihole.d.cts +7 -0
  390. package/dist/services/definitions/pihole.d.cts.map +1 -0
  391. package/dist/services/definitions/pihole.d.mts +7 -0
  392. package/dist/services/definitions/pihole.d.mts.map +1 -0
  393. package/dist/services/definitions/pihole.mjs +72 -0
  394. package/dist/services/definitions/pihole.mjs.map +1 -0
  395. package/dist/services/definitions/piper-tts.cjs +70 -0
  396. package/dist/services/definitions/piper-tts.cjs.map +1 -0
  397. package/dist/services/definitions/piper-tts.d.cts +7 -0
  398. package/dist/services/definitions/piper-tts.d.cts.map +1 -0
  399. package/dist/services/definitions/piper-tts.d.mts +7 -0
  400. package/dist/services/definitions/piper-tts.d.mts.map +1 -0
  401. package/dist/services/definitions/piper-tts.mjs +69 -0
  402. package/dist/services/definitions/piper-tts.mjs.map +1 -0
  403. package/dist/services/definitions/plane.cjs +75 -0
  404. package/dist/services/definitions/plane.cjs.map +1 -0
  405. package/dist/services/definitions/plane.d.cts +7 -0
  406. package/dist/services/definitions/plane.d.cts.map +1 -0
  407. package/dist/services/definitions/plane.d.mts +7 -0
  408. package/dist/services/definitions/plane.d.mts.map +1 -0
  409. package/dist/services/definitions/plane.mjs +74 -0
  410. package/dist/services/definitions/plane.mjs.map +1 -0
  411. package/dist/services/definitions/plausible.cjs +94 -0
  412. package/dist/services/definitions/plausible.cjs.map +1 -0
  413. package/dist/services/definitions/plausible.d.cts +7 -0
  414. package/dist/services/definitions/plausible.d.cts.map +1 -0
  415. package/dist/services/definitions/plausible.d.mts +7 -0
  416. package/dist/services/definitions/plausible.d.mts.map +1 -0
  417. package/dist/services/definitions/plausible.mjs +93 -0
  418. package/dist/services/definitions/plausible.mjs.map +1 -0
  419. package/dist/services/definitions/pocket-id.cjs +101 -0
  420. package/dist/services/definitions/pocket-id.cjs.map +1 -0
  421. package/dist/services/definitions/pocket-id.d.cts +7 -0
  422. package/dist/services/definitions/pocket-id.d.cts.map +1 -0
  423. package/dist/services/definitions/pocket-id.d.mts +7 -0
  424. package/dist/services/definitions/pocket-id.d.mts.map +1 -0
  425. package/dist/services/definitions/pocket-id.mjs +100 -0
  426. package/dist/services/definitions/pocket-id.mjs.map +1 -0
  427. package/dist/services/definitions/posthog.cjs +94 -0
  428. package/dist/services/definitions/posthog.cjs.map +1 -0
  429. package/dist/services/definitions/posthog.d.cts +7 -0
  430. package/dist/services/definitions/posthog.d.cts.map +1 -0
  431. package/dist/services/definitions/posthog.d.mts +7 -0
  432. package/dist/services/definitions/posthog.d.mts.map +1 -0
  433. package/dist/services/definitions/posthog.mjs +93 -0
  434. package/dist/services/definitions/posthog.mjs.map +1 -0
  435. package/dist/services/definitions/redis.cjs +1 -1
  436. package/dist/services/definitions/redis.cjs.map +1 -1
  437. package/dist/services/definitions/redis.mjs +1 -1
  438. package/dist/services/definitions/redis.mjs.map +1 -1
  439. package/dist/services/definitions/revolt.cjs +64 -0
  440. package/dist/services/definitions/revolt.cjs.map +1 -0
  441. package/dist/services/definitions/revolt.d.cts +7 -0
  442. package/dist/services/definitions/revolt.d.cts.map +1 -0
  443. package/dist/services/definitions/revolt.d.mts +7 -0
  444. package/dist/services/definitions/revolt.d.mts.map +1 -0
  445. package/dist/services/definitions/revolt.mjs +63 -0
  446. package/dist/services/definitions/revolt.mjs.map +1 -0
  447. package/dist/services/definitions/sentry.cjs +101 -0
  448. package/dist/services/definitions/sentry.cjs.map +1 -0
  449. package/dist/services/definitions/sentry.d.cts +7 -0
  450. package/dist/services/definitions/sentry.d.cts.map +1 -0
  451. package/dist/services/definitions/sentry.d.mts +7 -0
  452. package/dist/services/definitions/sentry.d.mts.map +1 -0
  453. package/dist/services/definitions/sentry.mjs +100 -0
  454. package/dist/services/definitions/sentry.mjs.map +1 -0
  455. package/dist/services/definitions/sonarqube.cjs +86 -0
  456. package/dist/services/definitions/sonarqube.cjs.map +1 -0
  457. package/dist/services/definitions/sonarqube.d.cts +7 -0
  458. package/dist/services/definitions/sonarqube.d.cts.map +1 -0
  459. package/dist/services/definitions/sonarqube.d.mts +7 -0
  460. package/dist/services/definitions/sonarqube.d.mts.map +1 -0
  461. package/dist/services/definitions/sonarqube.mjs +85 -0
  462. package/dist/services/definitions/sonarqube.mjs.map +1 -0
  463. package/dist/services/definitions/superset.cjs +77 -0
  464. package/dist/services/definitions/superset.cjs.map +1 -0
  465. package/dist/services/definitions/superset.d.cts +7 -0
  466. package/dist/services/definitions/superset.d.cts.map +1 -0
  467. package/dist/services/definitions/superset.d.mts +7 -0
  468. package/dist/services/definitions/superset.d.mts.map +1 -0
  469. package/dist/services/definitions/superset.mjs +76 -0
  470. package/dist/services/definitions/superset.mjs.map +1 -0
  471. package/dist/services/definitions/surrealdb.cjs +72 -0
  472. package/dist/services/definitions/surrealdb.cjs.map +1 -0
  473. package/dist/services/definitions/surrealdb.d.cts +7 -0
  474. package/dist/services/definitions/surrealdb.d.cts.map +1 -0
  475. package/dist/services/definitions/surrealdb.d.mts +7 -0
  476. package/dist/services/definitions/surrealdb.d.mts.map +1 -0
  477. package/dist/services/definitions/surrealdb.mjs +71 -0
  478. package/dist/services/definitions/surrealdb.mjs.map +1 -0
  479. package/dist/services/definitions/tabby-ml.cjs +70 -0
  480. package/dist/services/definitions/tabby-ml.cjs.map +1 -0
  481. package/dist/services/definitions/tabby-ml.d.cts +7 -0
  482. package/dist/services/definitions/tabby-ml.d.cts.map +1 -0
  483. package/dist/services/definitions/tabby-ml.d.mts +7 -0
  484. package/dist/services/definitions/tabby-ml.d.mts.map +1 -0
  485. package/dist/services/definitions/tabby-ml.mjs +69 -0
  486. package/dist/services/definitions/tabby-ml.mjs.map +1 -0
  487. package/dist/services/definitions/tempo.cjs +57 -0
  488. package/dist/services/definitions/tempo.cjs.map +1 -0
  489. package/dist/services/definitions/tempo.d.cts +7 -0
  490. package/dist/services/definitions/tempo.d.cts.map +1 -0
  491. package/dist/services/definitions/tempo.d.mts +7 -0
  492. package/dist/services/definitions/tempo.d.mts.map +1 -0
  493. package/dist/services/definitions/tempo.mjs +56 -0
  494. package/dist/services/definitions/tempo.mjs.map +1 -0
  495. package/dist/services/definitions/text-gen-webui.cjs +88 -0
  496. package/dist/services/definitions/text-gen-webui.cjs.map +1 -0
  497. package/dist/services/definitions/text-gen-webui.d.cts +7 -0
  498. package/dist/services/definitions/text-gen-webui.d.cts.map +1 -0
  499. package/dist/services/definitions/text-gen-webui.d.mts +7 -0
  500. package/dist/services/definitions/text-gen-webui.d.mts.map +1 -0
  501. package/dist/services/definitions/text-gen-webui.mjs +87 -0
  502. package/dist/services/definitions/text-gen-webui.mjs.map +1 -0
  503. package/dist/services/definitions/timescaledb.cjs +87 -0
  504. package/dist/services/definitions/timescaledb.cjs.map +1 -0
  505. package/dist/services/definitions/timescaledb.d.cts +7 -0
  506. package/dist/services/definitions/timescaledb.d.cts.map +1 -0
  507. package/dist/services/definitions/timescaledb.d.mts +7 -0
  508. package/dist/services/definitions/timescaledb.d.mts.map +1 -0
  509. package/dist/services/definitions/timescaledb.mjs +86 -0
  510. package/dist/services/definitions/timescaledb.mjs.map +1 -0
  511. package/dist/services/definitions/valkey.cjs +1 -1
  512. package/dist/services/definitions/valkey.cjs.map +1 -1
  513. package/dist/services/definitions/valkey.mjs +1 -1
  514. package/dist/services/definitions/valkey.mjs.map +1 -1
  515. package/dist/services/definitions/vector-log.cjs +59 -0
  516. package/dist/services/definitions/vector-log.cjs.map +1 -0
  517. package/dist/services/definitions/vector-log.d.cts +7 -0
  518. package/dist/services/definitions/vector-log.d.cts.map +1 -0
  519. package/dist/services/definitions/vector-log.d.mts +7 -0
  520. package/dist/services/definitions/vector-log.d.mts.map +1 -0
  521. package/dist/services/definitions/vector-log.mjs +58 -0
  522. package/dist/services/definitions/vector-log.mjs.map +1 -0
  523. package/dist/services/definitions/vikunja.cjs +96 -0
  524. package/dist/services/definitions/vikunja.cjs.map +1 -0
  525. package/dist/services/definitions/vikunja.d.cts +7 -0
  526. package/dist/services/definitions/vikunja.d.cts.map +1 -0
  527. package/dist/services/definitions/vikunja.d.mts +7 -0
  528. package/dist/services/definitions/vikunja.d.mts.map +1 -0
  529. package/dist/services/definitions/vikunja.mjs +95 -0
  530. package/dist/services/definitions/vikunja.mjs.map +1 -0
  531. package/dist/services/definitions/wireguard.cjs +88 -0
  532. package/dist/services/definitions/wireguard.cjs.map +1 -0
  533. package/dist/services/definitions/wireguard.d.cts +7 -0
  534. package/dist/services/definitions/wireguard.d.cts.map +1 -0
  535. package/dist/services/definitions/wireguard.d.mts +7 -0
  536. package/dist/services/definitions/wireguard.d.mts.map +1 -0
  537. package/dist/services/definitions/wireguard.mjs +87 -0
  538. package/dist/services/definitions/wireguard.mjs.map +1 -0
  539. package/dist/services/definitions/woodpecker-ci.cjs +93 -0
  540. package/dist/services/definitions/woodpecker-ci.cjs.map +1 -0
  541. package/dist/services/definitions/woodpecker-ci.d.cts +7 -0
  542. package/dist/services/definitions/woodpecker-ci.d.cts.map +1 -0
  543. package/dist/services/definitions/woodpecker-ci.d.mts +7 -0
  544. package/dist/services/definitions/woodpecker-ci.d.mts.map +1 -0
  545. package/dist/services/definitions/woodpecker-ci.mjs +92 -0
  546. package/dist/services/definitions/woodpecker-ci.mjs.map +1 -0
  547. package/dist/services/definitions/zulip.cjs +116 -0
  548. package/dist/services/definitions/zulip.cjs.map +1 -0
  549. package/dist/services/definitions/zulip.d.cts +7 -0
  550. package/dist/services/definitions/zulip.d.cts.map +1 -0
  551. package/dist/services/definitions/zulip.d.mts +7 -0
  552. package/dist/services/definitions/zulip.d.mts.map +1 -0
  553. package/dist/services/definitions/zulip.mjs +115 -0
  554. package/dist/services/definitions/zulip.mjs.map +1 -0
  555. package/dist/services/registry.cjs +3 -0
  556. package/dist/services/registry.cjs.map +1 -1
  557. package/dist/services/registry.d.cts.map +1 -1
  558. package/dist/services/registry.d.mts.map +1 -1
  559. package/dist/services/registry.mjs +3 -0
  560. package/dist/services/registry.mjs.map +1 -1
  561. package/dist/services/registry.test.cjs +8 -1
  562. package/dist/services/registry.test.cjs.map +1 -1
  563. package/dist/services/registry.test.mjs +8 -1
  564. package/dist/services/registry.test.mjs.map +1 -1
  565. package/dist/{skill-manifest-BVUXU0__.mjs → skill-manifest-6XhrhWsG.mjs} +49 -1
  566. package/dist/{skill-manifest--IgY9REK.cjs.map → skill-manifest-6XhrhWsG.mjs.map} +1 -1
  567. package/dist/{skill-manifest--IgY9REK.cjs → skill-manifest-B8znSsym.cjs} +49 -1
  568. package/dist/{skill-manifest-BVUXU0__.mjs.map → skill-manifest-B8znSsym.cjs.map} +1 -1
  569. package/dist/skills/registry.cjs +3 -3
  570. package/dist/skills/registry.cjs.map +1 -1
  571. package/dist/skills/registry.mjs +3 -3
  572. package/dist/skills/registry.mjs.map +1 -1
  573. package/dist/skills/skill-manifest.cjs +1 -1
  574. package/dist/skills/skill-manifest.mjs +1 -1
  575. package/dist/track-analytics.cjs +50 -0
  576. package/dist/track-analytics.cjs.map +1 -0
  577. package/dist/track-analytics.d.cts +34 -0
  578. package/dist/track-analytics.d.cts.map +1 -0
  579. package/dist/track-analytics.d.mts +34 -0
  580. package/dist/track-analytics.d.mts.map +1 -0
  581. package/dist/track-analytics.mjs +48 -0
  582. package/dist/track-analytics.mjs.map +1 -0
  583. package/dist/track-analytics.test.cjs +91 -0
  584. package/dist/track-analytics.test.cjs.map +1 -0
  585. package/dist/track-analytics.test.d.cts +1 -0
  586. package/dist/track-analytics.test.d.mts +1 -0
  587. package/dist/track-analytics.test.mjs +92 -0
  588. package/dist/track-analytics.test.mjs.map +1 -0
  589. package/dist/types.cjs +35 -0
  590. package/dist/types.cjs.map +1 -1
  591. package/dist/types.d.cts +5 -2
  592. package/dist/types.d.cts.map +1 -1
  593. package/dist/types.d.mts +5 -2
  594. package/dist/types.d.mts.map +1 -1
  595. package/dist/types.mjs +35 -0
  596. package/dist/types.mjs.map +1 -1
  597. package/dist/validator.test.cjs +1 -1
  598. package/dist/validator.test.mjs +1 -1
  599. package/dist/version-manager.cjs +1 -1
  600. package/dist/version-manager.cjs.map +1 -1
  601. package/dist/version-manager.mjs +1 -1
  602. package/dist/version-manager.mjs.map +1 -1
  603. package/dist/version-manager.test.cjs +7 -5
  604. package/dist/version-manager.test.cjs.map +1 -1
  605. package/dist/version-manager.test.mjs +7 -5
  606. package/dist/version-manager.test.mjs.map +1 -1
  607. package/dist/{vi.2VT5v0um-DvC3SVNc.mjs → vi.2VT5v0um-C_jmO7m2.mjs} +5 -5
  608. package/dist/{vi.2VT5v0um-DvC3SVNc.mjs.map → vi.2VT5v0um-C_jmO7m2.mjs.map} +1 -1
  609. package/dist/{vi.2VT5v0um-CRqXre87.cjs → vi.2VT5v0um-iVBt6Fyq.cjs} +5 -5
  610. package/dist/{vi.2VT5v0um-CRqXre87.cjs.map → vi.2VT5v0um-iVBt6Fyq.cjs.map} +1 -1
  611. package/package.json +1 -1
  612. package/src/__snapshots__/composer.snapshot.test.ts.snap +285 -65
  613. package/src/bare-metal-partition.test.ts +4 -3
  614. package/src/composer.test.ts +4 -2
  615. package/src/composer.ts +45 -16
  616. package/src/generate.test.ts +2 -1
  617. package/src/generate.ts +11 -1
  618. package/src/generators/clone-repos.test.ts +154 -0
  619. package/src/generators/clone-repos.ts +159 -0
  620. package/src/generators/env.ts +214 -0
  621. package/src/generators/openclaw-json.ts +156 -1
  622. package/src/generators/postgres-init.ts +17 -0
  623. package/src/generators/readme.ts +2 -1
  624. package/src/generators/scripts.test.ts +52 -4
  625. package/src/generators/scripts.ts +351 -3
  626. package/src/generators/stack-manifest.ts +4 -2
  627. package/src/index.ts +8 -0
  628. package/src/presets/registry.ts +20 -0
  629. package/src/resolver.test.ts +53 -15
  630. package/src/resolver.ts +13 -1
  631. package/src/schema.ts +37 -4
  632. package/src/services/definitions/adguard-home.ts +79 -0
  633. package/src/services/definitions/apptension-saas.ts +84 -0
  634. package/src/services/definitions/audiobookshelf.ts +83 -0
  635. package/src/services/definitions/baserow.ts +118 -0
  636. package/src/services/definitions/boxyhq-saas.ts +84 -0
  637. package/src/services/definitions/calibre-web.ts +95 -0
  638. package/src/services/definitions/clickhouse.ts +115 -0
  639. package/src/services/definitions/cloudflared.ts +55 -0
  640. package/src/services/definitions/cmsaas-starter.ts +84 -0
  641. package/src/services/definitions/cockroachdb.ts +75 -0
  642. package/src/services/definitions/coder.ts +68 -0
  643. package/src/services/definitions/dragonfly.ts +68 -0
  644. package/src/services/definitions/drone-ci.ts +96 -0
  645. package/src/services/definitions/element-web.ts +62 -0
  646. package/src/services/definitions/focalboard.ts +69 -0
  647. package/src/services/definitions/forgejo.ts +109 -0
  648. package/src/services/definitions/graylog.ts +101 -0
  649. package/src/services/definitions/index.ts +159 -0
  650. package/src/services/definitions/influxdb.ts +109 -0
  651. package/src/services/definitions/invoke-ai.ts +76 -0
  652. package/src/services/definitions/ixartz-saas.ts +84 -0
  653. package/src/services/definitions/jaeger.ts +94 -0
  654. package/src/services/definitions/jan.ts +68 -0
  655. package/src/services/definitions/jitsi-meet.ts +108 -0
  656. package/src/services/definitions/local-ai.ts +90 -0
  657. package/src/services/definitions/metabase.ts +111 -0
  658. package/src/services/definitions/mission-control.ts +19 -2
  659. package/src/services/definitions/mosquitto.ts +84 -0
  660. package/src/services/definitions/navidrome.ts +95 -0
  661. package/src/services/definitions/nginx-proxy-manager.ts +70 -0
  662. package/src/services/definitions/node-red.ts +83 -0
  663. package/src/services/definitions/open-saas.ts +79 -0
  664. package/src/services/definitions/photoprism.ts +130 -0
  665. package/src/services/definitions/pihole.ts +79 -0
  666. package/src/services/definitions/piper-tts.ts +76 -0
  667. package/src/services/definitions/plane.ts +75 -0
  668. package/src/services/definitions/plausible.ts +97 -0
  669. package/src/services/definitions/pocket-id.ts +98 -0
  670. package/src/services/definitions/posthog.ts +97 -0
  671. package/src/services/definitions/redis.ts +1 -1
  672. package/src/services/definitions/revolt.ts +68 -0
  673. package/src/services/definitions/sentry.ts +104 -0
  674. package/src/services/definitions/sonarqube.ts +85 -0
  675. package/src/services/definitions/superset.ts +84 -0
  676. package/src/services/definitions/surrealdb.ts +77 -0
  677. package/src/services/definitions/tabby-ml.ts +76 -0
  678. package/src/services/definitions/tempo.ts +59 -0
  679. package/src/services/definitions/text-gen-webui.ts +92 -0
  680. package/src/services/definitions/timescaledb.ts +90 -0
  681. package/src/services/definitions/valkey.ts +1 -1
  682. package/src/services/definitions/vector-log.ts +61 -0
  683. package/src/services/definitions/vikunja.ts +96 -0
  684. package/src/services/definitions/wireguard.ts +89 -0
  685. package/src/services/definitions/woodpecker-ci.ts +97 -0
  686. package/src/services/definitions/zulip.ts +117 -0
  687. package/src/services/registry.test.ts +8 -0
  688. package/src/services/registry.ts +7 -0
  689. package/src/skills/manifest.json +64 -0
  690. package/src/skills/registry.ts +3 -3
  691. package/src/track-analytics.test.ts +82 -0
  692. package/src/track-analytics.ts +76 -0
  693. package/src/types.ts +40 -0
  694. package/src/version-manager.test.ts +10 -5
  695. package/src/version-manager.ts +1 -1
  696. package/dist/schema-C_hc7e4k.d.cts.map +0 -1
  697. package/dist/schema-CaesJaS2.d.mts.map +0 -1
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * Returns a map of file paths (relative to project root) to file contents.
5
5
  */
6
- export function generateScripts(): Record<string, string> {
6
+ export function generateScripts(options?: { hasGitServices?: boolean }): Record<string, string> {
7
+ const hasGit = options?.hasGitServices ?? false;
7
8
  const files: Record<string, string> = {};
8
9
 
9
10
  // ── scripts/start.sh ────────────────────────────────────────────────────
@@ -136,6 +137,14 @@ if [ "$EMPTY_SECRETS" -gt 0 ]; then
136
137
  echo ""
137
138
  fi
138
139
 
140
+ # ── Clone git-based repositories (if any) ────────────────────────────────────
141
+
142
+ if [ -f "$SCRIPT_DIR/clone-repos.sh" ]; then
143
+ info "Cloning/updating SaaS boilerplate repositories..."
144
+ bash "$SCRIPT_DIR/clone-repos.sh"
145
+ ok "Repositories ready."
146
+ fi
147
+
139
148
  # ── Pull and start ───────────────────────────────────────────────────────────
140
149
 
141
150
  echo ""
@@ -144,7 +153,7 @@ docker compose pull --quiet 2>/dev/null || docker compose pull
144
153
 
145
154
  echo ""
146
155
  info "Starting services..."
147
- docker compose up -d --remove-orphans
156
+ docker compose up -d --remove-orphans${hasGit ? " --build" : ""}
148
157
 
149
158
  # ── Health-check loop ────────────────────────────────────────────────────────
150
159
 
@@ -243,13 +252,19 @@ cd "$PROJECT_DIR"
243
252
  echo "🐾 OpenClaw — Updating services..."
244
253
  echo ""
245
254
 
255
+ # Update git-based repositories (if any)
256
+ if [ -f "$SCRIPT_DIR/clone-repos.sh" ]; then
257
+ echo "📂 Updating SaaS boilerplate repositories..."
258
+ bash "$SCRIPT_DIR/clone-repos.sh"
259
+ fi
260
+
246
261
  # Pull latest images
247
262
  echo "📦 Pulling latest images..."
248
263
  docker compose pull
249
264
 
250
265
  echo ""
251
266
  echo "🔄 Restarting services with new images..."
252
- docker compose up -d --remove-orphans
267
+ docker compose up -d --remove-orphans${hasGit ? " --build" : ""}
253
268
 
254
269
  echo ""
255
270
  echo "⏳ Waiting for services to stabilize..."
@@ -356,6 +371,339 @@ echo "── Network ───────────────────
356
371
  echo ""
357
372
 
358
373
  docker network ls --filter "name=openclaw" --format "table {{.Name}}\\t{{.Driver}}\\t{{.Scope}}" 2>/dev/null || true
374
+ `;
375
+
376
+ // ═══════════════════════════════════════════════════════════════════════
377
+ // PowerShell equivalents
378
+ // ═══════════════════════════════════════════════════════════════════════
379
+
380
+ // ── scripts/start.ps1 ───────────────────────────────────────────────────
381
+
382
+ files["scripts/start.ps1"] = `#Requires -Version 5.1
383
+ <#
384
+ .SYNOPSIS
385
+ OpenClaw Start Script — validates prerequisites, auto-generates secrets,
386
+ creates required directories, and starts all services via Docker Compose.
387
+ #>
388
+
389
+ $ErrorActionPreference = 'Stop'
390
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
391
+ $ProjectDir = Split-Path -Parent $ScriptDir
392
+ Set-Location $ProjectDir
393
+
394
+ function Info { param($Msg) Write-Host " i $Msg" -ForegroundColor Cyan }
395
+ function Ok { param($Msg) Write-Host " + $Msg" -ForegroundColor Green }
396
+ function Warn { param($Msg) Write-Host " ! $Msg" -ForegroundColor Yellow }
397
+ function Err { param($Msg) Write-Host " x $Msg" -ForegroundColor Red }
398
+
399
+ Write-Host ""
400
+ Write-Host "OpenClaw - Starting services..." -ForegroundColor White
401
+ Write-Host ""
402
+
403
+ # ── Prerequisite checks ─────────────────────────────────────────────────
404
+ if (-not (Get-Command docker -ErrorAction SilentlyContinue)) {
405
+ Err "Docker is not installed. Please install Docker Desktop."
406
+ Write-Host " https://docs.docker.com/desktop/install/windows-install/"
407
+ exit 1
408
+ }
409
+
410
+ $composeCheck = docker compose version 2>&1
411
+ if ($LASTEXITCODE -ne 0) {
412
+ Err "Docker Compose (v2) is not available."
413
+ Write-Host " https://docs.docker.com/compose/install/"
414
+ exit 1
415
+ }
416
+
417
+ $dockerInfo = docker info 2>&1
418
+ if ($LASTEXITCODE -ne 0) {
419
+ Err "Docker daemon is not running. Please start Docker Desktop."
420
+ exit 1
421
+ }
422
+
423
+ # ── Source .env if it exists ─────────────────────────────────────────────
424
+ if (Test-Path ".env") {
425
+ Info "Loading existing .env file..."
426
+ Get-Content ".env" | ForEach-Object {
427
+ if ($_ -match '^([^#=]+)=(.*)$') {
428
+ [Environment]::SetEnvironmentVariable($Matches[1].Trim(), $Matches[2].Trim(), 'Process')
429
+ }
430
+ }
431
+ } else {
432
+ Warn ".env file not found - will create one from .env.example if available."
433
+ if (Test-Path ".env.example") {
434
+ Copy-Item ".env.example" ".env"
435
+ Info "Created .env from .env.example"
436
+ Get-Content ".env" | ForEach-Object {
437
+ if ($_ -match '^([^#=]+)=(.*)$') {
438
+ [Environment]::SetEnvironmentVariable($Matches[1].Trim(), $Matches[2].Trim(), 'Process')
439
+ }
440
+ }
441
+ }
442
+ }
443
+
444
+ # ── Auto-generate OPENCLAW_GATEWAY_TOKEN if missing ──────────────────────
445
+ if (-not $env:OPENCLAW_GATEWAY_TOKEN) {
446
+ Info "Generating OPENCLAW_GATEWAY_TOKEN..."
447
+ $bytes = New-Object byte[] 32
448
+ [System.Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($bytes)
449
+ $env:OPENCLAW_GATEWAY_TOKEN = ($bytes | ForEach-Object { $_.ToString("x2") }) -join ''
450
+
451
+ if (Test-Path ".env") {
452
+ $envContent = Get-Content ".env" -Raw
453
+ if ($envContent -match '(?m)^OPENCLAW_GATEWAY_TOKEN=') {
454
+ $envContent = $envContent -replace '(?m)^OPENCLAW_GATEWAY_TOKEN=.*', "OPENCLAW_GATEWAY_TOKEN=$($env:OPENCLAW_GATEWAY_TOKEN)"
455
+ Set-Content ".env" $envContent -NoNewline
456
+ } else {
457
+ Add-Content ".env" "OPENCLAW_GATEWAY_TOKEN=$($env:OPENCLAW_GATEWAY_TOKEN)"
458
+ }
459
+ }
460
+ Ok "Gateway token generated and saved."
461
+ }
462
+
463
+ # ── Apply defaults ───────────────────────────────────────────────────────
464
+ if (-not $env:OPENCLAW_VERSION) { $env:OPENCLAW_VERSION = "latest" }
465
+ if (-not $env:OPENCLAW_GATEWAY_PORT) { $env:OPENCLAW_GATEWAY_PORT = "18789" }
466
+ if (-not $env:OPENCLAW_BRIDGE_PORT) { $env:OPENCLAW_BRIDGE_PORT = "18790" }
467
+ if (-not $env:OPENCLAW_GATEWAY_BIND) { $env:OPENCLAW_GATEWAY_BIND = "lan" }
468
+ if (-not $env:OPENCLAW_CONFIG_DIR) { $env:OPENCLAW_CONFIG_DIR = "./openclaw/config" }
469
+ if (-not $env:OPENCLAW_WORKSPACE_DIR) { $env:OPENCLAW_WORKSPACE_DIR = "./openclaw/workspace" }
470
+
471
+ # ── Create required host directories ────────────────────────────────────
472
+ Info "Ensuring host directories exist..."
473
+ New-Item -ItemType Directory -Force -Path $env:OPENCLAW_CONFIG_DIR | Out-Null
474
+ New-Item -ItemType Directory -Force -Path $env:OPENCLAW_WORKSPACE_DIR | Out-Null
475
+ Ok "Directories ready: $($env:OPENCLAW_CONFIG_DIR), $($env:OPENCLAW_WORKSPACE_DIR)"
476
+
477
+ # ── Clone git-based repositories (if any) ─────────────────────────────
478
+ $cloneScript = Join-Path $ScriptDir "clone-repos.ps1"
479
+ if (Test-Path $cloneScript) {
480
+ Info "Cloning/updating SaaS boilerplate repositories..."
481
+ & $cloneScript
482
+ Ok "Repositories ready."
483
+ }
484
+
485
+ # ── Pull and start ───────────────────────────────────────────────────────
486
+ Write-Host ""
487
+ Info "Pulling latest images..."
488
+ docker compose pull 2>$null
489
+ if ($LASTEXITCODE -ne 0) { docker compose pull }
490
+
491
+ Write-Host ""
492
+ Info "Starting services..."
493
+ docker compose up -d --remove-orphans${hasGit ? " --build" : ""}
494
+
495
+ # ── Health-check loop ────────────────────────────────────────────────────
496
+ Write-Host ""
497
+ Info "Waiting for services to become healthy..."
498
+ Start-Sleep -Seconds 5
499
+
500
+ $retries = 0
501
+ $maxRetries = 30
502
+ while ($retries -lt $maxRetries) {
503
+ $psOutput = docker compose ps --format json 2>$null
504
+ $unhealthy = ($psOutput | Select-String -Pattern '"unhealthy"' -SimpleMatch).Count
505
+ $starting = ($psOutput | Select-String -Pattern '"starting"' -SimpleMatch).Count
506
+ if ($unhealthy -eq 0 -and $starting -eq 0) { break }
507
+ $retries++
508
+ Start-Sleep -Seconds 2
509
+ }
510
+
511
+ Write-Host ""
512
+ docker compose ps
513
+ Write-Host ""
514
+
515
+ if ($retries -ge $maxRetries) {
516
+ Warn "Some services may still be starting. Check: docker compose ps"
517
+ } else {
518
+ Ok "All services are running!"
519
+ }
520
+
521
+ # ── Print service URLs & token ───────────────────────────────────────────
522
+ $gatewayHost = if ($env:OPENCLAW_GATEWAY_BIND -eq "lan") { "0.0.0.0" } else { "localhost" }
523
+
524
+ Write-Host ""
525
+ Write-Host "==============================================================================="
526
+ Write-Host " OpenClaw is ready!"
527
+ Write-Host "==============================================================================="
528
+ Write-Host ""
529
+ Write-Host " Gateway URL: http://\${gatewayHost}:$($env:OPENCLAW_GATEWAY_PORT)"
530
+ Write-Host " Bridge (WebSocket): ws://\${gatewayHost}:$($env:OPENCLAW_BRIDGE_PORT)"
531
+ Write-Host " Config directory: $($env:OPENCLAW_CONFIG_DIR)"
532
+ Write-Host " Workspace directory: $($env:OPENCLAW_WORKSPACE_DIR)"
533
+ Write-Host ""
534
+ Write-Host " Gateway Token: $($env:OPENCLAW_GATEWAY_TOKEN)"
535
+ Write-Host ""
536
+ Write-Host " Manage:"
537
+ Write-Host " Stop: .\\scripts\\stop.ps1"
538
+ Write-Host " Status: .\\scripts\\status.ps1"
539
+ Write-Host " Update: .\\scripts\\update.ps1"
540
+ Write-Host " Logs: docker compose logs -f"
541
+ Write-Host ""
542
+ Write-Host "==============================================================================="
543
+ `;
544
+
545
+ // ── scripts/stop.ps1 ────────────────────────────────────────────────────
546
+
547
+ files["scripts/stop.ps1"] = `#Requires -Version 5.1
548
+ <#
549
+ .SYNOPSIS
550
+ OpenClaw Stop Script — gracefully stops all services.
551
+ #>
552
+
553
+ $ErrorActionPreference = 'Stop'
554
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
555
+ $ProjectDir = Split-Path -Parent $ScriptDir
556
+ Set-Location $ProjectDir
557
+
558
+ Write-Host ""
559
+ Write-Host "OpenClaw - Stopping services..." -ForegroundColor White
560
+ Write-Host ""
561
+
562
+ docker compose down --timeout 30
563
+
564
+ Write-Host ""
565
+ Write-Host " + All services stopped." -ForegroundColor Green
566
+ `;
567
+
568
+ // ── scripts/update.ps1 ──────────────────────────────────────────────────
569
+
570
+ files["scripts/update.ps1"] = `#Requires -Version 5.1
571
+ <#
572
+ .SYNOPSIS
573
+ OpenClaw Update Script — pulls latest images and restarts services.
574
+ #>
575
+
576
+ $ErrorActionPreference = 'Stop'
577
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
578
+ $ProjectDir = Split-Path -Parent $ScriptDir
579
+ Set-Location $ProjectDir
580
+
581
+ Write-Host ""
582
+ Write-Host "OpenClaw - Updating services..." -ForegroundColor White
583
+ Write-Host ""
584
+
585
+ # Update git-based repositories (if any)
586
+ $cloneScript = Join-Path $ScriptDir "clone-repos.ps1"
587
+ if (Test-Path $cloneScript) {
588
+ Write-Host " Updating SaaS boilerplate repositories..." -ForegroundColor Cyan
589
+ & $cloneScript
590
+ }
591
+
592
+ Write-Host " Pulling latest images..." -ForegroundColor Cyan
593
+ docker compose pull
594
+
595
+ Write-Host ""
596
+ Write-Host " Restarting services with new images..." -ForegroundColor Cyan
597
+ docker compose up -d --remove-orphans${hasGit ? " --build" : ""}
598
+
599
+ Write-Host ""
600
+ Write-Host " Waiting for services to stabilize..." -ForegroundColor Cyan
601
+ Start-Sleep -Seconds 10
602
+
603
+ docker compose ps
604
+
605
+ Write-Host ""
606
+ Write-Host " + Update complete!" -ForegroundColor Green
607
+ `;
608
+
609
+ // ── scripts/backup.ps1 ──────────────────────────────────────────────────
610
+
611
+ files["scripts/backup.ps1"] = `#Requires -Version 5.1
612
+ <#
613
+ .SYNOPSIS
614
+ OpenClaw Backup Script — backs up all named Docker volumes to a timestamped directory.
615
+ #>
616
+
617
+ $ErrorActionPreference = 'Stop'
618
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
619
+ $ProjectDir = Split-Path -Parent $ScriptDir
620
+ Set-Location $ProjectDir
621
+
622
+ $timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
623
+ $backupDir = Join-Path $ProjectDir "backups\\$timestamp"
624
+ New-Item -ItemType Directory -Force -Path $backupDir | Out-Null
625
+
626
+ Write-Host ""
627
+ Write-Host "OpenClaw - Backing up volumes..." -ForegroundColor White
628
+ Write-Host " Backup directory: $backupDir"
629
+ Write-Host ""
630
+
631
+ # Get project name from docker compose
632
+ $projectName = "openclaw"
633
+ try {
634
+ $configJson = docker compose config --format json 2>$null | ConvertFrom-Json
635
+ if ($configJson.name) { $projectName = $configJson.name }
636
+ } catch {}
637
+
638
+ # List all volumes for this project
639
+ $volumes = docker volume ls --filter "name=$projectName" --format "{{.Name}}" 2>$null
640
+ if (-not $volumes) {
641
+ Write-Host " ! No volumes found for project: $projectName" -ForegroundColor Yellow
642
+ Write-Host " Trying to list all openclaw volumes..."
643
+ $volumes = docker volume ls --filter "name=openclaw" --format "{{.Name}}" 2>$null
644
+ }
645
+
646
+ if (-not $volumes) {
647
+ Write-Host " x No volumes found to back up." -ForegroundColor Red
648
+ exit 1
649
+ }
650
+
651
+ $backedUp = 0
652
+ foreach ($volume in $volumes) {
653
+ $vol = $volume.Trim()
654
+ if (-not $vol) { continue }
655
+ Write-Host " Backing up: $vol" -ForegroundColor Cyan
656
+ docker run --rm -v "\${vol}:/source:ro" -v "\${backupDir}:/backup" alpine tar czf "/backup/$vol.tar.gz" -C /source .
657
+ $size = (Get-Item (Join-Path $backupDir "$vol.tar.gz")).Length / 1MB
658
+ Write-Host " + $vol ($([math]::Round($size, 1))MB)" -ForegroundColor Green
659
+ $backedUp++
660
+ }
661
+
662
+ $totalSize = ((Get-ChildItem $backupDir -Recurse | Measure-Object -Property Length -Sum).Sum) / 1MB
663
+ Write-Host ""
664
+ Write-Host " + Backed up $backedUp volume(s) ($([math]::Round($totalSize, 1))MB total)" -ForegroundColor Green
665
+ Write-Host " Location: $backupDir"
666
+ `;
667
+
668
+ // ── scripts/status.ps1 ──────────────────────────────────────────────────
669
+
670
+ files["scripts/status.ps1"] = `#Requires -Version 5.1
671
+ <#
672
+ .SYNOPSIS
673
+ OpenClaw Status Script — shows the current status of all services.
674
+ #>
675
+
676
+ $ErrorActionPreference = 'Stop'
677
+ $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
678
+ $ProjectDir = Split-Path -Parent $ScriptDir
679
+ Set-Location $ProjectDir
680
+
681
+ Write-Host ""
682
+ Write-Host "OpenClaw - Service Status" -ForegroundColor White
683
+ Write-Host ""
684
+
685
+ # Show compose status
686
+ docker compose ps
687
+
688
+ Write-Host ""
689
+ Write-Host "-- Resource Usage ----------------------------------------------------------"
690
+ Write-Host ""
691
+
692
+ try { docker compose top 2>$null } catch {}
693
+
694
+ Write-Host ""
695
+ Write-Host "-- Disk Usage --------------------------------------------------------------"
696
+ Write-Host ""
697
+
698
+ try { docker system df 2>$null } catch {}
699
+
700
+ Write-Host ""
701
+ Write-Host "-- Network -----------------------------------------------------------------"
702
+ Write-Host ""
703
+
704
+ try {
705
+ docker network ls --filter "name=openclaw" --format "table {{.Name}}\\t{{.Driver}}\\t{{.Scope}}" 2>$null
706
+ } catch {}
359
707
  `;
360
708
 
361
709
  return files;
@@ -13,8 +13,9 @@ export interface StackManifestService {
13
13
  name: string;
14
14
  category: string;
15
15
  icon: string;
16
- image: string;
17
- imageTag: string;
16
+ image?: string;
17
+ imageTag?: string;
18
+ gitRepoUrl?: string;
18
19
  ports: { container: number; host?: number; exposed: boolean; description: string }[];
19
20
  docsUrl: string;
20
21
  addedBy: string;
@@ -72,6 +73,7 @@ export function generateStackManifest(
72
73
  icon: def.icon,
73
74
  image: def.image,
74
75
  imageTag: def.imageTag,
76
+ gitRepoUrl: def.gitSource?.repoUrl,
75
77
  ports: def.ports.map((p) => ({
76
78
  container: p.container,
77
79
  host: p.host,
package/src/index.ts CHANGED
@@ -28,6 +28,7 @@ export {
28
28
  export { StackConfigError, ValidationError } from "./errors.js";
29
29
  export { generate, generateServicesDoc } from "./generate.js";
30
30
  export { generateCaddyfile } from "./generators/caddy.js";
31
+ export { generateCloneScripts } from "./generators/clone-repos.js";
31
32
  export type { EnvVarGroup } from "./generators/env.js";
32
33
  export { generateEnvFiles, getStructuredEnvVars } from "./generators/env.js";
33
34
  export {
@@ -44,6 +45,9 @@ export { generatePrometheusConfig } from "./generators/prometheus.js";
44
45
  export { generateReadme } from "./generators/readme.js";
45
46
  export { generateScripts } from "./generators/scripts.js";
46
47
  export { generateSkillFiles } from "./generators/skills.js";
48
+ // ─── Analytics ─────────────────────────────────────────────────────────────
49
+ export type { AnalyticsPayload } from "./track-analytics.js";
50
+ export { buildAnalyticsPayload, trackAnalytics } from "./track-analytics.js";
47
51
  export type {
48
52
  StackManifest,
49
53
  StackManifestService,
@@ -69,6 +73,7 @@ export { resolve } from "./resolver.js";
69
73
  export {
70
74
  AddedDependencySchema,
71
75
  ApiErrorSchema,
76
+ BuildContextSchema,
72
77
  ComposeOptionsSchema,
73
78
  DeploymentTargetSchema,
74
79
  DeploymentTypeSchema,
@@ -77,6 +82,7 @@ export {
77
82
  EnvVariableSchema,
78
83
  ErrorSchema,
79
84
  GenerationInputSchema,
85
+ GitSourceSchema,
80
86
  HealthCheckSchema,
81
87
  MaturitySchema,
82
88
  NativePlatformSchema,
@@ -127,6 +133,7 @@ export type {
127
133
  AddedDependency,
128
134
  AiProvider,
129
135
  ApiError,
136
+ BuildContext,
130
137
  CategoryInfo,
131
138
  ComposeOptions,
132
139
  Deploy,
@@ -138,6 +145,7 @@ export type {
138
145
  GenerationInput,
139
146
  GenerationMetadata,
140
147
  GenerationResult,
148
+ GitSource,
141
149
  GsdRuntime,
142
150
  HealthCheck,
143
151
  Maturity,
@@ -102,6 +102,26 @@ const presets: Preset[] = [
102
102
  skillPacks: ["ai-playground"],
103
103
  estimatedMemoryMB: 4096,
104
104
  },
105
+ {
106
+ id: "ai-virtual-desktop",
107
+ name: "AI Virtual Desktop",
108
+ description:
109
+ "Self-hosted autonomous AI agent with local LLM, vector memory, web search, browser automation, and workflow orchestration. The open-source alternative to Manus and Perplexity Computer.",
110
+ services: [
111
+ "ollama",
112
+ "qdrant",
113
+ "postgresql",
114
+ "redis",
115
+ "minio",
116
+ "n8n",
117
+ "browserless",
118
+ "open-webui",
119
+ "searxng",
120
+ "caddy",
121
+ ],
122
+ skillPacks: ["research-agent", "dev-ops"],
123
+ estimatedMemoryMB: 6144,
124
+ },
105
125
  {
106
126
  id: "coding-team",
107
127
  name: "Coding Team",
@@ -1,18 +1,30 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import { resolve } from "./resolver.js";
3
3
 
4
+ // Mandatory services (convex, mission-control, tailscale) are always auto-included.
5
+ // These IDs and their combined memory are accounted for in all tests.
6
+ const MANDATORY_IDS = ["convex", "mission-control", "tailscale"];
7
+ const MANDATORY_MEMORY = 256 + 128 + 64; // convex + mission-control + tailscale
8
+
4
9
  describe("resolve", () => {
5
- it("returns empty services for empty input", () => {
10
+ it("returns only mandatory services for empty input", () => {
6
11
  const result = resolve({ services: [], skillPacks: [] });
7
- expect(result.services).toHaveLength(0);
12
+ const ids = result.services.map((s) => s.definition.id);
13
+ for (const id of MANDATORY_IDS) {
14
+ expect(ids).toContain(id);
15
+ }
8
16
  expect(result.isValid).toBe(true);
9
- expect(result.estimatedMemoryMB).toBe(512); // base OpenClaw only
17
+ // 512 (base) + mandatory services memory
18
+ expect(result.estimatedMemoryMB).toBe(512 + MANDATORY_MEMORY);
10
19
  });
11
20
 
12
- it("resolves a single service with no dependencies", () => {
21
+ it("resolves a single service alongside mandatory services", () => {
13
22
  const result = resolve({ services: ["redis"], skillPacks: [] });
14
- expect(result.services).toHaveLength(1);
15
- expect(result.services[0]!.definition.id).toBe("redis");
23
+ const ids = result.services.map((s) => s.definition.id);
24
+ expect(ids).toContain("redis");
25
+ for (const id of MANDATORY_IDS) {
26
+ expect(ids).toContain(id);
27
+ }
16
28
  expect(result.isValid).toBe(true);
17
29
  });
18
30
 
@@ -97,8 +109,8 @@ describe("resolve", () => {
97
109
 
98
110
  it("estimates memory correctly", () => {
99
111
  const result = resolve({ services: ["redis"], skillPacks: [] });
100
- // 512 (base) + 128 (redis) = 640
101
- expect(result.estimatedMemoryMB).toBe(640);
112
+ // 512 (base) + 128 (redis) + mandatory services
113
+ expect(result.estimatedMemoryMB).toBe(512 + 128 + MANDATORY_MEMORY);
102
114
  });
103
115
 
104
116
  it("adds proxy service when specified", () => {
@@ -133,18 +145,15 @@ describe("resolve", () => {
133
145
  });
134
146
 
135
147
  it("warns about GPU when AI services selected without gpu flag", () => {
136
- // Ollama doesn't have gpuRequired=true (it's recommended not required)
137
- // but we should still check GPU warning logic works
138
148
  const result = resolve({ services: ["redis"], skillPacks: [], gpu: false });
139
- // Redis doesn't need GPU, so no GPU warnings
140
149
  const gpuWarnings = result.warnings.filter((w) => w.type === "gpu");
141
150
  expect(gpuWarnings).toHaveLength(0);
142
151
  });
143
152
 
144
- it("resolves tailscale as single service with no dependencies", () => {
145
- const result = resolve({ services: ["tailscale"], skillPacks: [] });
146
- expect(result.services).toHaveLength(1);
147
- expect(result.services[0]!.definition.id).toBe("tailscale");
153
+ it("resolves tailscale (mandatory, always present)", () => {
154
+ const result = resolve({ services: [], skillPacks: [] });
155
+ const ids = result.services.map((s) => s.definition.id);
156
+ expect(ids).toContain("tailscale");
148
157
  expect(result.isValid).toBe(true);
149
158
  });
150
159
 
@@ -201,4 +210,33 @@ describe("resolve", () => {
201
210
  expect(backendIdx).toBeGreaterThan(livekitIdx);
202
211
  expect(frontendIdx).toBeGreaterThan(backendIdx);
203
212
  });
213
+
214
+ // ── Mandatory services enforcement ──────────────────────────────────────
215
+
216
+ it("auto-includes mandatory services even when not selected", () => {
217
+ const result = resolve({ services: ["redis"], skillPacks: [] });
218
+ const ids = result.services.map((s) => s.definition.id);
219
+ expect(ids).toContain("mission-control");
220
+ expect(ids).toContain("convex");
221
+ expect(ids).toContain("tailscale");
222
+ const mc = result.services.find((s) => s.definition.id === "mission-control");
223
+ expect(mc!.addedBy).toBe("mandatory");
224
+ });
225
+
226
+ it("marks user-selected mandatory services as 'user' not 'mandatory'", () => {
227
+ const result = resolve({ services: ["mission-control"], skillPacks: [] });
228
+ const mc = result.services.find((s) => s.definition.id === "mission-control");
229
+ expect(mc!.addedBy).toBe("user");
230
+ // convex should still be auto-added as dependency of mission-control
231
+ const convex = result.services.find((s) => s.definition.id === "convex");
232
+ expect(convex).toBeDefined();
233
+ });
234
+
235
+ it("orders convex before mission-control (dependency ordering)", () => {
236
+ const result = resolve({ services: ["redis"], skillPacks: [] });
237
+ const ids = result.services.map((s) => s.definition.id);
238
+ const convexIdx = ids.indexOf("convex");
239
+ const mcIdx = ids.indexOf("mission-control");
240
+ expect(convexIdx).toBeLessThan(mcIdx);
241
+ });
204
242
  });
package/src/resolver.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { getServiceById } from "./services/registry.js";
1
+ import { getAllServices, getServiceById } from "./services/registry.js";
2
2
  import { getSkillPackById } from "./skills/registry.js";
3
3
  import type {
4
4
  AddedDependency,
@@ -99,6 +99,18 @@ export function resolve(input: ResolverInput): ResolverOutput {
99
99
  }
100
100
  }
101
101
 
102
+ // Add mandatory platform services (mission-control, convex, tailscale, etc.)
103
+ for (const def of getAllServices()) {
104
+ if (def.mandatory && !serviceIds.has(def.id)) {
105
+ serviceIds.add(def.id);
106
+ serviceAddedBy.set(def.id, "mandatory");
107
+ addedDependencies.push({
108
+ service: def.id,
109
+ reason: "Mandatory OpenClaw platform service",
110
+ });
111
+ }
112
+ }
113
+
102
114
  // Validate all service IDs exist
103
115
  const unknownIds: string[] = [];
104
116
  for (const id of serviceIds) {