@better-openclaw/core 1.0.25 → 1.0.30

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 (1049) hide show
  1. package/README.md +66 -7
  2. package/dist/addon-stack.cjs +95 -30
  3. package/dist/addon-stack.cjs.map +1 -1
  4. package/dist/addon-stack.d.cts +1 -1
  5. package/dist/addon-stack.d.cts.map +1 -1
  6. package/dist/addon-stack.d.mts +1 -1
  7. package/dist/addon-stack.d.mts.map +1 -1
  8. package/dist/addon-stack.mjs +94 -29
  9. package/dist/addon-stack.mjs.map +1 -1
  10. package/dist/addon-stack.test.cjs +123 -11
  11. package/dist/addon-stack.test.cjs.map +1 -1
  12. package/dist/addon-stack.test.mjs +122 -10
  13. package/dist/addon-stack.test.mjs.map +1 -1
  14. package/dist/bare-metal-partition.d.cts +1 -1
  15. package/dist/bare-metal-partition.d.mts +1 -1
  16. package/dist/bare-metal-partition.test.cjs +1 -1
  17. package/dist/bare-metal-partition.test.mjs +1 -1
  18. package/dist/callback-sink-CdMKYayY.d.mts +15 -0
  19. package/dist/callback-sink-CdMKYayY.d.mts.map +1 -0
  20. package/dist/callback-sink-iNThWRnQ.d.cts +15 -0
  21. package/dist/callback-sink-iNThWRnQ.d.cts.map +1 -0
  22. package/dist/claude-code-fw-CrbAlzTM.d.mts +7 -0
  23. package/dist/claude-code-fw-CrbAlzTM.d.mts.map +1 -0
  24. package/dist/claude-code-fw-dKYH2prH.d.cts +7 -0
  25. package/dist/claude-code-fw-dKYH2prH.d.cts.map +1 -0
  26. package/dist/codex-fw-Ct8q4pzo.d.mts +7 -0
  27. package/dist/codex-fw-Ct8q4pzo.d.mts.map +1 -0
  28. package/dist/codex-fw-l7Ku8ZI8.d.cts +7 -0
  29. package/dist/codex-fw-l7Ku8ZI8.d.cts.map +1 -0
  30. package/dist/compose-validation.test.cjs +1 -1
  31. package/dist/composer.cjs +89 -129
  32. package/dist/composer.cjs.map +1 -1
  33. package/dist/composer.d.cts +3 -3
  34. package/dist/composer.d.cts.map +1 -1
  35. package/dist/composer.d.mts +3 -3
  36. package/dist/composer.d.mts.map +1 -1
  37. package/dist/composer.mjs +88 -128
  38. package/dist/composer.mjs.map +1 -1
  39. package/dist/composer.snapshot.test.cjs +1 -1
  40. package/dist/composer.snapshot.test.mjs +1 -1
  41. package/dist/composer.test.cjs +53 -2
  42. package/dist/composer.test.cjs.map +1 -1
  43. package/dist/composer.test.mjs +52 -1
  44. package/dist/composer.test.mjs.map +1 -1
  45. package/dist/console-sink-BHQpRyCt.d.cts +13 -0
  46. package/dist/console-sink-BHQpRyCt.d.cts.map +1 -0
  47. package/dist/console-sink-bouG_M1K.d.mts +13 -0
  48. package/dist/console-sink-bouG_M1K.d.mts.map +1 -0
  49. package/dist/{coolify-BVGGcMrT.d.mts → coolify-D5E0z01M.d.mts} +2 -2
  50. package/dist/{coolify-BVGGcMrT.d.mts.map → coolify-D5E0z01M.d.mts.map} +1 -1
  51. package/dist/{coolify-vlb1G9V2.d.cts → coolify-DjHecHCr.d.cts} +2 -2
  52. package/dist/{coolify-vlb1G9V2.d.cts.map → coolify-DjHecHCr.d.cts.map} +1 -1
  53. package/dist/copaw-BQyjioz7.d.cts +7 -0
  54. package/dist/copaw-BQyjioz7.d.cts.map +1 -0
  55. package/dist/copaw-C_3N7eQu.d.mts +7 -0
  56. package/dist/copaw-C_3N7eQu.d.mts.map +1 -0
  57. package/dist/deployers/coolify.cjs +25 -0
  58. package/dist/deployers/coolify.cjs.map +1 -1
  59. package/dist/deployers/coolify.d.cts +1 -1
  60. package/dist/deployers/coolify.d.mts +1 -1
  61. package/dist/deployers/coolify.mjs +25 -0
  62. package/dist/deployers/coolify.mjs.map +1 -1
  63. package/dist/deployers/dokploy.cjs +25 -0
  64. package/dist/deployers/dokploy.cjs.map +1 -1
  65. package/dist/deployers/dokploy.d.cts +1 -1
  66. package/dist/deployers/dokploy.d.mts +1 -1
  67. package/dist/deployers/dokploy.mjs +25 -0
  68. package/dist/deployers/dokploy.mjs.map +1 -1
  69. package/dist/deployers/index.d.cts +3 -3
  70. package/dist/deployers/index.d.mts +3 -3
  71. package/dist/deployers/strip-host-ports.cjs +1 -1
  72. package/dist/deployers/strip-host-ports.test.cjs +1 -1
  73. package/dist/deployers/strip-host-ports.test.mjs +1 -1
  74. package/dist/deployers/types.d.cts +1 -1
  75. package/dist/deployers/types.d.mts +1 -1
  76. package/dist/{dokploy-8cbrxUun.d.cts → dokploy-BnVDjWCV.d.cts} +2 -2
  77. package/dist/{dokploy-8cbrxUun.d.cts.map → dokploy-BnVDjWCV.d.cts.map} +1 -1
  78. package/dist/{dokploy-BTflLhTM.d.mts → dokploy-BqLdCfyR.d.mts} +2 -2
  79. package/dist/{dokploy-BTflLhTM.d.mts.map → dokploy-BqLdCfyR.d.mts.map} +1 -1
  80. package/dist/frameworks/claude-code-fw.cjs +79 -0
  81. package/dist/frameworks/claude-code-fw.cjs.map +1 -0
  82. package/dist/frameworks/claude-code-fw.d.cts +2 -0
  83. package/dist/frameworks/claude-code-fw.d.mts +2 -0
  84. package/dist/frameworks/claude-code-fw.mjs +78 -0
  85. package/dist/frameworks/claude-code-fw.mjs.map +1 -0
  86. package/dist/frameworks/codex-fw.cjs +67 -0
  87. package/dist/frameworks/codex-fw.cjs.map +1 -0
  88. package/dist/frameworks/codex-fw.d.cts +2 -0
  89. package/dist/frameworks/codex-fw.d.mts +2 -0
  90. package/dist/frameworks/codex-fw.mjs +66 -0
  91. package/dist/frameworks/codex-fw.mjs.map +1 -0
  92. package/dist/frameworks/copaw.cjs +118 -0
  93. package/dist/frameworks/copaw.cjs.map +1 -0
  94. package/dist/frameworks/copaw.d.cts +2 -0
  95. package/dist/frameworks/copaw.d.mts +2 -0
  96. package/dist/frameworks/copaw.mjs +117 -0
  97. package/dist/frameworks/copaw.mjs.map +1 -0
  98. package/dist/frameworks/index.cjs +35 -0
  99. package/dist/frameworks/index.cjs.map +1 -0
  100. package/dist/frameworks/index.d.cts +11 -0
  101. package/dist/frameworks/index.d.mts +11 -0
  102. package/dist/frameworks/index.mjs +22 -0
  103. package/dist/frameworks/index.mjs.map +1 -0
  104. package/dist/frameworks/memu.cjs +118 -0
  105. package/dist/frameworks/memu.cjs.map +1 -0
  106. package/dist/frameworks/memu.d.cts +2 -0
  107. package/dist/frameworks/memu.d.mts +2 -0
  108. package/dist/frameworks/memu.mjs +117 -0
  109. package/dist/frameworks/memu.mjs.map +1 -0
  110. package/dist/frameworks/nanobot.cjs +126 -0
  111. package/dist/frameworks/nanobot.cjs.map +1 -0
  112. package/dist/frameworks/nanobot.d.cts +2 -0
  113. package/dist/frameworks/nanobot.d.mts +2 -0
  114. package/dist/frameworks/nanobot.mjs +125 -0
  115. package/dist/frameworks/nanobot.mjs.map +1 -0
  116. package/dist/frameworks/nanoclaw.cjs +99 -0
  117. package/dist/frameworks/nanoclaw.cjs.map +1 -0
  118. package/dist/frameworks/nanoclaw.d.cts +2 -0
  119. package/dist/frameworks/nanoclaw.d.mts +2 -0
  120. package/dist/frameworks/nanoclaw.mjs +98 -0
  121. package/dist/frameworks/nanoclaw.mjs.map +1 -0
  122. package/dist/frameworks/openclaw.cjs +253 -0
  123. package/dist/frameworks/openclaw.cjs.map +1 -0
  124. package/dist/frameworks/openclaw.d.cts +2 -0
  125. package/dist/frameworks/openclaw.d.mts +2 -0
  126. package/dist/frameworks/openclaw.mjs +251 -0
  127. package/dist/frameworks/openclaw.mjs.map +1 -0
  128. package/dist/frameworks/registry.cjs +31 -0
  129. package/dist/frameworks/registry.cjs.map +1 -0
  130. package/dist/frameworks/registry.d.cts +2 -0
  131. package/dist/frameworks/registry.d.mts +2 -0
  132. package/dist/frameworks/registry.mjs +26 -0
  133. package/dist/frameworks/registry.mjs.map +1 -0
  134. package/dist/frameworks/registry.test.cjs +110 -0
  135. package/dist/frameworks/registry.test.cjs.map +1 -0
  136. package/dist/frameworks/registry.test.d.cts +1 -0
  137. package/dist/frameworks/registry.test.d.mts +1 -0
  138. package/dist/frameworks/registry.test.mjs +111 -0
  139. package/dist/frameworks/registry.test.mjs.map +1 -0
  140. package/dist/frameworks/types.cjs +0 -0
  141. package/dist/frameworks/types.d.cts +2 -0
  142. package/dist/frameworks/types.d.mts +2 -0
  143. package/dist/frameworks/types.mjs +1 -0
  144. package/dist/frameworks/zeroclaw.cjs +123 -0
  145. package/dist/frameworks/zeroclaw.cjs.map +1 -0
  146. package/dist/frameworks/zeroclaw.d.cts +2 -0
  147. package/dist/frameworks/zeroclaw.d.mts +2 -0
  148. package/dist/frameworks/zeroclaw.mjs +122 -0
  149. package/dist/frameworks/zeroclaw.mjs.map +1 -0
  150. package/dist/generate.cjs +64 -13
  151. package/dist/generate.cjs.map +1 -1
  152. package/dist/generate.d.cts +5 -2
  153. package/dist/generate.d.cts.map +1 -1
  154. package/dist/generate.d.mts +5 -2
  155. package/dist/generate.d.mts.map +1 -1
  156. package/dist/generate.mjs +63 -12
  157. package/dist/generate.mjs.map +1 -1
  158. package/dist/generate.test.cjs +42 -6
  159. package/dist/generate.test.cjs.map +1 -1
  160. package/dist/generate.test.mjs +41 -5
  161. package/dist/generate.test.mjs.map +1 -1
  162. package/dist/generators/bare-metal-install.d.cts +1 -1
  163. package/dist/generators/bare-metal-install.d.mts +1 -1
  164. package/dist/generators/bare-metal-install.test.cjs +1 -1
  165. package/dist/generators/bare-metal-install.test.mjs +1 -1
  166. package/dist/generators/caddy.cjs +9 -3
  167. package/dist/generators/caddy.cjs.map +1 -1
  168. package/dist/generators/caddy.d.cts +1 -1
  169. package/dist/generators/caddy.d.mts +1 -1
  170. package/dist/generators/caddy.mjs +9 -3
  171. package/dist/generators/caddy.mjs.map +1 -1
  172. package/dist/generators/caddy.test.cjs +30 -2
  173. package/dist/generators/caddy.test.cjs.map +1 -1
  174. package/dist/generators/caddy.test.mjs +30 -2
  175. package/dist/generators/caddy.test.mjs.map +1 -1
  176. package/dist/generators/clone-repos.cjs.map +1 -1
  177. package/dist/generators/clone-repos.d.cts +1 -1
  178. package/dist/generators/clone-repos.d.mts +1 -1
  179. package/dist/generators/clone-repos.mjs.map +1 -1
  180. package/dist/generators/clone-repos.test.cjs +1 -1
  181. package/dist/generators/clone-repos.test.cjs.map +1 -1
  182. package/dist/generators/clone-repos.test.mjs +1 -1
  183. package/dist/generators/clone-repos.test.mjs.map +1 -1
  184. package/dist/generators/env.cjs +28 -103
  185. package/dist/generators/env.cjs.map +1 -1
  186. package/dist/generators/env.d.cts +4 -1
  187. package/dist/generators/env.d.cts.map +1 -1
  188. package/dist/generators/env.d.mts +4 -1
  189. package/dist/generators/env.d.mts.map +1 -1
  190. package/dist/generators/env.mjs +27 -102
  191. package/dist/generators/env.mjs.map +1 -1
  192. package/dist/generators/env.test.cjs +3 -3
  193. package/dist/generators/env.test.cjs.map +1 -1
  194. package/dist/generators/env.test.mjs +3 -3
  195. package/dist/generators/env.test.mjs.map +1 -1
  196. package/dist/generators/get-shit-done.d.cts +1 -1
  197. package/dist/generators/get-shit-done.d.mts +1 -1
  198. package/dist/generators/health-check.cjs +6 -6
  199. package/dist/generators/health-check.cjs.map +1 -1
  200. package/dist/generators/health-check.d.cts +1 -1
  201. package/dist/generators/health-check.d.mts +1 -1
  202. package/dist/generators/health-check.mjs +6 -6
  203. package/dist/generators/health-check.mjs.map +1 -1
  204. package/dist/generators/health-check.test.cjs +1 -1
  205. package/dist/generators/health-check.test.mjs +1 -1
  206. package/dist/generators/n8n-workflows.d.cts +1 -1
  207. package/dist/generators/n8n-workflows.d.mts +1 -1
  208. package/dist/generators/native-services.d.cts +1 -1
  209. package/dist/generators/native-services.d.mts +1 -1
  210. package/dist/generators/openclaw-json.cjs +60 -4
  211. package/dist/generators/openclaw-json.cjs.map +1 -1
  212. package/dist/generators/openclaw-json.d.cts +1 -5
  213. package/dist/generators/openclaw-json.d.cts.map +1 -1
  214. package/dist/generators/openclaw-json.d.mts +1 -5
  215. package/dist/generators/openclaw-json.d.mts.map +1 -1
  216. package/dist/generators/openclaw-json.mjs +60 -4
  217. package/dist/generators/openclaw-json.mjs.map +1 -1
  218. package/dist/generators/postgres-init.cjs +25 -0
  219. package/dist/generators/postgres-init.cjs.map +1 -1
  220. package/dist/generators/postgres-init.d.cts +1 -1
  221. package/dist/generators/postgres-init.d.cts.map +1 -1
  222. package/dist/generators/postgres-init.d.mts +1 -1
  223. package/dist/generators/postgres-init.d.mts.map +1 -1
  224. package/dist/generators/postgres-init.mjs +25 -0
  225. package/dist/generators/postgres-init.mjs.map +1 -1
  226. package/dist/generators/prometheus.d.cts +1 -1
  227. package/dist/generators/prometheus.d.mts +1 -1
  228. package/dist/generators/readme.cjs +50 -7
  229. package/dist/generators/readme.cjs.map +1 -1
  230. package/dist/generators/readme.d.cts +3 -1
  231. package/dist/generators/readme.d.cts.map +1 -1
  232. package/dist/generators/readme.d.mts +3 -1
  233. package/dist/generators/readme.d.mts.map +1 -1
  234. package/dist/generators/readme.mjs +50 -7
  235. package/dist/generators/readme.mjs.map +1 -1
  236. package/dist/generators/scripts.test.cjs +2 -2
  237. package/dist/generators/scripts.test.cjs.map +1 -1
  238. package/dist/generators/scripts.test.mjs +2 -2
  239. package/dist/generators/scripts.test.mjs.map +1 -1
  240. package/dist/generators/skills.cjs +1 -1
  241. package/dist/generators/skills.d.cts +1 -1
  242. package/dist/generators/skills.d.cts.map +1 -1
  243. package/dist/generators/skills.d.mts +1 -1
  244. package/dist/generators/skills.d.mts.map +1 -1
  245. package/dist/generators/skills.mjs +451 -0
  246. package/dist/generators/skills.mjs.map +1 -1
  247. package/dist/generators/stack-manifest.d.cts +1 -1
  248. package/dist/generators/stack-manifest.d.mts +1 -1
  249. package/dist/generators/traefik.d.cts +1 -1
  250. package/dist/generators/traefik.d.mts +1 -1
  251. package/dist/generators/traefik.test.cjs +12 -12
  252. package/dist/generators/traefik.test.cjs.map +1 -1
  253. package/dist/generators/traefik.test.mjs +12 -12
  254. package/dist/generators/traefik.test.mjs.map +1 -1
  255. package/dist/index.cjs +20 -2
  256. package/dist/index.d.cts +14 -7
  257. package/dist/index.d.mts +14 -7
  258. package/dist/index.mjs +10 -3
  259. package/dist/logger/__tests__/logger.test.cjs +308 -0
  260. package/dist/logger/__tests__/logger.test.cjs.map +1 -0
  261. package/dist/logger/__tests__/logger.test.d.cts +1 -0
  262. package/dist/logger/__tests__/logger.test.d.mts +1 -0
  263. package/dist/logger/__tests__/logger.test.mjs +308 -0
  264. package/dist/logger/__tests__/logger.test.mjs.map +1 -0
  265. package/dist/logger/index.cjs +10 -0
  266. package/dist/logger/index.d.cts +6 -0
  267. package/dist/logger/index.d.mts +6 -0
  268. package/dist/logger/index.mjs +5 -0
  269. package/dist/logger/logger.cjs +270 -0
  270. package/dist/logger/logger.cjs.map +1 -0
  271. package/dist/logger/logger.d.cts +2 -0
  272. package/dist/logger/logger.d.mts +2 -0
  273. package/dist/logger/logger.mjs +267 -0
  274. package/dist/logger/logger.mjs.map +1 -0
  275. package/dist/logger/sinks/callback-sink.cjs +18 -0
  276. package/dist/logger/sinks/callback-sink.cjs.map +1 -0
  277. package/dist/logger/sinks/callback-sink.d.cts +2 -0
  278. package/dist/logger/sinks/callback-sink.d.mts +2 -0
  279. package/dist/logger/sinks/callback-sink.mjs +17 -0
  280. package/dist/logger/sinks/callback-sink.mjs.map +1 -0
  281. package/dist/logger/sinks/console-sink.cjs +39 -0
  282. package/dist/logger/sinks/console-sink.cjs.map +1 -0
  283. package/dist/logger/sinks/console-sink.d.cts +2 -0
  284. package/dist/logger/sinks/console-sink.d.mts +2 -0
  285. package/dist/logger/sinks/console-sink.mjs +38 -0
  286. package/dist/logger/sinks/console-sink.mjs.map +1 -0
  287. package/dist/logger/sinks/file-sink.cjs +72 -0
  288. package/dist/logger/sinks/file-sink.cjs.map +1 -0
  289. package/dist/logger/sinks/file-sink.d.cts +36 -0
  290. package/dist/logger/sinks/file-sink.d.cts.map +1 -0
  291. package/dist/logger/sinks/file-sink.d.mts +36 -0
  292. package/dist/logger/sinks/file-sink.d.mts.map +1 -0
  293. package/dist/logger/sinks/file-sink.mjs +70 -0
  294. package/dist/logger/sinks/file-sink.mjs.map +1 -0
  295. package/dist/logger/types.cjs +0 -0
  296. package/dist/logger/types.d.cts +2 -0
  297. package/dist/logger/types.d.mts +2 -0
  298. package/dist/logger/types.mjs +1 -0
  299. package/dist/logger-CZ0Qnyiu.d.mts +66 -0
  300. package/dist/logger-CZ0Qnyiu.d.mts.map +1 -0
  301. package/dist/logger-DDfwai-A.d.cts +66 -0
  302. package/dist/logger-DDfwai-A.d.cts.map +1 -0
  303. package/dist/memu-BfRXtwmL.d.cts +7 -0
  304. package/dist/memu-BfRXtwmL.d.cts.map +1 -0
  305. package/dist/memu-C-fXbWr-.d.mts +7 -0
  306. package/dist/memu-C-fXbWr-.d.mts.map +1 -0
  307. package/dist/migrations.cjs +17 -9
  308. package/dist/migrations.cjs.map +1 -1
  309. package/dist/migrations.d.cts +1 -1
  310. package/dist/migrations.d.cts.map +1 -1
  311. package/dist/migrations.d.mts +1 -1
  312. package/dist/migrations.d.mts.map +1 -1
  313. package/dist/migrations.mjs +17 -9
  314. package/dist/migrations.mjs.map +1 -1
  315. package/dist/migrations.test.cjs +4 -4
  316. package/dist/migrations.test.mjs +4 -4
  317. package/dist/nanobot-2c0bS4lu.d.cts +7 -0
  318. package/dist/nanobot-2c0bS4lu.d.cts.map +1 -0
  319. package/dist/nanobot-BUO6pVQc.d.mts +7 -0
  320. package/dist/nanobot-BUO6pVQc.d.mts.map +1 -0
  321. package/dist/nanoclaw-CgHubEig.d.mts +7 -0
  322. package/dist/nanoclaw-CgHubEig.d.mts.map +1 -0
  323. package/dist/nanoclaw-Dvz0ef6J.d.cts +7 -0
  324. package/dist/nanoclaw-Dvz0ef6J.d.cts.map +1 -0
  325. package/dist/openclaw-D8lVecjC.d.mts +7 -0
  326. package/dist/openclaw-D8lVecjC.d.mts.map +1 -0
  327. package/dist/openclaw-DThj8i3N.d.cts +7 -0
  328. package/dist/openclaw-DThj8i3N.d.cts.map +1 -0
  329. package/dist/port-scanner.d.cts +1 -1
  330. package/dist/port-scanner.d.mts +1 -1
  331. package/dist/presets/presets.test.cjs +5 -5
  332. package/dist/presets/presets.test.cjs.map +1 -1
  333. package/dist/presets/presets.test.mjs +4 -4
  334. package/dist/presets/presets.test.mjs.map +1 -1
  335. package/dist/presets/registry.d.cts +1 -1
  336. package/dist/presets/registry.d.mts +1 -1
  337. package/dist/presets/registry.test.cjs +7 -7
  338. package/dist/presets/registry.test.cjs.map +1 -1
  339. package/dist/presets/registry.test.mjs +7 -7
  340. package/dist/presets/registry.test.mjs.map +1 -1
  341. package/dist/registry-DHX7vnVo.d.cts +16 -0
  342. package/dist/registry-DHX7vnVo.d.cts.map +1 -0
  343. package/dist/registry-DTAILnga.d.mts +16 -0
  344. package/dist/registry-DTAILnga.d.mts.map +1 -0
  345. package/dist/resolver.cjs +13 -3
  346. package/dist/resolver.cjs.map +1 -1
  347. package/dist/resolver.d.cts +1 -1
  348. package/dist/resolver.d.cts.map +1 -1
  349. package/dist/resolver.d.mts +1 -1
  350. package/dist/resolver.d.mts.map +1 -1
  351. package/dist/resolver.mjs +13 -3
  352. package/dist/resolver.mjs.map +1 -1
  353. package/dist/resolver.test.cjs +35 -3
  354. package/dist/resolver.test.cjs.map +1 -1
  355. package/dist/resolver.test.mjs +35 -3
  356. package/dist/resolver.test.mjs.map +1 -1
  357. package/dist/{schema-CKBRu-Rt.d.cts → schema-BSl9wiFe.d.mts} +139 -2
  358. package/dist/schema-BSl9wiFe.d.mts.map +1 -0
  359. package/dist/{schema-Dn-_Jpb6.d.mts → schema-Bd9l2r7p.d.cts} +139 -2
  360. package/dist/schema-Bd9l2r7p.d.cts.map +1 -0
  361. package/dist/schema.cjs +38 -5
  362. package/dist/schema.cjs.map +1 -1
  363. package/dist/schema.d.cts +2 -2
  364. package/dist/schema.d.mts +2 -2
  365. package/dist/schema.mjs +37 -5
  366. package/dist/schema.mjs.map +1 -1
  367. package/dist/schema.test.cjs +3 -3
  368. package/dist/schema.test.cjs.map +1 -1
  369. package/dist/schema.test.mjs +3 -3
  370. package/dist/schema.test.mjs.map +1 -1
  371. package/dist/services/definitions/adguard-home.d.cts +1 -1
  372. package/dist/services/definitions/adguard-home.d.mts +1 -1
  373. package/dist/services/definitions/agent-browser.cjs +161 -0
  374. package/dist/services/definitions/agent-browser.cjs.map +1 -0
  375. package/dist/services/definitions/agent-browser.d.cts +7 -0
  376. package/dist/services/definitions/agent-browser.d.cts.map +1 -0
  377. package/dist/services/definitions/agent-browser.d.mts +7 -0
  378. package/dist/services/definitions/agent-browser.d.mts.map +1 -0
  379. package/dist/services/definitions/agent-browser.mjs +160 -0
  380. package/dist/services/definitions/agent-browser.mjs.map +1 -0
  381. package/dist/services/definitions/airbyte.d.cts +1 -1
  382. package/dist/services/definitions/airbyte.d.mts +1 -1
  383. package/dist/services/definitions/airflow.d.cts +1 -1
  384. package/dist/services/definitions/airflow.d.mts +1 -1
  385. package/dist/services/definitions/anything-llm.d.cts +1 -1
  386. package/dist/services/definitions/anything-llm.d.mts +1 -1
  387. package/dist/services/definitions/appflowy.d.cts +1 -1
  388. package/dist/services/definitions/appflowy.d.mts +1 -1
  389. package/dist/services/definitions/apptension-saas.cjs.map +1 -1
  390. package/dist/services/definitions/apptension-saas.d.cts +1 -1
  391. package/dist/services/definitions/apptension-saas.d.mts +1 -1
  392. package/dist/services/definitions/apptension-saas.mjs.map +1 -1
  393. package/dist/services/definitions/appwrite.d.cts +1 -1
  394. package/dist/services/definitions/appwrite.d.mts +1 -1
  395. package/dist/services/definitions/audiobookshelf.d.cts +1 -1
  396. package/dist/services/definitions/audiobookshelf.d.mts +1 -1
  397. package/dist/services/definitions/authelia.d.cts +1 -1
  398. package/dist/services/definitions/authelia.d.mts +1 -1
  399. package/dist/services/definitions/authentik.d.cts +1 -1
  400. package/dist/services/definitions/authentik.d.mts +1 -1
  401. package/dist/services/definitions/axolotl.d.cts +1 -1
  402. package/dist/services/definitions/axolotl.d.mts +1 -1
  403. package/dist/services/definitions/baserow.d.cts +1 -1
  404. package/dist/services/definitions/baserow.d.mts +1 -1
  405. package/dist/services/definitions/beszel.d.cts +1 -1
  406. package/dist/services/definitions/beszel.d.mts +1 -1
  407. package/dist/services/definitions/boxyhq-saas.d.cts +1 -1
  408. package/dist/services/definitions/boxyhq-saas.d.mts +1 -1
  409. package/dist/services/definitions/browserless.d.cts +1 -1
  410. package/dist/services/definitions/browserless.d.mts +1 -1
  411. package/dist/services/definitions/burnlink.cjs +142 -0
  412. package/dist/services/definitions/burnlink.cjs.map +1 -0
  413. package/dist/services/definitions/burnlink.d.cts +7 -0
  414. package/dist/services/definitions/burnlink.d.cts.map +1 -0
  415. package/dist/services/definitions/burnlink.d.mts +7 -0
  416. package/dist/services/definitions/burnlink.d.mts.map +1 -0
  417. package/dist/services/definitions/burnlink.mjs +141 -0
  418. package/dist/services/definitions/burnlink.mjs.map +1 -0
  419. package/dist/services/definitions/caddy.d.cts +1 -1
  420. package/dist/services/definitions/caddy.d.mts +1 -1
  421. package/dist/services/definitions/cal-com.d.cts +1 -1
  422. package/dist/services/definitions/cal-com.d.mts +1 -1
  423. package/dist/services/definitions/calibre-web.d.cts +1 -1
  424. package/dist/services/definitions/calibre-web.d.mts +1 -1
  425. package/dist/services/definitions/chatwoot-worker.d.cts +1 -1
  426. package/dist/services/definitions/chatwoot-worker.d.mts +1 -1
  427. package/dist/services/definitions/chatwoot.d.cts +1 -1
  428. package/dist/services/definitions/chatwoot.d.mts +1 -1
  429. package/dist/services/definitions/chromadb.cjs +4 -1
  430. package/dist/services/definitions/chromadb.cjs.map +1 -1
  431. package/dist/services/definitions/chromadb.d.cts +1 -1
  432. package/dist/services/definitions/chromadb.d.mts +1 -1
  433. package/dist/services/definitions/chromadb.mjs +4 -1
  434. package/dist/services/definitions/chromadb.mjs.map +1 -1
  435. package/dist/services/definitions/claude-code.cjs +1 -1
  436. package/dist/services/definitions/claude-code.cjs.map +1 -1
  437. package/dist/services/definitions/claude-code.d.cts +1 -1
  438. package/dist/services/definitions/claude-code.d.mts +1 -1
  439. package/dist/services/definitions/claude-code.mjs +1 -1
  440. package/dist/services/definitions/claude-code.mjs.map +1 -1
  441. package/dist/services/definitions/clawrouter.cjs +138 -0
  442. package/dist/services/definitions/clawrouter.cjs.map +1 -0
  443. package/dist/services/definitions/clawrouter.d.cts +7 -0
  444. package/dist/services/definitions/clawrouter.d.cts.map +1 -0
  445. package/dist/services/definitions/clawrouter.d.mts +7 -0
  446. package/dist/services/definitions/clawrouter.d.mts.map +1 -0
  447. package/dist/services/definitions/clawrouter.mjs +137 -0
  448. package/dist/services/definitions/clawrouter.mjs.map +1 -0
  449. package/dist/services/definitions/clickhouse.d.cts +1 -1
  450. package/dist/services/definitions/clickhouse.d.mts +1 -1
  451. package/dist/services/definitions/cloudflared.d.cts +1 -1
  452. package/dist/services/definitions/cloudflared.d.mts +1 -1
  453. package/dist/services/definitions/cmsaas-starter.d.cts +1 -1
  454. package/dist/services/definitions/cmsaas-starter.d.mts +1 -1
  455. package/dist/services/definitions/cockroachdb.d.cts +1 -1
  456. package/dist/services/definitions/cockroachdb.d.mts +1 -1
  457. package/dist/services/definitions/code-server.d.cts +1 -1
  458. package/dist/services/definitions/code-server.d.mts +1 -1
  459. package/dist/services/definitions/coder.d.cts +1 -1
  460. package/dist/services/definitions/coder.d.mts +1 -1
  461. package/dist/services/definitions/codex.cjs +1 -1
  462. package/dist/services/definitions/codex.cjs.map +1 -1
  463. package/dist/services/definitions/codex.d.cts +1 -1
  464. package/dist/services/definitions/codex.d.mts +1 -1
  465. package/dist/services/definitions/codex.mjs +1 -1
  466. package/dist/services/definitions/codex.mjs.map +1 -1
  467. package/dist/services/definitions/comfyui.d.cts +1 -1
  468. package/dist/services/definitions/comfyui.d.mts +1 -1
  469. package/dist/services/definitions/convex-dashboard.d.cts +1 -1
  470. package/dist/services/definitions/convex-dashboard.d.mts +1 -1
  471. package/dist/services/definitions/convex.cjs.map +1 -1
  472. package/dist/services/definitions/convex.d.cts +1 -1
  473. package/dist/services/definitions/convex.d.mts +1 -1
  474. package/dist/services/definitions/convex.mjs.map +1 -1
  475. package/dist/services/definitions/coolify.d.cts +1 -1
  476. package/dist/services/definitions/coolify.d.mts +1 -1
  477. package/dist/services/definitions/copaw.cjs +97 -0
  478. package/dist/services/definitions/copaw.cjs.map +1 -0
  479. package/dist/services/definitions/copaw.d.cts +7 -0
  480. package/dist/services/definitions/copaw.d.cts.map +1 -0
  481. package/dist/services/definitions/copaw.d.mts +7 -0
  482. package/dist/services/definitions/copaw.d.mts.map +1 -0
  483. package/dist/services/definitions/copaw.mjs +96 -0
  484. package/dist/services/definitions/copaw.mjs.map +1 -0
  485. package/dist/services/definitions/crowdsec.d.cts +1 -1
  486. package/dist/services/definitions/crowdsec.d.mts +1 -1
  487. package/dist/services/definitions/dagster.d.cts +1 -1
  488. package/dist/services/definitions/dagster.d.mts +1 -1
  489. package/dist/services/definitions/desktop-environment.cjs +2 -1
  490. package/dist/services/definitions/desktop-environment.cjs.map +1 -1
  491. package/dist/services/definitions/desktop-environment.d.cts +1 -1
  492. package/dist/services/definitions/desktop-environment.d.mts +1 -1
  493. package/dist/services/definitions/desktop-environment.mjs +2 -1
  494. package/dist/services/definitions/desktop-environment.mjs.map +1 -1
  495. package/dist/services/definitions/dify.d.cts +1 -1
  496. package/dist/services/definitions/dify.d.mts +1 -1
  497. package/dist/services/definitions/directus.d.cts +1 -1
  498. package/dist/services/definitions/directus.d.mts +1 -1
  499. package/dist/services/definitions/docsgpt.d.cts +1 -1
  500. package/dist/services/definitions/docsgpt.d.mts +1 -1
  501. package/dist/services/definitions/dokploy.d.cts +1 -1
  502. package/dist/services/definitions/dokploy.d.mts +1 -1
  503. package/dist/services/definitions/dozzle.d.cts +1 -1
  504. package/dist/services/definitions/dozzle.d.mts +1 -1
  505. package/dist/services/definitions/dragonfly.d.cts +1 -1
  506. package/dist/services/definitions/dragonfly.d.mts +1 -1
  507. package/dist/services/definitions/drone-ci.d.cts +1 -1
  508. package/dist/services/definitions/drone-ci.d.mts +1 -1
  509. package/dist/services/definitions/duplicati.d.cts +1 -1
  510. package/dist/services/definitions/duplicati.d.mts +1 -1
  511. package/dist/services/definitions/element-web.d.cts +1 -1
  512. package/dist/services/definitions/element-web.d.mts +1 -1
  513. package/dist/services/definitions/excalidraw.d.cts +1 -1
  514. package/dist/services/definitions/excalidraw.d.mts +1 -1
  515. package/dist/services/definitions/ffmpeg.d.cts +1 -1
  516. package/dist/services/definitions/ffmpeg.d.mts +1 -1
  517. package/dist/services/definitions/firecrawl-playwright.d.cts +1 -1
  518. package/dist/services/definitions/firecrawl-playwright.d.mts +1 -1
  519. package/dist/services/definitions/firecrawl.d.cts +1 -1
  520. package/dist/services/definitions/firecrawl.d.mts +1 -1
  521. package/dist/services/definitions/flagsmith.d.cts +1 -1
  522. package/dist/services/definitions/flagsmith.d.mts +1 -1
  523. package/dist/services/definitions/flowise.d.cts +1 -1
  524. package/dist/services/definitions/flowise.d.mts +1 -1
  525. package/dist/services/definitions/focalboard.d.cts +1 -1
  526. package/dist/services/definitions/focalboard.d.mts +1 -1
  527. package/dist/services/definitions/fonoster.d.cts +1 -1
  528. package/dist/services/definitions/fonoster.d.mts +1 -1
  529. package/dist/services/definitions/forgejo.d.cts +1 -1
  530. package/dist/services/definitions/forgejo.d.mts +1 -1
  531. package/dist/services/definitions/formbricks.d.cts +1 -1
  532. package/dist/services/definitions/formbricks.d.mts +1 -1
  533. package/dist/services/definitions/gemini-cli.d.cts +1 -1
  534. package/dist/services/definitions/gemini-cli.d.mts +1 -1
  535. package/dist/services/definitions/ghost.d.cts +1 -1
  536. package/dist/services/definitions/ghost.d.mts +1 -1
  537. package/dist/services/definitions/gitea.d.cts +1 -1
  538. package/dist/services/definitions/gitea.d.mts +1 -1
  539. package/dist/services/definitions/gotify.d.cts +1 -1
  540. package/dist/services/definitions/gotify.d.mts +1 -1
  541. package/dist/services/definitions/grafana.d.cts +1 -1
  542. package/dist/services/definitions/grafana.d.mts +1 -1
  543. package/dist/services/definitions/graylog.d.cts +1 -1
  544. package/dist/services/definitions/graylog.d.mts +1 -1
  545. package/dist/services/definitions/headscale.d.cts +1 -1
  546. package/dist/services/definitions/headscale.d.mts +1 -1
  547. package/dist/services/definitions/hedgedoc.d.cts +1 -1
  548. package/dist/services/definitions/hedgedoc.d.mts +1 -1
  549. package/dist/services/definitions/hexstrike.d.cts +1 -1
  550. package/dist/services/definitions/hexstrike.d.mts +1 -1
  551. package/dist/services/definitions/heyform.d.cts +1 -1
  552. package/dist/services/definitions/heyform.d.mts +1 -1
  553. package/dist/services/definitions/hindsight.cjs +133 -0
  554. package/dist/services/definitions/hindsight.cjs.map +1 -0
  555. package/dist/services/definitions/hindsight.d.cts +7 -0
  556. package/dist/services/definitions/hindsight.d.cts.map +1 -0
  557. package/dist/services/definitions/hindsight.d.mts +7 -0
  558. package/dist/services/definitions/hindsight.d.mts.map +1 -0
  559. package/dist/services/definitions/hindsight.mjs +132 -0
  560. package/dist/services/definitions/hindsight.mjs.map +1 -0
  561. package/dist/services/definitions/homeassistant.d.cts +1 -1
  562. package/dist/services/definitions/homeassistant.d.mts +1 -1
  563. package/dist/services/definitions/hoppscotch.d.cts +1 -1
  564. package/dist/services/definitions/hoppscotch.d.mts +1 -1
  565. package/dist/services/definitions/immich.d.cts +1 -1
  566. package/dist/services/definitions/immich.d.mts +1 -1
  567. package/dist/services/definitions/index.cjs +50 -5
  568. package/dist/services/definitions/index.cjs.map +1 -1
  569. package/dist/services/definitions/index.d.cts +19 -4
  570. package/dist/services/definitions/index.d.cts.map +1 -1
  571. package/dist/services/definitions/index.d.mts +19 -4
  572. package/dist/services/definitions/index.d.mts.map +1 -1
  573. package/dist/services/definitions/index.mjs +36 -6
  574. package/dist/services/definitions/index.mjs.map +1 -1
  575. package/dist/services/definitions/infisical.d.cts +1 -1
  576. package/dist/services/definitions/infisical.d.mts +1 -1
  577. package/dist/services/definitions/influxdb.d.cts +1 -1
  578. package/dist/services/definitions/influxdb.d.mts +1 -1
  579. package/dist/services/definitions/invoke-ai.d.cts +1 -1
  580. package/dist/services/definitions/invoke-ai.d.mts +1 -1
  581. package/dist/services/definitions/ixartz-saas.d.cts +1 -1
  582. package/dist/services/definitions/ixartz-saas.d.mts +1 -1
  583. package/dist/services/definitions/jaeger.d.cts +1 -1
  584. package/dist/services/definitions/jaeger.d.mts +1 -1
  585. package/dist/services/definitions/jan.d.cts +1 -1
  586. package/dist/services/definitions/jan.d.mts +1 -1
  587. package/dist/services/definitions/jellyfin.d.cts +1 -1
  588. package/dist/services/definitions/jellyfin.d.mts +1 -1
  589. package/dist/services/definitions/jenkins.d.cts +1 -1
  590. package/dist/services/definitions/jenkins.d.mts +1 -1
  591. package/dist/services/definitions/jitsi-meet.d.cts +1 -1
  592. package/dist/services/definitions/jitsi-meet.d.mts +1 -1
  593. package/dist/services/definitions/keycloak.d.cts +1 -1
  594. package/dist/services/definitions/keycloak.d.mts +1 -1
  595. package/dist/services/definitions/kimi.d.cts +1 -1
  596. package/dist/services/definitions/kimi.d.mts +1 -1
  597. package/dist/services/definitions/kong.d.cts +1 -1
  598. package/dist/services/definitions/kong.d.mts +1 -1
  599. package/dist/services/definitions/lago.d.cts +1 -1
  600. package/dist/services/definitions/lago.d.mts +1 -1
  601. package/dist/services/definitions/langflow.d.cts +1 -1
  602. package/dist/services/definitions/langflow.d.mts +1 -1
  603. package/dist/services/definitions/langfuse.d.cts +1 -1
  604. package/dist/services/definitions/langfuse.d.mts +1 -1
  605. package/dist/services/definitions/lasuite-meet-agents.d.cts +1 -1
  606. package/dist/services/definitions/lasuite-meet-agents.d.mts +1 -1
  607. package/dist/services/definitions/lasuite-meet-backend.d.cts +1 -1
  608. package/dist/services/definitions/lasuite-meet-backend.d.mts +1 -1
  609. package/dist/services/definitions/lasuite-meet-frontend.d.cts +1 -1
  610. package/dist/services/definitions/lasuite-meet-frontend.d.mts +1 -1
  611. package/dist/services/definitions/librechat.d.cts +1 -1
  612. package/dist/services/definitions/librechat.d.mts +1 -1
  613. package/dist/services/definitions/lightpanda.d.cts +1 -1
  614. package/dist/services/definitions/lightpanda.d.mts +1 -1
  615. package/dist/services/definitions/listmonk.d.cts +1 -1
  616. package/dist/services/definitions/listmonk.d.mts +1 -1
  617. package/dist/services/definitions/litellm.d.cts +1 -1
  618. package/dist/services/definitions/litellm.d.mts +1 -1
  619. package/dist/services/definitions/livekit.d.cts +1 -1
  620. package/dist/services/definitions/livekit.d.mts +1 -1
  621. package/dist/services/definitions/local-ai.d.cts +1 -1
  622. package/dist/services/definitions/local-ai.d.mts +1 -1
  623. package/dist/services/definitions/loki.d.cts +1 -1
  624. package/dist/services/definitions/loki.d.mts +1 -1
  625. package/dist/services/definitions/mariadb.d.cts +1 -1
  626. package/dist/services/definitions/mariadb.d.mts +1 -1
  627. package/dist/services/definitions/matomo.d.cts +1 -1
  628. package/dist/services/definitions/matomo.d.mts +1 -1
  629. package/dist/services/definitions/matrix-synapse.d.cts +1 -1
  630. package/dist/services/definitions/matrix-synapse.d.mts +1 -1
  631. package/dist/services/definitions/mattermost.d.cts +1 -1
  632. package/dist/services/definitions/mattermost.d.mts +1 -1
  633. package/dist/services/definitions/mautic.d.cts +1 -1
  634. package/dist/services/definitions/mautic.d.mts +1 -1
  635. package/dist/services/definitions/medusa.d.cts +1 -1
  636. package/dist/services/definitions/medusa.d.mts +1 -1
  637. package/dist/services/definitions/meilisearch.d.cts +1 -1
  638. package/dist/services/definitions/meilisearch.d.mts +1 -1
  639. package/dist/services/definitions/mem0.cjs +133 -0
  640. package/dist/services/definitions/mem0.cjs.map +1 -0
  641. package/dist/services/definitions/mem0.d.cts +7 -0
  642. package/dist/services/definitions/mem0.d.cts.map +1 -0
  643. package/dist/services/definitions/mem0.d.mts +7 -0
  644. package/dist/services/definitions/mem0.d.mts.map +1 -0
  645. package/dist/services/definitions/mem0.mjs +132 -0
  646. package/dist/services/definitions/mem0.mjs.map +1 -0
  647. package/dist/services/definitions/memu.cjs +96 -0
  648. package/dist/services/definitions/memu.cjs.map +1 -0
  649. package/dist/services/definitions/memu.d.cts +7 -0
  650. package/dist/services/definitions/memu.d.cts.map +1 -0
  651. package/dist/services/definitions/memu.d.mts +7 -0
  652. package/dist/services/definitions/memu.d.mts.map +1 -0
  653. package/dist/services/definitions/memu.mjs +95 -0
  654. package/dist/services/definitions/memu.mjs.map +1 -0
  655. package/dist/services/definitions/metabase.d.cts +1 -1
  656. package/dist/services/definitions/metabase.d.mts +1 -1
  657. package/dist/services/definitions/milvus.cjs +4 -1
  658. package/dist/services/definitions/milvus.cjs.map +1 -1
  659. package/dist/services/definitions/milvus.d.cts +1 -1
  660. package/dist/services/definitions/milvus.d.mts +1 -1
  661. package/dist/services/definitions/milvus.mjs +4 -1
  662. package/dist/services/definitions/milvus.mjs.map +1 -1
  663. package/dist/services/definitions/minio.d.cts +1 -1
  664. package/dist/services/definitions/minio.d.mts +1 -1
  665. package/dist/services/definitions/mission-control.d.cts +1 -1
  666. package/dist/services/definitions/mission-control.d.mts +1 -1
  667. package/dist/services/definitions/mixpost.d.cts +1 -1
  668. package/dist/services/definitions/mixpost.d.mts +1 -1
  669. package/dist/services/definitions/mosquitto.d.cts +1 -1
  670. package/dist/services/definitions/mosquitto.d.mts +1 -1
  671. package/dist/services/definitions/motion-canvas.d.cts +1 -1
  672. package/dist/services/definitions/motion-canvas.d.mts +1 -1
  673. package/dist/services/definitions/mysql.d.cts +1 -1
  674. package/dist/services/definitions/mysql.d.mts +1 -1
  675. package/dist/services/definitions/n8n.d.cts +1 -1
  676. package/dist/services/definitions/n8n.d.mts +1 -1
  677. package/dist/services/definitions/nanobot.cjs +86 -0
  678. package/dist/services/definitions/nanobot.cjs.map +1 -0
  679. package/dist/services/definitions/nanobot.d.cts +7 -0
  680. package/dist/services/definitions/nanobot.d.cts.map +1 -0
  681. package/dist/services/definitions/nanobot.d.mts +7 -0
  682. package/dist/services/definitions/nanobot.d.mts.map +1 -0
  683. package/dist/services/definitions/nanobot.mjs +85 -0
  684. package/dist/services/definitions/nanobot.mjs.map +1 -0
  685. package/dist/services/definitions/nanoclaw.cjs +79 -0
  686. package/dist/services/definitions/nanoclaw.cjs.map +1 -0
  687. package/dist/services/definitions/nanoclaw.d.cts +7 -0
  688. package/dist/services/definitions/nanoclaw.d.cts.map +1 -0
  689. package/dist/services/definitions/nanoclaw.d.mts +7 -0
  690. package/dist/services/definitions/nanoclaw.d.mts.map +1 -0
  691. package/dist/services/definitions/nanoclaw.mjs +78 -0
  692. package/dist/services/definitions/nanoclaw.mjs.map +1 -0
  693. package/dist/services/definitions/navidrome.d.cts +1 -1
  694. package/dist/services/definitions/navidrome.d.mts +1 -1
  695. package/dist/services/definitions/neo4j.d.cts +1 -1
  696. package/dist/services/definitions/neo4j.d.mts +1 -1
  697. package/dist/services/definitions/nextcloud.d.cts +1 -1
  698. package/dist/services/definitions/nextcloud.d.mts +1 -1
  699. package/dist/services/definitions/nginx-proxy-manager.d.cts +1 -1
  700. package/dist/services/definitions/nginx-proxy-manager.d.mts +1 -1
  701. package/dist/services/definitions/nocodb.d.cts +1 -1
  702. package/dist/services/definitions/nocodb.d.mts +1 -1
  703. package/dist/services/definitions/node-red.d.cts +1 -1
  704. package/dist/services/definitions/node-red.d.mts +1 -1
  705. package/dist/services/definitions/ntfy.d.cts +1 -1
  706. package/dist/services/definitions/ntfy.d.mts +1 -1
  707. package/dist/services/definitions/ollama.d.cts +1 -1
  708. package/dist/services/definitions/ollama.d.mts +1 -1
  709. package/dist/services/definitions/open-saas.d.cts +1 -1
  710. package/dist/services/definitions/open-saas.d.mts +1 -1
  711. package/dist/services/definitions/open-webui.d.cts +1 -1
  712. package/dist/services/definitions/open-webui.d.mts +1 -1
  713. package/dist/services/definitions/opencode.d.cts +1 -1
  714. package/dist/services/definitions/opencode.d.mts +1 -1
  715. package/dist/services/definitions/openhands.d.cts +1 -1
  716. package/dist/services/definitions/openhands.d.mts +1 -1
  717. package/dist/services/definitions/openpanel.d.cts +1 -1
  718. package/dist/services/definitions/openpanel.d.mts +1 -1
  719. package/dist/services/definitions/opensandbox.cjs +150 -0
  720. package/dist/services/definitions/opensandbox.cjs.map +1 -0
  721. package/dist/services/definitions/opensandbox.d.cts +7 -0
  722. package/dist/services/definitions/opensandbox.d.cts.map +1 -0
  723. package/dist/services/definitions/opensandbox.d.mts +7 -0
  724. package/dist/services/definitions/opensandbox.d.mts.map +1 -0
  725. package/dist/services/definitions/opensandbox.mjs +149 -0
  726. package/dist/services/definitions/opensandbox.mjs.map +1 -0
  727. package/dist/services/definitions/opensearch.d.cts +1 -1
  728. package/dist/services/definitions/opensearch.d.mts +1 -1
  729. package/dist/services/definitions/outline.d.cts +1 -1
  730. package/dist/services/definitions/outline.d.mts +1 -1
  731. package/dist/services/definitions/paperless-ngx.d.cts +1 -1
  732. package/dist/services/definitions/paperless-ngx.d.mts +1 -1
  733. package/dist/services/definitions/pentagi.d.cts +1 -1
  734. package/dist/services/definitions/pentagi.d.mts +1 -1
  735. package/dist/services/definitions/pentestagent.d.cts +1 -1
  736. package/dist/services/definitions/pentestagent.d.mts +1 -1
  737. package/dist/services/definitions/photoprism.d.cts +1 -1
  738. package/dist/services/definitions/photoprism.d.mts +1 -1
  739. package/dist/services/definitions/pihole.d.cts +1 -1
  740. package/dist/services/definitions/pihole.d.mts +1 -1
  741. package/dist/services/definitions/piper-tts.d.cts +1 -1
  742. package/dist/services/definitions/piper-tts.d.mts +1 -1
  743. package/dist/services/definitions/plane.d.cts +1 -1
  744. package/dist/services/definitions/plane.d.mts +1 -1
  745. package/dist/services/definitions/plausible.d.cts +1 -1
  746. package/dist/services/definitions/plausible.d.mts +1 -1
  747. package/dist/services/definitions/playwright-server.d.cts +1 -1
  748. package/dist/services/definitions/playwright-server.d.mts +1 -1
  749. package/dist/services/definitions/pocket-id.d.cts +1 -1
  750. package/dist/services/definitions/pocket-id.d.mts +1 -1
  751. package/dist/services/definitions/pocketbase.d.cts +1 -1
  752. package/dist/services/definitions/pocketbase.d.mts +1 -1
  753. package/dist/services/definitions/portainer.d.cts +1 -1
  754. package/dist/services/definitions/portainer.d.mts +1 -1
  755. package/dist/services/definitions/postgresql.d.cts +1 -1
  756. package/dist/services/definitions/postgresql.d.mts +1 -1
  757. package/dist/services/definitions/posthog.d.cts +1 -1
  758. package/dist/services/definitions/posthog.d.mts +1 -1
  759. package/dist/services/definitions/postiz.d.cts +1 -1
  760. package/dist/services/definitions/postiz.d.mts +1 -1
  761. package/dist/services/definitions/prometheus.d.cts +1 -1
  762. package/dist/services/definitions/prometheus.d.mts +1 -1
  763. package/dist/services/definitions/qdrant.d.cts +1 -1
  764. package/dist/services/definitions/qdrant.d.mts +1 -1
  765. package/dist/services/definitions/rabbitmq.d.cts +1 -1
  766. package/dist/services/definitions/rabbitmq.d.mts +1 -1
  767. package/dist/services/definitions/ragflow.d.cts +1 -1
  768. package/dist/services/definitions/ragflow.d.mts +1 -1
  769. package/dist/services/definitions/redis.d.cts +1 -1
  770. package/dist/services/definitions/redis.d.mts +1 -1
  771. package/dist/services/definitions/relaticle-horizon.cjs +48 -0
  772. package/dist/services/definitions/relaticle-horizon.cjs.map +1 -0
  773. package/dist/services/definitions/relaticle-horizon.d.cts +7 -0
  774. package/dist/services/definitions/relaticle-horizon.d.cts.map +1 -0
  775. package/dist/services/definitions/relaticle-horizon.d.mts +7 -0
  776. package/dist/services/definitions/relaticle-horizon.d.mts.map +1 -0
  777. package/dist/services/definitions/relaticle-horizon.mjs +48 -0
  778. package/dist/services/definitions/relaticle-horizon.mjs.map +1 -0
  779. package/dist/services/definitions/relaticle-scheduler.cjs +44 -0
  780. package/dist/services/definitions/relaticle-scheduler.cjs.map +1 -0
  781. package/dist/services/definitions/relaticle-scheduler.d.cts +7 -0
  782. package/dist/services/definitions/relaticle-scheduler.d.cts.map +1 -0
  783. package/dist/services/definitions/relaticle-scheduler.d.mts +7 -0
  784. package/dist/services/definitions/relaticle-scheduler.d.mts.map +1 -0
  785. package/dist/services/definitions/relaticle-scheduler.mjs +44 -0
  786. package/dist/services/definitions/relaticle-scheduler.mjs.map +1 -0
  787. package/dist/services/definitions/relaticle.cjs +151 -0
  788. package/dist/services/definitions/relaticle.cjs.map +1 -0
  789. package/dist/services/definitions/relaticle.d.cts +80 -0
  790. package/dist/services/definitions/relaticle.d.cts.map +1 -0
  791. package/dist/services/definitions/relaticle.d.mts +80 -0
  792. package/dist/services/definitions/relaticle.d.mts.map +1 -0
  793. package/dist/services/definitions/relaticle.mjs +149 -0
  794. package/dist/services/definitions/relaticle.mjs.map +1 -0
  795. package/dist/services/definitions/remotion.d.cts +1 -1
  796. package/dist/services/definitions/remotion.d.mts +1 -1
  797. package/dist/services/definitions/restic.d.cts +1 -1
  798. package/dist/services/definitions/restic.d.mts +1 -1
  799. package/dist/services/definitions/revolt.d.cts +1 -1
  800. package/dist/services/definitions/revolt.d.mts +1 -1
  801. package/dist/services/definitions/rocketchat.d.cts +1 -1
  802. package/dist/services/definitions/rocketchat.d.mts +1 -1
  803. package/dist/services/definitions/saleor.d.cts +1 -1
  804. package/dist/services/definitions/saleor.d.mts +1 -1
  805. package/dist/services/definitions/scrapling.d.cts +1 -1
  806. package/dist/services/definitions/scrapling.d.mts +1 -1
  807. package/dist/services/definitions/searxng.d.cts +1 -1
  808. package/dist/services/definitions/searxng.d.mts +1 -1
  809. package/dist/services/definitions/sentry.d.cts +1 -1
  810. package/dist/services/definitions/sentry.d.mts +1 -1
  811. package/dist/services/definitions/signoz.d.cts +1 -1
  812. package/dist/services/definitions/signoz.d.mts +1 -1
  813. package/dist/services/definitions/solidityguard.d.cts +1 -1
  814. package/dist/services/definitions/solidityguard.d.mts +1 -1
  815. package/dist/services/definitions/sonarqube.d.cts +1 -1
  816. package/dist/services/definitions/sonarqube.d.mts +1 -1
  817. package/dist/services/definitions/stable-diffusion.d.cts +1 -1
  818. package/dist/services/definitions/stable-diffusion.d.mts +1 -1
  819. package/dist/services/definitions/steel-browser.d.cts +1 -1
  820. package/dist/services/definitions/steel-browser.d.mts +1 -1
  821. package/dist/services/definitions/stirling-pdf.d.cts +1 -1
  822. package/dist/services/definitions/stirling-pdf.d.mts +1 -1
  823. package/dist/services/definitions/strapi.d.cts +1 -1
  824. package/dist/services/definitions/strapi.d.mts +1 -1
  825. package/dist/services/definitions/stream-gateway.d.cts +1 -1
  826. package/dist/services/definitions/stream-gateway.d.mts +1 -1
  827. package/dist/services/definitions/supabase.d.cts +1 -1
  828. package/dist/services/definitions/supabase.d.mts +1 -1
  829. package/dist/services/definitions/superset.d.cts +1 -1
  830. package/dist/services/definitions/superset.d.mts +1 -1
  831. package/dist/services/definitions/surrealdb.d.cts +1 -1
  832. package/dist/services/definitions/surrealdb.d.mts +1 -1
  833. package/dist/services/definitions/tabby-ml.d.cts +1 -1
  834. package/dist/services/definitions/tabby-ml.d.mts +1 -1
  835. package/dist/services/definitions/tailscale.d.cts +1 -1
  836. package/dist/services/definitions/tailscale.d.mts +1 -1
  837. package/dist/services/definitions/tempo.d.cts +1 -1
  838. package/dist/services/definitions/tempo.d.mts +1 -1
  839. package/dist/services/definitions/temporal.d.cts +1 -1
  840. package/dist/services/definitions/temporal.d.mts +1 -1
  841. package/dist/services/definitions/text-gen-webui.d.cts +1 -1
  842. package/dist/services/definitions/text-gen-webui.d.mts +1 -1
  843. package/dist/services/definitions/timescaledb.d.cts +1 -1
  844. package/dist/services/definitions/timescaledb.d.mts +1 -1
  845. package/dist/services/definitions/traefik.d.cts +1 -1
  846. package/dist/services/definitions/traefik.d.mts +1 -1
  847. package/dist/services/definitions/twenty-worker.cjs +73 -0
  848. package/dist/services/definitions/twenty-worker.cjs.map +1 -0
  849. package/dist/services/definitions/twenty-worker.d.cts +7 -0
  850. package/dist/services/definitions/twenty-worker.d.cts.map +1 -0
  851. package/dist/services/definitions/twenty-worker.d.mts +7 -0
  852. package/dist/services/definitions/twenty-worker.d.mts.map +1 -0
  853. package/dist/services/definitions/twenty-worker.mjs +72 -0
  854. package/dist/services/definitions/twenty-worker.mjs.map +1 -0
  855. package/dist/services/definitions/twenty.cjs +24 -2
  856. package/dist/services/definitions/twenty.cjs.map +1 -1
  857. package/dist/services/definitions/twenty.d.cts +1 -1
  858. package/dist/services/definitions/twenty.d.mts +1 -1
  859. package/dist/services/definitions/twenty.mjs +24 -2
  860. package/dist/services/definitions/twenty.mjs.map +1 -1
  861. package/dist/services/definitions/umami.d.cts +1 -1
  862. package/dist/services/definitions/umami.d.mts +1 -1
  863. package/dist/services/definitions/uptime-kuma.d.cts +1 -1
  864. package/dist/services/definitions/uptime-kuma.d.mts +1 -1
  865. package/dist/services/definitions/usesend.d.cts +1 -1
  866. package/dist/services/definitions/usesend.d.mts +1 -1
  867. package/dist/services/definitions/valkey.d.cts +1 -1
  868. package/dist/services/definitions/valkey.d.mts +1 -1
  869. package/dist/services/definitions/vault.d.cts +1 -1
  870. package/dist/services/definitions/vault.d.mts +1 -1
  871. package/dist/services/definitions/vaultwarden.d.cts +1 -1
  872. package/dist/services/definitions/vaultwarden.d.mts +1 -1
  873. package/dist/services/definitions/vector-log.d.cts +1 -1
  874. package/dist/services/definitions/vector-log.d.mts +1 -1
  875. package/dist/services/definitions/vikunja.d.cts +1 -1
  876. package/dist/services/definitions/vikunja.d.mts +1 -1
  877. package/dist/services/definitions/watchtower.d.cts +1 -1
  878. package/dist/services/definitions/watchtower.d.mts +1 -1
  879. package/dist/services/definitions/weaviate.cjs +4 -1
  880. package/dist/services/definitions/weaviate.cjs.map +1 -1
  881. package/dist/services/definitions/weaviate.d.cts +1 -1
  882. package/dist/services/definitions/weaviate.d.mts +1 -1
  883. package/dist/services/definitions/weaviate.mjs +4 -1
  884. package/dist/services/definitions/weaviate.mjs.map +1 -1
  885. package/dist/services/definitions/whisper.d.cts +1 -1
  886. package/dist/services/definitions/whisper.d.mts +1 -1
  887. package/dist/services/definitions/wireguard.d.cts +1 -1
  888. package/dist/services/definitions/wireguard.d.mts +1 -1
  889. package/dist/services/definitions/woodpecker-ci.d.cts +1 -1
  890. package/dist/services/definitions/woodpecker-ci.d.mts +1 -1
  891. package/dist/services/definitions/xyops.d.cts +1 -1
  892. package/dist/services/definitions/xyops.d.mts +1 -1
  893. package/dist/services/definitions/zeroclaw.cjs +103 -0
  894. package/dist/services/definitions/zeroclaw.cjs.map +1 -0
  895. package/dist/services/definitions/zeroclaw.d.cts +7 -0
  896. package/dist/services/definitions/zeroclaw.d.cts.map +1 -0
  897. package/dist/services/definitions/zeroclaw.d.mts +7 -0
  898. package/dist/services/definitions/zeroclaw.d.mts.map +1 -0
  899. package/dist/services/definitions/zeroclaw.mjs +102 -0
  900. package/dist/services/definitions/zeroclaw.mjs.map +1 -0
  901. package/dist/services/definitions/zulip.d.cts +1 -1
  902. package/dist/services/definitions/zulip.d.mts +1 -1
  903. package/dist/services/registry.d.cts +1 -1
  904. package/dist/services/registry.d.mts +1 -1
  905. package/dist/services/registry.test.cjs +8 -8
  906. package/dist/services/registry.test.cjs.map +1 -1
  907. package/dist/services/registry.test.mjs +8 -8
  908. package/dist/services/registry.test.mjs.map +1 -1
  909. package/dist/skills/registry.cjs +19 -0
  910. package/dist/skills/registry.cjs.map +1 -1
  911. package/dist/skills/registry.d.cts +1 -1
  912. package/dist/skills/registry.d.cts.map +1 -1
  913. package/dist/skills/registry.d.mts +1 -1
  914. package/dist/skills/registry.d.mts.map +1 -1
  915. package/dist/skills/registry.mjs +19 -0
  916. package/dist/skills/registry.mjs.map +1 -1
  917. package/dist/{skills-BlzpHmpH.cjs → skills-uPxJVmKk.cjs} +452 -1
  918. package/dist/skills-uPxJVmKk.cjs.map +1 -0
  919. package/dist/{test.CTcmp4Su-ClCHJ3FA.mjs → test.CTcmp4Su-BRa7-bTj.mjs} +2 -2
  920. package/dist/{test.CTcmp4Su-ClCHJ3FA.mjs.map → test.CTcmp4Su-BRa7-bTj.mjs.map} +1 -1
  921. package/dist/{test.CTcmp4Su-DlzTarwH.cjs → test.CTcmp4Su-BWSPM8ZQ.cjs} +19 -1
  922. package/dist/{test.CTcmp4Su-DlzTarwH.cjs.map → test.CTcmp4Su-BWSPM8ZQ.cjs.map} +1 -1
  923. package/dist/track-analytics.d.cts +1 -1
  924. package/dist/track-analytics.d.mts +1 -1
  925. package/dist/track-analytics.test.cjs +1 -1
  926. package/dist/track-analytics.test.mjs +1 -1
  927. package/dist/types-BREUfzzq.d.mts +77 -0
  928. package/dist/types-BREUfzzq.d.mts.map +1 -0
  929. package/dist/types-Bsn0XzSP.d.cts +95 -0
  930. package/dist/types-Bsn0XzSP.d.cts.map +1 -0
  931. package/dist/types-CyZ5mn6w.d.cts +77 -0
  932. package/dist/types-CyZ5mn6w.d.cts.map +1 -0
  933. package/dist/types-DIsPc-hb.d.cts +100 -0
  934. package/dist/types-DIsPc-hb.d.cts.map +1 -0
  935. package/dist/types-DbXajvYq.d.mts +100 -0
  936. package/dist/types-DbXajvYq.d.mts.map +1 -0
  937. package/dist/types-DwTKyCZ9.d.mts +95 -0
  938. package/dist/types-DwTKyCZ9.d.mts.map +1 -0
  939. package/dist/{types-CR83OJiq.d.cts → types-dyBnrHm9.d.cts} +5 -1
  940. package/dist/types-dyBnrHm9.d.cts.map +1 -0
  941. package/dist/{types-zYjGTuyn.d.mts → types-fRSnaZTX.d.mts} +5 -1
  942. package/dist/types-fRSnaZTX.d.mts.map +1 -0
  943. package/dist/types.cjs +7 -0
  944. package/dist/types.cjs.map +1 -1
  945. package/dist/types.d.cts +2 -93
  946. package/dist/types.d.mts +2 -93
  947. package/dist/types.mjs +7 -0
  948. package/dist/types.mjs.map +1 -1
  949. package/dist/validator.cjs +1 -1
  950. package/dist/validator.d.cts +1 -1
  951. package/dist/validator.d.mts +1 -1
  952. package/dist/validator.test.cjs +1 -1
  953. package/dist/validator.test.mjs +1 -1
  954. package/dist/version-manager.d.cts +1 -1
  955. package/dist/version-manager.d.mts +1 -1
  956. package/dist/version-manager.test.cjs +3 -3
  957. package/dist/version-manager.test.cjs.map +1 -1
  958. package/dist/version-manager.test.mjs +3 -3
  959. package/dist/version-manager.test.mjs.map +1 -1
  960. package/dist/zeroclaw-B-0TuOfZ.d.mts +7 -0
  961. package/dist/zeroclaw-B-0TuOfZ.d.mts.map +1 -0
  962. package/dist/zeroclaw-BvKpDHKe.d.cts +7 -0
  963. package/dist/zeroclaw-BvKpDHKe.d.cts.map +1 -0
  964. package/package.json +6 -2
  965. package/src/addon-stack.test.ts +170 -16
  966. package/src/addon-stack.ts +114 -43
  967. package/src/composer.test.ts +59 -0
  968. package/src/composer.ts +135 -194
  969. package/src/deployers/coolify.ts +38 -0
  970. package/src/deployers/dokploy.ts +38 -0
  971. package/src/deployers/types.ts +2 -0
  972. package/src/frameworks/claude-code-fw.ts +118 -0
  973. package/src/frameworks/codex-fw.ts +102 -0
  974. package/src/frameworks/copaw.ts +154 -0
  975. package/src/frameworks/index.ts +46 -0
  976. package/src/frameworks/memu.ts +149 -0
  977. package/src/frameworks/nanobot.ts +156 -0
  978. package/src/frameworks/nanoclaw.ts +126 -0
  979. package/src/frameworks/openclaw.ts +325 -0
  980. package/src/frameworks/registry.test.ts +131 -0
  981. package/src/frameworks/registry.ts +28 -0
  982. package/src/frameworks/types.ts +146 -0
  983. package/src/frameworks/zeroclaw.ts +148 -0
  984. package/src/generate.test.ts +55 -4
  985. package/src/generate.ts +67 -14
  986. package/src/generators/caddy.test.ts +41 -1
  987. package/src/generators/caddy.ts +16 -2
  988. package/src/generators/clone-repos.test.ts +1 -1
  989. package/src/generators/clone-repos.ts +7 -2
  990. package/src/generators/env.test.ts +2 -2
  991. package/src/generators/env.ts +30 -180
  992. package/src/generators/health-check.ts +4 -4
  993. package/src/generators/openclaw-json.ts +57 -5
  994. package/src/generators/postgres-init.ts +11 -0
  995. package/src/generators/readme.ts +75 -9
  996. package/src/generators/scripts.test.ts +1 -1
  997. package/src/generators/skills.ts +458 -0
  998. package/src/generators/traefik.test.ts +13 -13
  999. package/src/index.ts +46 -7
  1000. package/src/logger/__tests__/logger.test.ts +388 -0
  1001. package/src/logger/index.ts +14 -0
  1002. package/src/logger/logger.ts +326 -0
  1003. package/src/logger/sinks/callback-sink.ts +13 -0
  1004. package/src/logger/sinks/console-sink.ts +51 -0
  1005. package/src/logger/sinks/file-sink.ts +121 -0
  1006. package/src/logger/types.ts +90 -0
  1007. package/src/migrations.ts +8 -1
  1008. package/src/presets/presets.test.ts +4 -4
  1009. package/src/presets/registry.test.ts +6 -6
  1010. package/src/resolver.test.ts +31 -3
  1011. package/src/resolver.ts +19 -3
  1012. package/src/schema.test.ts +2 -2
  1013. package/src/schema.ts +61 -13
  1014. package/src/services/definitions/agent-browser.ts +177 -0
  1015. package/src/services/definitions/apptension-saas.ts +2 -1
  1016. package/src/services/definitions/burnlink.ts +142 -0
  1017. package/src/services/definitions/chromadb.ts +1 -1
  1018. package/src/services/definitions/claude-code.ts +1 -1
  1019. package/src/services/definitions/clawrouter.ts +141 -0
  1020. package/src/services/definitions/codex.ts +1 -1
  1021. package/src/services/definitions/convex.ts +1 -2
  1022. package/src/services/definitions/copaw.ts +101 -0
  1023. package/src/services/definitions/desktop-environment.ts +1 -0
  1024. package/src/services/definitions/hindsight.ts +132 -0
  1025. package/src/services/definitions/index.ts +61 -14
  1026. package/src/services/definitions/mem0.ts +132 -0
  1027. package/src/services/definitions/memu.ts +96 -0
  1028. package/src/services/definitions/milvus.ts +1 -1
  1029. package/src/services/definitions/nanobot.ts +89 -0
  1030. package/src/services/definitions/nanoclaw.ts +78 -0
  1031. package/src/services/definitions/opensandbox.ts +147 -0
  1032. package/src/services/definitions/relaticle-horizon.ts +48 -0
  1033. package/src/services/definitions/relaticle-scheduler.ts +42 -0
  1034. package/src/services/definitions/relaticle.ts +142 -0
  1035. package/src/services/definitions/twenty-worker.ts +70 -0
  1036. package/src/services/definitions/twenty.ts +16 -2
  1037. package/src/services/definitions/weaviate.ts +1 -1
  1038. package/src/services/definitions/zeroclaw.ts +102 -0
  1039. package/src/services/registry.test.ts +7 -7
  1040. package/src/skills/registry.ts +10 -0
  1041. package/src/types.ts +11 -1
  1042. package/src/version-manager.test.ts +2 -2
  1043. package/dist/schema-CKBRu-Rt.d.cts.map +0 -1
  1044. package/dist/schema-Dn-_Jpb6.d.mts.map +0 -1
  1045. package/dist/skills-BlzpHmpH.cjs.map +0 -1
  1046. package/dist/types-CR83OJiq.d.cts.map +0 -1
  1047. package/dist/types-zYjGTuyn.d.mts.map +0 -1
  1048. package/dist/types.d.cts.map +0 -1
  1049. package/dist/types.d.mts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"readme.cjs","names":[],"sources":["../../src/generators/readme.ts"],"sourcesContent":["import type { ResolverOutput } from \"../types.js\";\n\n/**\n * Options for README generation.\n */\nexport interface ReadmeOptions {\n\tprojectName: string;\n\tdomain?: string;\n\tproxy?: string;\n\t/** When \"bare-metal\", the stack uses native + Docker hybrid. */\n\tdeploymentType?: \"docker\" | \"bare-metal\" | \"local\";\n\t/** True when some services run natively on the host (bare-metal only). */\n\thasNativeServices?: boolean;\n\t/** How OpenClaw itself is installed: docker (container) or direct (host). */\n\topenclawInstallMethod?: \"docker\" | \"direct\";\n}\n\n/**\n * Generates a comprehensive README.md for the OpenClaw project.\n *\n * Includes: project description, service table, quick start instructions,\n * service URLs, skill packs, and scripts documentation.\n */\nexport function generateReadme(resolved: ResolverOutput, options: ReadmeOptions): string {\n\tconst { projectName, domain, proxy, deploymentType, hasNativeServices, openclawInstallMethod } =\n\t\toptions;\n\tconst isDirectInstall = openclawInstallMethod === \"direct\";\n\tconst sections: string[] = [];\n\n\t// ── Title & Description ─────────────────────────────────────────────────\n\n\tsections.push(`# ${projectName}\n\n> Self-hosted AI agent infrastructure powered by [OpenClaw](https://openclaw.dev).\n\nThis project provides a fully configured Docker Compose stack with ${resolved.services.length} services, ready to deploy on any server.${isDirectInstall ? \" OpenClaw itself runs directly on the host (not in Docker).\" : \"\"}\n${deploymentType === \"bare-metal\" && hasNativeServices ? \"\\n\\n**Bare-metal (native + Docker):** Some services run natively on the host; the rest (including the OpenClaw gateway) run in Docker. Use the top-level `install.sh` or `install.ps1` to install/start native services first, then start the Docker stack.\" : \"\"}\n\n---`);\n\n\t// ── Service Table ────────────────────────────────────────────────────────\n\n\tconst serviceRows = resolved.services\n\t\t.map(({ definition }) => {\n\t\t\tconst mainPort = definition.ports.find((p) => p.exposed);\n\t\t\tconst url = mainPort\n\t\t\t\t? domain\n\t\t\t\t\t? `https://${definition.id}.${domain}`\n\t\t\t\t\t: `http://localhost:${mainPort.host}`\n\t\t\t\t: \"N/A (internal)\";\n\t\t\treturn `| ${definition.icon} | **${definition.name}** | ${url} | ${definition.description} |`;\n\t\t})\n\t\t.join(\"\\n\");\n\n\tsections.push(`## Services\n\n| | Service | URL | Description |\n|---|---------|-----|-------------|\n${serviceRows}\n`);\n\n\t// ── Quick Start ──────────────────────────────────────────────────────────\n\n\tsections.push(`## Quick Start\n\n### Prerequisites\n\n- [Docker](https://docs.docker.com/get-docker/) (v24+)\n- [Docker Compose](https://docs.docker.com/compose/install/) (v2+)\n- At least ${Math.ceil(resolved.estimatedMemoryMB / 1024)}GB of RAM available\n${isDirectInstall ? \"- Node.js 22+ (installed automatically by the OpenClaw installer)\" : \"\"}\n\n### 1. Extract the ZIP\n\n\\`\\`\\`bash\nunzip ${projectName}.zip\ncd ${projectName}\n\\`\\`\\`\n\n### 2. Configure Environment\n\n\\`\\`\\`bash\ncp .env.example .env\n\\`\\`\\`\n\nEdit \\`.env\\` and update any values as needed. Secret values have been pre-generated — review and change them for production use.\n${\n\tisDirectInstall\n\t\t? `\n### 3. Install OpenClaw on the Host\n\n\\`\\`\\`bash\nchmod +x scripts/install-openclaw.sh\n./scripts/install-openclaw.sh\n\\`\\`\\`\n\nThis downloads and runs the official installer, which sets up Node.js 22+ and OpenClaw globally.\n\n### 4. Start Companion Services\n\n\\`\\`\\`bash\ndocker compose up -d\n\\`\\`\\`\n\n### 5. Run Onboarding\n\n\\`\\`\\`bash\nopenclaw onboard\n\\`\\`\\`\n`\n\t\t: `\n### 3. Start Services\n\n\\`\\`\\`bash\ndocker compose up -d\n\\`\\`\\`\n\nOr use the provided start script:\n\n\\`\\`\\`bash\nchmod +x scripts/*.sh\n./scripts/start.sh\n\\`\\`\\`\n\n### 4. Check Status\n\n\\`\\`\\`bash\ndocker compose ps\n\\`\\`\\`\n\n### 5. View Logs\n\n\\`\\`\\`bash\ndocker compose logs -f openclaw-gateway\n\\`\\`\\`\n`\n}\nAll services should show a healthy status within 1–2 minutes.\n`);\n\n\t// ── Docker Compose Profiles ──────────────────────────────────────────────\n\n\tsections.push(`## Using Docker Compose Profiles\n\nYour stack may include profile-based compose files for optional service groups. Only the base services start by default — use profiles to activate additional groups:\n\n\\`\\`\\`bash\n# Start base services only\ndocker compose up -d\n\n# Start base + AI services (Ollama, Open WebUI, etc.)\ndocker compose -f docker-compose.yml -f docker-compose.ai.yml --profile ai up -d\n\n# Start base + monitoring (Grafana, Prometheus, Uptime Kuma)\ndocker compose -f docker-compose.yml -f docker-compose.monitoring.yml --profile monitoring up -d\n\n# Start base + AI + dev tools\ndocker compose -f docker-compose.yml -f docker-compose.ai.yml -f docker-compose.tools.yml --profile ai --profile tools up -d\n\\`\\`\\`\n\nAvailable profile files (if generated):\n| File | Profile | Services |\n|------|---------|----------|\n| \\`docker-compose.ai.yml\\` | \\`ai\\` | AI models, chat UIs, LLM platforms |\n| \\`docker-compose.media.yml\\` | \\`media\\` | FFmpeg, Remotion, Motion Canvas |\n| \\`docker-compose.monitoring.yml\\` | \\`monitoring\\` | Grafana, Prometheus, Uptime Kuma, analytics |\n| \\`docker-compose.tools.yml\\` | \\`tools\\` | Gitea, code-server, Portainer, coding agents |\n| \\`docker-compose.social.yml\\` | \\`social\\` | Postiz, Mixpost |\n| \\`docker-compose.knowledge.yml\\` | \\`knowledge\\` | Outline, Paperless-ngx, NocoDB |\n| \\`docker-compose.communication.yml\\` | \\`communication\\` | Matrix, Rocket.Chat, Mattermost |\n`);\n\n\t// ── Service URLs & Ports ─────────────────────────────────────────────────\n\n\tconst portRows = resolved.services\n\t\t.filter(({ definition }) => definition.ports.length > 0)\n\t\t.map(({ definition }) => {\n\t\t\tconst ports = definition.ports\n\t\t\t\t.map((p) => `\\`${p.host}\\` → \\`${p.container}\\` (${p.description})`)\n\t\t\t\t.join(\", \");\n\t\t\treturn `| ${definition.icon} ${definition.name} | ${ports} |`;\n\t\t})\n\t\t.join(\"\\n\");\n\n\tif (portRows) {\n\t\tsections.push(`## Ports\n\n| Service | Ports |\n|---------|-------|\n${portRows}\n`);\n\t}\n\n\t// ── Skill Packs ─────────────────────────────────────────────────────────\n\n\tconst allSkills = resolved.services.flatMap(({ definition }) =>\n\t\tdefinition.skills.map((s) => ({\n\t\t\tskillId: s.skillId,\n\t\t\tserviceName: definition.name,\n\t\t\tserviceIcon: definition.icon,\n\t\t})),\n\t);\n\n\tif (allSkills.length > 0) {\n\t\tconst skillRows = allSkills\n\t\t\t.map((s) => `| \\`${s.skillId}\\` | ${s.serviceIcon} ${s.serviceName} |`)\n\t\t\t.join(\"\\n\");\n\n\t\tsections.push(`## Skills\n\nThe following OpenClaw skills are automatically installed:\n\n| Skill | Service |\n|-------|---------|\n${skillRows}\n\nSkills are located in \\`openclaw/workspace/skills/\\`. Each skill provides a \\`SKILL.md\\` with usage instructions.\n`);\n\t}\n\n\t// ── Onboarding & Channels ──────────────────────────────────────────────\n\t// Based on openclaw_docker-setup.sh post-deploy instructions\n\n\tif (isDirectInstall) {\n\t\tsections.push(`## OpenClaw Setup\n\nOpenClaw is installed directly on the host (not in Docker). After running the install script:\\n\n\\`\\`\\`bash\n# Run onboarding to configure the gateway\nopenclaw onboard\n\n# Launch the dashboard\nopenclaw dashboard\n\\`\\`\\`\n\nWhen prompted during onboarding:\n- **Gateway bind:** \\`lan\\`\n- **Gateway auth:** \\`token\\`\n- **Gateway token:** (use the value from \\`.env\\` → \\`OPENCLAW_GATEWAY_TOKEN\\`)\n\n### Connect Messaging Channels (optional)\n\n\\`\\`\\`bash\n# WhatsApp (scan QR code)\nopenclaw channels login\n\n# Telegram\nopenclaw channels add --channel telegram --token <BOT_TOKEN>\n\n# Discord\nopenclaw channels add --channel discord --token <BOT_TOKEN>\n\\`\\`\\`\n\nSee [Channel Docs](https://docs.openclaw.ai/channels) for more providers.\n`);\n\t} else {\n\t\tsections.push(`## Onboarding & Channel Setup\n\nAfter starting the stack, complete the gateway onboarding:\n\n\\`\\`\\`bash\n# Interactive onboarding (sets up gateway auth and config)\ndocker compose run --rm openclaw-cli onboard --no-install-daemon\n\\`\\`\\`\n\nWhen prompted:\n- **Gateway bind:** \\`lan\\`\n- **Gateway auth:** \\`token\\`\n- **Gateway token:** (use the value from \\`.env\\` → \\`OPENCLAW_GATEWAY_TOKEN\\`)\n- **Tailscale exposure:** Off\n- **Install Gateway daemon:** No\n\n### Connect Messaging Channels (optional)\n\n\\`\\`\\`bash\n# WhatsApp (scan QR code)\ndocker compose run --rm openclaw-cli channels login\n\n# Telegram\ndocker compose run --rm openclaw-cli channels add --channel telegram --token <BOT_TOKEN>\n\n# Discord\ndocker compose run --rm openclaw-cli channels add --channel discord --token <BOT_TOKEN>\n\\`\\`\\`\n\nSee [Channel Docs](https://docs.openclaw.ai/channels) for more providers.\n`);\n\t}\n\n\t// ── Proxy Configuration ─────────────────────────────────────────────────\n\n\tif (proxy && proxy !== \"none\") {\n\t\tconst proxyName = proxy === \"caddy\" ? \"Caddy\" : \"Traefik\";\n\t\tsections.push(`## Reverse Proxy\n\nThis stack uses **${proxyName}** as a reverse proxy.${domain ? ` All services are available under \\`${domain}\\`.` : \"\"}\n\n${proxy === \"caddy\" ? \"The Caddyfile is located at `config/Caddyfile`.\" : \"Traefik configuration is handled via Docker labels.\"}\n`);\n\t}\n\n\t// ── Scripts ──────────────────────────────────────────────────────────────\n\n\tsections.push(`## Management Scripts\n\n\\`\\`\\`bash\nchmod +x scripts/*.sh # Make scripts executable (first time only)\n\\`\\`\\`\n\n| Script | Description |\n|--------|-------------|\n| \\`./scripts/start.sh\\` | Validates .env, auto-generates gateway token, creates dirs, starts all services with health checks |\n| \\`./scripts/stop.sh\\` | Gracefully stops all services |\n| \\`./scripts/update.sh\\` | Pulls latest Docker images and restarts services |\n| \\`./scripts/backup.sh\\` | Backs up all named Docker volumes to timestamped archives |\n| \\`./scripts/status.sh\\` | Shows current service status, resource usage, and disk |\n`);\n\n\t// ── Data & Volumes ──────────────────────────────────────────────────────\n\n\tconst volumeRows = resolved.services.flatMap(({ definition }) =>\n\t\tdefinition.volumes.map((v) => ({\n\t\t\tname: v.name,\n\t\t\tpath: v.containerPath,\n\t\t\tdescription: v.description,\n\t\t\tserviceName: definition.name,\n\t\t})),\n\t);\n\n\tif (volumeRows.length > 0) {\n\t\tconst rows = volumeRows\n\t\t\t.map((v) => `| \\`${v.name}\\` | ${v.serviceName} | ${v.description} |`)\n\t\t\t.join(\"\\n\");\n\n\t\tsections.push(`## Volumes\n\n| Volume | Service | Description |\n|--------|---------|-------------|\n${rows}\n\n> **Tip:** Use \\`scripts/backup.sh\\` to back up all volumes before updates.\n`);\n\t}\n\n\t// ── Estimated Resources ─────────────────────────────────────────────────\n\n\tsections.push(`## Resource Estimates\n\n- **Services:** ${resolved.services.length}\n- **Estimated RAM:** ~${(resolved.estimatedMemoryMB / 1024).toFixed(1)}GB\n- **Recommended minimum:** ${Math.ceil(resolved.estimatedMemoryMB / 1024) + 2}GB RAM\n`);\n\n\t// ── Warnings ─────────────────────────────────────────────────────────────\n\n\tif (resolved.warnings.length > 0) {\n\t\tconst warningList = resolved.warnings.map((w) => `- ⚠️ ${w.message}`).join(\"\\n\");\n\n\t\tsections.push(`## Warnings\n\n${warningList}\n`);\n\t}\n\n\t// ── Footer ──────────────────────────────────────────────────────────────\n\n\tsections.push(`---\n\nGenerated by [better-openclaw](https://better-openclaw.dev) • ${new Date().toISOString().split(\"T\")[0]}\nDeploy without managing servers: [Clawexa Cloud](https://clawexa.net)\n`);\n\n\treturn sections.join(\"\\n\");\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"readme.cjs","names":["getFrameworkById"],"sources":["../../src/generators/readme.ts"],"sourcesContent":["import { getFrameworkById } from \"../frameworks/index.js\";\nimport type { ResolverOutput } from \"../types.js\";\n\n/**\n * Options for README generation.\n */\nexport interface ReadmeOptions {\n\tprojectName: string;\n\tdomain?: string;\n\tproxy?: string;\n\t/** When \"bare-metal\", the stack uses native + Docker hybrid. */\n\tdeploymentType?: \"docker\" | \"bare-metal\" | \"local\";\n\t/** True when some services run natively on the host (bare-metal only). */\n\thasNativeServices?: boolean;\n\t/** How OpenClaw itself is installed: docker (container) or direct (host). */\n\topenclawInstallMethod?: \"docker\" | \"direct\";\n\t/** Primary agent framework (defaults to \"openclaw\"). */\n\tprimaryFramework?: string;\n}\n\n/**\n * Generates a comprehensive README.md for the OpenClaw project.\n *\n * Includes: project description, service table, quick start instructions,\n * service URLs, skill packs, and scripts documentation.\n */\nexport function generateReadme(resolved: ResolverOutput, options: ReadmeOptions): string {\n\tconst {\n\t\tprojectName,\n\t\tdomain,\n\t\tproxy,\n\t\tdeploymentType,\n\t\thasNativeServices,\n\t\topenclawInstallMethod,\n\t\tprimaryFramework,\n\t} = options;\n\tconst isDirectInstall = openclawInstallMethod === \"direct\";\n\tconst framework = getFrameworkById(primaryFramework ?? \"openclaw\");\n\tconst frameworkName = framework?.name ?? \"OpenClaw\";\n\tconst isOpenClaw = (primaryFramework ?? \"openclaw\") === \"openclaw\";\n\tconst sections: string[] = [];\n\n\t// ── Title & Description ─────────────────────────────────────────────────\n\n\tsections.push(`# ${projectName}\n\n> Self-hosted AI agent infrastructure powered by **${frameworkName}**${isOpenClaw ? \" — [openclaw.dev](https://openclaw.dev)\" : \"\"}.\n\nThis project provides a fully configured Docker Compose stack with ${resolved.services.length} services, ready to deploy on any server.${isDirectInstall ? ` ${frameworkName} itself runs directly on the host (not in Docker).` : \"\"}\n${deploymentType === \"bare-metal\" && hasNativeServices ? `\\n\\n**Bare-metal (native + Docker):** Some services run natively on the host; the rest (including the ${frameworkName} gateway) run in Docker. Use the top-level \\`install.sh\\` or \\`install.ps1\\` to install/start native services first, then start the Docker stack.` : \"\"}\n\n---`);\n\n\t// ── Service Table ────────────────────────────────────────────────────────\n\n\tconst serviceRows = resolved.services\n\t\t.map(({ definition }) => {\n\t\t\tconst mainPort = definition.ports.find((p) => p.exposed);\n\t\t\tconst url = mainPort\n\t\t\t\t? domain\n\t\t\t\t\t? `https://${definition.id}.${domain}`\n\t\t\t\t\t: `http://localhost:${mainPort.host}`\n\t\t\t\t: \"N/A (internal)\";\n\t\t\treturn `| ${definition.icon} | **${definition.name}** | ${url} | ${definition.description} |`;\n\t\t})\n\t\t.join(\"\\n\");\n\n\tsections.push(`## Services\n\n| | Service | URL | Description |\n|---|---------|-----|-------------|\n${serviceRows}\n`);\n\n\t// ── Quick Start ──────────────────────────────────────────────────────────\n\n\tsections.push(`## Quick Start\n\n### Prerequisites\n\n- [Docker](https://docs.docker.com/get-docker/) (v24+)\n- [Docker Compose](https://docs.docker.com/compose/install/) (v2+)\n- At least ${Math.ceil(resolved.estimatedMemoryMB / 1024)}GB of RAM available\n${isDirectInstall ? \"- Node.js 22+ (installed automatically by the OpenClaw installer)\" : \"\"}\n\n### 1. Extract the ZIP\n\n\\`\\`\\`bash\nunzip ${projectName}.zip\ncd ${projectName}\n\\`\\`\\`\n\n### 2. Configure Environment\n\n\\`\\`\\`bash\ncp .env.example .env\n\\`\\`\\`\n\nEdit \\`.env\\` and update any values as needed. Secret values have been pre-generated — review and change them for production use.\n${\n\tisDirectInstall\n\t\t? `\n### 3. Install OpenClaw on the Host\n\n\\`\\`\\`bash\nchmod +x scripts/install-openclaw.sh\n./scripts/install-openclaw.sh\n\\`\\`\\`\n\nThis downloads and runs the official installer, which sets up Node.js 22+ and OpenClaw globally.\n\n### 4. Start Companion Services\n\n\\`\\`\\`bash\ndocker compose up -d\n\\`\\`\\`\n\n### 5. Run Onboarding\n\n\\`\\`\\`bash\nopenclaw onboard\n\\`\\`\\`\n`\n\t\t: `\n### 3. Start Services\n\n\\`\\`\\`bash\ndocker compose up -d\n\\`\\`\\`\n\nOr use the provided start script:\n\n\\`\\`\\`bash\nchmod +x scripts/*.sh\n./scripts/start.sh\n\\`\\`\\`\n\n### 4. Check Status\n\n\\`\\`\\`bash\ndocker compose ps\n\\`\\`\\`\n\n### 5. View Logs\n\n\\`\\`\\`bash\ndocker compose logs -f ${primaryFramework ?? \"openclaw\"}-gateway\n\\`\\`\\`\n`\n}\nAll services should show a healthy status within 1–2 minutes.\n`);\n\n\t// ── Docker Compose Profiles ──────────────────────────────────────────────\n\n\tsections.push(`## Using Docker Compose Profiles\n\nYour stack may include profile-based compose files for optional service groups. Only the base services start by default — use profiles to activate additional groups:\n\n\\`\\`\\`bash\n# Start base services only\ndocker compose up -d\n\n# Start base + AI services (Ollama, Open WebUI, etc.)\ndocker compose -f docker-compose.yml -f docker-compose.ai.yml --profile ai up -d\n\n# Start base + monitoring (Grafana, Prometheus, Uptime Kuma)\ndocker compose -f docker-compose.yml -f docker-compose.monitoring.yml --profile monitoring up -d\n\n# Start base + AI + dev tools\ndocker compose -f docker-compose.yml -f docker-compose.ai.yml -f docker-compose.tools.yml --profile ai --profile tools up -d\n\\`\\`\\`\n\nAvailable profile files (if generated):\n| File | Profile | Services |\n|------|---------|----------|\n| \\`docker-compose.ai.yml\\` | \\`ai\\` | AI models, chat UIs, LLM platforms |\n| \\`docker-compose.media.yml\\` | \\`media\\` | FFmpeg, Remotion, Motion Canvas |\n| \\`docker-compose.monitoring.yml\\` | \\`monitoring\\` | Grafana, Prometheus, Uptime Kuma, analytics |\n| \\`docker-compose.tools.yml\\` | \\`tools\\` | Gitea, code-server, Portainer, coding agents |\n| \\`docker-compose.social.yml\\` | \\`social\\` | Postiz, Mixpost |\n| \\`docker-compose.knowledge.yml\\` | \\`knowledge\\` | Outline, Paperless-ngx, NocoDB |\n| \\`docker-compose.communication.yml\\` | \\`communication\\` | Matrix, Rocket.Chat, Mattermost |\n`);\n\n\t// ── Service URLs & Ports ─────────────────────────────────────────────────\n\n\tconst portRows = resolved.services\n\t\t.filter(({ definition }) => definition.ports.length > 0)\n\t\t.map(({ definition }) => {\n\t\t\tconst ports = definition.ports\n\t\t\t\t.map((p) => `\\`${p.host}\\` → \\`${p.container}\\` (${p.description})`)\n\t\t\t\t.join(\", \");\n\t\t\treturn `| ${definition.icon} ${definition.name} | ${ports} |`;\n\t\t})\n\t\t.join(\"\\n\");\n\n\tif (portRows) {\n\t\tsections.push(`## Ports\n\n| Service | Ports |\n|---------|-------|\n${portRows}\n`);\n\t}\n\n\t// ── Skill Packs ─────────────────────────────────────────────────────────\n\n\tconst allSkills = resolved.services.flatMap(({ definition }) =>\n\t\tdefinition.skills.map((s) => ({\n\t\t\tskillId: s.skillId,\n\t\t\tserviceName: definition.name,\n\t\t\tserviceIcon: definition.icon,\n\t\t})),\n\t);\n\n\tif (allSkills.length > 0) {\n\t\tconst skillRows = allSkills\n\t\t\t.map((s) => `| \\`${s.skillId}\\` | ${s.serviceIcon} ${s.serviceName} |`)\n\t\t\t.join(\"\\n\");\n\n\t\tsections.push(`## Skills\n\nThe following OpenClaw skills are automatically installed:\n\n| Skill | Service |\n|-------|---------|\n${skillRows}\n\nSkills are located in \\`openclaw/workspace/skills/\\`. Each skill provides a \\`SKILL.md\\` with usage instructions.\n`);\n\t}\n\n\t// ── AI Memory Integration ──────────────────────────────────────────────\n\n\tconst memoryServiceIds = [\"mem0\", \"memu\", \"hindsight\"];\n\tconst vectorDbIds = [\"qdrant\", \"chromadb\", \"weaviate\", \"milvus\"];\n\n\tconst memoryServices = resolved.services.filter(({ definition }) =>\n\t\tmemoryServiceIds.includes(definition.id),\n\t);\n\tconst vectorDbs = resolved.services.filter(({ definition }) =>\n\t\tvectorDbIds.includes(definition.id),\n\t);\n\n\tif (memoryServices.length > 0 || vectorDbs.length > 0) {\n\t\tlet memSection = `## AI Memory Integration\n\nThis stack includes integrated AI memory services. The ${frameworkName} agent framework is automatically configured to use them via \\`openclaw/config/openclaw.json\\`.\n`;\n\n\t\tif (memoryServices.length > 0) {\n\t\t\tconst memList = memoryServices\n\t\t\t\t.map(\n\t\t\t\t\t({ definition }) =>\n\t\t\t\t\t\t`- ${definition.icon} **${definition.name}** — ${definition.description.split(\".\")[0]}`,\n\t\t\t\t)\n\t\t\t\t.join(\"\\n\");\n\t\t\tmemSection += `\n### Memory Services\n\n${memList}\n`;\n\t\t}\n\n\t\tif (vectorDbs.length > 0) {\n\t\t\tconst vecList = vectorDbs\n\t\t\t\t.map(\n\t\t\t\t\t({ definition }) =>\n\t\t\t\t\t\t`- ${definition.icon} **${definition.name}** — ${definition.description.split(\".\")[0]}`,\n\t\t\t\t)\n\t\t\t\t.join(\"\\n\");\n\t\t\tmemSection += `\n### Vector Databases\n\n${vecList}\n`;\n\t\t}\n\n\t\tmemSection += `\nSkills for interacting with these services are in \\`openclaw/workspace/skills/\\`.\n`;\n\n\t\tsections.push(memSection);\n\t}\n\n\t// ── Onboarding & Channels ──────────────────────────────────────────────\n\t// Only show OpenClaw-specific onboarding instructions for OpenClaw stacks\n\n\tif (isOpenClaw && isDirectInstall) {\n\t\tsections.push(`## OpenClaw Setup\n\nOpenClaw is installed directly on the host (not in Docker). After running the install script:\\n\n\\`\\`\\`bash\n# Run onboarding to configure the gateway\nopenclaw onboard\n\n# Launch the dashboard\nopenclaw dashboard\n\\`\\`\\`\n\nWhen prompted during onboarding:\n- **Gateway bind:** \\`lan\\`\n- **Gateway auth:** \\`token\\`\n- **Gateway token:** (use the value from \\`.env\\` → \\`OPENCLAW_GATEWAY_TOKEN\\`)\n\n### Connect Messaging Channels (optional)\n\n\\`\\`\\`bash\n# WhatsApp (scan QR code)\nopenclaw channels login\n\n# Telegram\nopenclaw channels add --channel telegram --token <BOT_TOKEN>\n\n# Discord\nopenclaw channels add --channel discord --token <BOT_TOKEN>\n\\`\\`\\`\n\nSee [Channel Docs](https://docs.openclaw.ai/channels) for more providers.\n`);\n\t} else if (isOpenClaw) {\n\t\tsections.push(`## Onboarding & Channel Setup\n\nAfter starting the stack, complete the gateway onboarding:\n\n\\`\\`\\`bash\n# Interactive onboarding (sets up gateway auth and config)\ndocker compose run --rm openclaw-cli onboard --no-install-daemon\n\\`\\`\\`\n\nWhen prompted:\n- **Gateway bind:** \\`lan\\`\n- **Gateway auth:** \\`token\\`\n- **Gateway token:** (use the value from \\`.env\\` → \\`OPENCLAW_GATEWAY_TOKEN\\`)\n- **Tailscale exposure:** Off\n- **Install Gateway daemon:** No\n\n### Connect Messaging Channels (optional)\n\n\\`\\`\\`bash\n# WhatsApp (scan QR code)\ndocker compose run --rm openclaw-cli channels login\n\n# Telegram\ndocker compose run --rm openclaw-cli channels add --channel telegram --token <BOT_TOKEN>\n\n# Discord\ndocker compose run --rm openclaw-cli channels add --channel discord --token <BOT_TOKEN>\n\\`\\`\\`\n\nSee [Channel Docs](https://docs.openclaw.ai/channels) for more providers.\n`);\n\t}\n\n\t// ── Proxy Configuration ─────────────────────────────────────────────────\n\n\tif (proxy && proxy !== \"none\") {\n\t\tconst proxyName = proxy === \"caddy\" ? \"Caddy\" : \"Traefik\";\n\t\tsections.push(`## Reverse Proxy\n\nThis stack uses **${proxyName}** as a reverse proxy.${domain ? ` All services are available under \\`${domain}\\`.` : \"\"}\n\n${proxy === \"caddy\" ? \"The Caddyfile is located at `config/Caddyfile`.\" : \"Traefik configuration is handled via Docker labels.\"}\n`);\n\t}\n\n\t// ── Scripts ──────────────────────────────────────────────────────────────\n\n\tsections.push(`## Management Scripts\n\n\\`\\`\\`bash\nchmod +x scripts/*.sh # Make scripts executable (first time only)\n\\`\\`\\`\n\n| Script | Description |\n|--------|-------------|\n| \\`./scripts/start.sh\\` | Validates .env, auto-generates gateway token, creates dirs, starts all services with health checks |\n| \\`./scripts/stop.sh\\` | Gracefully stops all services |\n| \\`./scripts/update.sh\\` | Pulls latest Docker images and restarts services |\n| \\`./scripts/backup.sh\\` | Backs up all named Docker volumes to timestamped archives |\n| \\`./scripts/status.sh\\` | Shows current service status, resource usage, and disk |\n`);\n\n\t// ── Data & Volumes ──────────────────────────────────────────────────────\n\n\tconst volumeRows = resolved.services.flatMap(({ definition }) =>\n\t\tdefinition.volumes.map((v) => ({\n\t\t\tname: v.name,\n\t\t\tpath: v.containerPath,\n\t\t\tdescription: v.description,\n\t\t\tserviceName: definition.name,\n\t\t})),\n\t);\n\n\tif (volumeRows.length > 0) {\n\t\tconst rows = volumeRows\n\t\t\t.map((v) => `| \\`${v.name}\\` | ${v.serviceName} | ${v.description} |`)\n\t\t\t.join(\"\\n\");\n\n\t\tsections.push(`## Volumes\n\n| Volume | Service | Description |\n|--------|---------|-------------|\n${rows}\n\n> **Tip:** Use \\`scripts/backup.sh\\` to back up all volumes before updates.\n`);\n\t}\n\n\t// ── Estimated Resources ─────────────────────────────────────────────────\n\n\tsections.push(`## Resource Estimates\n\n- **Services:** ${resolved.services.length}\n- **Estimated RAM:** ~${(resolved.estimatedMemoryMB / 1024).toFixed(1)}GB\n- **Recommended minimum:** ${Math.ceil(resolved.estimatedMemoryMB / 1024) + 2}GB RAM\n`);\n\n\t// ── Warnings ─────────────────────────────────────────────────────────────\n\n\tif (resolved.warnings.length > 0) {\n\t\tconst warningList = resolved.warnings.map((w) => `- ⚠️ ${w.message}`).join(\"\\n\");\n\n\t\tsections.push(`## Warnings\n\n${warningList}\n`);\n\t}\n\n\t// ── Footer ──────────────────────────────────────────────────────────────\n\n\tsections.push(`---\n\nGenerated by [better-openclaw](https://better-openclaw.dev) • ${new Date().toISOString().split(\"T\")[0]}\nDeploy without managing servers: [Clawexa Cloud](https://clawexa.net)\n`);\n\n\treturn sections.join(\"\\n\");\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ResolverOutput } from "../types.cjs";
1
+ import { B as ResolverOutput } from "../types-Bsn0XzSP.cjs";
2
2
 
3
3
  //#region src/generators/readme.d.ts
4
4
  /**
@@ -14,6 +14,8 @@ interface ReadmeOptions {
14
14
  hasNativeServices?: boolean;
15
15
  /** How OpenClaw itself is installed: docker (container) or direct (host). */
16
16
  openclawInstallMethod?: "docker" | "direct";
17
+ /** Primary agent framework (defaults to "openclaw"). */
18
+ primaryFramework?: string;
17
19
  }
18
20
  /**
19
21
  * Generates a comprehensive README.md for the OpenClaw project.
@@ -1 +1 @@
1
- {"version":3,"file":"readme.d.cts","names":[],"sources":["../../src/generators/readme.ts"],"mappings":";;;;;AAKA;UAAiB,aAAA;EAChB,WAAA;EACA,MAAA;EACA,KAAA;EADA;EAGA,cAAA;EAAA;EAEA,iBAAA;EAEA;EAAA,qBAAA;AAAA;AASD;;;;;;AAAA,iBAAgB,cAAA,CAAe,QAAA,EAAU,cAAA,EAAgB,OAAA,EAAS,aAAA"}
1
+ {"version":3,"file":"readme.d.cts","names":[],"sources":["../../src/generators/readme.ts"],"mappings":";;;;;AAMA;UAAiB,aAAA;EAChB,WAAA;EACA,MAAA;EACA,KAAA;EADA;EAGA,cAAA;EAAA;EAEA,iBAAA;EAEA;EAAA,qBAAA;EAEgB;EAAhB,gBAAA;AAAA;;;;;;;iBASe,cAAA,CAAe,QAAA,EAAU,cAAA,EAAgB,OAAA,EAAS,aAAA"}
@@ -1,4 +1,4 @@
1
- import { ResolverOutput } from "../types.mjs";
1
+ import { B as ResolverOutput } from "../types-DwTKyCZ9.mjs";
2
2
 
3
3
  //#region src/generators/readme.d.ts
4
4
  /**
@@ -14,6 +14,8 @@ interface ReadmeOptions {
14
14
  hasNativeServices?: boolean;
15
15
  /** How OpenClaw itself is installed: docker (container) or direct (host). */
16
16
  openclawInstallMethod?: "docker" | "direct";
17
+ /** Primary agent framework (defaults to "openclaw"). */
18
+ primaryFramework?: string;
17
19
  }
18
20
  /**
19
21
  * Generates a comprehensive README.md for the OpenClaw project.
@@ -1 +1 @@
1
- {"version":3,"file":"readme.d.mts","names":[],"sources":["../../src/generators/readme.ts"],"mappings":";;;;;;UAKiB,aAAA;EAChB,WAAA;EACA,MAAA;EACA,KAAA;EAFA;EAIA,cAAA;EAFA;EAIA,iBAAA;EAAA;EAEA,qBAAA;AAAA;;AASD;;;;;iBAAgB,cAAA,CAAe,QAAA,EAAU,cAAA,EAAgB,OAAA,EAAS,aAAA"}
1
+ {"version":3,"file":"readme.d.mts","names":[],"sources":["../../src/generators/readme.ts"],"mappings":";;;;;;UAMiB,aAAA;EAChB,WAAA;EACA,MAAA;EACA,KAAA;EAFA;EAIA,cAAA;EAFA;EAIA,iBAAA;EAAA;EAEA,qBAAA;EAEA;EAAA,gBAAA;AAAA;AASD;;;;;;AAAA,iBAAgB,cAAA,CAAe,QAAA,EAAU,cAAA,EAAgB,OAAA,EAAS,aAAA"}
@@ -1,3 +1,5 @@
1
+ import { getFrameworkById } from "../frameworks/registry.mjs";
2
+ import "../frameworks/index.mjs";
1
3
  //#region src/generators/readme.ts
2
4
  /**
3
5
  * Generates a comprehensive README.md for the OpenClaw project.
@@ -6,15 +8,17 @@
6
8
  * service URLs, skill packs, and scripts documentation.
7
9
  */
8
10
  function generateReadme(resolved, options) {
9
- const { projectName, domain, proxy, deploymentType, hasNativeServices, openclawInstallMethod } = options;
11
+ const { projectName, domain, proxy, deploymentType, hasNativeServices, openclawInstallMethod, primaryFramework } = options;
10
12
  const isDirectInstall = openclawInstallMethod === "direct";
13
+ const frameworkName = getFrameworkById(primaryFramework ?? "openclaw")?.name ?? "OpenClaw";
14
+ const isOpenClaw = (primaryFramework ?? "openclaw") === "openclaw";
11
15
  const sections = [];
12
16
  sections.push(`# ${projectName}
13
17
 
14
- > Self-hosted AI agent infrastructure powered by [OpenClaw](https://openclaw.dev).
18
+ > Self-hosted AI agent infrastructure powered by **${frameworkName}**${isOpenClaw ? " — [openclaw.dev](https://openclaw.dev)" : ""}.
15
19
 
16
- This project provides a fully configured Docker Compose stack with ${resolved.services.length} services, ready to deploy on any server.${isDirectInstall ? " OpenClaw itself runs directly on the host (not in Docker)." : ""}
17
- ${deploymentType === "bare-metal" && hasNativeServices ? "\n\n**Bare-metal (native + Docker):** Some services run natively on the host; the rest (including the OpenClaw gateway) run in Docker. Use the top-level `install.sh` or `install.ps1` to install/start native services first, then start the Docker stack." : ""}
20
+ This project provides a fully configured Docker Compose stack with ${resolved.services.length} services, ready to deploy on any server.${isDirectInstall ? ` ${frameworkName} itself runs directly on the host (not in Docker).` : ""}
21
+ ${deploymentType === "bare-metal" && hasNativeServices ? `\n\n**Bare-metal (native + Docker):** Some services run natively on the host; the rest (including the ${frameworkName} gateway) run in Docker. Use the top-level \`install.sh\` or \`install.ps1\` to install/start native services first, then start the Docker stack.` : ""}
18
22
 
19
23
  ---`);
20
24
  const serviceRows = resolved.services.map(({ definition }) => {
@@ -95,7 +99,7 @@ docker compose ps
95
99
  ### 5. View Logs
96
100
 
97
101
  \`\`\`bash
98
- docker compose logs -f openclaw-gateway
102
+ docker compose logs -f ${primaryFramework ?? "openclaw"}-gateway
99
103
  \`\`\`
100
104
  `}
101
105
  All services should show a healthy status within 1–2 minutes.
@@ -157,7 +161,46 @@ ${skillRows}
157
161
  Skills are located in \`openclaw/workspace/skills/\`. Each skill provides a \`SKILL.md\` with usage instructions.
158
162
  `);
159
163
  }
160
- if (isDirectInstall) sections.push(`## OpenClaw Setup
164
+ const memoryServiceIds = [
165
+ "mem0",
166
+ "memu",
167
+ "hindsight"
168
+ ];
169
+ const vectorDbIds = [
170
+ "qdrant",
171
+ "chromadb",
172
+ "weaviate",
173
+ "milvus"
174
+ ];
175
+ const memoryServices = resolved.services.filter(({ definition }) => memoryServiceIds.includes(definition.id));
176
+ const vectorDbs = resolved.services.filter(({ definition }) => vectorDbIds.includes(definition.id));
177
+ if (memoryServices.length > 0 || vectorDbs.length > 0) {
178
+ let memSection = `## AI Memory Integration
179
+
180
+ This stack includes integrated AI memory services. The ${frameworkName} agent framework is automatically configured to use them via \`openclaw/config/openclaw.json\`.
181
+ `;
182
+ if (memoryServices.length > 0) {
183
+ const memList = memoryServices.map(({ definition }) => `- ${definition.icon} **${definition.name}** — ${definition.description.split(".")[0]}`).join("\n");
184
+ memSection += `
185
+ ### Memory Services
186
+
187
+ ${memList}
188
+ `;
189
+ }
190
+ if (vectorDbs.length > 0) {
191
+ const vecList = vectorDbs.map(({ definition }) => `- ${definition.icon} **${definition.name}** — ${definition.description.split(".")[0]}`).join("\n");
192
+ memSection += `
193
+ ### Vector Databases
194
+
195
+ ${vecList}
196
+ `;
197
+ }
198
+ memSection += `
199
+ Skills for interacting with these services are in \`openclaw/workspace/skills/\`.
200
+ `;
201
+ sections.push(memSection);
202
+ }
203
+ if (isOpenClaw && isDirectInstall) sections.push(`## OpenClaw Setup
161
204
 
162
205
  OpenClaw is installed directly on the host (not in Docker). After running the install script:\n
163
206
  \`\`\`bash
@@ -188,7 +231,7 @@ openclaw channels add --channel discord --token <BOT_TOKEN>
188
231
 
189
232
  See [Channel Docs](https://docs.openclaw.ai/channels) for more providers.
190
233
  `);
191
- else sections.push(`## Onboarding & Channel Setup
234
+ else if (isOpenClaw) sections.push(`## Onboarding & Channel Setup
192
235
 
193
236
  After starting the stack, complete the gateway onboarding:
194
237
 
@@ -1 +1 @@
1
- {"version":3,"file":"readme.mjs","names":[],"sources":["../../src/generators/readme.ts"],"sourcesContent":["import type { ResolverOutput } from \"../types.js\";\n\n/**\n * Options for README generation.\n */\nexport interface ReadmeOptions {\n\tprojectName: string;\n\tdomain?: string;\n\tproxy?: string;\n\t/** When \"bare-metal\", the stack uses native + Docker hybrid. */\n\tdeploymentType?: \"docker\" | \"bare-metal\" | \"local\";\n\t/** True when some services run natively on the host (bare-metal only). */\n\thasNativeServices?: boolean;\n\t/** How OpenClaw itself is installed: docker (container) or direct (host). */\n\topenclawInstallMethod?: \"docker\" | \"direct\";\n}\n\n/**\n * Generates a comprehensive README.md for the OpenClaw project.\n *\n * Includes: project description, service table, quick start instructions,\n * service URLs, skill packs, and scripts documentation.\n */\nexport function generateReadme(resolved: ResolverOutput, options: ReadmeOptions): string {\n\tconst { projectName, domain, proxy, deploymentType, hasNativeServices, openclawInstallMethod } =\n\t\toptions;\n\tconst isDirectInstall = openclawInstallMethod === \"direct\";\n\tconst sections: string[] = [];\n\n\t// ── Title & Description ─────────────────────────────────────────────────\n\n\tsections.push(`# ${projectName}\n\n> Self-hosted AI agent infrastructure powered by [OpenClaw](https://openclaw.dev).\n\nThis project provides a fully configured Docker Compose stack with ${resolved.services.length} services, ready to deploy on any server.${isDirectInstall ? \" OpenClaw itself runs directly on the host (not in Docker).\" : \"\"}\n${deploymentType === \"bare-metal\" && hasNativeServices ? \"\\n\\n**Bare-metal (native + Docker):** Some services run natively on the host; the rest (including the OpenClaw gateway) run in Docker. Use the top-level `install.sh` or `install.ps1` to install/start native services first, then start the Docker stack.\" : \"\"}\n\n---`);\n\n\t// ── Service Table ────────────────────────────────────────────────────────\n\n\tconst serviceRows = resolved.services\n\t\t.map(({ definition }) => {\n\t\t\tconst mainPort = definition.ports.find((p) => p.exposed);\n\t\t\tconst url = mainPort\n\t\t\t\t? domain\n\t\t\t\t\t? `https://${definition.id}.${domain}`\n\t\t\t\t\t: `http://localhost:${mainPort.host}`\n\t\t\t\t: \"N/A (internal)\";\n\t\t\treturn `| ${definition.icon} | **${definition.name}** | ${url} | ${definition.description} |`;\n\t\t})\n\t\t.join(\"\\n\");\n\n\tsections.push(`## Services\n\n| | Service | URL | Description |\n|---|---------|-----|-------------|\n${serviceRows}\n`);\n\n\t// ── Quick Start ──────────────────────────────────────────────────────────\n\n\tsections.push(`## Quick Start\n\n### Prerequisites\n\n- [Docker](https://docs.docker.com/get-docker/) (v24+)\n- [Docker Compose](https://docs.docker.com/compose/install/) (v2+)\n- At least ${Math.ceil(resolved.estimatedMemoryMB / 1024)}GB of RAM available\n${isDirectInstall ? \"- Node.js 22+ (installed automatically by the OpenClaw installer)\" : \"\"}\n\n### 1. Extract the ZIP\n\n\\`\\`\\`bash\nunzip ${projectName}.zip\ncd ${projectName}\n\\`\\`\\`\n\n### 2. Configure Environment\n\n\\`\\`\\`bash\ncp .env.example .env\n\\`\\`\\`\n\nEdit \\`.env\\` and update any values as needed. Secret values have been pre-generated — review and change them for production use.\n${\n\tisDirectInstall\n\t\t? `\n### 3. Install OpenClaw on the Host\n\n\\`\\`\\`bash\nchmod +x scripts/install-openclaw.sh\n./scripts/install-openclaw.sh\n\\`\\`\\`\n\nThis downloads and runs the official installer, which sets up Node.js 22+ and OpenClaw globally.\n\n### 4. Start Companion Services\n\n\\`\\`\\`bash\ndocker compose up -d\n\\`\\`\\`\n\n### 5. Run Onboarding\n\n\\`\\`\\`bash\nopenclaw onboard\n\\`\\`\\`\n`\n\t\t: `\n### 3. Start Services\n\n\\`\\`\\`bash\ndocker compose up -d\n\\`\\`\\`\n\nOr use the provided start script:\n\n\\`\\`\\`bash\nchmod +x scripts/*.sh\n./scripts/start.sh\n\\`\\`\\`\n\n### 4. Check Status\n\n\\`\\`\\`bash\ndocker compose ps\n\\`\\`\\`\n\n### 5. View Logs\n\n\\`\\`\\`bash\ndocker compose logs -f openclaw-gateway\n\\`\\`\\`\n`\n}\nAll services should show a healthy status within 1–2 minutes.\n`);\n\n\t// ── Docker Compose Profiles ──────────────────────────────────────────────\n\n\tsections.push(`## Using Docker Compose Profiles\n\nYour stack may include profile-based compose files for optional service groups. Only the base services start by default — use profiles to activate additional groups:\n\n\\`\\`\\`bash\n# Start base services only\ndocker compose up -d\n\n# Start base + AI services (Ollama, Open WebUI, etc.)\ndocker compose -f docker-compose.yml -f docker-compose.ai.yml --profile ai up -d\n\n# Start base + monitoring (Grafana, Prometheus, Uptime Kuma)\ndocker compose -f docker-compose.yml -f docker-compose.monitoring.yml --profile monitoring up -d\n\n# Start base + AI + dev tools\ndocker compose -f docker-compose.yml -f docker-compose.ai.yml -f docker-compose.tools.yml --profile ai --profile tools up -d\n\\`\\`\\`\n\nAvailable profile files (if generated):\n| File | Profile | Services |\n|------|---------|----------|\n| \\`docker-compose.ai.yml\\` | \\`ai\\` | AI models, chat UIs, LLM platforms |\n| \\`docker-compose.media.yml\\` | \\`media\\` | FFmpeg, Remotion, Motion Canvas |\n| \\`docker-compose.monitoring.yml\\` | \\`monitoring\\` | Grafana, Prometheus, Uptime Kuma, analytics |\n| \\`docker-compose.tools.yml\\` | \\`tools\\` | Gitea, code-server, Portainer, coding agents |\n| \\`docker-compose.social.yml\\` | \\`social\\` | Postiz, Mixpost |\n| \\`docker-compose.knowledge.yml\\` | \\`knowledge\\` | Outline, Paperless-ngx, NocoDB |\n| \\`docker-compose.communication.yml\\` | \\`communication\\` | Matrix, Rocket.Chat, Mattermost |\n`);\n\n\t// ── Service URLs & Ports ─────────────────────────────────────────────────\n\n\tconst portRows = resolved.services\n\t\t.filter(({ definition }) => definition.ports.length > 0)\n\t\t.map(({ definition }) => {\n\t\t\tconst ports = definition.ports\n\t\t\t\t.map((p) => `\\`${p.host}\\` → \\`${p.container}\\` (${p.description})`)\n\t\t\t\t.join(\", \");\n\t\t\treturn `| ${definition.icon} ${definition.name} | ${ports} |`;\n\t\t})\n\t\t.join(\"\\n\");\n\n\tif (portRows) {\n\t\tsections.push(`## Ports\n\n| Service | Ports |\n|---------|-------|\n${portRows}\n`);\n\t}\n\n\t// ── Skill Packs ─────────────────────────────────────────────────────────\n\n\tconst allSkills = resolved.services.flatMap(({ definition }) =>\n\t\tdefinition.skills.map((s) => ({\n\t\t\tskillId: s.skillId,\n\t\t\tserviceName: definition.name,\n\t\t\tserviceIcon: definition.icon,\n\t\t})),\n\t);\n\n\tif (allSkills.length > 0) {\n\t\tconst skillRows = allSkills\n\t\t\t.map((s) => `| \\`${s.skillId}\\` | ${s.serviceIcon} ${s.serviceName} |`)\n\t\t\t.join(\"\\n\");\n\n\t\tsections.push(`## Skills\n\nThe following OpenClaw skills are automatically installed:\n\n| Skill | Service |\n|-------|---------|\n${skillRows}\n\nSkills are located in \\`openclaw/workspace/skills/\\`. Each skill provides a \\`SKILL.md\\` with usage instructions.\n`);\n\t}\n\n\t// ── Onboarding & Channels ──────────────────────────────────────────────\n\t// Based on openclaw_docker-setup.sh post-deploy instructions\n\n\tif (isDirectInstall) {\n\t\tsections.push(`## OpenClaw Setup\n\nOpenClaw is installed directly on the host (not in Docker). After running the install script:\\n\n\\`\\`\\`bash\n# Run onboarding to configure the gateway\nopenclaw onboard\n\n# Launch the dashboard\nopenclaw dashboard\n\\`\\`\\`\n\nWhen prompted during onboarding:\n- **Gateway bind:** \\`lan\\`\n- **Gateway auth:** \\`token\\`\n- **Gateway token:** (use the value from \\`.env\\` → \\`OPENCLAW_GATEWAY_TOKEN\\`)\n\n### Connect Messaging Channels (optional)\n\n\\`\\`\\`bash\n# WhatsApp (scan QR code)\nopenclaw channels login\n\n# Telegram\nopenclaw channels add --channel telegram --token <BOT_TOKEN>\n\n# Discord\nopenclaw channels add --channel discord --token <BOT_TOKEN>\n\\`\\`\\`\n\nSee [Channel Docs](https://docs.openclaw.ai/channels) for more providers.\n`);\n\t} else {\n\t\tsections.push(`## Onboarding & Channel Setup\n\nAfter starting the stack, complete the gateway onboarding:\n\n\\`\\`\\`bash\n# Interactive onboarding (sets up gateway auth and config)\ndocker compose run --rm openclaw-cli onboard --no-install-daemon\n\\`\\`\\`\n\nWhen prompted:\n- **Gateway bind:** \\`lan\\`\n- **Gateway auth:** \\`token\\`\n- **Gateway token:** (use the value from \\`.env\\` → \\`OPENCLAW_GATEWAY_TOKEN\\`)\n- **Tailscale exposure:** Off\n- **Install Gateway daemon:** No\n\n### Connect Messaging Channels (optional)\n\n\\`\\`\\`bash\n# WhatsApp (scan QR code)\ndocker compose run --rm openclaw-cli channels login\n\n# Telegram\ndocker compose run --rm openclaw-cli channels add --channel telegram --token <BOT_TOKEN>\n\n# Discord\ndocker compose run --rm openclaw-cli channels add --channel discord --token <BOT_TOKEN>\n\\`\\`\\`\n\nSee [Channel Docs](https://docs.openclaw.ai/channels) for more providers.\n`);\n\t}\n\n\t// ── Proxy Configuration ─────────────────────────────────────────────────\n\n\tif (proxy && proxy !== \"none\") {\n\t\tconst proxyName = proxy === \"caddy\" ? \"Caddy\" : \"Traefik\";\n\t\tsections.push(`## Reverse Proxy\n\nThis stack uses **${proxyName}** as a reverse proxy.${domain ? ` All services are available under \\`${domain}\\`.` : \"\"}\n\n${proxy === \"caddy\" ? \"The Caddyfile is located at `config/Caddyfile`.\" : \"Traefik configuration is handled via Docker labels.\"}\n`);\n\t}\n\n\t// ── Scripts ──────────────────────────────────────────────────────────────\n\n\tsections.push(`## Management Scripts\n\n\\`\\`\\`bash\nchmod +x scripts/*.sh # Make scripts executable (first time only)\n\\`\\`\\`\n\n| Script | Description |\n|--------|-------------|\n| \\`./scripts/start.sh\\` | Validates .env, auto-generates gateway token, creates dirs, starts all services with health checks |\n| \\`./scripts/stop.sh\\` | Gracefully stops all services |\n| \\`./scripts/update.sh\\` | Pulls latest Docker images and restarts services |\n| \\`./scripts/backup.sh\\` | Backs up all named Docker volumes to timestamped archives |\n| \\`./scripts/status.sh\\` | Shows current service status, resource usage, and disk |\n`);\n\n\t// ── Data & Volumes ──────────────────────────────────────────────────────\n\n\tconst volumeRows = resolved.services.flatMap(({ definition }) =>\n\t\tdefinition.volumes.map((v) => ({\n\t\t\tname: v.name,\n\t\t\tpath: v.containerPath,\n\t\t\tdescription: v.description,\n\t\t\tserviceName: definition.name,\n\t\t})),\n\t);\n\n\tif (volumeRows.length > 0) {\n\t\tconst rows = volumeRows\n\t\t\t.map((v) => `| \\`${v.name}\\` | ${v.serviceName} | ${v.description} |`)\n\t\t\t.join(\"\\n\");\n\n\t\tsections.push(`## Volumes\n\n| Volume | Service | Description |\n|--------|---------|-------------|\n${rows}\n\n> **Tip:** Use \\`scripts/backup.sh\\` to back up all volumes before updates.\n`);\n\t}\n\n\t// ── Estimated Resources ─────────────────────────────────────────────────\n\n\tsections.push(`## Resource Estimates\n\n- **Services:** ${resolved.services.length}\n- **Estimated RAM:** ~${(resolved.estimatedMemoryMB / 1024).toFixed(1)}GB\n- **Recommended minimum:** ${Math.ceil(resolved.estimatedMemoryMB / 1024) + 2}GB RAM\n`);\n\n\t// ── Warnings ─────────────────────────────────────────────────────────────\n\n\tif (resolved.warnings.length > 0) {\n\t\tconst warningList = resolved.warnings.map((w) => `- ⚠️ ${w.message}`).join(\"\\n\");\n\n\t\tsections.push(`## Warnings\n\n${warningList}\n`);\n\t}\n\n\t// ── Footer ──────────────────────────────────────────────────────────────\n\n\tsections.push(`---\n\nGenerated by [better-openclaw](https://better-openclaw.dev) • ${new Date().toISOString().split(\"T\")[0]}\nDeploy without managing servers: [Clawexa Cloud](https://clawexa.net)\n`);\n\n\treturn sections.join(\"\\n\");\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"readme.mjs","names":[],"sources":["../../src/generators/readme.ts"],"sourcesContent":["import { getFrameworkById } from \"../frameworks/index.js\";\nimport type { ResolverOutput } from \"../types.js\";\n\n/**\n * Options for README generation.\n */\nexport interface ReadmeOptions {\n\tprojectName: string;\n\tdomain?: string;\n\tproxy?: string;\n\t/** When \"bare-metal\", the stack uses native + Docker hybrid. */\n\tdeploymentType?: \"docker\" | \"bare-metal\" | \"local\";\n\t/** True when some services run natively on the host (bare-metal only). */\n\thasNativeServices?: boolean;\n\t/** How OpenClaw itself is installed: docker (container) or direct (host). */\n\topenclawInstallMethod?: \"docker\" | \"direct\";\n\t/** Primary agent framework (defaults to \"openclaw\"). */\n\tprimaryFramework?: string;\n}\n\n/**\n * Generates a comprehensive README.md for the OpenClaw project.\n *\n * Includes: project description, service table, quick start instructions,\n * service URLs, skill packs, and scripts documentation.\n */\nexport function generateReadme(resolved: ResolverOutput, options: ReadmeOptions): string {\n\tconst {\n\t\tprojectName,\n\t\tdomain,\n\t\tproxy,\n\t\tdeploymentType,\n\t\thasNativeServices,\n\t\topenclawInstallMethod,\n\t\tprimaryFramework,\n\t} = options;\n\tconst isDirectInstall = openclawInstallMethod === \"direct\";\n\tconst framework = getFrameworkById(primaryFramework ?? \"openclaw\");\n\tconst frameworkName = framework?.name ?? \"OpenClaw\";\n\tconst isOpenClaw = (primaryFramework ?? \"openclaw\") === \"openclaw\";\n\tconst sections: string[] = [];\n\n\t// ── Title & Description ─────────────────────────────────────────────────\n\n\tsections.push(`# ${projectName}\n\n> Self-hosted AI agent infrastructure powered by **${frameworkName}**${isOpenClaw ? \" — [openclaw.dev](https://openclaw.dev)\" : \"\"}.\n\nThis project provides a fully configured Docker Compose stack with ${resolved.services.length} services, ready to deploy on any server.${isDirectInstall ? ` ${frameworkName} itself runs directly on the host (not in Docker).` : \"\"}\n${deploymentType === \"bare-metal\" && hasNativeServices ? `\\n\\n**Bare-metal (native + Docker):** Some services run natively on the host; the rest (including the ${frameworkName} gateway) run in Docker. Use the top-level \\`install.sh\\` or \\`install.ps1\\` to install/start native services first, then start the Docker stack.` : \"\"}\n\n---`);\n\n\t// ── Service Table ────────────────────────────────────────────────────────\n\n\tconst serviceRows = resolved.services\n\t\t.map(({ definition }) => {\n\t\t\tconst mainPort = definition.ports.find((p) => p.exposed);\n\t\t\tconst url = mainPort\n\t\t\t\t? domain\n\t\t\t\t\t? `https://${definition.id}.${domain}`\n\t\t\t\t\t: `http://localhost:${mainPort.host}`\n\t\t\t\t: \"N/A (internal)\";\n\t\t\treturn `| ${definition.icon} | **${definition.name}** | ${url} | ${definition.description} |`;\n\t\t})\n\t\t.join(\"\\n\");\n\n\tsections.push(`## Services\n\n| | Service | URL | Description |\n|---|---------|-----|-------------|\n${serviceRows}\n`);\n\n\t// ── Quick Start ──────────────────────────────────────────────────────────\n\n\tsections.push(`## Quick Start\n\n### Prerequisites\n\n- [Docker](https://docs.docker.com/get-docker/) (v24+)\n- [Docker Compose](https://docs.docker.com/compose/install/) (v2+)\n- At least ${Math.ceil(resolved.estimatedMemoryMB / 1024)}GB of RAM available\n${isDirectInstall ? \"- Node.js 22+ (installed automatically by the OpenClaw installer)\" : \"\"}\n\n### 1. Extract the ZIP\n\n\\`\\`\\`bash\nunzip ${projectName}.zip\ncd ${projectName}\n\\`\\`\\`\n\n### 2. Configure Environment\n\n\\`\\`\\`bash\ncp .env.example .env\n\\`\\`\\`\n\nEdit \\`.env\\` and update any values as needed. Secret values have been pre-generated — review and change them for production use.\n${\n\tisDirectInstall\n\t\t? `\n### 3. Install OpenClaw on the Host\n\n\\`\\`\\`bash\nchmod +x scripts/install-openclaw.sh\n./scripts/install-openclaw.sh\n\\`\\`\\`\n\nThis downloads and runs the official installer, which sets up Node.js 22+ and OpenClaw globally.\n\n### 4. Start Companion Services\n\n\\`\\`\\`bash\ndocker compose up -d\n\\`\\`\\`\n\n### 5. Run Onboarding\n\n\\`\\`\\`bash\nopenclaw onboard\n\\`\\`\\`\n`\n\t\t: `\n### 3. Start Services\n\n\\`\\`\\`bash\ndocker compose up -d\n\\`\\`\\`\n\nOr use the provided start script:\n\n\\`\\`\\`bash\nchmod +x scripts/*.sh\n./scripts/start.sh\n\\`\\`\\`\n\n### 4. Check Status\n\n\\`\\`\\`bash\ndocker compose ps\n\\`\\`\\`\n\n### 5. View Logs\n\n\\`\\`\\`bash\ndocker compose logs -f ${primaryFramework ?? \"openclaw\"}-gateway\n\\`\\`\\`\n`\n}\nAll services should show a healthy status within 1–2 minutes.\n`);\n\n\t// ── Docker Compose Profiles ──────────────────────────────────────────────\n\n\tsections.push(`## Using Docker Compose Profiles\n\nYour stack may include profile-based compose files for optional service groups. Only the base services start by default — use profiles to activate additional groups:\n\n\\`\\`\\`bash\n# Start base services only\ndocker compose up -d\n\n# Start base + AI services (Ollama, Open WebUI, etc.)\ndocker compose -f docker-compose.yml -f docker-compose.ai.yml --profile ai up -d\n\n# Start base + monitoring (Grafana, Prometheus, Uptime Kuma)\ndocker compose -f docker-compose.yml -f docker-compose.monitoring.yml --profile monitoring up -d\n\n# Start base + AI + dev tools\ndocker compose -f docker-compose.yml -f docker-compose.ai.yml -f docker-compose.tools.yml --profile ai --profile tools up -d\n\\`\\`\\`\n\nAvailable profile files (if generated):\n| File | Profile | Services |\n|------|---------|----------|\n| \\`docker-compose.ai.yml\\` | \\`ai\\` | AI models, chat UIs, LLM platforms |\n| \\`docker-compose.media.yml\\` | \\`media\\` | FFmpeg, Remotion, Motion Canvas |\n| \\`docker-compose.monitoring.yml\\` | \\`monitoring\\` | Grafana, Prometheus, Uptime Kuma, analytics |\n| \\`docker-compose.tools.yml\\` | \\`tools\\` | Gitea, code-server, Portainer, coding agents |\n| \\`docker-compose.social.yml\\` | \\`social\\` | Postiz, Mixpost |\n| \\`docker-compose.knowledge.yml\\` | \\`knowledge\\` | Outline, Paperless-ngx, NocoDB |\n| \\`docker-compose.communication.yml\\` | \\`communication\\` | Matrix, Rocket.Chat, Mattermost |\n`);\n\n\t// ── Service URLs & Ports ─────────────────────────────────────────────────\n\n\tconst portRows = resolved.services\n\t\t.filter(({ definition }) => definition.ports.length > 0)\n\t\t.map(({ definition }) => {\n\t\t\tconst ports = definition.ports\n\t\t\t\t.map((p) => `\\`${p.host}\\` → \\`${p.container}\\` (${p.description})`)\n\t\t\t\t.join(\", \");\n\t\t\treturn `| ${definition.icon} ${definition.name} | ${ports} |`;\n\t\t})\n\t\t.join(\"\\n\");\n\n\tif (portRows) {\n\t\tsections.push(`## Ports\n\n| Service | Ports |\n|---------|-------|\n${portRows}\n`);\n\t}\n\n\t// ── Skill Packs ─────────────────────────────────────────────────────────\n\n\tconst allSkills = resolved.services.flatMap(({ definition }) =>\n\t\tdefinition.skills.map((s) => ({\n\t\t\tskillId: s.skillId,\n\t\t\tserviceName: definition.name,\n\t\t\tserviceIcon: definition.icon,\n\t\t})),\n\t);\n\n\tif (allSkills.length > 0) {\n\t\tconst skillRows = allSkills\n\t\t\t.map((s) => `| \\`${s.skillId}\\` | ${s.serviceIcon} ${s.serviceName} |`)\n\t\t\t.join(\"\\n\");\n\n\t\tsections.push(`## Skills\n\nThe following OpenClaw skills are automatically installed:\n\n| Skill | Service |\n|-------|---------|\n${skillRows}\n\nSkills are located in \\`openclaw/workspace/skills/\\`. Each skill provides a \\`SKILL.md\\` with usage instructions.\n`);\n\t}\n\n\t// ── AI Memory Integration ──────────────────────────────────────────────\n\n\tconst memoryServiceIds = [\"mem0\", \"memu\", \"hindsight\"];\n\tconst vectorDbIds = [\"qdrant\", \"chromadb\", \"weaviate\", \"milvus\"];\n\n\tconst memoryServices = resolved.services.filter(({ definition }) =>\n\t\tmemoryServiceIds.includes(definition.id),\n\t);\n\tconst vectorDbs = resolved.services.filter(({ definition }) =>\n\t\tvectorDbIds.includes(definition.id),\n\t);\n\n\tif (memoryServices.length > 0 || vectorDbs.length > 0) {\n\t\tlet memSection = `## AI Memory Integration\n\nThis stack includes integrated AI memory services. The ${frameworkName} agent framework is automatically configured to use them via \\`openclaw/config/openclaw.json\\`.\n`;\n\n\t\tif (memoryServices.length > 0) {\n\t\t\tconst memList = memoryServices\n\t\t\t\t.map(\n\t\t\t\t\t({ definition }) =>\n\t\t\t\t\t\t`- ${definition.icon} **${definition.name}** — ${definition.description.split(\".\")[0]}`,\n\t\t\t\t)\n\t\t\t\t.join(\"\\n\");\n\t\t\tmemSection += `\n### Memory Services\n\n${memList}\n`;\n\t\t}\n\n\t\tif (vectorDbs.length > 0) {\n\t\t\tconst vecList = vectorDbs\n\t\t\t\t.map(\n\t\t\t\t\t({ definition }) =>\n\t\t\t\t\t\t`- ${definition.icon} **${definition.name}** — ${definition.description.split(\".\")[0]}`,\n\t\t\t\t)\n\t\t\t\t.join(\"\\n\");\n\t\t\tmemSection += `\n### Vector Databases\n\n${vecList}\n`;\n\t\t}\n\n\t\tmemSection += `\nSkills for interacting with these services are in \\`openclaw/workspace/skills/\\`.\n`;\n\n\t\tsections.push(memSection);\n\t}\n\n\t// ── Onboarding & Channels ──────────────────────────────────────────────\n\t// Only show OpenClaw-specific onboarding instructions for OpenClaw stacks\n\n\tif (isOpenClaw && isDirectInstall) {\n\t\tsections.push(`## OpenClaw Setup\n\nOpenClaw is installed directly on the host (not in Docker). After running the install script:\\n\n\\`\\`\\`bash\n# Run onboarding to configure the gateway\nopenclaw onboard\n\n# Launch the dashboard\nopenclaw dashboard\n\\`\\`\\`\n\nWhen prompted during onboarding:\n- **Gateway bind:** \\`lan\\`\n- **Gateway auth:** \\`token\\`\n- **Gateway token:** (use the value from \\`.env\\` → \\`OPENCLAW_GATEWAY_TOKEN\\`)\n\n### Connect Messaging Channels (optional)\n\n\\`\\`\\`bash\n# WhatsApp (scan QR code)\nopenclaw channels login\n\n# Telegram\nopenclaw channels add --channel telegram --token <BOT_TOKEN>\n\n# Discord\nopenclaw channels add --channel discord --token <BOT_TOKEN>\n\\`\\`\\`\n\nSee [Channel Docs](https://docs.openclaw.ai/channels) for more providers.\n`);\n\t} else if (isOpenClaw) {\n\t\tsections.push(`## Onboarding & Channel Setup\n\nAfter starting the stack, complete the gateway onboarding:\n\n\\`\\`\\`bash\n# Interactive onboarding (sets up gateway auth and config)\ndocker compose run --rm openclaw-cli onboard --no-install-daemon\n\\`\\`\\`\n\nWhen prompted:\n- **Gateway bind:** \\`lan\\`\n- **Gateway auth:** \\`token\\`\n- **Gateway token:** (use the value from \\`.env\\` → \\`OPENCLAW_GATEWAY_TOKEN\\`)\n- **Tailscale exposure:** Off\n- **Install Gateway daemon:** No\n\n### Connect Messaging Channels (optional)\n\n\\`\\`\\`bash\n# WhatsApp (scan QR code)\ndocker compose run --rm openclaw-cli channels login\n\n# Telegram\ndocker compose run --rm openclaw-cli channels add --channel telegram --token <BOT_TOKEN>\n\n# Discord\ndocker compose run --rm openclaw-cli channels add --channel discord --token <BOT_TOKEN>\n\\`\\`\\`\n\nSee [Channel Docs](https://docs.openclaw.ai/channels) for more providers.\n`);\n\t}\n\n\t// ── Proxy Configuration ─────────────────────────────────────────────────\n\n\tif (proxy && proxy !== \"none\") {\n\t\tconst proxyName = proxy === \"caddy\" ? \"Caddy\" : \"Traefik\";\n\t\tsections.push(`## Reverse Proxy\n\nThis stack uses **${proxyName}** as a reverse proxy.${domain ? ` All services are available under \\`${domain}\\`.` : \"\"}\n\n${proxy === \"caddy\" ? \"The Caddyfile is located at `config/Caddyfile`.\" : \"Traefik configuration is handled via Docker labels.\"}\n`);\n\t}\n\n\t// ── Scripts ──────────────────────────────────────────────────────────────\n\n\tsections.push(`## Management Scripts\n\n\\`\\`\\`bash\nchmod +x scripts/*.sh # Make scripts executable (first time only)\n\\`\\`\\`\n\n| Script | Description |\n|--------|-------------|\n| \\`./scripts/start.sh\\` | Validates .env, auto-generates gateway token, creates dirs, starts all services with health checks |\n| \\`./scripts/stop.sh\\` | Gracefully stops all services |\n| \\`./scripts/update.sh\\` | Pulls latest Docker images and restarts services |\n| \\`./scripts/backup.sh\\` | Backs up all named Docker volumes to timestamped archives |\n| \\`./scripts/status.sh\\` | Shows current service status, resource usage, and disk |\n`);\n\n\t// ── Data & Volumes ──────────────────────────────────────────────────────\n\n\tconst volumeRows = resolved.services.flatMap(({ definition }) =>\n\t\tdefinition.volumes.map((v) => ({\n\t\t\tname: v.name,\n\t\t\tpath: v.containerPath,\n\t\t\tdescription: v.description,\n\t\t\tserviceName: definition.name,\n\t\t})),\n\t);\n\n\tif (volumeRows.length > 0) {\n\t\tconst rows = volumeRows\n\t\t\t.map((v) => `| \\`${v.name}\\` | ${v.serviceName} | ${v.description} |`)\n\t\t\t.join(\"\\n\");\n\n\t\tsections.push(`## Volumes\n\n| Volume | Service | Description |\n|--------|---------|-------------|\n${rows}\n\n> **Tip:** Use \\`scripts/backup.sh\\` to back up all volumes before updates.\n`);\n\t}\n\n\t// ── Estimated Resources ─────────────────────────────────────────────────\n\n\tsections.push(`## Resource Estimates\n\n- **Services:** ${resolved.services.length}\n- **Estimated RAM:** ~${(resolved.estimatedMemoryMB / 1024).toFixed(1)}GB\n- **Recommended minimum:** ${Math.ceil(resolved.estimatedMemoryMB / 1024) + 2}GB RAM\n`);\n\n\t// ── Warnings ─────────────────────────────────────────────────────────────\n\n\tif (resolved.warnings.length > 0) {\n\t\tconst warningList = resolved.warnings.map((w) => `- ⚠️ ${w.message}`).join(\"\\n\");\n\n\t\tsections.push(`## Warnings\n\n${warningList}\n`);\n\t}\n\n\t// ── Footer ──────────────────────────────────────────────────────────────\n\n\tsections.push(`---\n\nGenerated by [better-openclaw](https://better-openclaw.dev) • ${new Date().toISOString().split(\"T\")[0]}\nDeploy without managing servers: [Clawexa Cloud](https://clawexa.net)\n`);\n\n\treturn sections.join(\"\\n\");\n}\n"],"mappings":";;;;;;;;;AA0BA,SAAgB,eAAe,UAA0B,SAAgC;CACxF,MAAM,EACL,aACA,QACA,OACA,gBACA,mBACA,uBACA,qBACG;CACJ,MAAM,kBAAkB,0BAA0B;CAElD,MAAM,gBADY,iBAAiB,oBAAoB,WAAW,EACjC,QAAQ;CACzC,MAAM,cAAc,oBAAoB,gBAAgB;CACxD,MAAM,WAAqB,EAAE;AAI7B,UAAS,KAAK,KAAK,YAAY;;qDAEqB,cAAc,IAAI,aAAa,4CAA4C,GAAG;;qEAE9D,SAAS,SAAS,OAAO,2CAA2C,kBAAkB,IAAI,cAAc,sDAAsD,GAAG;EACpO,mBAAmB,gBAAgB,oBAAoB,yGAAyG,cAAc,qJAAqJ,GAAG;;KAEnU;CAIJ,MAAM,cAAc,SAAS,SAC3B,KAAK,EAAE,iBAAiB;EACxB,MAAM,WAAW,WAAW,MAAM,MAAM,MAAM,EAAE,QAAQ;EACxD,MAAM,MAAM,WACT,SACC,WAAW,WAAW,GAAG,GAAG,WAC5B,oBAAoB,SAAS,SAC9B;AACH,SAAO,KAAK,WAAW,KAAK,OAAO,WAAW,KAAK,OAAO,IAAI,KAAK,WAAW,YAAY;GACzF,CACD,KAAK,KAAK;AAEZ,UAAS,KAAK;;;;EAIb,YAAY;EACZ;AAID,UAAS,KAAK;;;;;;aAMF,KAAK,KAAK,SAAS,oBAAoB,KAAK,CAAC;EACxD,kBAAkB,sEAAsE,GAAG;;;;;QAKrF,YAAY;KACf,YAAY;;;;;;;;;;EAWhB,kBACG;;;;;;;;;;;;;;;;;;;;;IAsBA;;;;;;;;;;;;;;;;;;;;;;;yBAuBqB,oBAAoB,WAAW;;EAGvD;;EAEC;AAID,UAAS,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4Bb;CAID,MAAM,WAAW,SAAS,SACxB,QAAQ,EAAE,iBAAiB,WAAW,MAAM,SAAS,EAAE,CACvD,KAAK,EAAE,iBAAiB;EACxB,MAAM,QAAQ,WAAW,MACvB,KAAK,MAAM,KAAK,EAAE,KAAK,SAAS,EAAE,UAAU,MAAM,EAAE,YAAY,GAAG,CACnE,KAAK,KAAK;AACZ,SAAO,KAAK,WAAW,KAAK,GAAG,WAAW,KAAK,KAAK,MAAM;GACzD,CACD,KAAK,KAAK;AAEZ,KAAI,SACH,UAAS,KAAK;;;;EAId,SAAS;EACT;CAKD,MAAM,YAAY,SAAS,SAAS,SAAS,EAAE,iBAC9C,WAAW,OAAO,KAAK,OAAO;EAC7B,SAAS,EAAE;EACX,aAAa,WAAW;EACxB,aAAa,WAAW;EACxB,EAAE,CACH;AAED,KAAI,UAAU,SAAS,GAAG;EACzB,MAAM,YAAY,UAChB,KAAK,MAAM,OAAO,EAAE,QAAQ,OAAO,EAAE,YAAY,GAAG,EAAE,YAAY,IAAI,CACtE,KAAK,KAAK;AAEZ,WAAS,KAAK;;;;;;EAMd,UAAU;;;EAGV;;CAKD,MAAM,mBAAmB;EAAC;EAAQ;EAAQ;EAAY;CACtD,MAAM,cAAc;EAAC;EAAU;EAAY;EAAY;EAAS;CAEhE,MAAM,iBAAiB,SAAS,SAAS,QAAQ,EAAE,iBAClD,iBAAiB,SAAS,WAAW,GAAG,CACxC;CACD,MAAM,YAAY,SAAS,SAAS,QAAQ,EAAE,iBAC7C,YAAY,SAAS,WAAW,GAAG,CACnC;AAED,KAAI,eAAe,SAAS,KAAK,UAAU,SAAS,GAAG;EACtD,IAAI,aAAa;;yDAEsC,cAAc;;AAGrE,MAAI,eAAe,SAAS,GAAG;GAC9B,MAAM,UAAU,eACd,KACC,EAAE,iBACF,KAAK,WAAW,KAAK,KAAK,WAAW,KAAK,OAAO,WAAW,YAAY,MAAM,IAAI,CAAC,KACpF,CACA,KAAK,KAAK;AACZ,iBAAc;;;EAGf,QAAQ;;;AAIR,MAAI,UAAU,SAAS,GAAG;GACzB,MAAM,UAAU,UACd,KACC,EAAE,iBACF,KAAK,WAAW,KAAK,KAAK,WAAW,KAAK,OAAO,WAAW,YAAY,MAAM,IAAI,CAAC,KACpF,CACA,KAAK,KAAK;AACZ,iBAAc;;;EAGf,QAAQ;;;AAIR,gBAAc;;;AAId,WAAS,KAAK,WAAW;;AAM1B,KAAI,cAAc,gBACjB,UAAS,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8Bd;UACU,WACV,UAAS,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8Bd;AAKD,KAAI,SAAS,UAAU,QAAQ;EAC9B,MAAM,YAAY,UAAU,UAAU,UAAU;AAChD,WAAS,KAAK;;oBAEI,UAAU,wBAAwB,SAAS,uCAAuC,OAAO,OAAO,GAAG;;EAErH,UAAU,UAAU,oDAAoD,sDAAsD;EAC9H;;AAKD,UAAS,KAAK;;;;;;;;;;;;;EAab;CAID,MAAM,aAAa,SAAS,SAAS,SAAS,EAAE,iBAC/C,WAAW,QAAQ,KAAK,OAAO;EAC9B,MAAM,EAAE;EACR,MAAM,EAAE;EACR,aAAa,EAAE;EACf,aAAa,WAAW;EACxB,EAAE,CACH;AAED,KAAI,WAAW,SAAS,GAAG;EAC1B,MAAM,OAAO,WACX,KAAK,MAAM,OAAO,EAAE,KAAK,OAAO,EAAE,YAAY,KAAK,EAAE,YAAY,IAAI,CACrE,KAAK,KAAK;AAEZ,WAAS,KAAK;;;;EAId,KAAK;;;EAGL;;AAKD,UAAS,KAAK;;kBAEG,SAAS,SAAS,OAAO;yBAClB,SAAS,oBAAoB,MAAM,QAAQ,EAAE,CAAC;6BAC1C,KAAK,KAAK,SAAS,oBAAoB,KAAK,GAAG,EAAE;EAC5E;AAID,KAAI,SAAS,SAAS,SAAS,GAAG;EACjC,MAAM,cAAc,SAAS,SAAS,KAAK,MAAM,QAAQ,EAAE,UAAU,CAAC,KAAK,KAAK;AAEhF,WAAS,KAAK;;EAEd,YAAY;EACZ;;AAKD,UAAS,KAAK;;iFAEiD,IAAI,MAAM,EAAC,aAAa,CAAC,MAAM,IAAI,CAAC,GAAG;;EAErG;AAED,QAAO,SAAS,KAAK,KAAK"}
@@ -1,4 +1,4 @@
1
- const require_test_CTcmp4Su = require("../test.CTcmp4Su-DlzTarwH.cjs");
1
+ const require_test_CTcmp4Su = require("../test.CTcmp4Su-BWSPM8ZQ.cjs");
2
2
  const require_generators_scripts = require("./scripts.cjs");
3
3
  //#region src/generators/scripts.test.ts
4
4
  require_test_CTcmp4Su.describe("generateScripts", () => {
@@ -17,7 +17,7 @@ require_test_CTcmp4Su.describe("generateScripts", () => {
17
17
  "scripts/status.ps1"
18
18
  ]) {
19
19
  require_test_CTcmp4Su.globalExpect(result).toHaveProperty(script);
20
- require_test_CTcmp4Su.globalExpect(result[script].length).toBeGreaterThan(0);
20
+ require_test_CTcmp4Su.globalExpect(result[script]?.length).toBeGreaterThan(0);
21
21
  }
22
22
  });
23
23
  require_test_CTcmp4Su.it("start.sh calls docker compose up", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"scripts.test.cjs","names":["describe","generateScripts"],"sources":["../../src/generators/scripts.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generateScripts } from \"./scripts.js\";\n\ndescribe(\"generateScripts\", () => {\n\tit(\"generates all 10 expected scripts (5 bash + 5 PowerShell)\", () => {\n\t\tconst result = generateScripts();\n\n\t\tconst expectedScripts = [\n\t\t\t\"scripts/start.sh\",\n\t\t\t\"scripts/stop.sh\",\n\t\t\t\"scripts/update.sh\",\n\t\t\t\"scripts/backup.sh\",\n\t\t\t\"scripts/status.sh\",\n\t\t\t\"scripts/start.ps1\",\n\t\t\t\"scripts/stop.ps1\",\n\t\t\t\"scripts/update.ps1\",\n\t\t\t\"scripts/backup.ps1\",\n\t\t\t\"scripts/status.ps1\",\n\t\t];\n\n\t\tfor (const script of expectedScripts) {\n\t\t\texpect(result).toHaveProperty(script);\n\t\t\texpect(result[script]!.length).toBeGreaterThan(0);\n\t\t}\n\t});\n\n\tit(\"start.sh calls docker compose up\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/start.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/start.sh\"]).toContain(\"up\");\n\t});\n\n\tit(\"stop.sh calls docker compose down\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/stop.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/stop.sh\"]).toContain(\"down\");\n\t});\n\n\tit(\"update.sh calls docker compose pull\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/update.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/update.sh\"]).toContain(\"pull\");\n\t});\n\n\tit(\"backup.sh references volumes or backup\", () => {\n\t\tconst result = generateScripts();\n\t\tconst backup = result[\"scripts/backup.sh\"]!;\n\t\texpect(backup).toBeDefined();\n\t\texpect(backup.length).toBeGreaterThan(50);\n\t});\n\n\tit(\"status.sh calls docker compose ps\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/status.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/status.sh\"]).toContain(\"ps\");\n\t});\n\n\tit(\"all bash scripts start with shebang\", () => {\n\t\tconst result = generateScripts();\n\n\t\tfor (const [path, content] of Object.entries(result)) {\n\t\t\tif (path.endsWith(\".sh\")) {\n\t\t\t\texpect(content.startsWith(\"#!/\")).toBe(true);\n\t\t\t}\n\t\t}\n\t});\n\n\tit(\"all PowerShell scripts start with #Requires\", () => {\n\t\tconst result = generateScripts();\n\n\t\tfor (const [path, content] of Object.entries(result)) {\n\t\t\tif (path.endsWith(\".ps1\")) {\n\t\t\t\texpect(content.startsWith(\"#Requires\")).toBe(true);\n\t\t\t}\n\t\t}\n\t});\n\n\tit(\"start.ps1 calls docker compose up\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/start.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/start.ps1\"]).toContain(\"up\");\n\t});\n\n\tit(\"stop.ps1 calls docker compose down\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/stop.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/stop.ps1\"]).toContain(\"down\");\n\t});\n\n\tit(\"update.ps1 calls docker compose pull\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/update.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/update.ps1\"]).toContain(\"pull\");\n\t});\n\n\tit(\"backup.ps1 references volumes or backup\", () => {\n\t\tconst result = generateScripts();\n\t\tconst backup = result[\"scripts/backup.ps1\"]!;\n\t\texpect(backup).toBeDefined();\n\t\texpect(backup.length).toBeGreaterThan(50);\n\t});\n\n\tit(\"status.ps1 calls docker compose ps\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/status.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/status.ps1\"]).toContain(\"ps\");\n\t});\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"scripts.test.cjs","names":["describe","generateScripts"],"sources":["../../src/generators/scripts.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generateScripts } from \"./scripts.js\";\n\ndescribe(\"generateScripts\", () => {\n\tit(\"generates all 10 expected scripts (5 bash + 5 PowerShell)\", () => {\n\t\tconst result = generateScripts();\n\n\t\tconst expectedScripts = [\n\t\t\t\"scripts/start.sh\",\n\t\t\t\"scripts/stop.sh\",\n\t\t\t\"scripts/update.sh\",\n\t\t\t\"scripts/backup.sh\",\n\t\t\t\"scripts/status.sh\",\n\t\t\t\"scripts/start.ps1\",\n\t\t\t\"scripts/stop.ps1\",\n\t\t\t\"scripts/update.ps1\",\n\t\t\t\"scripts/backup.ps1\",\n\t\t\t\"scripts/status.ps1\",\n\t\t];\n\n\t\tfor (const script of expectedScripts) {\n\t\t\texpect(result).toHaveProperty(script);\n\t\t\texpect(result[script]?.length).toBeGreaterThan(0);\n\t\t}\n\t});\n\n\tit(\"start.sh calls docker compose up\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/start.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/start.sh\"]).toContain(\"up\");\n\t});\n\n\tit(\"stop.sh calls docker compose down\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/stop.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/stop.sh\"]).toContain(\"down\");\n\t});\n\n\tit(\"update.sh calls docker compose pull\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/update.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/update.sh\"]).toContain(\"pull\");\n\t});\n\n\tit(\"backup.sh references volumes or backup\", () => {\n\t\tconst result = generateScripts();\n\t\tconst backup = result[\"scripts/backup.sh\"]!;\n\t\texpect(backup).toBeDefined();\n\t\texpect(backup.length).toBeGreaterThan(50);\n\t});\n\n\tit(\"status.sh calls docker compose ps\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/status.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/status.sh\"]).toContain(\"ps\");\n\t});\n\n\tit(\"all bash scripts start with shebang\", () => {\n\t\tconst result = generateScripts();\n\n\t\tfor (const [path, content] of Object.entries(result)) {\n\t\t\tif (path.endsWith(\".sh\")) {\n\t\t\t\texpect(content.startsWith(\"#!/\")).toBe(true);\n\t\t\t}\n\t\t}\n\t});\n\n\tit(\"all PowerShell scripts start with #Requires\", () => {\n\t\tconst result = generateScripts();\n\n\t\tfor (const [path, content] of Object.entries(result)) {\n\t\t\tif (path.endsWith(\".ps1\")) {\n\t\t\t\texpect(content.startsWith(\"#Requires\")).toBe(true);\n\t\t\t}\n\t\t}\n\t});\n\n\tit(\"start.ps1 calls docker compose up\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/start.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/start.ps1\"]).toContain(\"up\");\n\t});\n\n\tit(\"stop.ps1 calls docker compose down\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/stop.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/stop.ps1\"]).toContain(\"down\");\n\t});\n\n\tit(\"update.ps1 calls docker compose pull\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/update.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/update.ps1\"]).toContain(\"pull\");\n\t});\n\n\tit(\"backup.ps1 references volumes or backup\", () => {\n\t\tconst result = generateScripts();\n\t\tconst backup = result[\"scripts/backup.ps1\"]!;\n\t\texpect(backup).toBeDefined();\n\t\texpect(backup.length).toBeGreaterThan(50);\n\t});\n\n\tit(\"status.ps1 calls docker compose ps\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/status.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/status.ps1\"]).toContain(\"ps\");\n\t});\n});\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { n as describe, r as it, t as globalExpect } from "../test.CTcmp4Su-ClCHJ3FA.mjs";
1
+ import { a as describe, o as it, t as globalExpect } from "../test.CTcmp4Su-BRa7-bTj.mjs";
2
2
  import { generateScripts } from "./scripts.mjs";
3
3
  //#region src/generators/scripts.test.ts
4
4
  describe("generateScripts", () => {
@@ -17,7 +17,7 @@ describe("generateScripts", () => {
17
17
  "scripts/status.ps1"
18
18
  ]) {
19
19
  globalExpect(result).toHaveProperty(script);
20
- globalExpect(result[script].length).toBeGreaterThan(0);
20
+ globalExpect(result[script]?.length).toBeGreaterThan(0);
21
21
  }
22
22
  });
23
23
  it("start.sh calls docker compose up", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"scripts.test.mjs","names":[],"sources":["../../src/generators/scripts.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generateScripts } from \"./scripts.js\";\n\ndescribe(\"generateScripts\", () => {\n\tit(\"generates all 10 expected scripts (5 bash + 5 PowerShell)\", () => {\n\t\tconst result = generateScripts();\n\n\t\tconst expectedScripts = [\n\t\t\t\"scripts/start.sh\",\n\t\t\t\"scripts/stop.sh\",\n\t\t\t\"scripts/update.sh\",\n\t\t\t\"scripts/backup.sh\",\n\t\t\t\"scripts/status.sh\",\n\t\t\t\"scripts/start.ps1\",\n\t\t\t\"scripts/stop.ps1\",\n\t\t\t\"scripts/update.ps1\",\n\t\t\t\"scripts/backup.ps1\",\n\t\t\t\"scripts/status.ps1\",\n\t\t];\n\n\t\tfor (const script of expectedScripts) {\n\t\t\texpect(result).toHaveProperty(script);\n\t\t\texpect(result[script]!.length).toBeGreaterThan(0);\n\t\t}\n\t});\n\n\tit(\"start.sh calls docker compose up\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/start.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/start.sh\"]).toContain(\"up\");\n\t});\n\n\tit(\"stop.sh calls docker compose down\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/stop.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/stop.sh\"]).toContain(\"down\");\n\t});\n\n\tit(\"update.sh calls docker compose pull\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/update.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/update.sh\"]).toContain(\"pull\");\n\t});\n\n\tit(\"backup.sh references volumes or backup\", () => {\n\t\tconst result = generateScripts();\n\t\tconst backup = result[\"scripts/backup.sh\"]!;\n\t\texpect(backup).toBeDefined();\n\t\texpect(backup.length).toBeGreaterThan(50);\n\t});\n\n\tit(\"status.sh calls docker compose ps\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/status.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/status.sh\"]).toContain(\"ps\");\n\t});\n\n\tit(\"all bash scripts start with shebang\", () => {\n\t\tconst result = generateScripts();\n\n\t\tfor (const [path, content] of Object.entries(result)) {\n\t\t\tif (path.endsWith(\".sh\")) {\n\t\t\t\texpect(content.startsWith(\"#!/\")).toBe(true);\n\t\t\t}\n\t\t}\n\t});\n\n\tit(\"all PowerShell scripts start with #Requires\", () => {\n\t\tconst result = generateScripts();\n\n\t\tfor (const [path, content] of Object.entries(result)) {\n\t\t\tif (path.endsWith(\".ps1\")) {\n\t\t\t\texpect(content.startsWith(\"#Requires\")).toBe(true);\n\t\t\t}\n\t\t}\n\t});\n\n\tit(\"start.ps1 calls docker compose up\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/start.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/start.ps1\"]).toContain(\"up\");\n\t});\n\n\tit(\"stop.ps1 calls docker compose down\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/stop.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/stop.ps1\"]).toContain(\"down\");\n\t});\n\n\tit(\"update.ps1 calls docker compose pull\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/update.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/update.ps1\"]).toContain(\"pull\");\n\t});\n\n\tit(\"backup.ps1 references volumes or backup\", () => {\n\t\tconst result = generateScripts();\n\t\tconst backup = result[\"scripts/backup.ps1\"]!;\n\t\texpect(backup).toBeDefined();\n\t\texpect(backup.length).toBeGreaterThan(50);\n\t});\n\n\tit(\"status.ps1 calls docker compose ps\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/status.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/status.ps1\"]).toContain(\"ps\");\n\t});\n});\n"],"mappings":";;;AAGA,SAAS,yBAAyB;AACjC,IAAG,mEAAmE;EACrE,MAAM,SAAS,iBAAiB;AAehC,OAAK,MAAM,UAba;GACvB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,EAEqC;AACrC,gBAAO,OAAO,CAAC,eAAe,OAAO;AACrC,gBAAO,OAAO,QAAS,OAAO,CAAC,gBAAgB,EAAE;;GAEjD;AAEF,IAAG,0CAA0C;EAC5C,MAAM,SAAS,iBAAiB;AAChC,eAAO,OAAO,oBAAoB,CAAC,UAAU,iBAAiB;AAC9D,eAAO,OAAO,oBAAoB,CAAC,UAAU,KAAK;GACjD;AAEF,IAAG,2CAA2C;EAC7C,MAAM,SAAS,iBAAiB;AAChC,eAAO,OAAO,mBAAmB,CAAC,UAAU,iBAAiB;AAC7D,eAAO,OAAO,mBAAmB,CAAC,UAAU,OAAO;GAClD;AAEF,IAAG,6CAA6C;EAC/C,MAAM,SAAS,iBAAiB;AAChC,eAAO,OAAO,qBAAqB,CAAC,UAAU,iBAAiB;AAC/D,eAAO,OAAO,qBAAqB,CAAC,UAAU,OAAO;GACpD;AAEF,IAAG,gDAAgD;EAElD,MAAM,SADS,iBAAiB,CACV;AACtB,eAAO,OAAO,CAAC,aAAa;AAC5B,eAAO,OAAO,OAAO,CAAC,gBAAgB,GAAG;GACxC;AAEF,IAAG,2CAA2C;EAC7C,MAAM,SAAS,iBAAiB;AAChC,eAAO,OAAO,qBAAqB,CAAC,UAAU,iBAAiB;AAC/D,eAAO,OAAO,qBAAqB,CAAC,UAAU,KAAK;GAClD;AAEF,IAAG,6CAA6C;EAC/C,MAAM,SAAS,iBAAiB;AAEhC,OAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,OAAO,CACnD,KAAI,KAAK,SAAS,MAAM,CACvB,cAAO,QAAQ,WAAW,MAAM,CAAC,CAAC,KAAK,KAAK;GAG7C;AAEF,IAAG,qDAAqD;EACvD,MAAM,SAAS,iBAAiB;AAEhC,OAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,OAAO,CACnD,KAAI,KAAK,SAAS,OAAO,CACxB,cAAO,QAAQ,WAAW,YAAY,CAAC,CAAC,KAAK,KAAK;GAGnD;AAEF,IAAG,2CAA2C;EAC7C,MAAM,SAAS,iBAAiB;AAChC,eAAO,OAAO,qBAAqB,CAAC,UAAU,iBAAiB;AAC/D,eAAO,OAAO,qBAAqB,CAAC,UAAU,KAAK;GAClD;AAEF,IAAG,4CAA4C;EAC9C,MAAM,SAAS,iBAAiB;AAChC,eAAO,OAAO,oBAAoB,CAAC,UAAU,iBAAiB;AAC9D,eAAO,OAAO,oBAAoB,CAAC,UAAU,OAAO;GACnD;AAEF,IAAG,8CAA8C;EAChD,MAAM,SAAS,iBAAiB;AAChC,eAAO,OAAO,sBAAsB,CAAC,UAAU,iBAAiB;AAChE,eAAO,OAAO,sBAAsB,CAAC,UAAU,OAAO;GACrD;AAEF,IAAG,iDAAiD;EAEnD,MAAM,SADS,iBAAiB,CACV;AACtB,eAAO,OAAO,CAAC,aAAa;AAC5B,eAAO,OAAO,OAAO,CAAC,gBAAgB,GAAG;GACxC;AAEF,IAAG,4CAA4C;EAC9C,MAAM,SAAS,iBAAiB;AAChC,eAAO,OAAO,sBAAsB,CAAC,UAAU,iBAAiB;AAChE,eAAO,OAAO,sBAAsB,CAAC,UAAU,KAAK;GACnD;EACD"}
1
+ {"version":3,"file":"scripts.test.mjs","names":[],"sources":["../../src/generators/scripts.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { generateScripts } from \"./scripts.js\";\n\ndescribe(\"generateScripts\", () => {\n\tit(\"generates all 10 expected scripts (5 bash + 5 PowerShell)\", () => {\n\t\tconst result = generateScripts();\n\n\t\tconst expectedScripts = [\n\t\t\t\"scripts/start.sh\",\n\t\t\t\"scripts/stop.sh\",\n\t\t\t\"scripts/update.sh\",\n\t\t\t\"scripts/backup.sh\",\n\t\t\t\"scripts/status.sh\",\n\t\t\t\"scripts/start.ps1\",\n\t\t\t\"scripts/stop.ps1\",\n\t\t\t\"scripts/update.ps1\",\n\t\t\t\"scripts/backup.ps1\",\n\t\t\t\"scripts/status.ps1\",\n\t\t];\n\n\t\tfor (const script of expectedScripts) {\n\t\t\texpect(result).toHaveProperty(script);\n\t\t\texpect(result[script]?.length).toBeGreaterThan(0);\n\t\t}\n\t});\n\n\tit(\"start.sh calls docker compose up\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/start.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/start.sh\"]).toContain(\"up\");\n\t});\n\n\tit(\"stop.sh calls docker compose down\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/stop.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/stop.sh\"]).toContain(\"down\");\n\t});\n\n\tit(\"update.sh calls docker compose pull\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/update.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/update.sh\"]).toContain(\"pull\");\n\t});\n\n\tit(\"backup.sh references volumes or backup\", () => {\n\t\tconst result = generateScripts();\n\t\tconst backup = result[\"scripts/backup.sh\"]!;\n\t\texpect(backup).toBeDefined();\n\t\texpect(backup.length).toBeGreaterThan(50);\n\t});\n\n\tit(\"status.sh calls docker compose ps\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/status.sh\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/status.sh\"]).toContain(\"ps\");\n\t});\n\n\tit(\"all bash scripts start with shebang\", () => {\n\t\tconst result = generateScripts();\n\n\t\tfor (const [path, content] of Object.entries(result)) {\n\t\t\tif (path.endsWith(\".sh\")) {\n\t\t\t\texpect(content.startsWith(\"#!/\")).toBe(true);\n\t\t\t}\n\t\t}\n\t});\n\n\tit(\"all PowerShell scripts start with #Requires\", () => {\n\t\tconst result = generateScripts();\n\n\t\tfor (const [path, content] of Object.entries(result)) {\n\t\t\tif (path.endsWith(\".ps1\")) {\n\t\t\t\texpect(content.startsWith(\"#Requires\")).toBe(true);\n\t\t\t}\n\t\t}\n\t});\n\n\tit(\"start.ps1 calls docker compose up\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/start.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/start.ps1\"]).toContain(\"up\");\n\t});\n\n\tit(\"stop.ps1 calls docker compose down\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/stop.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/stop.ps1\"]).toContain(\"down\");\n\t});\n\n\tit(\"update.ps1 calls docker compose pull\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/update.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/update.ps1\"]).toContain(\"pull\");\n\t});\n\n\tit(\"backup.ps1 references volumes or backup\", () => {\n\t\tconst result = generateScripts();\n\t\tconst backup = result[\"scripts/backup.ps1\"]!;\n\t\texpect(backup).toBeDefined();\n\t\texpect(backup.length).toBeGreaterThan(50);\n\t});\n\n\tit(\"status.ps1 calls docker compose ps\", () => {\n\t\tconst result = generateScripts();\n\t\texpect(result[\"scripts/status.ps1\"]).toContain(\"docker compose\");\n\t\texpect(result[\"scripts/status.ps1\"]).toContain(\"ps\");\n\t});\n});\n"],"mappings":";;;AAGA,SAAS,yBAAyB;AACjC,IAAG,mEAAmE;EACrE,MAAM,SAAS,iBAAiB;AAehC,OAAK,MAAM,UAba;GACvB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,EAEqC;AACrC,gBAAO,OAAO,CAAC,eAAe,OAAO;AACrC,gBAAO,OAAO,SAAS,OAAO,CAAC,gBAAgB,EAAE;;GAEjD;AAEF,IAAG,0CAA0C;EAC5C,MAAM,SAAS,iBAAiB;AAChC,eAAO,OAAO,oBAAoB,CAAC,UAAU,iBAAiB;AAC9D,eAAO,OAAO,oBAAoB,CAAC,UAAU,KAAK;GACjD;AAEF,IAAG,2CAA2C;EAC7C,MAAM,SAAS,iBAAiB;AAChC,eAAO,OAAO,mBAAmB,CAAC,UAAU,iBAAiB;AAC7D,eAAO,OAAO,mBAAmB,CAAC,UAAU,OAAO;GAClD;AAEF,IAAG,6CAA6C;EAC/C,MAAM,SAAS,iBAAiB;AAChC,eAAO,OAAO,qBAAqB,CAAC,UAAU,iBAAiB;AAC/D,eAAO,OAAO,qBAAqB,CAAC,UAAU,OAAO;GACpD;AAEF,IAAG,gDAAgD;EAElD,MAAM,SADS,iBAAiB,CACV;AACtB,eAAO,OAAO,CAAC,aAAa;AAC5B,eAAO,OAAO,OAAO,CAAC,gBAAgB,GAAG;GACxC;AAEF,IAAG,2CAA2C;EAC7C,MAAM,SAAS,iBAAiB;AAChC,eAAO,OAAO,qBAAqB,CAAC,UAAU,iBAAiB;AAC/D,eAAO,OAAO,qBAAqB,CAAC,UAAU,KAAK;GAClD;AAEF,IAAG,6CAA6C;EAC/C,MAAM,SAAS,iBAAiB;AAEhC,OAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,OAAO,CACnD,KAAI,KAAK,SAAS,MAAM,CACvB,cAAO,QAAQ,WAAW,MAAM,CAAC,CAAC,KAAK,KAAK;GAG7C;AAEF,IAAG,qDAAqD;EACvD,MAAM,SAAS,iBAAiB;AAEhC,OAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,OAAO,CACnD,KAAI,KAAK,SAAS,OAAO,CACxB,cAAO,QAAQ,WAAW,YAAY,CAAC,CAAC,KAAK,KAAK;GAGnD;AAEF,IAAG,2CAA2C;EAC7C,MAAM,SAAS,iBAAiB;AAChC,eAAO,OAAO,qBAAqB,CAAC,UAAU,iBAAiB;AAC/D,eAAO,OAAO,qBAAqB,CAAC,UAAU,KAAK;GAClD;AAEF,IAAG,4CAA4C;EAC9C,MAAM,SAAS,iBAAiB;AAChC,eAAO,OAAO,oBAAoB,CAAC,UAAU,iBAAiB;AAC9D,eAAO,OAAO,oBAAoB,CAAC,UAAU,OAAO;GACnD;AAEF,IAAG,8CAA8C;EAChD,MAAM,SAAS,iBAAiB;AAChC,eAAO,OAAO,sBAAsB,CAAC,UAAU,iBAAiB;AAChE,eAAO,OAAO,sBAAsB,CAAC,UAAU,OAAO;GACrD;AAEF,IAAG,iDAAiD;EAEnD,MAAM,SADS,iBAAiB,CACV;AACtB,eAAO,OAAO,CAAC,aAAa;AAC5B,eAAO,OAAO,OAAO,CAAC,gBAAgB,GAAG;GACxC;AAEF,IAAG,4CAA4C;EAC9C,MAAM,SAAS,iBAAiB;AAChC,eAAO,OAAO,sBAAsB,CAAC,UAAU,iBAAiB;AAChE,eAAO,OAAO,sBAAsB,CAAC,UAAU,KAAK;GACnD;EACD"}
@@ -1,3 +1,3 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_skills = require("../skills-BlzpHmpH.cjs");
2
+ const require_skills = require("../skills-uPxJVmKk.cjs");
3
3
  exports.generateSkillFiles = require_skills.generateSkillFiles;
@@ -1,4 +1,4 @@
1
- import { ResolverOutput } from "../types.cjs";
1
+ import { B as ResolverOutput } from "../types-Bsn0XzSP.cjs";
2
2
 
3
3
  //#region src/generators/skills.d.ts
4
4
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.cts","names":[],"sources":["../../src/generators/skills.ts"],"mappings":";;;;;AAmiBA;;;;;iBAAgB,kBAAA,CAAmB,QAAA,EAAU,cAAA,GAAiB,MAAA"}
1
+ {"version":3,"file":"skills.d.cts","names":[],"sources":["../../src/generators/skills.ts"],"mappings":";;;;;AA6+BA;;;;;iBAAgB,kBAAA,CAAmB,QAAA,EAAU,cAAA,GAAiB,MAAA"}
@@ -1,4 +1,4 @@
1
- import { ResolverOutput } from "../types.mjs";
1
+ import { B as ResolverOutput } from "../types-DwTKyCZ9.mjs";
2
2
 
3
3
  //#region src/generators/skills.d.ts
4
4
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.mts","names":[],"sources":["../../src/generators/skills.ts"],"mappings":";;;;;;AAmiBA;;;;iBAAgB,kBAAA,CAAmB,QAAA,EAAU,cAAA,GAAiB,MAAA"}
1
+ {"version":3,"file":"skills.d.mts","names":[],"sources":["../../src/generators/skills.ts"],"mappings":";;;;;;AA6+BA;;;;iBAAgB,kBAAA,CAAmB,QAAA,EAAU,cAAA,GAAiB,MAAA"}