@better-openclaw/core 1.0.23 → 1.0.25

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 (335) hide show
  1. package/dist/addon-stack.cjs +673 -0
  2. package/dist/addon-stack.cjs.map +1 -0
  3. package/dist/addon-stack.d.cts +23 -0
  4. package/dist/addon-stack.d.cts.map +1 -0
  5. package/dist/addon-stack.d.mts +23 -0
  6. package/dist/addon-stack.d.mts.map +1 -0
  7. package/dist/addon-stack.mjs +671 -0
  8. package/dist/addon-stack.mjs.map +1 -0
  9. package/dist/addon-stack.test.cjs +349 -0
  10. package/dist/addon-stack.test.cjs.map +1 -0
  11. package/dist/addon-stack.test.d.cts +1 -0
  12. package/dist/addon-stack.test.d.mts +1 -0
  13. package/dist/addon-stack.test.mjs +349 -0
  14. package/dist/addon-stack.test.mjs.map +1 -0
  15. package/dist/bare-metal-partition.test.cjs +20 -21
  16. package/dist/bare-metal-partition.test.cjs.map +1 -1
  17. package/dist/bare-metal-partition.test.mjs +4 -5
  18. package/dist/bare-metal-partition.test.mjs.map +1 -1
  19. package/dist/composer.cjs +17 -1
  20. package/dist/composer.cjs.map +1 -1
  21. package/dist/composer.d.cts +24 -1
  22. package/dist/composer.d.cts.map +1 -1
  23. package/dist/composer.d.mts +24 -1
  24. package/dist/composer.d.mts.map +1 -1
  25. package/dist/composer.mjs +14 -2
  26. package/dist/composer.mjs.map +1 -1
  27. package/dist/composer.snapshot.test.cjs +20 -20
  28. package/dist/composer.snapshot.test.cjs.map +1 -1
  29. package/dist/composer.snapshot.test.mjs +2 -2
  30. package/dist/composer.test.cjs +53 -52
  31. package/dist/composer.test.cjs.map +1 -1
  32. package/dist/composer.test.mjs +4 -3
  33. package/dist/composer.test.mjs.map +1 -1
  34. package/dist/deployers/strip-host-ports.test.cjs +26 -26
  35. package/dist/deployers/strip-host-ports.test.cjs.map +1 -1
  36. package/dist/deployers/strip-host-ports.test.mjs +1 -1
  37. package/dist/generate.cjs +8 -4
  38. package/dist/generate.cjs.map +1 -1
  39. package/dist/generate.d.cts.map +1 -1
  40. package/dist/generate.d.mts.map +1 -1
  41. package/dist/generate.mjs +9 -5
  42. package/dist/generate.mjs.map +1 -1
  43. package/dist/generate.test.cjs +55 -55
  44. package/dist/generate.test.cjs.map +1 -1
  45. package/dist/generate.test.mjs +2 -2
  46. package/dist/generate.test.mjs.map +1 -1
  47. package/dist/generators/bare-metal-install.test.cjs +18 -18
  48. package/dist/generators/bare-metal-install.test.cjs.map +1 -1
  49. package/dist/generators/bare-metal-install.test.mjs +1 -1
  50. package/dist/generators/caddy.test.cjs +13 -13
  51. package/dist/generators/caddy.test.cjs.map +1 -1
  52. package/dist/generators/caddy.test.mjs +1 -1
  53. package/dist/generators/clone-repos.cjs +140 -0
  54. package/dist/generators/clone-repos.cjs.map +1 -0
  55. package/dist/generators/clone-repos.d.cts +11 -0
  56. package/dist/generators/clone-repos.d.cts.map +1 -0
  57. package/dist/generators/clone-repos.d.mts +11 -0
  58. package/dist/generators/clone-repos.d.mts.map +1 -0
  59. package/dist/generators/clone-repos.mjs +139 -0
  60. package/dist/generators/clone-repos.mjs.map +1 -0
  61. package/dist/generators/clone-repos.test.cjs +140 -0
  62. package/dist/generators/clone-repos.test.cjs.map +1 -0
  63. package/dist/generators/clone-repos.test.d.cts +1 -0
  64. package/dist/generators/clone-repos.test.d.mts +1 -0
  65. package/dist/generators/clone-repos.test.mjs +141 -0
  66. package/dist/generators/clone-repos.test.mjs.map +1 -0
  67. package/dist/generators/env.test.cjs +17 -17
  68. package/dist/generators/env.test.cjs.map +1 -1
  69. package/dist/generators/env.test.mjs +1 -1
  70. package/dist/generators/health-check.test.cjs +39 -39
  71. package/dist/generators/health-check.test.cjs.map +1 -1
  72. package/dist/generators/health-check.test.mjs +1 -1
  73. package/dist/generators/postgres-init.cjs +20 -0
  74. package/dist/generators/postgres-init.cjs.map +1 -1
  75. package/dist/generators/postgres-init.d.cts.map +1 -1
  76. package/dist/generators/postgres-init.d.mts.map +1 -1
  77. package/dist/generators/postgres-init.mjs +20 -0
  78. package/dist/generators/postgres-init.mjs.map +1 -1
  79. package/dist/generators/scripts.cjs +332 -3
  80. package/dist/generators/scripts.cjs.map +1 -1
  81. package/dist/generators/scripts.d.cts +3 -1
  82. package/dist/generators/scripts.d.cts.map +1 -1
  83. package/dist/generators/scripts.d.mts +3 -1
  84. package/dist/generators/scripts.d.mts.map +1 -1
  85. package/dist/generators/scripts.mjs +332 -3
  86. package/dist/generators/scripts.mjs.map +1 -1
  87. package/dist/generators/scripts.test.cjs +57 -23
  88. package/dist/generators/scripts.test.cjs.map +1 -1
  89. package/dist/generators/scripts.test.mjs +39 -5
  90. package/dist/generators/scripts.test.mjs.map +1 -1
  91. package/dist/generators/stack-manifest.cjs +1 -0
  92. package/dist/generators/stack-manifest.cjs.map +1 -1
  93. package/dist/generators/stack-manifest.d.cts +3 -2
  94. package/dist/generators/stack-manifest.d.cts.map +1 -1
  95. package/dist/generators/stack-manifest.d.mts +3 -2
  96. package/dist/generators/stack-manifest.d.mts.map +1 -1
  97. package/dist/generators/stack-manifest.mjs +1 -0
  98. package/dist/generators/stack-manifest.mjs.map +1 -1
  99. package/dist/generators/traefik.test.cjs +32 -32
  100. package/dist/generators/traefik.test.cjs.map +1 -1
  101. package/dist/generators/traefik.test.mjs +1 -1
  102. package/dist/index.cjs +28 -5
  103. package/dist/index.d.cts +7 -4
  104. package/dist/index.d.mts +7 -4
  105. package/dist/index.mjs +10 -7
  106. package/dist/migrations.test.cjs +16 -16
  107. package/dist/migrations.test.cjs.map +1 -1
  108. package/dist/migrations.test.mjs +1 -1
  109. package/dist/presets/registry.cjs.map +1 -1
  110. package/dist/presets/registry.d.cts.map +1 -1
  111. package/dist/presets/registry.d.mts.map +1 -1
  112. package/dist/presets/registry.mjs.map +1 -1
  113. package/dist/presets/registry.test.cjs +14 -14
  114. package/dist/presets/registry.test.cjs.map +1 -1
  115. package/dist/presets/registry.test.mjs +1 -1
  116. package/dist/resolver.cjs +8 -0
  117. package/dist/resolver.cjs.map +1 -1
  118. package/dist/resolver.mjs +9 -1
  119. package/dist/resolver.mjs.map +1 -1
  120. package/dist/resolver.test.cjs +125 -90
  121. package/dist/resolver.test.cjs.map +1 -1
  122. package/dist/resolver.test.mjs +47 -12
  123. package/dist/resolver.test.mjs.map +1 -1
  124. package/dist/{schema-B4c64P8N.d.cts → schema-CKBRu-Rt.d.cts} +355 -8
  125. package/dist/schema-CKBRu-Rt.d.cts.map +1 -0
  126. package/dist/{schema-CXNhYci1.d.mts → schema-Dn-_Jpb6.d.mts} +355 -8
  127. package/dist/schema-Dn-_Jpb6.d.mts.map +1 -0
  128. package/dist/schema.cjs +160 -5
  129. package/dist/schema.cjs.map +1 -1
  130. package/dist/schema.d.cts +2 -2
  131. package/dist/schema.d.mts +2 -2
  132. package/dist/schema.mjs +150 -6
  133. package/dist/schema.mjs.map +1 -1
  134. package/dist/schema.test.cjs +86 -86
  135. package/dist/schema.test.cjs.map +1 -1
  136. package/dist/schema.test.mjs +1 -1
  137. package/dist/services/definitions/apptension-saas.cjs +87 -0
  138. package/dist/services/definitions/apptension-saas.cjs.map +1 -0
  139. package/dist/services/definitions/apptension-saas.d.cts +7 -0
  140. package/dist/services/definitions/apptension-saas.d.cts.map +1 -0
  141. package/dist/services/definitions/apptension-saas.d.mts +7 -0
  142. package/dist/services/definitions/apptension-saas.d.mts.map +1 -0
  143. package/dist/services/definitions/apptension-saas.mjs +86 -0
  144. package/dist/services/definitions/apptension-saas.mjs.map +1 -0
  145. package/dist/services/definitions/boxyhq-saas.cjs +88 -0
  146. package/dist/services/definitions/boxyhq-saas.cjs.map +1 -0
  147. package/dist/services/definitions/boxyhq-saas.d.cts +7 -0
  148. package/dist/services/definitions/boxyhq-saas.d.cts.map +1 -0
  149. package/dist/services/definitions/boxyhq-saas.d.mts +7 -0
  150. package/dist/services/definitions/boxyhq-saas.d.mts.map +1 -0
  151. package/dist/services/definitions/boxyhq-saas.mjs +87 -0
  152. package/dist/services/definitions/boxyhq-saas.mjs.map +1 -0
  153. package/dist/services/definitions/browserless.cjs +4 -1
  154. package/dist/services/definitions/browserless.cjs.map +1 -1
  155. package/dist/services/definitions/browserless.mjs +4 -1
  156. package/dist/services/definitions/browserless.mjs.map +1 -1
  157. package/dist/services/definitions/cmsaas-starter.cjs +86 -0
  158. package/dist/services/definitions/cmsaas-starter.cjs.map +1 -0
  159. package/dist/services/definitions/cmsaas-starter.d.cts +7 -0
  160. package/dist/services/definitions/cmsaas-starter.d.cts.map +1 -0
  161. package/dist/services/definitions/cmsaas-starter.d.mts +7 -0
  162. package/dist/services/definitions/cmsaas-starter.d.mts.map +1 -0
  163. package/dist/services/definitions/cmsaas-starter.mjs +85 -0
  164. package/dist/services/definitions/cmsaas-starter.mjs.map +1 -0
  165. package/dist/services/definitions/convex.cjs +43 -1
  166. package/dist/services/definitions/convex.cjs.map +1 -1
  167. package/dist/services/definitions/convex.mjs +43 -1
  168. package/dist/services/definitions/convex.mjs.map +1 -1
  169. package/dist/services/definitions/grafana.cjs +11 -1
  170. package/dist/services/definitions/grafana.cjs.map +1 -1
  171. package/dist/services/definitions/grafana.mjs +11 -1
  172. package/dist/services/definitions/grafana.mjs.map +1 -1
  173. package/dist/services/definitions/index.cjs +51 -36
  174. package/dist/services/definitions/index.cjs.map +1 -1
  175. package/dist/services/definitions/index.d.cts +30 -25
  176. package/dist/services/definitions/index.d.cts.map +1 -1
  177. package/dist/services/definitions/index.d.mts +30 -25
  178. package/dist/services/definitions/index.d.mts.map +1 -1
  179. package/dist/services/definitions/index.mjs +47 -37
  180. package/dist/services/definitions/index.mjs.map +1 -1
  181. package/dist/services/definitions/ixartz-saas.cjs +88 -0
  182. package/dist/services/definitions/ixartz-saas.cjs.map +1 -0
  183. package/dist/services/definitions/ixartz-saas.d.cts +7 -0
  184. package/dist/services/definitions/ixartz-saas.d.cts.map +1 -0
  185. package/dist/services/definitions/ixartz-saas.d.mts +7 -0
  186. package/dist/services/definitions/ixartz-saas.d.mts.map +1 -0
  187. package/dist/services/definitions/ixartz-saas.mjs +87 -0
  188. package/dist/services/definitions/ixartz-saas.mjs.map +1 -0
  189. package/dist/services/definitions/meilisearch.cjs +11 -1
  190. package/dist/services/definitions/meilisearch.cjs.map +1 -1
  191. package/dist/services/definitions/meilisearch.mjs +11 -1
  192. package/dist/services/definitions/meilisearch.mjs.map +1 -1
  193. package/dist/services/definitions/minio.cjs +3 -1
  194. package/dist/services/definitions/minio.cjs.map +1 -1
  195. package/dist/services/definitions/minio.mjs +3 -1
  196. package/dist/services/definitions/minio.mjs.map +1 -1
  197. package/dist/services/definitions/mission-control.cjs +16 -2
  198. package/dist/services/definitions/mission-control.cjs.map +1 -1
  199. package/dist/services/definitions/mission-control.mjs +16 -2
  200. package/dist/services/definitions/mission-control.mjs.map +1 -1
  201. package/dist/services/definitions/n8n.cjs +11 -1
  202. package/dist/services/definitions/n8n.cjs.map +1 -1
  203. package/dist/services/definitions/n8n.mjs +11 -1
  204. package/dist/services/definitions/n8n.mjs.map +1 -1
  205. package/dist/services/definitions/ollama.cjs +3 -1
  206. package/dist/services/definitions/ollama.cjs.map +1 -1
  207. package/dist/services/definitions/ollama.mjs +3 -1
  208. package/dist/services/definitions/ollama.mjs.map +1 -1
  209. package/dist/services/definitions/open-saas.cjs +81 -0
  210. package/dist/services/definitions/open-saas.cjs.map +1 -0
  211. package/dist/services/definitions/open-saas.d.cts +7 -0
  212. package/dist/services/definitions/open-saas.d.cts.map +1 -0
  213. package/dist/services/definitions/open-saas.d.mts +7 -0
  214. package/dist/services/definitions/open-saas.d.mts.map +1 -0
  215. package/dist/services/definitions/open-saas.mjs +80 -0
  216. package/dist/services/definitions/open-saas.mjs.map +1 -0
  217. package/dist/services/definitions/qdrant.cjs +3 -1
  218. package/dist/services/definitions/qdrant.cjs.map +1 -1
  219. package/dist/services/definitions/qdrant.mjs +3 -1
  220. package/dist/services/definitions/qdrant.mjs.map +1 -1
  221. package/dist/services/definitions/searxng.cjs +8 -1
  222. package/dist/services/definitions/searxng.cjs.map +1 -1
  223. package/dist/services/definitions/searxng.mjs +8 -1
  224. package/dist/services/definitions/searxng.mjs.map +1 -1
  225. package/dist/services/definitions/uptime-kuma.cjs +8 -1
  226. package/dist/services/definitions/uptime-kuma.cjs.map +1 -1
  227. package/dist/services/definitions/uptime-kuma.mjs +8 -1
  228. package/dist/services/definitions/uptime-kuma.mjs.map +1 -1
  229. package/dist/services/registry.cjs +3 -0
  230. package/dist/services/registry.cjs.map +1 -1
  231. package/dist/services/registry.d.cts.map +1 -1
  232. package/dist/services/registry.d.mts.map +1 -1
  233. package/dist/services/registry.mjs +3 -0
  234. package/dist/services/registry.mjs.map +1 -1
  235. package/dist/services/registry.test.cjs +40 -33
  236. package/dist/services/registry.test.cjs.map +1 -1
  237. package/dist/services/registry.test.mjs +8 -1
  238. package/dist/services/registry.test.mjs.map +1 -1
  239. package/dist/{skill-manifest-BVUXU0__.mjs → skill-manifest-6XhrhWsG.mjs} +49 -1
  240. package/dist/{skill-manifest--IgY9REK.cjs.map → skill-manifest-6XhrhWsG.mjs.map} +1 -1
  241. package/dist/{skill-manifest--IgY9REK.cjs → skill-manifest-B8znSsym.cjs} +49 -1
  242. package/dist/{skill-manifest-BVUXU0__.mjs.map → skill-manifest-B8znSsym.cjs.map} +1 -1
  243. package/dist/skills/registry.cjs +3 -3
  244. package/dist/skills/registry.cjs.map +1 -1
  245. package/dist/skills/registry.mjs +3 -3
  246. package/dist/skills/registry.mjs.map +1 -1
  247. package/dist/skills/skill-manifest.cjs +1 -1
  248. package/dist/skills/skill-manifest.mjs +1 -1
  249. package/dist/{vi.2VT5v0um-DvC3SVNc.mjs → test.CTcmp4Su-ClCHJ3FA.mjs} +6793 -6403
  250. package/dist/test.CTcmp4Su-ClCHJ3FA.mjs.map +1 -0
  251. package/dist/{vi.2VT5v0um-CRqXre87.cjs → test.CTcmp4Su-DlzTarwH.cjs} +6793 -6403
  252. package/dist/test.CTcmp4Su-DlzTarwH.cjs.map +1 -0
  253. package/dist/track-analytics.cjs +50 -0
  254. package/dist/track-analytics.cjs.map +1 -0
  255. package/dist/track-analytics.d.cts +34 -0
  256. package/dist/track-analytics.d.cts.map +1 -0
  257. package/dist/track-analytics.d.mts +34 -0
  258. package/dist/track-analytics.d.mts.map +1 -0
  259. package/dist/track-analytics.mjs +48 -0
  260. package/dist/track-analytics.mjs.map +1 -0
  261. package/dist/track-analytics.test.cjs +91 -0
  262. package/dist/track-analytics.test.cjs.map +1 -0
  263. package/dist/track-analytics.test.d.cts +1 -0
  264. package/dist/track-analytics.test.d.mts +1 -0
  265. package/dist/track-analytics.test.mjs +92 -0
  266. package/dist/track-analytics.test.mjs.map +1 -0
  267. package/dist/types.cjs +7 -0
  268. package/dist/types.cjs.map +1 -1
  269. package/dist/types.d.cts +12 -2
  270. package/dist/types.d.cts.map +1 -1
  271. package/dist/types.d.mts +12 -2
  272. package/dist/types.d.mts.map +1 -1
  273. package/dist/types.mjs +7 -0
  274. package/dist/types.mjs.map +1 -1
  275. package/dist/validator.test.cjs +15 -15
  276. package/dist/validator.test.cjs.map +1 -1
  277. package/dist/validator.test.mjs +2 -2
  278. package/dist/version-manager.cjs +1 -1
  279. package/dist/version-manager.cjs.map +1 -1
  280. package/dist/version-manager.mjs +1 -1
  281. package/dist/version-manager.mjs.map +1 -1
  282. package/dist/version-manager.test.cjs +40 -38
  283. package/dist/version-manager.test.cjs.map +1 -1
  284. package/dist/version-manager.test.mjs +7 -5
  285. package/dist/version-manager.test.mjs.map +1 -1
  286. package/package.json +4 -4
  287. package/src/__snapshots__/composer.snapshot.test.ts.snap +160 -0
  288. package/src/addon-stack.test.ts +490 -0
  289. package/src/addon-stack.ts +998 -0
  290. package/src/bare-metal-partition.test.ts +4 -3
  291. package/src/composer.test.ts +4 -2
  292. package/src/composer.ts +24 -5
  293. package/src/generate.test.ts +2 -1
  294. package/src/generate.ts +10 -1
  295. package/src/generators/clone-repos.test.ts +154 -0
  296. package/src/generators/clone-repos.ts +159 -0
  297. package/src/generators/postgres-init.ts +17 -0
  298. package/src/generators/scripts.test.ts +52 -4
  299. package/src/generators/scripts.ts +351 -3
  300. package/src/generators/stack-manifest.ts +4 -2
  301. package/src/index.ts +28 -2
  302. package/src/presets/registry.ts +241 -329
  303. package/src/resolver.test.ts +53 -15
  304. package/src/resolver.ts +13 -1
  305. package/src/schema.ts +216 -4
  306. package/src/services/definitions/apptension-saas.ts +84 -0
  307. package/src/services/definitions/boxyhq-saas.ts +84 -0
  308. package/src/services/definitions/browserless.ts +3 -0
  309. package/src/services/definitions/cmsaas-starter.ts +84 -0
  310. package/src/services/definitions/convex.ts +31 -0
  311. package/src/services/definitions/grafana.ts +9 -0
  312. package/src/services/definitions/index.ts +90 -70
  313. package/src/services/definitions/ixartz-saas.ts +84 -0
  314. package/src/services/definitions/meilisearch.ts +9 -0
  315. package/src/services/definitions/minio.ts +2 -0
  316. package/src/services/definitions/mission-control.ts +19 -2
  317. package/src/services/definitions/n8n.ts +9 -0
  318. package/src/services/definitions/ollama.ts +2 -0
  319. package/src/services/definitions/open-saas.ts +79 -0
  320. package/src/services/definitions/qdrant.ts +2 -0
  321. package/src/services/definitions/searxng.ts +3 -0
  322. package/src/services/definitions/uptime-kuma.ts +3 -0
  323. package/src/services/registry.test.ts +8 -0
  324. package/src/services/registry.ts +7 -0
  325. package/src/skills/manifest.json +64 -0
  326. package/src/skills/registry.ts +3 -3
  327. package/src/track-analytics.test.ts +82 -0
  328. package/src/track-analytics.ts +76 -0
  329. package/src/types.ts +29 -0
  330. package/src/version-manager.test.ts +10 -5
  331. package/src/version-manager.ts +1 -1
  332. package/dist/schema-B4c64P8N.d.cts.map +0 -1
  333. package/dist/schema-CXNhYci1.d.mts.map +0 -1
  334. package/dist/vi.2VT5v0um-CRqXre87.cjs.map +0 -1
  335. package/dist/vi.2VT5v0um-DvC3SVNc.mjs.map +0 -1
@@ -1,65 +1,65 @@
1
- const require_vi_2VT5v0um = require("./vi.2VT5v0um-CRqXre87.cjs");
1
+ const require_test_CTcmp4Su = require("./test.CTcmp4Su-DlzTarwH.cjs");
2
2
  const require_schema = require("./schema.cjs");
3
3
  //#region src/schema.test.ts
4
- require_vi_2VT5v0um.describe("ServiceCategorySchema", () => {
5
- require_vi_2VT5v0um.it("accepts valid categories", () => {
6
- require_vi_2VT5v0um.globalExpect(require_schema.ServiceCategorySchema.parse("automation")).toBe("automation");
7
- require_vi_2VT5v0um.globalExpect(require_schema.ServiceCategorySchema.parse("vector-db")).toBe("vector-db");
8
- require_vi_2VT5v0um.globalExpect(require_schema.ServiceCategorySchema.parse("ai")).toBe("ai");
4
+ require_test_CTcmp4Su.describe("ServiceCategorySchema", () => {
5
+ require_test_CTcmp4Su.it("accepts valid categories", () => {
6
+ require_test_CTcmp4Su.globalExpect(require_schema.ServiceCategorySchema.parse("automation")).toBe("automation");
7
+ require_test_CTcmp4Su.globalExpect(require_schema.ServiceCategorySchema.parse("vector-db")).toBe("vector-db");
8
+ require_test_CTcmp4Su.globalExpect(require_schema.ServiceCategorySchema.parse("ai")).toBe("ai");
9
9
  });
10
- require_vi_2VT5v0um.it("rejects invalid categories", () => {
11
- require_vi_2VT5v0um.globalExpect(() => require_schema.ServiceCategorySchema.parse("invalid")).toThrow();
12
- require_vi_2VT5v0um.globalExpect(() => require_schema.ServiceCategorySchema.parse("")).toThrow();
10
+ require_test_CTcmp4Su.it("rejects invalid categories", () => {
11
+ require_test_CTcmp4Su.globalExpect(() => require_schema.ServiceCategorySchema.parse("invalid")).toThrow();
12
+ require_test_CTcmp4Su.globalExpect(() => require_schema.ServiceCategorySchema.parse("")).toThrow();
13
13
  });
14
14
  });
15
- require_vi_2VT5v0um.describe("PortMappingSchema", () => {
16
- require_vi_2VT5v0um.it("accepts valid port mapping", () => {
17
- require_vi_2VT5v0um.globalExpect(require_schema.PortMappingSchema.parse({
15
+ require_test_CTcmp4Su.describe("PortMappingSchema", () => {
16
+ require_test_CTcmp4Su.it("accepts valid port mapping", () => {
17
+ require_test_CTcmp4Su.globalExpect(require_schema.PortMappingSchema.parse({
18
18
  host: 6379,
19
19
  container: 6379,
20
20
  description: "Redis port",
21
21
  exposed: true
22
22
  }).host).toBe(6379);
23
23
  });
24
- require_vi_2VT5v0um.it("defaults exposed to true", () => {
25
- require_vi_2VT5v0um.globalExpect(require_schema.PortMappingSchema.parse({
24
+ require_test_CTcmp4Su.it("defaults exposed to true", () => {
25
+ require_test_CTcmp4Su.globalExpect(require_schema.PortMappingSchema.parse({
26
26
  host: 6379,
27
27
  container: 6379,
28
28
  description: "Redis port"
29
29
  }).exposed).toBe(true);
30
30
  });
31
- require_vi_2VT5v0um.it("rejects invalid port numbers", () => {
32
- require_vi_2VT5v0um.globalExpect(() => require_schema.PortMappingSchema.parse({
31
+ require_test_CTcmp4Su.it("rejects invalid port numbers", () => {
32
+ require_test_CTcmp4Su.globalExpect(() => require_schema.PortMappingSchema.parse({
33
33
  host: 0,
34
34
  container: 6379,
35
35
  description: "bad"
36
36
  })).toThrow();
37
- require_vi_2VT5v0um.globalExpect(() => require_schema.PortMappingSchema.parse({
37
+ require_test_CTcmp4Su.globalExpect(() => require_schema.PortMappingSchema.parse({
38
38
  host: 7e4,
39
39
  container: 6379,
40
40
  description: "bad"
41
41
  })).toThrow();
42
42
  });
43
43
  });
44
- require_vi_2VT5v0um.describe("VolumeMappingSchema", () => {
45
- require_vi_2VT5v0um.it("accepts valid volume mapping", () => {
46
- require_vi_2VT5v0um.globalExpect(require_schema.VolumeMappingSchema.parse({
44
+ require_test_CTcmp4Su.describe("VolumeMappingSchema", () => {
45
+ require_test_CTcmp4Su.it("accepts valid volume mapping", () => {
46
+ require_test_CTcmp4Su.globalExpect(require_schema.VolumeMappingSchema.parse({
47
47
  name: "redis-data",
48
48
  containerPath: "/data",
49
49
  description: "Redis persistent data"
50
50
  }).name).toBe("redis-data");
51
51
  });
52
- require_vi_2VT5v0um.it("rejects empty name", () => {
53
- require_vi_2VT5v0um.globalExpect(() => require_schema.VolumeMappingSchema.parse({
52
+ require_test_CTcmp4Su.it("rejects empty name", () => {
53
+ require_test_CTcmp4Su.globalExpect(() => require_schema.VolumeMappingSchema.parse({
54
54
  name: "",
55
55
  containerPath: "/data",
56
56
  description: "bad"
57
57
  })).toThrow();
58
58
  });
59
59
  });
60
- require_vi_2VT5v0um.describe("EnvVariableSchema", () => {
61
- require_vi_2VT5v0um.it("accepts valid env variable", () => {
62
- require_vi_2VT5v0um.globalExpect(require_schema.EnvVariableSchema.parse({
60
+ require_test_CTcmp4Su.describe("EnvVariableSchema", () => {
61
+ require_test_CTcmp4Su.it("accepts valid env variable", () => {
62
+ require_test_CTcmp4Su.globalExpect(require_schema.EnvVariableSchema.parse({
63
63
  key: "REDIS_PASSWORD",
64
64
  defaultValue: "changeme",
65
65
  secret: true,
@@ -67,26 +67,26 @@ require_vi_2VT5v0um.describe("EnvVariableSchema", () => {
67
67
  required: true
68
68
  }).secret).toBe(true);
69
69
  });
70
- require_vi_2VT5v0um.it("defaults secret to false", () => {
70
+ require_test_CTcmp4Su.it("defaults secret to false", () => {
71
71
  const result = require_schema.EnvVariableSchema.parse({
72
72
  key: "REDIS_HOST",
73
73
  defaultValue: "redis",
74
74
  description: "Redis host"
75
75
  });
76
- require_vi_2VT5v0um.globalExpect(result.secret).toBe(false);
77
- require_vi_2VT5v0um.globalExpect(result.required).toBe(true);
76
+ require_test_CTcmp4Su.globalExpect(result.secret).toBe(false);
77
+ require_test_CTcmp4Su.globalExpect(result.required).toBe(true);
78
78
  });
79
79
  });
80
- require_vi_2VT5v0um.describe("HealthCheckSchema", () => {
81
- require_vi_2VT5v0um.it("accepts valid healthcheck with defaults", () => {
80
+ require_test_CTcmp4Su.describe("HealthCheckSchema", () => {
81
+ require_test_CTcmp4Su.it("accepts valid healthcheck with defaults", () => {
82
82
  const result = require_schema.HealthCheckSchema.parse({ test: "redis-cli ping" });
83
- require_vi_2VT5v0um.globalExpect(result.interval).toBe("30s");
84
- require_vi_2VT5v0um.globalExpect(result.timeout).toBe("10s");
85
- require_vi_2VT5v0um.globalExpect(result.retries).toBe(3);
83
+ require_test_CTcmp4Su.globalExpect(result.interval).toBe("30s");
84
+ require_test_CTcmp4Su.globalExpect(result.timeout).toBe("10s");
85
+ require_test_CTcmp4Su.globalExpect(result.retries).toBe(3);
86
86
  });
87
87
  });
88
- require_vi_2VT5v0um.describe("GenerationInputSchema", () => {
89
- require_vi_2VT5v0um.it("accepts valid generation input", () => {
88
+ require_test_CTcmp4Su.describe("GenerationInputSchema", () => {
89
+ require_test_CTcmp4Su.it("accepts valid generation input", () => {
90
90
  const result = require_schema.GenerationInputSchema.parse({
91
91
  projectName: "my-openclaw-stack",
92
92
  services: ["redis", "qdrant"],
@@ -94,47 +94,47 @@ require_vi_2VT5v0um.describe("GenerationInputSchema", () => {
94
94
  proxy: "caddy",
95
95
  domain: "openclaw.example.com"
96
96
  });
97
- require_vi_2VT5v0um.globalExpect(result.projectName).toBe("my-openclaw-stack");
98
- require_vi_2VT5v0um.globalExpect(result.gpu).toBe(false);
97
+ require_test_CTcmp4Su.globalExpect(result.projectName).toBe("my-openclaw-stack");
98
+ require_test_CTcmp4Su.globalExpect(result.gpu).toBe(false);
99
99
  });
100
- require_vi_2VT5v0um.it("rejects invalid project names", () => {
101
- require_vi_2VT5v0um.globalExpect(() => require_schema.GenerationInputSchema.parse({ projectName: "-bad-name" })).toThrow();
102
- require_vi_2VT5v0um.globalExpect(() => require_schema.GenerationInputSchema.parse({ projectName: "Bad Name" })).toThrow();
103
- require_vi_2VT5v0um.globalExpect(() => require_schema.GenerationInputSchema.parse({ projectName: "has spaces" })).toThrow();
100
+ require_test_CTcmp4Su.it("rejects invalid project names", () => {
101
+ require_test_CTcmp4Su.globalExpect(() => require_schema.GenerationInputSchema.parse({ projectName: "-bad-name" })).toThrow();
102
+ require_test_CTcmp4Su.globalExpect(() => require_schema.GenerationInputSchema.parse({ projectName: "Bad Name" })).toThrow();
103
+ require_test_CTcmp4Su.globalExpect(() => require_schema.GenerationInputSchema.parse({ projectName: "has spaces" })).toThrow();
104
104
  });
105
- require_vi_2VT5v0um.it("accepts single-char project name", () => {
106
- require_vi_2VT5v0um.globalExpect(require_schema.GenerationInputSchema.parse({ projectName: "a" }).projectName).toBe("a");
105
+ require_test_CTcmp4Su.it("accepts single-char project name", () => {
106
+ require_test_CTcmp4Su.globalExpect(require_schema.GenerationInputSchema.parse({ projectName: "a" }).projectName).toBe("a");
107
107
  });
108
- require_vi_2VT5v0um.it("applies defaults", () => {
108
+ require_test_CTcmp4Su.it("applies defaults", () => {
109
109
  const result = require_schema.GenerationInputSchema.parse({ projectName: "test" });
110
- require_vi_2VT5v0um.globalExpect(result.services).toEqual([]);
111
- require_vi_2VT5v0um.globalExpect(result.skillPacks).toEqual([]);
112
- require_vi_2VT5v0um.globalExpect(result.proxy).toBe("none");
113
- require_vi_2VT5v0um.globalExpect(result.gpu).toBe(false);
114
- require_vi_2VT5v0um.globalExpect(result.platform).toBe("linux/amd64");
115
- require_vi_2VT5v0um.globalExpect(result.deployment).toBe("local");
116
- require_vi_2VT5v0um.globalExpect(result.deploymentType).toBe("docker");
117
- require_vi_2VT5v0um.globalExpect(result.generateSecrets).toBe(true);
118
- require_vi_2VT5v0um.globalExpect(result.openclawVersion).toBe("latest");
110
+ require_test_CTcmp4Su.globalExpect(result.services).toEqual([]);
111
+ require_test_CTcmp4Su.globalExpect(result.skillPacks).toEqual([]);
112
+ require_test_CTcmp4Su.globalExpect(result.proxy).toBe("none");
113
+ require_test_CTcmp4Su.globalExpect(result.gpu).toBe(false);
114
+ require_test_CTcmp4Su.globalExpect(result.platform).toBe("linux/amd64");
115
+ require_test_CTcmp4Su.globalExpect(result.deployment).toBe("local");
116
+ require_test_CTcmp4Su.globalExpect(result.deploymentType).toBe("docker");
117
+ require_test_CTcmp4Su.globalExpect(result.generateSecrets).toBe(true);
118
+ require_test_CTcmp4Su.globalExpect(result.openclawVersion).toBe("latest");
119
119
  });
120
- require_vi_2VT5v0um.it("accepts deploymentType bare-metal and extended platform", () => {
120
+ require_test_CTcmp4Su.it("accepts deploymentType bare-metal and extended platform", () => {
121
121
  const result = require_schema.GenerationInputSchema.parse({
122
122
  projectName: "my-stack",
123
123
  services: ["redis"],
124
124
  deploymentType: "bare-metal",
125
125
  platform: "windows/amd64"
126
126
  });
127
- require_vi_2VT5v0um.globalExpect(result.deploymentType).toBe("bare-metal");
128
- require_vi_2VT5v0um.globalExpect(result.platform).toBe("windows/amd64");
127
+ require_test_CTcmp4Su.globalExpect(result.deploymentType).toBe("bare-metal");
128
+ require_test_CTcmp4Su.globalExpect(result.platform).toBe("windows/amd64");
129
129
  });
130
- require_vi_2VT5v0um.it("accepts platform macos/arm64", () => {
131
- require_vi_2VT5v0um.globalExpect(require_schema.GenerationInputSchema.parse({
130
+ require_test_CTcmp4Su.it("accepts platform macos/arm64", () => {
131
+ require_test_CTcmp4Su.globalExpect(require_schema.GenerationInputSchema.parse({
132
132
  projectName: "my-stack",
133
133
  platform: "macos/arm64"
134
134
  }).platform).toBe("macos/arm64");
135
135
  });
136
136
  });
137
- require_vi_2VT5v0um.describe("ServiceDefinitionSchema", () => {
137
+ require_test_CTcmp4Su.describe("ServiceDefinitionSchema", () => {
138
138
  const validDef = {
139
139
  id: "redis",
140
140
  name: "Redis",
@@ -163,16 +163,16 @@ require_vi_2VT5v0um.describe("ServiceDefinitionSchema", () => {
163
163
  tags: ["cache", "database"],
164
164
  maturity: "stable"
165
165
  };
166
- require_vi_2VT5v0um.it("accepts valid service definition", () => {
167
- require_vi_2VT5v0um.globalExpect(require_schema.ServiceDefinitionSchema.parse(validDef).id).toBe("redis");
166
+ require_test_CTcmp4Su.it("accepts valid service definition", () => {
167
+ require_test_CTcmp4Su.globalExpect(require_schema.ServiceDefinitionSchema.parse(validDef).id).toBe("redis");
168
168
  });
169
- require_vi_2VT5v0um.it("rejects invalid id format", () => {
170
- require_vi_2VT5v0um.globalExpect(() => require_schema.ServiceDefinitionSchema.parse({
169
+ require_test_CTcmp4Su.it("rejects invalid id format", () => {
170
+ require_test_CTcmp4Su.globalExpect(() => require_schema.ServiceDefinitionSchema.parse({
171
171
  ...validDef,
172
172
  id: "Bad_Id"
173
173
  })).toThrow();
174
174
  });
175
- require_vi_2VT5v0um.it("defaults arrays and booleans correctly", () => {
175
+ require_test_CTcmp4Su.it("defaults arrays and booleans correctly", () => {
176
176
  const result = require_schema.ServiceDefinitionSchema.parse({
177
177
  id: "test",
178
178
  name: "Test",
@@ -183,23 +183,23 @@ require_vi_2VT5v0um.describe("ServiceDefinitionSchema", () => {
183
183
  imageTag: "latest",
184
184
  docsUrl: "https://example.com"
185
185
  });
186
- require_vi_2VT5v0um.globalExpect(result.ports).toEqual([]);
187
- require_vi_2VT5v0um.globalExpect(result.volumes).toEqual([]);
188
- require_vi_2VT5v0um.globalExpect(result.requires).toEqual([]);
189
- require_vi_2VT5v0um.globalExpect(result.conflictsWith).toEqual([]);
190
- require_vi_2VT5v0um.globalExpect(result.gpuRequired).toBe(false);
186
+ require_test_CTcmp4Su.globalExpect(result.ports).toEqual([]);
187
+ require_test_CTcmp4Su.globalExpect(result.volumes).toEqual([]);
188
+ require_test_CTcmp4Su.globalExpect(result.requires).toEqual([]);
189
+ require_test_CTcmp4Su.globalExpect(result.conflictsWith).toEqual([]);
190
+ require_test_CTcmp4Su.globalExpect(result.gpuRequired).toBe(false);
191
191
  });
192
- require_vi_2VT5v0um.it("accepts optional mandatory field and defaults to false when omitted", () => {
192
+ require_test_CTcmp4Su.it("accepts optional mandatory field and defaults to false when omitted", () => {
193
193
  const withMandatory = {
194
194
  ...validDef,
195
195
  mandatory: true
196
196
  };
197
- require_vi_2VT5v0um.globalExpect(require_schema.ServiceDefinitionSchema.parse(withMandatory).mandatory).toBe(true);
197
+ require_test_CTcmp4Su.globalExpect(require_schema.ServiceDefinitionSchema.parse(withMandatory).mandatory).toBe(true);
198
198
  });
199
- require_vi_2VT5v0um.it("omitting mandatory leaves it undefined or false (schema default false)", () => {
200
- require_vi_2VT5v0um.globalExpect(require_schema.ServiceDefinitionSchema.parse(validDef).mandatory !== true).toBe(true);
199
+ require_test_CTcmp4Su.it("omitting mandatory leaves it undefined or false (schema default false)", () => {
200
+ require_test_CTcmp4Su.globalExpect(require_schema.ServiceDefinitionSchema.parse(validDef).mandatory !== true).toBe(true);
201
201
  });
202
- require_vi_2VT5v0um.it("accepts nativeSupported and nativeRecipes for bare-metal", () => {
202
+ require_test_CTcmp4Su.it("accepts nativeSupported and nativeRecipes for bare-metal", () => {
203
203
  const withNative = {
204
204
  ...validDef,
205
205
  nativeSupported: true,
@@ -212,15 +212,15 @@ require_vi_2VT5v0um.describe("ServiceDefinitionSchema", () => {
212
212
  }]
213
213
  };
214
214
  const result = require_schema.ServiceDefinitionSchema.parse(withNative);
215
- require_vi_2VT5v0um.globalExpect(result.nativeSupported).toBe(true);
216
- require_vi_2VT5v0um.globalExpect(result.nativeRecipes).toHaveLength(1);
217
- require_vi_2VT5v0um.globalExpect(result.nativeRecipes[0].platform).toBe("linux");
218
- require_vi_2VT5v0um.globalExpect(result.nativeRecipes[0].startCommand).toBe("systemctl start redis-server");
215
+ require_test_CTcmp4Su.globalExpect(result.nativeSupported).toBe(true);
216
+ require_test_CTcmp4Su.globalExpect(result.nativeRecipes).toHaveLength(1);
217
+ require_test_CTcmp4Su.globalExpect(result.nativeRecipes[0].platform).toBe("linux");
218
+ require_test_CTcmp4Su.globalExpect(result.nativeRecipes[0].startCommand).toBe("systemctl start redis-server");
219
219
  });
220
220
  });
221
- require_vi_2VT5v0um.describe("SkillPackSchema", () => {
222
- require_vi_2VT5v0um.it("accepts valid skill pack", () => {
223
- require_vi_2VT5v0um.globalExpect(require_schema.SkillPackSchema.parse({
221
+ require_test_CTcmp4Su.describe("SkillPackSchema", () => {
222
+ require_test_CTcmp4Su.it("accepts valid skill pack", () => {
223
+ require_test_CTcmp4Su.globalExpect(require_schema.SkillPackSchema.parse({
224
224
  id: "research-agent",
225
225
  name: "Research Agent",
226
226
  description: "Research agent pack",
@@ -236,8 +236,8 @@ require_vi_2VT5v0um.describe("SkillPackSchema", () => {
236
236
  ]
237
237
  }).requiredServices).toHaveLength(3);
238
238
  });
239
- require_vi_2VT5v0um.it("rejects empty required services", () => {
240
- require_vi_2VT5v0um.globalExpect(() => require_schema.SkillPackSchema.parse({
239
+ require_test_CTcmp4Su.it("rejects empty required services", () => {
240
+ require_test_CTcmp4Su.globalExpect(() => require_schema.SkillPackSchema.parse({
241
241
  id: "empty",
242
242
  name: "Empty",
243
243
  description: "Bad",
@@ -246,9 +246,9 @@ require_vi_2VT5v0um.describe("SkillPackSchema", () => {
246
246
  })).toThrow();
247
247
  });
248
248
  });
249
- require_vi_2VT5v0um.describe("PresetSchema", () => {
250
- require_vi_2VT5v0um.it("accepts valid preset", () => {
251
- require_vi_2VT5v0um.globalExpect(require_schema.PresetSchema.parse({
249
+ require_test_CTcmp4Su.describe("PresetSchema", () => {
250
+ require_test_CTcmp4Su.it("accepts valid preset", () => {
251
+ require_test_CTcmp4Su.globalExpect(require_schema.PresetSchema.parse({
252
252
  id: "minimal",
253
253
  name: "Minimal",
254
254
  description: "OpenClaw + Redis",
@@ -1 +1 @@
1
- {"version":3,"file":"schema.test.cjs","names":["describe","ServiceCategorySchema","PortMappingSchema","VolumeMappingSchema","EnvVariableSchema","HealthCheckSchema","GenerationInputSchema","ServiceDefinitionSchema","SkillPackSchema","PresetSchema"],"sources":["../src/schema.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport {\n\tEnvVariableSchema,\n\tGenerationInputSchema,\n\tHealthCheckSchema,\n\tPortMappingSchema,\n\tPresetSchema,\n\tServiceCategorySchema,\n\tServiceDefinitionSchema,\n\tSkillPackSchema,\n\tVolumeMappingSchema,\n} from \"./schema.js\";\n\ndescribe(\"ServiceCategorySchema\", () => {\n\tit(\"accepts valid categories\", () => {\n\t\texpect(ServiceCategorySchema.parse(\"automation\")).toBe(\"automation\");\n\t\texpect(ServiceCategorySchema.parse(\"vector-db\")).toBe(\"vector-db\");\n\t\texpect(ServiceCategorySchema.parse(\"ai\")).toBe(\"ai\");\n\t});\n\n\tit(\"rejects invalid categories\", () => {\n\t\texpect(() => ServiceCategorySchema.parse(\"invalid\")).toThrow();\n\t\texpect(() => ServiceCategorySchema.parse(\"\")).toThrow();\n\t});\n});\n\ndescribe(\"PortMappingSchema\", () => {\n\tit(\"accepts valid port mapping\", () => {\n\t\tconst result = PortMappingSchema.parse({\n\t\t\thost: 6379,\n\t\t\tcontainer: 6379,\n\t\t\tdescription: \"Redis port\",\n\t\t\texposed: true,\n\t\t});\n\t\texpect(result.host).toBe(6379);\n\t});\n\n\tit(\"defaults exposed to true\", () => {\n\t\tconst result = PortMappingSchema.parse({\n\t\t\thost: 6379,\n\t\t\tcontainer: 6379,\n\t\t\tdescription: \"Redis port\",\n\t\t});\n\t\texpect(result.exposed).toBe(true);\n\t});\n\n\tit(\"rejects invalid port numbers\", () => {\n\t\texpect(() =>\n\t\t\tPortMappingSchema.parse({\n\t\t\t\thost: 0,\n\t\t\t\tcontainer: 6379,\n\t\t\t\tdescription: \"bad\",\n\t\t\t}),\n\t\t).toThrow();\n\t\texpect(() =>\n\t\t\tPortMappingSchema.parse({\n\t\t\t\thost: 70000,\n\t\t\t\tcontainer: 6379,\n\t\t\t\tdescription: \"bad\",\n\t\t\t}),\n\t\t).toThrow();\n\t});\n});\n\ndescribe(\"VolumeMappingSchema\", () => {\n\tit(\"accepts valid volume mapping\", () => {\n\t\tconst result = VolumeMappingSchema.parse({\n\t\t\tname: \"redis-data\",\n\t\t\tcontainerPath: \"/data\",\n\t\t\tdescription: \"Redis persistent data\",\n\t\t});\n\t\texpect(result.name).toBe(\"redis-data\");\n\t});\n\n\tit(\"rejects empty name\", () => {\n\t\texpect(() =>\n\t\t\tVolumeMappingSchema.parse({\n\t\t\t\tname: \"\",\n\t\t\t\tcontainerPath: \"/data\",\n\t\t\t\tdescription: \"bad\",\n\t\t\t}),\n\t\t).toThrow();\n\t});\n});\n\ndescribe(\"EnvVariableSchema\", () => {\n\tit(\"accepts valid env variable\", () => {\n\t\tconst result = EnvVariableSchema.parse({\n\t\t\tkey: \"REDIS_PASSWORD\",\n\t\t\tdefaultValue: \"changeme\",\n\t\t\tsecret: true,\n\t\t\tdescription: \"Redis password\",\n\t\t\trequired: true,\n\t\t});\n\t\texpect(result.secret).toBe(true);\n\t});\n\n\tit(\"defaults secret to false\", () => {\n\t\tconst result = EnvVariableSchema.parse({\n\t\t\tkey: \"REDIS_HOST\",\n\t\t\tdefaultValue: \"redis\",\n\t\t\tdescription: \"Redis host\",\n\t\t});\n\t\texpect(result.secret).toBe(false);\n\t\texpect(result.required).toBe(true);\n\t});\n});\n\ndescribe(\"HealthCheckSchema\", () => {\n\tit(\"accepts valid healthcheck with defaults\", () => {\n\t\tconst result = HealthCheckSchema.parse({\n\t\t\ttest: \"redis-cli ping\",\n\t\t});\n\t\texpect(result.interval).toBe(\"30s\");\n\t\texpect(result.timeout).toBe(\"10s\");\n\t\texpect(result.retries).toBe(3);\n\t});\n});\n\ndescribe(\"GenerationInputSchema\", () => {\n\tit(\"accepts valid generation input\", () => {\n\t\tconst result = GenerationInputSchema.parse({\n\t\t\tprojectName: \"my-openclaw-stack\",\n\t\t\tservices: [\"redis\", \"qdrant\"],\n\t\t\tskillPacks: [\"research-agent\"],\n\t\t\tproxy: \"caddy\",\n\t\t\tdomain: \"openclaw.example.com\",\n\t\t});\n\t\texpect(result.projectName).toBe(\"my-openclaw-stack\");\n\t\texpect(result.gpu).toBe(false);\n\t});\n\n\tit(\"rejects invalid project names\", () => {\n\t\texpect(() => GenerationInputSchema.parse({ projectName: \"-bad-name\" })).toThrow();\n\t\texpect(() => GenerationInputSchema.parse({ projectName: \"Bad Name\" })).toThrow();\n\t\texpect(() => GenerationInputSchema.parse({ projectName: \"has spaces\" })).toThrow();\n\t});\n\n\tit(\"accepts single-char project name\", () => {\n\t\tconst result = GenerationInputSchema.parse({ projectName: \"a\" });\n\t\texpect(result.projectName).toBe(\"a\");\n\t});\n\n\tit(\"applies defaults\", () => {\n\t\tconst result = GenerationInputSchema.parse({ projectName: \"test\" });\n\t\texpect(result.services).toEqual([]);\n\t\texpect(result.skillPacks).toEqual([]);\n\t\texpect(result.proxy).toBe(\"none\");\n\t\texpect(result.gpu).toBe(false);\n\t\texpect(result.platform).toBe(\"linux/amd64\");\n\t\texpect(result.deployment).toBe(\"local\");\n\t\texpect(result.deploymentType).toBe(\"docker\");\n\t\texpect(result.generateSecrets).toBe(true);\n\t\texpect(result.openclawVersion).toBe(\"latest\");\n\t});\n\n\tit(\"accepts deploymentType bare-metal and extended platform\", () => {\n\t\tconst result = GenerationInputSchema.parse({\n\t\t\tprojectName: \"my-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tdeploymentType: \"bare-metal\",\n\t\t\tplatform: \"windows/amd64\",\n\t\t});\n\t\texpect(result.deploymentType).toBe(\"bare-metal\");\n\t\texpect(result.platform).toBe(\"windows/amd64\");\n\t});\n\n\tit(\"accepts platform macos/arm64\", () => {\n\t\tconst result = GenerationInputSchema.parse({\n\t\t\tprojectName: \"my-stack\",\n\t\t\tplatform: \"macos/arm64\",\n\t\t});\n\t\texpect(result.platform).toBe(\"macos/arm64\");\n\t});\n});\n\ndescribe(\"ServiceDefinitionSchema\", () => {\n\tconst validDef = {\n\t\tid: \"redis\",\n\t\tname: \"Redis\",\n\t\tdescription: \"In-memory data store\",\n\t\tcategory: \"database\",\n\t\ticon: \"🔴\",\n\t\timage: \"redis\",\n\t\timageTag: \"7-alpine\",\n\t\tports: [{ host: 6379, container: 6379, description: \"Redis port\", exposed: true }],\n\t\tvolumes: [{ name: \"redis-data\", containerPath: \"/data\", description: \"Data\" }],\n\t\tenvironment: [],\n\t\trestartPolicy: \"unless-stopped\",\n\t\tnetworks: [\"openclaw-network\"],\n\t\tskills: [],\n\t\topenclawEnvVars: [],\n\t\tdocsUrl: \"https://redis.io/docs\",\n\t\ttags: [\"cache\", \"database\"],\n\t\tmaturity: \"stable\",\n\t};\n\n\tit(\"accepts valid service definition\", () => {\n\t\tconst result = ServiceDefinitionSchema.parse(validDef);\n\t\texpect(result.id).toBe(\"redis\");\n\t});\n\n\tit(\"rejects invalid id format\", () => {\n\t\texpect(() => ServiceDefinitionSchema.parse({ ...validDef, id: \"Bad_Id\" })).toThrow();\n\t});\n\n\tit(\"defaults arrays and booleans correctly\", () => {\n\t\tconst minimal = {\n\t\t\tid: \"test\",\n\t\t\tname: \"Test\",\n\t\t\tdescription: \"Test service\",\n\t\t\tcategory: \"database\",\n\t\t\ticon: \"🧪\",\n\t\t\timage: \"test\",\n\t\t\timageTag: \"latest\",\n\t\t\tdocsUrl: \"https://example.com\",\n\t\t};\n\t\tconst result = ServiceDefinitionSchema.parse(minimal);\n\t\texpect(result.ports).toEqual([]);\n\t\texpect(result.volumes).toEqual([]);\n\t\texpect(result.requires).toEqual([]);\n\t\texpect(result.conflictsWith).toEqual([]);\n\t\texpect(result.gpuRequired).toBe(false);\n\t});\n\n\tit(\"accepts optional mandatory field and defaults to false when omitted\", () => {\n\t\tconst withMandatory = { ...validDef, mandatory: true };\n\t\tconst result = ServiceDefinitionSchema.parse(withMandatory);\n\t\texpect(result.mandatory).toBe(true);\n\t});\n\n\tit(\"omitting mandatory leaves it undefined or false (schema default false)\", () => {\n\t\tconst result = ServiceDefinitionSchema.parse(validDef);\n\t\texpect(result.mandatory !== true).toBe(true); // false or undefined both mean not mandatory\n\t});\n\n\tit(\"accepts nativeSupported and nativeRecipes for bare-metal\", () => {\n\t\tconst withNative = {\n\t\t\t...validDef,\n\t\t\tnativeSupported: true,\n\t\t\tnativeRecipes: [\n\t\t\t\t{\n\t\t\t\t\tplatform: \"linux\",\n\t\t\t\t\tinstallSteps: [\"apt-get install -y redis-server\"],\n\t\t\t\t\tstartCommand: \"systemctl start redis-server\",\n\t\t\t\t\tstopCommand: \"systemctl stop redis-server\",\n\t\t\t\t\tsystemdUnit: \"redis-server\",\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t\tconst result = ServiceDefinitionSchema.parse(withNative);\n\t\texpect(result.nativeSupported).toBe(true);\n\t\texpect(result.nativeRecipes).toHaveLength(1);\n\t\texpect(result.nativeRecipes![0].platform).toBe(\"linux\");\n\t\texpect(result.nativeRecipes![0].startCommand).toBe(\"systemctl start redis-server\");\n\t});\n});\n\ndescribe(\"SkillPackSchema\", () => {\n\tit(\"accepts valid skill pack\", () => {\n\t\tconst result = SkillPackSchema.parse({\n\t\t\tid: \"research-agent\",\n\t\t\tname: \"Research Agent\",\n\t\t\tdescription: \"Research agent pack\",\n\t\t\trequiredServices: [\"qdrant\", \"searxng\", \"browserless\"],\n\t\t\tskills: [\"qdrant-memory\", \"searxng-search\", \"browserless-browse\"],\n\t\t});\n\t\texpect(result.requiredServices).toHaveLength(3);\n\t});\n\n\tit(\"rejects empty required services\", () => {\n\t\texpect(() =>\n\t\t\tSkillPackSchema.parse({\n\t\t\t\tid: \"empty\",\n\t\t\t\tname: \"Empty\",\n\t\t\t\tdescription: \"Bad\",\n\t\t\t\trequiredServices: [],\n\t\t\t\tskills: [],\n\t\t\t}),\n\t\t).toThrow();\n\t});\n});\n\ndescribe(\"PresetSchema\", () => {\n\tit(\"accepts valid preset\", () => {\n\t\tconst result = PresetSchema.parse({\n\t\t\tid: \"minimal\",\n\t\t\tname: \"Minimal\",\n\t\t\tdescription: \"OpenClaw + Redis\",\n\t\t\tservices: [\"redis\"],\n\t\t\testimatedMemoryMB: 1024,\n\t\t});\n\t\texpect(result.skillPacks).toEqual([]);\n\t});\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"schema.test.cjs","names":["describe","ServiceCategorySchema","PortMappingSchema","VolumeMappingSchema","EnvVariableSchema","HealthCheckSchema","GenerationInputSchema","ServiceDefinitionSchema","SkillPackSchema","PresetSchema"],"sources":["../src/schema.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport {\n\tEnvVariableSchema,\n\tGenerationInputSchema,\n\tHealthCheckSchema,\n\tPortMappingSchema,\n\tPresetSchema,\n\tServiceCategorySchema,\n\tServiceDefinitionSchema,\n\tSkillPackSchema,\n\tVolumeMappingSchema,\n} from \"./schema.js\";\n\ndescribe(\"ServiceCategorySchema\", () => {\n\tit(\"accepts valid categories\", () => {\n\t\texpect(ServiceCategorySchema.parse(\"automation\")).toBe(\"automation\");\n\t\texpect(ServiceCategorySchema.parse(\"vector-db\")).toBe(\"vector-db\");\n\t\texpect(ServiceCategorySchema.parse(\"ai\")).toBe(\"ai\");\n\t});\n\n\tit(\"rejects invalid categories\", () => {\n\t\texpect(() => ServiceCategorySchema.parse(\"invalid\")).toThrow();\n\t\texpect(() => ServiceCategorySchema.parse(\"\")).toThrow();\n\t});\n});\n\ndescribe(\"PortMappingSchema\", () => {\n\tit(\"accepts valid port mapping\", () => {\n\t\tconst result = PortMappingSchema.parse({\n\t\t\thost: 6379,\n\t\t\tcontainer: 6379,\n\t\t\tdescription: \"Redis port\",\n\t\t\texposed: true,\n\t\t});\n\t\texpect(result.host).toBe(6379);\n\t});\n\n\tit(\"defaults exposed to true\", () => {\n\t\tconst result = PortMappingSchema.parse({\n\t\t\thost: 6379,\n\t\t\tcontainer: 6379,\n\t\t\tdescription: \"Redis port\",\n\t\t});\n\t\texpect(result.exposed).toBe(true);\n\t});\n\n\tit(\"rejects invalid port numbers\", () => {\n\t\texpect(() =>\n\t\t\tPortMappingSchema.parse({\n\t\t\t\thost: 0,\n\t\t\t\tcontainer: 6379,\n\t\t\t\tdescription: \"bad\",\n\t\t\t}),\n\t\t).toThrow();\n\t\texpect(() =>\n\t\t\tPortMappingSchema.parse({\n\t\t\t\thost: 70000,\n\t\t\t\tcontainer: 6379,\n\t\t\t\tdescription: \"bad\",\n\t\t\t}),\n\t\t).toThrow();\n\t});\n});\n\ndescribe(\"VolumeMappingSchema\", () => {\n\tit(\"accepts valid volume mapping\", () => {\n\t\tconst result = VolumeMappingSchema.parse({\n\t\t\tname: \"redis-data\",\n\t\t\tcontainerPath: \"/data\",\n\t\t\tdescription: \"Redis persistent data\",\n\t\t});\n\t\texpect(result.name).toBe(\"redis-data\");\n\t});\n\n\tit(\"rejects empty name\", () => {\n\t\texpect(() =>\n\t\t\tVolumeMappingSchema.parse({\n\t\t\t\tname: \"\",\n\t\t\t\tcontainerPath: \"/data\",\n\t\t\t\tdescription: \"bad\",\n\t\t\t}),\n\t\t).toThrow();\n\t});\n});\n\ndescribe(\"EnvVariableSchema\", () => {\n\tit(\"accepts valid env variable\", () => {\n\t\tconst result = EnvVariableSchema.parse({\n\t\t\tkey: \"REDIS_PASSWORD\",\n\t\t\tdefaultValue: \"changeme\",\n\t\t\tsecret: true,\n\t\t\tdescription: \"Redis password\",\n\t\t\trequired: true,\n\t\t});\n\t\texpect(result.secret).toBe(true);\n\t});\n\n\tit(\"defaults secret to false\", () => {\n\t\tconst result = EnvVariableSchema.parse({\n\t\t\tkey: \"REDIS_HOST\",\n\t\t\tdefaultValue: \"redis\",\n\t\t\tdescription: \"Redis host\",\n\t\t});\n\t\texpect(result.secret).toBe(false);\n\t\texpect(result.required).toBe(true);\n\t});\n});\n\ndescribe(\"HealthCheckSchema\", () => {\n\tit(\"accepts valid healthcheck with defaults\", () => {\n\t\tconst result = HealthCheckSchema.parse({\n\t\t\ttest: \"redis-cli ping\",\n\t\t});\n\t\texpect(result.interval).toBe(\"30s\");\n\t\texpect(result.timeout).toBe(\"10s\");\n\t\texpect(result.retries).toBe(3);\n\t});\n});\n\ndescribe(\"GenerationInputSchema\", () => {\n\tit(\"accepts valid generation input\", () => {\n\t\tconst result = GenerationInputSchema.parse({\n\t\t\tprojectName: \"my-openclaw-stack\",\n\t\t\tservices: [\"redis\", \"qdrant\"],\n\t\t\tskillPacks: [\"research-agent\"],\n\t\t\tproxy: \"caddy\",\n\t\t\tdomain: \"openclaw.example.com\",\n\t\t});\n\t\texpect(result.projectName).toBe(\"my-openclaw-stack\");\n\t\texpect(result.gpu).toBe(false);\n\t});\n\n\tit(\"rejects invalid project names\", () => {\n\t\texpect(() => GenerationInputSchema.parse({ projectName: \"-bad-name\" })).toThrow();\n\t\texpect(() => GenerationInputSchema.parse({ projectName: \"Bad Name\" })).toThrow();\n\t\texpect(() => GenerationInputSchema.parse({ projectName: \"has spaces\" })).toThrow();\n\t});\n\n\tit(\"accepts single-char project name\", () => {\n\t\tconst result = GenerationInputSchema.parse({ projectName: \"a\" });\n\t\texpect(result.projectName).toBe(\"a\");\n\t});\n\n\tit(\"applies defaults\", () => {\n\t\tconst result = GenerationInputSchema.parse({ projectName: \"test\" });\n\t\texpect(result.services).toEqual([]);\n\t\texpect(result.skillPacks).toEqual([]);\n\t\texpect(result.proxy).toBe(\"none\");\n\t\texpect(result.gpu).toBe(false);\n\t\texpect(result.platform).toBe(\"linux/amd64\");\n\t\texpect(result.deployment).toBe(\"local\");\n\t\texpect(result.deploymentType).toBe(\"docker\");\n\t\texpect(result.generateSecrets).toBe(true);\n\t\texpect(result.openclawVersion).toBe(\"latest\");\n\t});\n\n\tit(\"accepts deploymentType bare-metal and extended platform\", () => {\n\t\tconst result = GenerationInputSchema.parse({\n\t\t\tprojectName: \"my-stack\",\n\t\t\tservices: [\"redis\"],\n\t\t\tdeploymentType: \"bare-metal\",\n\t\t\tplatform: \"windows/amd64\",\n\t\t});\n\t\texpect(result.deploymentType).toBe(\"bare-metal\");\n\t\texpect(result.platform).toBe(\"windows/amd64\");\n\t});\n\n\tit(\"accepts platform macos/arm64\", () => {\n\t\tconst result = GenerationInputSchema.parse({\n\t\t\tprojectName: \"my-stack\",\n\t\t\tplatform: \"macos/arm64\",\n\t\t});\n\t\texpect(result.platform).toBe(\"macos/arm64\");\n\t});\n});\n\ndescribe(\"ServiceDefinitionSchema\", () => {\n\tconst validDef = {\n\t\tid: \"redis\",\n\t\tname: \"Redis\",\n\t\tdescription: \"In-memory data store\",\n\t\tcategory: \"database\",\n\t\ticon: \"🔴\",\n\t\timage: \"redis\",\n\t\timageTag: \"7-alpine\",\n\t\tports: [{ host: 6379, container: 6379, description: \"Redis port\", exposed: true }],\n\t\tvolumes: [{ name: \"redis-data\", containerPath: \"/data\", description: \"Data\" }],\n\t\tenvironment: [],\n\t\trestartPolicy: \"unless-stopped\",\n\t\tnetworks: [\"openclaw-network\"],\n\t\tskills: [],\n\t\topenclawEnvVars: [],\n\t\tdocsUrl: \"https://redis.io/docs\",\n\t\ttags: [\"cache\", \"database\"],\n\t\tmaturity: \"stable\",\n\t};\n\n\tit(\"accepts valid service definition\", () => {\n\t\tconst result = ServiceDefinitionSchema.parse(validDef);\n\t\texpect(result.id).toBe(\"redis\");\n\t});\n\n\tit(\"rejects invalid id format\", () => {\n\t\texpect(() => ServiceDefinitionSchema.parse({ ...validDef, id: \"Bad_Id\" })).toThrow();\n\t});\n\n\tit(\"defaults arrays and booleans correctly\", () => {\n\t\tconst minimal = {\n\t\t\tid: \"test\",\n\t\t\tname: \"Test\",\n\t\t\tdescription: \"Test service\",\n\t\t\tcategory: \"database\",\n\t\t\ticon: \"🧪\",\n\t\t\timage: \"test\",\n\t\t\timageTag: \"latest\",\n\t\t\tdocsUrl: \"https://example.com\",\n\t\t};\n\t\tconst result = ServiceDefinitionSchema.parse(minimal);\n\t\texpect(result.ports).toEqual([]);\n\t\texpect(result.volumes).toEqual([]);\n\t\texpect(result.requires).toEqual([]);\n\t\texpect(result.conflictsWith).toEqual([]);\n\t\texpect(result.gpuRequired).toBe(false);\n\t});\n\n\tit(\"accepts optional mandatory field and defaults to false when omitted\", () => {\n\t\tconst withMandatory = { ...validDef, mandatory: true };\n\t\tconst result = ServiceDefinitionSchema.parse(withMandatory);\n\t\texpect(result.mandatory).toBe(true);\n\t});\n\n\tit(\"omitting mandatory leaves it undefined or false (schema default false)\", () => {\n\t\tconst result = ServiceDefinitionSchema.parse(validDef);\n\t\texpect(result.mandatory !== true).toBe(true); // false or undefined both mean not mandatory\n\t});\n\n\tit(\"accepts nativeSupported and nativeRecipes for bare-metal\", () => {\n\t\tconst withNative = {\n\t\t\t...validDef,\n\t\t\tnativeSupported: true,\n\t\t\tnativeRecipes: [\n\t\t\t\t{\n\t\t\t\t\tplatform: \"linux\",\n\t\t\t\t\tinstallSteps: [\"apt-get install -y redis-server\"],\n\t\t\t\t\tstartCommand: \"systemctl start redis-server\",\n\t\t\t\t\tstopCommand: \"systemctl stop redis-server\",\n\t\t\t\t\tsystemdUnit: \"redis-server\",\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t\tconst result = ServiceDefinitionSchema.parse(withNative);\n\t\texpect(result.nativeSupported).toBe(true);\n\t\texpect(result.nativeRecipes).toHaveLength(1);\n\t\texpect(result.nativeRecipes![0].platform).toBe(\"linux\");\n\t\texpect(result.nativeRecipes![0].startCommand).toBe(\"systemctl start redis-server\");\n\t});\n});\n\ndescribe(\"SkillPackSchema\", () => {\n\tit(\"accepts valid skill pack\", () => {\n\t\tconst result = SkillPackSchema.parse({\n\t\t\tid: \"research-agent\",\n\t\t\tname: \"Research Agent\",\n\t\t\tdescription: \"Research agent pack\",\n\t\t\trequiredServices: [\"qdrant\", \"searxng\", \"browserless\"],\n\t\t\tskills: [\"qdrant-memory\", \"searxng-search\", \"browserless-browse\"],\n\t\t});\n\t\texpect(result.requiredServices).toHaveLength(3);\n\t});\n\n\tit(\"rejects empty required services\", () => {\n\t\texpect(() =>\n\t\t\tSkillPackSchema.parse({\n\t\t\t\tid: \"empty\",\n\t\t\t\tname: \"Empty\",\n\t\t\t\tdescription: \"Bad\",\n\t\t\t\trequiredServices: [],\n\t\t\t\tskills: [],\n\t\t\t}),\n\t\t).toThrow();\n\t});\n});\n\ndescribe(\"PresetSchema\", () => {\n\tit(\"accepts valid preset\", () => {\n\t\tconst result = PresetSchema.parse({\n\t\t\tid: \"minimal\",\n\t\t\tname: \"Minimal\",\n\t\t\tdescription: \"OpenClaw + Redis\",\n\t\t\tservices: [\"redis\"],\n\t\t\testimatedMemoryMB: 1024,\n\t\t});\n\t\texpect(result.skillPacks).toEqual([]);\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 "./vi.2VT5v0um-DvC3SVNc.mjs";
1
+ import { n as describe, r as it, t as globalExpect } from "./test.CTcmp4Su-ClCHJ3FA.mjs";
2
2
  import { EnvVariableSchema, GenerationInputSchema, HealthCheckSchema, PortMappingSchema, PresetSchema, ServiceCategorySchema, ServiceDefinitionSchema, SkillPackSchema, VolumeMappingSchema } from "./schema.mjs";
3
3
  //#region src/schema.test.ts
4
4
  describe("ServiceCategorySchema", () => {
@@ -0,0 +1,87 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region src/services/definitions/apptension-saas.ts
3
+ const apptensionSaasDefinition = {
4
+ id: "apptension-saas",
5
+ name: "SaaS Boilerplate (Apptension)",
6
+ description: "Production-ready SaaS boilerplate with React frontend, Django backend, GraphQL API, PostgreSQL, async workers, email, Stripe payments, and Docker Compose support.",
7
+ category: "saas-boilerplate",
8
+ icon: "🚀",
9
+ gitSource: {
10
+ repoUrl: "https://github.com/apptension/saas-boilerplate.git",
11
+ branch: "master",
12
+ postCloneCommands: []
13
+ },
14
+ buildContext: {
15
+ dockerfile: "Dockerfile",
16
+ context: "."
17
+ },
18
+ ports: [{
19
+ host: 3101,
20
+ container: 80,
21
+ description: "Apptension SaaS web application",
22
+ exposed: true
23
+ }],
24
+ volumes: [],
25
+ environment: [
26
+ {
27
+ key: "APPTENSION_SAAS_DB_PASSWORD",
28
+ defaultValue: "",
29
+ secret: true,
30
+ description: "Database password for Apptension SaaS",
31
+ required: true
32
+ },
33
+ {
34
+ key: "DB_CONNECTION",
35
+ defaultValue: "postgresql://apptensionsaas:${APPTENSION_SAAS_DB_PASSWORD}@postgresql:5432/apptensionsaas",
36
+ secret: false,
37
+ description: "PostgreSQL connection string",
38
+ required: true
39
+ },
40
+ {
41
+ key: "DJANGO_SECRET_KEY",
42
+ defaultValue: "",
43
+ secret: true,
44
+ description: "Django secret key",
45
+ required: true
46
+ },
47
+ {
48
+ key: "REDIS_URL",
49
+ defaultValue: "redis://redis:6379/0",
50
+ secret: false,
51
+ description: "Redis connection URL for caching and async workers",
52
+ required: true
53
+ }
54
+ ],
55
+ healthcheck: {
56
+ test: "wget -q --spider http://localhost:80/ || exit 1",
57
+ interval: "30s",
58
+ timeout: "10s",
59
+ retries: 3,
60
+ startPeriod: "60s"
61
+ },
62
+ dependsOn: ["postgresql", "redis"],
63
+ restartPolicy: "unless-stopped",
64
+ networks: ["openclaw-network"],
65
+ skills: [],
66
+ openclawEnvVars: [],
67
+ docsUrl: "https://docs.demo.saas.apptension.com",
68
+ tags: [
69
+ "saas",
70
+ "boilerplate",
71
+ "react",
72
+ "django",
73
+ "graphql",
74
+ "stripe",
75
+ "enterprise"
76
+ ],
77
+ maturity: "beta",
78
+ requires: ["postgresql", "redis"],
79
+ recommends: [],
80
+ conflictsWith: [],
81
+ minMemoryMB: 768,
82
+ gpuRequired: false
83
+ };
84
+ //#endregion
85
+ exports.apptensionSaasDefinition = apptensionSaasDefinition;
86
+
87
+ //# sourceMappingURL=apptension-saas.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apptension-saas.cjs","names":[],"sources":["../../../src/services/definitions/apptension-saas.ts"],"sourcesContent":["import type { ServiceDefinition } from \"../../types.js\";\n\nexport const apptensionSaasDefinition: ServiceDefinition = {\n\tid: \"apptension-saas\",\n\tname: \"SaaS Boilerplate (Apptension)\",\n\tdescription:\n\t\t\"Production-ready SaaS boilerplate with React frontend, Django backend, GraphQL API, PostgreSQL, async workers, email, Stripe payments, and Docker Compose support.\",\n\tcategory: \"saas-boilerplate\",\n\ticon: \"🚀\",\n\n\tgitSource: {\n\t\trepoUrl: \"https://github.com/apptension/saas-boilerplate.git\",\n\t\tbranch: \"master\",\n\t\tpostCloneCommands: [],\n\t},\n\tbuildContext: {\n\t\tdockerfile: \"Dockerfile\",\n\t\tcontext: \".\",\n\t},\n\n\tports: [\n\t\t{\n\t\t\thost: 3101,\n\t\t\tcontainer: 80,\n\t\t\tdescription: \"Apptension SaaS web application\",\n\t\t\texposed: true,\n\t\t},\n\t],\n\tvolumes: [],\n\tenvironment: [\n\t\t{\n\t\t\tkey: \"APPTENSION_SAAS_DB_PASSWORD\",\n\t\t\tdefaultValue: \"\",\n\t\t\tsecret: true,\n\t\t\tdescription: \"Database password for Apptension SaaS\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"DB_CONNECTION\",\n\t\t\tdefaultValue: \"postgresql://apptensionsaas:${APPTENSION_SAAS_DB_PASSWORD}@postgresql:5432/apptensionsaas\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"PostgreSQL connection string\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"DJANGO_SECRET_KEY\",\n\t\t\tdefaultValue: \"\",\n\t\t\tsecret: true,\n\t\t\tdescription: \"Django secret key\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"REDIS_URL\",\n\t\t\tdefaultValue: \"redis://redis:6379/0\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Redis connection URL for caching and async workers\",\n\t\t\trequired: true,\n\t\t},\n\t],\n\thealthcheck: {\n\t\ttest: \"wget -q --spider http://localhost:80/ || exit 1\",\n\t\tinterval: \"30s\",\n\t\ttimeout: \"10s\",\n\t\tretries: 3,\n\t\tstartPeriod: \"60s\",\n\t},\n\tdependsOn: [\"postgresql\", \"redis\"],\n\trestartPolicy: \"unless-stopped\",\n\tnetworks: [\"openclaw-network\"],\n\n\tskills: [],\n\topenclawEnvVars: [],\n\n\tdocsUrl: \"https://docs.demo.saas.apptension.com\",\n\ttags: [\"saas\", \"boilerplate\", \"react\", \"django\", \"graphql\", \"stripe\", \"enterprise\"],\n\tmaturity: \"beta\",\n\n\trequires: [\"postgresql\", \"redis\"],\n\trecommends: [],\n\tconflictsWith: [],\n\n\tminMemoryMB: 768,\n\tgpuRequired: false,\n};\n"],"mappings":";;AAEA,MAAa,2BAA8C;CAC1D,IAAI;CACJ,MAAM;CACN,aACC;CACD,UAAU;CACV,MAAM;CAEN,WAAW;EACV,SAAS;EACT,QAAQ;EACR,mBAAmB,EAAE;EACrB;CACD,cAAc;EACb,YAAY;EACZ,SAAS;EACT;CAED,OAAO,CACN;EACC,MAAM;EACN,WAAW;EACX,aAAa;EACb,SAAS;EACT,CACD;CACD,SAAS,EAAE;CACX,aAAa;EACZ;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;CACD,aAAa;EACZ,MAAM;EACN,UAAU;EACV,SAAS;EACT,SAAS;EACT,aAAa;EACb;CACD,WAAW,CAAC,cAAc,QAAQ;CAClC,eAAe;CACf,UAAU,CAAC,mBAAmB;CAE9B,QAAQ,EAAE;CACV,iBAAiB,EAAE;CAEnB,SAAS;CACT,MAAM;EAAC;EAAQ;EAAe;EAAS;EAAU;EAAW;EAAU;EAAa;CACnF,UAAU;CAEV,UAAU,CAAC,cAAc,QAAQ;CACjC,YAAY,EAAE;CACd,eAAe,EAAE;CAEjB,aAAa;CACb,aAAa;CACb"}
@@ -0,0 +1,7 @@
1
+ import { ServiceDefinition } from "../../types.cjs";
2
+
3
+ //#region src/services/definitions/apptension-saas.d.ts
4
+ declare const apptensionSaasDefinition: ServiceDefinition;
5
+ //#endregion
6
+ export { apptensionSaasDefinition };
7
+ //# sourceMappingURL=apptension-saas.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apptension-saas.d.cts","names":[],"sources":["../../../src/services/definitions/apptension-saas.ts"],"mappings":";;;cAEa,wBAAA,EAA0B,iBAAA"}
@@ -0,0 +1,7 @@
1
+ import { ServiceDefinition } from "../../types.mjs";
2
+
3
+ //#region src/services/definitions/apptension-saas.d.ts
4
+ declare const apptensionSaasDefinition: ServiceDefinition;
5
+ //#endregion
6
+ export { apptensionSaasDefinition };
7
+ //# sourceMappingURL=apptension-saas.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apptension-saas.d.mts","names":[],"sources":["../../../src/services/definitions/apptension-saas.ts"],"mappings":";;;cAEa,wBAAA,EAA0B,iBAAA"}
@@ -0,0 +1,86 @@
1
+ //#region src/services/definitions/apptension-saas.ts
2
+ const apptensionSaasDefinition = {
3
+ id: "apptension-saas",
4
+ name: "SaaS Boilerplate (Apptension)",
5
+ description: "Production-ready SaaS boilerplate with React frontend, Django backend, GraphQL API, PostgreSQL, async workers, email, Stripe payments, and Docker Compose support.",
6
+ category: "saas-boilerplate",
7
+ icon: "🚀",
8
+ gitSource: {
9
+ repoUrl: "https://github.com/apptension/saas-boilerplate.git",
10
+ branch: "master",
11
+ postCloneCommands: []
12
+ },
13
+ buildContext: {
14
+ dockerfile: "Dockerfile",
15
+ context: "."
16
+ },
17
+ ports: [{
18
+ host: 3101,
19
+ container: 80,
20
+ description: "Apptension SaaS web application",
21
+ exposed: true
22
+ }],
23
+ volumes: [],
24
+ environment: [
25
+ {
26
+ key: "APPTENSION_SAAS_DB_PASSWORD",
27
+ defaultValue: "",
28
+ secret: true,
29
+ description: "Database password for Apptension SaaS",
30
+ required: true
31
+ },
32
+ {
33
+ key: "DB_CONNECTION",
34
+ defaultValue: "postgresql://apptensionsaas:${APPTENSION_SAAS_DB_PASSWORD}@postgresql:5432/apptensionsaas",
35
+ secret: false,
36
+ description: "PostgreSQL connection string",
37
+ required: true
38
+ },
39
+ {
40
+ key: "DJANGO_SECRET_KEY",
41
+ defaultValue: "",
42
+ secret: true,
43
+ description: "Django secret key",
44
+ required: true
45
+ },
46
+ {
47
+ key: "REDIS_URL",
48
+ defaultValue: "redis://redis:6379/0",
49
+ secret: false,
50
+ description: "Redis connection URL for caching and async workers",
51
+ required: true
52
+ }
53
+ ],
54
+ healthcheck: {
55
+ test: "wget -q --spider http://localhost:80/ || exit 1",
56
+ interval: "30s",
57
+ timeout: "10s",
58
+ retries: 3,
59
+ startPeriod: "60s"
60
+ },
61
+ dependsOn: ["postgresql", "redis"],
62
+ restartPolicy: "unless-stopped",
63
+ networks: ["openclaw-network"],
64
+ skills: [],
65
+ openclawEnvVars: [],
66
+ docsUrl: "https://docs.demo.saas.apptension.com",
67
+ tags: [
68
+ "saas",
69
+ "boilerplate",
70
+ "react",
71
+ "django",
72
+ "graphql",
73
+ "stripe",
74
+ "enterprise"
75
+ ],
76
+ maturity: "beta",
77
+ requires: ["postgresql", "redis"],
78
+ recommends: [],
79
+ conflictsWith: [],
80
+ minMemoryMB: 768,
81
+ gpuRequired: false
82
+ };
83
+ //#endregion
84
+ export { apptensionSaasDefinition };
85
+
86
+ //# sourceMappingURL=apptension-saas.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apptension-saas.mjs","names":[],"sources":["../../../src/services/definitions/apptension-saas.ts"],"sourcesContent":["import type { ServiceDefinition } from \"../../types.js\";\n\nexport const apptensionSaasDefinition: ServiceDefinition = {\n\tid: \"apptension-saas\",\n\tname: \"SaaS Boilerplate (Apptension)\",\n\tdescription:\n\t\t\"Production-ready SaaS boilerplate with React frontend, Django backend, GraphQL API, PostgreSQL, async workers, email, Stripe payments, and Docker Compose support.\",\n\tcategory: \"saas-boilerplate\",\n\ticon: \"🚀\",\n\n\tgitSource: {\n\t\trepoUrl: \"https://github.com/apptension/saas-boilerplate.git\",\n\t\tbranch: \"master\",\n\t\tpostCloneCommands: [],\n\t},\n\tbuildContext: {\n\t\tdockerfile: \"Dockerfile\",\n\t\tcontext: \".\",\n\t},\n\n\tports: [\n\t\t{\n\t\t\thost: 3101,\n\t\t\tcontainer: 80,\n\t\t\tdescription: \"Apptension SaaS web application\",\n\t\t\texposed: true,\n\t\t},\n\t],\n\tvolumes: [],\n\tenvironment: [\n\t\t{\n\t\t\tkey: \"APPTENSION_SAAS_DB_PASSWORD\",\n\t\t\tdefaultValue: \"\",\n\t\t\tsecret: true,\n\t\t\tdescription: \"Database password for Apptension SaaS\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"DB_CONNECTION\",\n\t\t\tdefaultValue: \"postgresql://apptensionsaas:${APPTENSION_SAAS_DB_PASSWORD}@postgresql:5432/apptensionsaas\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"PostgreSQL connection string\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"DJANGO_SECRET_KEY\",\n\t\t\tdefaultValue: \"\",\n\t\t\tsecret: true,\n\t\t\tdescription: \"Django secret key\",\n\t\t\trequired: true,\n\t\t},\n\t\t{\n\t\t\tkey: \"REDIS_URL\",\n\t\t\tdefaultValue: \"redis://redis:6379/0\",\n\t\t\tsecret: false,\n\t\t\tdescription: \"Redis connection URL for caching and async workers\",\n\t\t\trequired: true,\n\t\t},\n\t],\n\thealthcheck: {\n\t\ttest: \"wget -q --spider http://localhost:80/ || exit 1\",\n\t\tinterval: \"30s\",\n\t\ttimeout: \"10s\",\n\t\tretries: 3,\n\t\tstartPeriod: \"60s\",\n\t},\n\tdependsOn: [\"postgresql\", \"redis\"],\n\trestartPolicy: \"unless-stopped\",\n\tnetworks: [\"openclaw-network\"],\n\n\tskills: [],\n\topenclawEnvVars: [],\n\n\tdocsUrl: \"https://docs.demo.saas.apptension.com\",\n\ttags: [\"saas\", \"boilerplate\", \"react\", \"django\", \"graphql\", \"stripe\", \"enterprise\"],\n\tmaturity: \"beta\",\n\n\trequires: [\"postgresql\", \"redis\"],\n\trecommends: [],\n\tconflictsWith: [],\n\n\tminMemoryMB: 768,\n\tgpuRequired: false,\n};\n"],"mappings":";AAEA,MAAa,2BAA8C;CAC1D,IAAI;CACJ,MAAM;CACN,aACC;CACD,UAAU;CACV,MAAM;CAEN,WAAW;EACV,SAAS;EACT,QAAQ;EACR,mBAAmB,EAAE;EACrB;CACD,cAAc;EACb,YAAY;EACZ,SAAS;EACT;CAED,OAAO,CACN;EACC,MAAM;EACN,WAAW;EACX,aAAa;EACb,SAAS;EACT,CACD;CACD,SAAS,EAAE;CACX,aAAa;EACZ;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;GACC,KAAK;GACL,cAAc;GACd,QAAQ;GACR,aAAa;GACb,UAAU;GACV;EACD;CACD,aAAa;EACZ,MAAM;EACN,UAAU;EACV,SAAS;EACT,SAAS;EACT,aAAa;EACb;CACD,WAAW,CAAC,cAAc,QAAQ;CAClC,eAAe;CACf,UAAU,CAAC,mBAAmB;CAE9B,QAAQ,EAAE;CACV,iBAAiB,EAAE;CAEnB,SAAS;CACT,MAAM;EAAC;EAAQ;EAAe;EAAS;EAAU;EAAW;EAAU;EAAa;CACnF,UAAU;CAEV,UAAU,CAAC,cAAc,QAAQ;CACjC,YAAY,EAAE;CACd,eAAe,EAAE;CAEjB,aAAa;CACb,aAAa;CACb"}