@voltro/cli 0.28.0 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) hide show
  1. package/CHANGELOG.md +655 -0
  2. package/THIRD-PARTY-NOTICES.md +90 -4
  3. package/dist/{apiBuild-eUM32r1u.js → apiBuild-BceikpQf.js} +3 -3
  4. package/dist/apiBuild-CxvR1Dwt.js +2 -0
  5. package/dist/bin.js +3 -3
  6. package/dist/checkCommand-BMr-X48w.js +2427 -0
  7. package/dist/checkCommand-BOk9y264.js +2 -0
  8. package/dist/cliRuntime-Oh517vCV.js +96 -0
  9. package/dist/{commands-CSkrUI1h.js → commands-D4Y1-Nlu.js} +8575 -9366
  10. package/dist/{dbCommand-CpYgmSw4.js → dbCommand-C7hbl5pk.js} +345 -266
  11. package/dist/dbCommand-D8nhyppR.js +2 -0
  12. package/dist/{dev-DlBWWnJQ.js → dev-Cr-teYsz.js} +1 -1
  13. package/dist/{dev-CEZwJhmb.js → dev-DmnkH-wr.js} +2939 -1832
  14. package/dist/fileConventions-Cof68_BL.js +33 -0
  15. package/dist/{frameworkTableAssembly-BwHU9Euq.js → frameworkTableAssembly-BzAajuUv.js} +115 -99
  16. package/dist/frameworkTableAssembly-DU0aOxjL.js +2 -0
  17. package/dist/index.d.ts +7 -2
  18. package/dist/index.js +1 -1
  19. package/dist/{inspect-CUCCzw2I.js → inspect-BUUjt773.js} +349 -192
  20. package/dist/inspect-mmBuRXmy.js +2 -0
  21. package/dist/{inspectMetrics-BU90mvJN.js → inspectMetrics-BeJdP_3b.js} +1068 -978
  22. package/dist/{manifestBuild-BnzAxp2O.js → manifestBuild-BLrVuSlM.js} +1 -1
  23. package/dist/manifestBuild-Dj8Jjoto.js +2 -0
  24. package/dist/sdkgen-CqpOq_fy.js +582 -0
  25. package/dist/serveCommand-Ciq_wIY8.js +1577 -0
  26. package/dist/serveEntry.js +2 -2
  27. package/dist/{start-BGXIf6zT.js → start-ocqB1seX.js} +283 -270
  28. package/dist/startEntry.js +2 -2
  29. package/package.json +17 -17
  30. package/templates/AGENTS.core.md +50 -0
  31. package/templates/AGENTS.md +54 -2
  32. package/templates/agent-docs/_index.md +4 -2
  33. package/templates/agent-docs/_manifest.json +26 -5
  34. package/templates/agent-docs/ai.md +191 -0
  35. package/templates/agent-docs/cli.md +143 -6
  36. package/templates/agent-docs/configuration.md +32 -0
  37. package/templates/agent-docs/data.md +282 -0
  38. package/templates/agent-docs/database/migrations.md +47 -0
  39. package/templates/agent-docs/database/misc.md +57 -0
  40. package/templates/agent-docs/database/schema.md +3 -1
  41. package/templates/agent-docs/internationalization.md +169 -8
  42. package/templates/agent-docs/local-first-mobile.md +426 -0
  43. package/templates/agent-docs/routing.md +94 -3
  44. package/templates/agent-docs/schema-driven-ui.md +12 -0
  45. package/templates/agent-docs/security.md +17 -0
  46. package/templates/agent-docs/templates/apibackends.md +210 -1
  47. package/templates/agent-docs/templates/appshells.md +144 -1
  48. package/templates/agent-docs/templates/mobile.md +60 -0
  49. package/templates/agent-docs/templates/overview.md +17 -7
  50. package/templates/agent-docs/whats-new.md +238 -158
  51. package/templates/agent-docs/workflows.md +376 -0
  52. package/templates/apps/api-ai/package.json +7 -7
  53. package/templates/apps/api-auth/package.json +8 -8
  54. package/templates/apps/api-backend/package.json +7 -7
  55. package/templates/apps/api-backend-deactivation/package.json +7 -7
  56. package/templates/apps/api-backend-mail/package.json +8 -8
  57. package/templates/apps/api-backend-mariadb/package.json +9 -9
  58. package/templates/apps/api-backend-sqlite/.env.example +19 -0
  59. package/templates/apps/api-backend-sqlite/README.md +38 -0
  60. package/templates/apps/api-backend-sqlite/app.config.ts +35 -0
  61. package/templates/apps/api-backend-sqlite/database/schema.ts +54 -0
  62. package/templates/apps/api-backend-sqlite/mutations/notes.create.mutation.server.ts +19 -0
  63. package/templates/apps/api-backend-sqlite/mutations/notes.create.mutation.ts +37 -0
  64. package/templates/apps/api-backend-sqlite/package.json +30 -0
  65. package/templates/apps/api-backend-sqlite/queries/notes.query.server.ts +14 -0
  66. package/templates/apps/api-backend-sqlite/queries/notes.query.ts +20 -0
  67. package/templates/apps/api-backend-sqlite/template.json +6 -0
  68. package/templates/apps/api-backend-sqlite/tests/notes.create.test.ts +50 -0
  69. package/templates/apps/api-backend-sqlite/tsconfig.json +5 -0
  70. package/templates/apps/api-backend-storage/package.json +8 -8
  71. package/templates/apps/api-cms/README.md +104 -0
  72. package/templates/apps/api-cms/actions/content.get.action.server.ts +27 -0
  73. package/templates/apps/api-cms/actions/content.get.action.ts +19 -0
  74. package/templates/apps/api-cms/actions/content.types.action.server.ts +26 -0
  75. package/templates/apps/api-cms/actions/content.types.action.ts +40 -0
  76. package/templates/apps/api-cms/actions/me.action.server.ts +18 -0
  77. package/templates/apps/api-cms/actions/me.action.ts +16 -0
  78. package/templates/apps/api-cms/app.config.ts +61 -0
  79. package/templates/apps/api-cms/content/blogPost.contentType.ts +39 -0
  80. package/templates/apps/api-cms/content/index.ts +18 -0
  81. package/templates/apps/api-cms/content/page.contentType.ts +24 -0
  82. package/templates/apps/api-cms/database/schema.ts +64 -0
  83. package/templates/apps/api-cms/mutations/content.publish.mutation.server.ts +19 -0
  84. package/templates/apps/api-cms/mutations/content.publish.mutation.ts +15 -0
  85. package/templates/apps/api-cms/mutations/content.saveDraft.mutation.server.ts +36 -0
  86. package/templates/apps/api-cms/mutations/content.saveDraft.mutation.ts +32 -0
  87. package/templates/apps/api-cms/mutations/content.unpublish.mutation.server.ts +19 -0
  88. package/templates/apps/api-cms/mutations/content.unpublish.mutation.ts +11 -0
  89. package/templates/apps/api-cms/package.json +32 -0
  90. package/templates/apps/api-cms/queries/content.list.query.server.ts +0 -0
  91. package/templates/apps/api-cms/queries/content.list.query.ts +27 -0
  92. package/templates/apps/api-cms/template.json +6 -0
  93. package/templates/apps/api-cms/tests/content.descriptors.test.ts +64 -0
  94. package/templates/apps/api-cms/tests/content.write.test.ts +85 -0
  95. package/templates/apps/api-cms/tsconfig.json +5 -0
  96. package/templates/apps/api-collab/README.md +70 -0
  97. package/templates/apps/api-collab/app.config.ts +28 -0
  98. package/templates/apps/api-collab/database/schema.ts +63 -0
  99. package/templates/apps/api-collab/mutations/documents.create.mutation.server.ts +19 -0
  100. package/templates/apps/api-collab/mutations/documents.create.mutation.ts +36 -0
  101. package/templates/apps/api-collab/mutations/documents.setBody.mutation.server.ts +20 -0
  102. package/templates/apps/api-collab/mutations/documents.setBody.mutation.ts +30 -0
  103. package/templates/apps/api-collab/package.json +30 -0
  104. package/templates/apps/api-collab/queries/documents.query.server.ts +16 -0
  105. package/templates/apps/api-collab/queries/documents.query.ts +23 -0
  106. package/templates/apps/api-collab/template.json +6 -0
  107. package/templates/apps/api-collab/tests/documents.setBody.test.ts +89 -0
  108. package/templates/apps/api-collab/tsconfig.json +5 -0
  109. package/templates/apps/api-data-advanced/package.json +8 -8
  110. package/templates/apps/api-durable/package.json +8 -8
  111. package/templates/apps/api-feature-flags/package.json +9 -9
  112. package/templates/apps/api-governance/package.json +8 -8
  113. package/templates/apps/api-kv/package.json +8 -8
  114. package/templates/apps/api-moderation/package.json +8 -8
  115. package/templates/apps/api-observability/package.json +8 -8
  116. package/templates/apps/api-ratelimit/package.json +8 -8
  117. package/templates/apps/api-rbac/package.json +8 -8
  118. package/templates/apps/api-rest/package.json +7 -7
  119. package/templates/apps/api-saas/package.json +11 -11
  120. package/templates/apps/api-saas-starter/README.md +103 -0
  121. package/templates/apps/api-saas-starter/actions/me.action.server.ts +18 -0
  122. package/templates/apps/api-saas-starter/actions/me.action.ts +20 -0
  123. package/templates/apps/api-saas-starter/app.config.ts +87 -0
  124. package/templates/apps/api-saas-starter/database/schema.ts +57 -0
  125. package/templates/apps/api-saas-starter/mutations/invites.create.mutation.server.ts +26 -0
  126. package/templates/apps/api-saas-starter/mutations/invites.create.mutation.ts +18 -0
  127. package/templates/apps/api-saas-starter/mutations/projects.create.mutation.server.ts +29 -0
  128. package/templates/apps/api-saas-starter/mutations/projects.create.mutation.ts +18 -0
  129. package/templates/apps/api-saas-starter/package.json +32 -0
  130. package/templates/apps/api-saas-starter/queries/invites.list.query.server.ts +14 -0
  131. package/templates/apps/api-saas-starter/queries/invites.list.query.ts +17 -0
  132. package/templates/apps/api-saas-starter/queries/projects.list.query.server.ts +14 -0
  133. package/templates/apps/api-saas-starter/queries/projects.list.query.ts +18 -0
  134. package/templates/apps/api-saas-starter/template.json +6 -0
  135. package/templates/apps/api-saas-starter/tests/projects.create.test.ts +62 -0
  136. package/templates/apps/api-saas-starter/tests/session.test.ts +33 -0
  137. package/templates/apps/api-saas-starter/tsconfig.json +5 -0
  138. package/templates/apps/api-search/package.json +8 -8
  139. package/templates/apps/api-status/README.md +88 -0
  140. package/templates/apps/api-status/app.config.ts +36 -0
  141. package/templates/apps/api-status/authz.ts +33 -0
  142. package/templates/apps/api-status/database/schema.ts +70 -0
  143. package/templates/apps/api-status/mutations/components.create.mutation.server.ts +19 -0
  144. package/templates/apps/api-status/mutations/components.create.mutation.ts +16 -0
  145. package/templates/apps/api-status/mutations/incidents.create.mutation.server.ts +25 -0
  146. package/templates/apps/api-status/mutations/incidents.create.mutation.ts +22 -0
  147. package/templates/apps/api-status/mutations/incidents.resolve.mutation.server.ts +24 -0
  148. package/templates/apps/api-status/mutations/incidents.resolve.mutation.ts +19 -0
  149. package/templates/apps/api-status/mutations/incidents.update.mutation.server.ts +26 -0
  150. package/templates/apps/api-status/mutations/incidents.update.mutation.ts +21 -0
  151. package/templates/apps/api-status/package.json +30 -0
  152. package/templates/apps/api-status/queries/components.list.query.server.ts +14 -0
  153. package/templates/apps/api-status/queries/components.list.query.ts +13 -0
  154. package/templates/apps/api-status/queries/incidents.live.query.server.ts +14 -0
  155. package/templates/apps/api-status/queries/incidents.live.query.ts +20 -0
  156. package/templates/apps/api-status/queries/updates.list.query.server.ts +14 -0
  157. package/templates/apps/api-status/queries/updates.list.query.ts +17 -0
  158. package/templates/apps/api-status/template.json +6 -0
  159. package/templates/apps/api-status/tests/status.test.ts +70 -0
  160. package/templates/apps/api-status/tsconfig.json +5 -0
  161. package/templates/apps/api-versioning/package.json +8 -8
  162. package/templates/apps/api-webhooks/package.json +9 -9
  163. package/templates/apps/changelog/package.json +6 -6
  164. package/templates/apps/edge-functions/package.json +2 -2
  165. package/templates/apps/frontend-admin/app.config.ts +1 -1
  166. package/templates/apps/frontend-admin/package.json +8 -8
  167. package/templates/apps/frontend-admin/src/locales/index.ts +1 -1
  168. package/templates/apps/frontend-app/app.config.ts +1 -1
  169. package/templates/apps/frontend-app/package.json +8 -8
  170. package/templates/apps/frontend-app/src/locales/index.ts +1 -1
  171. package/templates/apps/frontend-app/src/pages/layout.tsx +1 -1
  172. package/templates/apps/frontend-app/src/pages/page.tsx +1 -1
  173. package/templates/apps/frontend-auth/README.md +78 -0
  174. package/templates/apps/frontend-auth/app.config.ts +34 -0
  175. package/templates/apps/frontend-auth/package.json +32 -0
  176. package/templates/apps/frontend-auth/src/components/AuthShell.tsx +35 -0
  177. package/templates/apps/frontend-auth/src/components/PasswordStrength.tsx +33 -0
  178. package/templates/apps/frontend-auth/src/config.ts +11 -0
  179. package/templates/apps/frontend-auth/src/globals.css +105 -0
  180. package/templates/apps/frontend-auth/src/globals.d.ts +6 -0
  181. package/templates/apps/frontend-auth/src/lib/auth.ts +34 -0
  182. package/templates/apps/frontend-auth/src/lib/redirect.test.ts +24 -0
  183. package/templates/apps/frontend-auth/src/lib/redirect.ts +29 -0
  184. package/templates/apps/frontend-auth/src/locales/de.ts +66 -0
  185. package/templates/apps/frontend-auth/src/locales/en.ts +76 -0
  186. package/templates/apps/frontend-auth/src/locales/index.ts +14 -0
  187. package/templates/apps/frontend-auth/src/pages/forgot/page.tsx +51 -0
  188. package/templates/apps/frontend-auth/src/pages/layout.tsx +12 -0
  189. package/templates/apps/frontend-auth/src/pages/login/page.test.tsx +53 -0
  190. package/templates/apps/frontend-auth/src/pages/login/page.tsx +67 -0
  191. package/templates/apps/frontend-auth/src/pages/logout/page.tsx +28 -0
  192. package/templates/apps/frontend-auth/src/pages/magic/page.tsx +51 -0
  193. package/templates/apps/frontend-auth/src/pages/page.tsx +26 -0
  194. package/templates/apps/frontend-auth/src/pages/reset/page.test.tsx +51 -0
  195. package/templates/apps/frontend-auth/src/pages/reset/page.tsx +63 -0
  196. package/templates/apps/frontend-auth/src/pages/signup/page.tsx +60 -0
  197. package/templates/apps/frontend-auth/src/pages/verify/page.tsx +50 -0
  198. package/templates/apps/frontend-auth/template.json +6 -0
  199. package/templates/apps/frontend-auth/tsconfig.json +5 -0
  200. package/templates/apps/frontend-blank/app.config.ts +1 -1
  201. package/templates/apps/frontend-blank/package.json +7 -7
  202. package/templates/apps/frontend-blank/src/locales/index.ts +1 -1
  203. package/templates/apps/frontend-blank/src/pages/layout.tsx +1 -1
  204. package/templates/apps/frontend-blank/src/pages/page.tsx +1 -1
  205. package/templates/apps/frontend-cms/README.md +47 -0
  206. package/templates/apps/frontend-cms/app.config.ts +37 -0
  207. package/templates/apps/frontend-cms/package.json +33 -0
  208. package/templates/apps/frontend-cms/src/config.ts +8 -0
  209. package/templates/apps/frontend-cms/src/globals.css +105 -0
  210. package/templates/apps/frontend-cms/src/globals.d.ts +6 -0
  211. package/templates/apps/frontend-cms/src/lib/api.ts +58 -0
  212. package/templates/apps/frontend-cms/src/locales/de.ts +50 -0
  213. package/templates/apps/frontend-cms/src/locales/en.ts +55 -0
  214. package/templates/apps/frontend-cms/src/locales/index.ts +14 -0
  215. package/templates/apps/frontend-cms/src/pages/(app)/error.tsx +18 -0
  216. package/templates/apps/frontend-cms/src/pages/(app)/layout.test.tsx +31 -0
  217. package/templates/apps/frontend-cms/src/pages/(app)/layout.tsx +62 -0
  218. package/templates/apps/frontend-cms/src/pages/(app)/not-found.tsx +14 -0
  219. package/templates/apps/frontend-cms/src/pages/(app)/page.test.tsx +110 -0
  220. package/templates/apps/frontend-cms/src/pages/(app)/page.tsx +159 -0
  221. package/templates/apps/frontend-cms/src/pages/layout.tsx +12 -0
  222. package/templates/apps/frontend-cms/src/pages/login/page.test.tsx +58 -0
  223. package/templates/apps/frontend-cms/src/pages/login/page.tsx +93 -0
  224. package/templates/apps/frontend-cms/template.json +6 -0
  225. package/templates/apps/frontend-cms/tsconfig.json +5 -0
  226. package/templates/apps/frontend-collab/README.md +80 -0
  227. package/templates/apps/frontend-collab/app.config.ts +38 -0
  228. package/templates/apps/frontend-collab/package.json +33 -0
  229. package/templates/apps/frontend-collab/src/locales/de.ts +29 -0
  230. package/templates/apps/frontend-collab/src/locales/en.ts +31 -0
  231. package/templates/apps/frontend-collab/src/locales/index.ts +15 -0
  232. package/templates/apps/frontend-collab/src/pages/layout.tsx +39 -0
  233. package/templates/apps/frontend-collab/src/pages/page.test.tsx +150 -0
  234. package/templates/apps/frontend-collab/src/pages/page.tsx +186 -0
  235. package/templates/apps/frontend-collab/template.json +6 -0
  236. package/templates/apps/frontend-collab/tsconfig.json +11 -0
  237. package/templates/apps/frontend-contact/package.json +7 -7
  238. package/templates/apps/frontend-dashboard/app.config.ts +1 -1
  239. package/templates/apps/frontend-dashboard/package.json +7 -7
  240. package/templates/apps/frontend-dashboard/src/locales/index.ts +1 -1
  241. package/templates/apps/frontend-docs/package.json +7 -7
  242. package/templates/apps/frontend-i18n/package.json +6 -6
  243. package/templates/apps/frontend-landing/package.json +7 -7
  244. package/templates/apps/frontend-portal/README.md +71 -0
  245. package/templates/apps/frontend-portal/app.config.ts +37 -0
  246. package/templates/apps/frontend-portal/package.json +32 -0
  247. package/templates/apps/frontend-portal/src/config.ts +8 -0
  248. package/templates/apps/frontend-portal/src/globals.css +93 -0
  249. package/templates/apps/frontend-portal/src/globals.d.ts +6 -0
  250. package/templates/apps/frontend-portal/src/lib/api.ts +62 -0
  251. package/templates/apps/frontend-portal/src/locales/de.ts +86 -0
  252. package/templates/apps/frontend-portal/src/locales/en.ts +93 -0
  253. package/templates/apps/frontend-portal/src/locales/index.ts +14 -0
  254. package/templates/apps/frontend-portal/src/pages/(portal)/api-keys/page.test.tsx +71 -0
  255. package/templates/apps/frontend-portal/src/pages/(portal)/api-keys/page.tsx +124 -0
  256. package/templates/apps/frontend-portal/src/pages/(portal)/billing/page.test.tsx +86 -0
  257. package/templates/apps/frontend-portal/src/pages/(portal)/billing/page.tsx +97 -0
  258. package/templates/apps/frontend-portal/src/pages/(portal)/error.tsx +19 -0
  259. package/templates/apps/frontend-portal/src/pages/(portal)/invoices/page.tsx +45 -0
  260. package/templates/apps/frontend-portal/src/pages/(portal)/layout.test.tsx +31 -0
  261. package/templates/apps/frontend-portal/src/pages/(portal)/layout.tsx +63 -0
  262. package/templates/apps/frontend-portal/src/pages/(portal)/not-found.tsx +15 -0
  263. package/templates/apps/frontend-portal/src/pages/(portal)/page.tsx +39 -0
  264. package/templates/apps/frontend-portal/src/pages/(portal)/profile/page.tsx +79 -0
  265. package/templates/apps/frontend-portal/src/pages/layout.tsx +12 -0
  266. package/templates/apps/frontend-portal/src/pages/login/page.test.tsx +58 -0
  267. package/templates/apps/frontend-portal/src/pages/login/page.tsx +96 -0
  268. package/templates/apps/frontend-portal/template.json +6 -0
  269. package/templates/apps/frontend-portal/tsconfig.json +5 -0
  270. package/templates/apps/frontend-saas/README.md +73 -0
  271. package/templates/apps/frontend-saas/app.config.ts +46 -0
  272. package/templates/apps/frontend-saas/package.json +32 -0
  273. package/templates/apps/frontend-saas/src/config.ts +8 -0
  274. package/templates/apps/frontend-saas/src/globals.css +85 -0
  275. package/templates/apps/frontend-saas/src/globals.d.ts +6 -0
  276. package/templates/apps/frontend-saas/src/lib/api.ts +47 -0
  277. package/templates/apps/frontend-saas/src/locales/de.ts +72 -0
  278. package/templates/apps/frontend-saas/src/locales/en.ts +81 -0
  279. package/templates/apps/frontend-saas/src/locales/index.ts +14 -0
  280. package/templates/apps/frontend-saas/src/pages/(marketing)/layout.tsx +30 -0
  281. package/templates/apps/frontend-saas/src/pages/(marketing)/login/page.test.tsx +58 -0
  282. package/templates/apps/frontend-saas/src/pages/(marketing)/login/page.tsx +96 -0
  283. package/templates/apps/frontend-saas/src/pages/(marketing)/page.tsx +27 -0
  284. package/templates/apps/frontend-saas/src/pages/dashboard/billing/page.tsx +72 -0
  285. package/templates/apps/frontend-saas/src/pages/dashboard/error.tsx +20 -0
  286. package/templates/apps/frontend-saas/src/pages/dashboard/layout.test.tsx +32 -0
  287. package/templates/apps/frontend-saas/src/pages/dashboard/layout.tsx +69 -0
  288. package/templates/apps/frontend-saas/src/pages/dashboard/not-found.tsx +17 -0
  289. package/templates/apps/frontend-saas/src/pages/dashboard/page.test.tsx +113 -0
  290. package/templates/apps/frontend-saas/src/pages/dashboard/page.tsx +76 -0
  291. package/templates/apps/frontend-saas/src/pages/dashboard/team/page.tsx +73 -0
  292. package/templates/apps/frontend-saas/src/pages/layout.tsx +12 -0
  293. package/templates/apps/frontend-saas/template.json +6 -0
  294. package/templates/apps/frontend-saas/tsconfig.json +5 -0
  295. package/templates/apps/frontend-spa/app.config.ts +1 -1
  296. package/templates/apps/frontend-spa/package.json +7 -7
  297. package/templates/apps/frontend-spa/src/locales/index.ts +1 -1
  298. package/templates/apps/frontend-spa/src/pages/layout.tsx +1 -1
  299. package/templates/apps/frontend-spa/src/pages/page.tsx +1 -1
  300. package/templates/apps/frontend-ssr/app.config.ts +1 -1
  301. package/templates/apps/frontend-ssr/package.json +7 -7
  302. package/templates/apps/frontend-ssr/src/locales/index.ts +1 -1
  303. package/templates/apps/frontend-ssr/src/pages/layout.tsx +1 -1
  304. package/templates/apps/frontend-ssr/src/pages/page.tsx +1 -1
  305. package/templates/apps/frontend-ssr-api/app.config.ts +1 -1
  306. package/templates/apps/frontend-ssr-api/package.json +8 -8
  307. package/templates/apps/frontend-ssr-api/src/locales/index.ts +1 -1
  308. package/templates/apps/frontend-ssr-api/src/pages/layout.tsx +1 -1
  309. package/templates/apps/frontend-static-blog/package.json +6 -6
  310. package/templates/apps/frontend-status/README.md +51 -0
  311. package/templates/apps/frontend-status/app.config.ts +39 -0
  312. package/templates/apps/frontend-status/package.json +32 -0
  313. package/templates/apps/frontend-status/src/config.ts +7 -0
  314. package/templates/apps/frontend-status/src/globals.css +70 -0
  315. package/templates/apps/frontend-status/src/globals.d.ts +6 -0
  316. package/templates/apps/frontend-status/src/lib/status.ts +81 -0
  317. package/templates/apps/frontend-status/src/locales/de.ts +41 -0
  318. package/templates/apps/frontend-status/src/locales/en.ts +45 -0
  319. package/templates/apps/frontend-status/src/locales/index.ts +13 -0
  320. package/templates/apps/frontend-status/src/pages/layout.tsx +27 -0
  321. package/templates/apps/frontend-status/src/pages/page.test.tsx +123 -0
  322. package/templates/apps/frontend-status/src/pages/page.tsx +136 -0
  323. package/templates/apps/frontend-status/template.json +6 -0
  324. package/templates/apps/frontend-status/tsconfig.json +11 -0
  325. package/templates/apps/mobile-app/README.md +58 -0
  326. package/templates/apps/mobile-app/app.config.ts +33 -0
  327. package/templates/apps/mobile-app/babel.config.js +5 -0
  328. package/templates/apps/mobile-app/metro.config.js +20 -0
  329. package/templates/apps/mobile-app/package.json +33 -0
  330. package/templates/apps/mobile-app/src/app/_layout.tsx +61 -0
  331. package/templates/apps/mobile-app/src/app/index.tsx +62 -0
  332. package/templates/apps/mobile-app/src/app/orders/[id].tsx +19 -0
  333. package/templates/apps/mobile-app/src/app/settings.tsx +51 -0
  334. package/templates/apps/mobile-app/src/client.ts +74 -0
  335. package/templates/apps/mobile-app/src/lib/deeplinks.ts +39 -0
  336. package/templates/apps/mobile-app/src/lib/notifications.ts +31 -0
  337. package/templates/apps/mobile-app/src/lib/sync.ts +29 -0
  338. package/templates/apps/mobile-app/src/persistence.ts +38 -0
  339. package/templates/apps/mobile-app/template.json +6 -0
  340. package/templates/apps/mobile-app/tests/deeplinks.test.ts +32 -0
  341. package/templates/apps/mobile-app/tests/notifications.test.ts +26 -0
  342. package/templates/apps/mobile-app/tests/sync.test.ts +34 -0
  343. package/templates/apps/mobile-app/tsconfig.json +10 -0
  344. package/templates/apps/mobile-app/voltro.mobile.ts +11 -0
  345. package/templates/baselines/compose/docker-compose.prod.yml +15 -0
  346. package/templates/baselines/compose-mariadb/docker-compose.prod.yml +15 -0
  347. package/templates/patches/@effect__cluster@0.60.0.patch +6 -6
  348. package/dist/apiBuild-DgBS9ayv.js +0 -2
  349. package/dist/dbCommand-DvguqlzF.js +0 -2
  350. package/dist/fileConventions-3bffWssN.js +0 -30
  351. package/dist/frameworkTableAssembly-lrjZtk0G.js +0 -2
  352. package/dist/inspect-gt8bq-Tz.js +0 -2
  353. package/dist/manifestBuild-ifczArzr.js +0 -2
  354. package/dist/serveCommand-ZTn-dPFa.js +0 -1425
@@ -0,0 +1,63 @@
1
+ // Schema for the {{projectName}} collaborative-editing backend.
2
+ //
3
+ // Tables are auto-discovered: every exported `table(...)` here (or in any
4
+ // `*.entity.ts` / `*.schema.ts` file) is registered by `voltro dev` — no manual
5
+ // barrel. `actors` + `tenants` are the framework's core tables the
6
+ // `audit()` / `tenant()` mixins reference, so they must be declared.
7
+
8
+ import {
9
+ crdtText,
10
+ databaseHandle,
11
+ id,
12
+ localFirst,
13
+ table,
14
+ text,
15
+ timestamp,
16
+ type InferRow,
17
+ } from '@voltro/database'
18
+ import { tenant } from '@voltro/plugin-multitenancy'
19
+
20
+ // ---------- Core tables (required by the audit / tenant mixins) ----------
21
+
22
+ export const actors = table('actors', {
23
+ id: id(),
24
+ kind: text().oneOf(['user', 'serviceAccount', 'apiKey', 'system']),
25
+ displayName: text().nullable(),
26
+ createdAt: timestamp().default('now'),
27
+ })
28
+
29
+ export const tenants = table('tenants', {
30
+ id: id(),
31
+ name: text(),
32
+ createdAt: timestamp().default('now'),
33
+ })
34
+
35
+ // ---------- The collaborative document ----------
36
+
37
+ // `body` is a `crdtText()` column — a CRDT-managed field stored as the encoded
38
+ // CRDT state (an opaque `bytes` blob; BYTEA / BLOB / VARBINARY per dialect).
39
+ // There is no special DDL: to the declarative differ it is an ordinary nullable
40
+ // `bytes` column, so it plans + round-trips like any other.
41
+ //
42
+ // The convergence guarantee is AUTHORITATIVE and SERVER-SIDE: when a client
43
+ // writes an encoded update to `body`, the runtime folds it into the STORED
44
+ // state with `mergeCrdtStates` on the write path (see
45
+ // `mutations/documents.setBody.mutation.server.ts`) — so two concurrent edits
46
+ // both survive, regardless of the order the server processes them.
47
+ //
48
+ // `localFirst()` marks the table local-first (client mirror + bi-directional
49
+ // sync + CRDT convergence for its `crdtText()` fields). It adds no column — it
50
+ // is a property the framework reflects on (`isLocalFirst` / `hasLocalFirst`).
51
+ export const documents = table('documents', {
52
+ id: id({ prefix: 'doc' }),
53
+ title: text(),
54
+ body: crdtText(), // CRDT-managed — Uint8Array | null; decode with decodeCrdtText()
55
+ })
56
+ // tenant() pulls audit() transitively → adds tenantId + createdAt /
57
+ // updatedAt / createdBy / updatedBy (auto-stamped by the runtime), and
58
+ // auto-scopes every read/write to the caller's tenant.
59
+ .with(tenant(), localFirst())
60
+
61
+ export type Document = InferRow<typeof documents>
62
+
63
+ export const database = databaseHandle({ actors, tenants, documents })
@@ -0,0 +1,19 @@
1
+ import { assertOwnTenant } from '@voltro/plugin-multitenancy/guard'
2
+ import type { AppContext } from '@voltro/runtime'
3
+
4
+ const execute = async (
5
+ input: { tenantId: string; title: string },
6
+ ctx: AppContext,
7
+ ) => {
8
+ assertOwnTenant(input.tenantId, ctx.request.subject)
9
+ // Framework auto-injects a `doc_…` id from the table's id() decl. `body` is
10
+ // omitted — a `crdtText()` column is nullable and the first setBody write
11
+ // establishes the document.
12
+ return ctx.store.insert('documents', {
13
+ title: input.title,
14
+ tenantId: input.tenantId,
15
+ createdAt: new Date(),
16
+ })
17
+ }
18
+
19
+ export default execute
@@ -0,0 +1,36 @@
1
+ // Creates a document (title only — the CRDT `body` starts empty and is
2
+ // established by the first `documents.setBody` write). The handler's
3
+ // `assertOwnTenant` guard rejects cross-tenant spoofing: input.tenantId MUST
4
+ // match the resolved subject's tenantId, else a typed `TenantMismatch`.
5
+
6
+ import { defineMutation } from '@voltro/protocol'
7
+ import { TenantMismatch } from '@voltro/plugin-multitenancy/guard'
8
+ import { Schema } from 'effect'
9
+
10
+ export const createDocument = defineMutation({
11
+ name: 'documents.create',
12
+ target: {
13
+ table: 'documents',
14
+ op: 'insert',
15
+ shape: (input: { tenantId: string; title: string }) => ({
16
+ title: input.title,
17
+ body: null,
18
+ tenantId: input.tenantId,
19
+ createdAt: new Date(),
20
+ }),
21
+ },
22
+ input: Schema.Struct({
23
+ tenantId: Schema.String,
24
+ title: Schema.NonEmptyString,
25
+ }),
26
+ output: Schema.Struct({
27
+ id: Schema.String,
28
+ title: Schema.String,
29
+ // The CRDT `body` rides the wire as its encoded bytes (nullable until the
30
+ // first edit establishes it). Decode with `decodeCrdtText()` on the client.
31
+ body: Schema.NullOr(Schema.Uint8ArrayFromBase64),
32
+ tenantId: Schema.String,
33
+ createdAt: Schema.Date,
34
+ }),
35
+ error: TenantMismatch,
36
+ })
@@ -0,0 +1,20 @@
1
+ import type { AppContext } from '@voltro/runtime'
2
+
3
+ // Write the incoming CRDT update to the `body` column. The handler looks like a
4
+ // plain overwrite — but `body` is a `crdtText()` column, so the runtime's
5
+ // MutationStore intercepts the write: it reads the STORED state and folds the
6
+ // incoming update in with `mergeCrdtStates` (from @voltro/local-first) BEFORE
7
+ // persisting. That authoritative server merge is what makes concurrent edits
8
+ // converge; the reactive engine then broadcasts the merged row to every
9
+ // subscriber. This handler stays a one-liner precisely because the convergence
10
+ // lives in the write path, not here.
11
+ const execute = async (
12
+ input: { id: string; update: Uint8Array },
13
+ ctx: AppContext,
14
+ ) => {
15
+ const row = await ctx.store.update('documents', input.id, { body: input.update })
16
+ if (row === null) throw { status: 404, message: `document ${input.id} not found` }
17
+ return row
18
+ }
19
+
20
+ export default execute
@@ -0,0 +1,30 @@
1
+ // The CRDT write. A client produces an encoded update from its local
2
+ // `crdtText()` handle (`handle.encode()`) and sends it here. The server does
3
+ // NOT overwrite `body` with it — the runtime folds the incoming update into the
4
+ // STORED state with `mergeCrdtStates` on the write path (see the `.server.ts`
5
+ // comment), so two clients that edited the same base CONVERGE. `update` is the
6
+ // opaque encoded CRDT state/delta (`bytes`); the same wire shape a Yjs update
7
+ // blob carries.
8
+ //
9
+ // `op: 'update'` targets the existing row by its primary key. There is no
10
+ // tenant field in the input: the `tenant()` mixin auto-scopes the update to the
11
+ // caller's tenant, so a foreign `id` simply matches no row.
12
+
13
+ import { defineMutation } from '@voltro/protocol'
14
+ import { Schema } from 'effect'
15
+
16
+ export const setDocumentBody = defineMutation({
17
+ name: 'documents.setBody',
18
+ target: { table: 'documents', op: 'update' },
19
+ input: Schema.Struct({
20
+ id: Schema.NonEmptyString,
21
+ update: Schema.Uint8ArrayFromBase64,
22
+ }),
23
+ output: Schema.Struct({
24
+ id: Schema.String,
25
+ title: Schema.String,
26
+ // The MERGED body — what every subscriber now converges to.
27
+ body: Schema.NullOr(Schema.Uint8ArrayFromBase64),
28
+ tenantId: Schema.String,
29
+ }),
30
+ })
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@{{projectName}}/{{appName}}",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "voltro dev .",
8
+ "lint": "voltro doctor .",
9
+ "migrate": "voltro migrate",
10
+ "test": "voltro test",
11
+ "typecheck": "tsc --noEmit"
12
+ },
13
+ "dependencies": {
14
+ "@effect/platform": "^0.97.0",
15
+ "@effect/rpc": "^0.76.0",
16
+ "@voltro/cli": "0.30.0",
17
+ "@voltro/database": "0.30.0",
18
+ "@voltro/env": "0.30.0",
19
+ "@voltro/local-first": "0.30.0",
20
+ "@voltro/plugin-multitenancy": "0.30.0",
21
+ "@voltro/protocol": "0.30.0",
22
+ "@voltro/runtime": "0.30.0",
23
+ "effect": "^3.22.0"
24
+ },
25
+ "devDependencies": {
26
+ "@voltro/testing": "0.30.0",
27
+ "typescript": "^6.0.3",
28
+ "vitest": "^4.1.10"
29
+ }
30
+ }
@@ -0,0 +1,16 @@
1
+ import type { AppContext } from '@voltro/runtime'
2
+
3
+ // Oldest-first so `documents[0]` is stable across clients — the collab page
4
+ // binds its editor to that first document, and every tab agrees on which one.
5
+ const execute = (_input: Record<string, never>, _ctx: AppContext) => ({
6
+ descriptor: {
7
+ table: 'documents' as const,
8
+ predicate: undefined,
9
+ order: [{ column: 'createdAt' as const, direction: 'asc' as const }],
10
+ take: 100,
11
+ skip: undefined,
12
+ projection: undefined,
13
+ },
14
+ })
15
+
16
+ export default execute
@@ -0,0 +1,23 @@
1
+ // Streaming subscription: every change to `documents` for the caller's tenant
2
+ // lands as a delta — including the MERGED `body` after any client's CRDT write.
3
+ // The runtime AND-merges tenant scope into the predicate via the `tenant()`
4
+ // mixin on the table, so no manual `eq('tenantId', ...)` is needed.
5
+ //
6
+ // `body` crosses the wire as base64 (`Schema.Uint8ArrayFromBase64` — JSON-safe,
7
+ // unlike raw bytes) and the rpc client decodes it back to a `Uint8Array`; the
8
+ // web client then folds it into its local CRDT handle to converge.
9
+
10
+ import { defineQuery } from '@voltro/protocol'
11
+ import { Schema } from 'effect'
12
+
13
+ export const listDocuments = defineQuery({
14
+ name: 'documents.list',
15
+ input: Schema.Struct({}),
16
+ output: Schema.Struct({
17
+ id: Schema.String,
18
+ title: Schema.String,
19
+ body: Schema.NullOr(Schema.Uint8ArrayFromBase64),
20
+ tenantId: Schema.String,
21
+ createdAt: Schema.Date,
22
+ }),
23
+ })
@@ -0,0 +1,6 @@
1
+ {
2
+ "id": "api-collab",
3
+ "kind": "api",
4
+ "summary": "Real-time collaborative editing — a `documents` table whose `body` is a `crdtText()` column. Concurrent edits from many clients CONVERGE via the runtime's authoritative server-side CRDT merge on the write path (no last-write-wins loser), then broadcast over the reactive engine. Zero infra (`store: 'memory'`). Pairs with frontend-collab: scaffold both with `create-project --api=api-collab --web=frontend-collab`.",
5
+ "tags": ["api", "backend", "local-first", "crdt", "collaborative", "realtime", "reactive", "subscription", "mutation", "frontend-collab"]
6
+ }
@@ -0,0 +1,89 @@
1
+ // The property that matters for a `crdtText()` column is CONVERGENCE: two
2
+ // clients that edit the same document body concurrently must end at the same
3
+ // text, no matter which write the server processes first, with BOTH edits
4
+ // surviving (no last-write-wins loser).
5
+ //
6
+ // This runs the real thing with no database and no server: `ctx.store` from
7
+ // `makeTestContext` is the SAME `wrapStoreWithMixinBehaviour` store the handler
8
+ // gets in production, so the authoritative server-side CRDT merge on the write
9
+ // path executes exactly as at runtime — the mutation just writes the incoming
10
+ // update bytes, and `ctx.store.update` folds them into the stored state.
11
+ // Importing `../database/schema` registers `documents` / `actors` / `tenants`
12
+ // so the store knows `body` is a CRDT-managed column. Run with `voltro test`.
13
+
14
+ import { describe, it, expect } from 'vitest'
15
+ import { makeTestContext, mockStore } from '@voltro/testing'
16
+ import { crdtText, decodeCrdtText } from '@voltro/local-first'
17
+ import '../database/schema' // registers documents / actors / tenants
18
+ import createDocument from '../mutations/documents.create.mutation.server'
19
+ import setBody from '../mutations/documents.setBody.mutation.server'
20
+
21
+ const bodyText = (row: { body?: unknown }): string =>
22
+ decodeCrdtText(row.body as Uint8Array)
23
+
24
+ const freshCtx = () =>
25
+ makeTestContext({
26
+ subject: { type: 'user', id: 'u1', tenantId: 'acme' },
27
+ store: mockStore({ documents: [] }),
28
+ })
29
+
30
+ describe('documents.setBody — authoritative server-side CRDT merge', () => {
31
+ it('folds two concurrent edits together so BOTH survive', async () => {
32
+ const ctx = freshCtx()
33
+ const doc = await createDocument({ tenantId: 'acme', title: 'Design doc' }, ctx)
34
+
35
+ await setBody({ id: String(doc['id']), update: crdtText().insert(0, 'Hello ').encode() }, ctx)
36
+ const merged = await setBody({ id: String(doc['id']), update: crdtText().insert(0, 'World').encode() }, ctx)
37
+
38
+ const text = bodyText(merged)
39
+ expect(text).toContain('Hello')
40
+ expect(text).toContain('World')
41
+ })
42
+
43
+ it('converges to the SAME text whichever order the server processes the writes', async () => {
44
+ // Capture the two updates ONCE and replay the SAME bytes in both orders —
45
+ // reusing the encoded state (not re-generating it) is what makes the CRDT
46
+ // tie-break deterministic, so this asserts order-independence, not chance.
47
+ const clientA = crdtText().insert(0, 'Hello ').encode()
48
+ const clientB = crdtText().insert(0, 'World').encode()
49
+
50
+ const forward = freshCtx()
51
+ const d1 = await createDocument({ tenantId: 'acme', title: 'Doc' }, forward)
52
+ await setBody({ id: String(d1['id']), update: clientA }, forward)
53
+ const fwd = await setBody({ id: String(d1['id']), update: clientB }, forward)
54
+
55
+ const reverse = freshCtx()
56
+ const d2 = await createDocument({ tenantId: 'acme', title: 'Doc' }, reverse)
57
+ await setBody({ id: String(d2['id']), update: clientB }, reverse)
58
+ const rev = await setBody({ id: String(d2['id']), update: clientA }, reverse)
59
+
60
+ expect(bodyText(fwd)).toBe(bodyText(rev)) // order-independent convergence
61
+ })
62
+
63
+ it('is idempotent — re-applying an update already folded in changes nothing', async () => {
64
+ const ctx = freshCtx()
65
+ const doc = await createDocument({ tenantId: 'acme', title: 'Doc' }, ctx)
66
+
67
+ const update = crdtText().insert(0, 'once').encode()
68
+ const first = await setBody({ id: String(doc['id']), update }, ctx)
69
+ const again = await setBody({ id: String(doc['id']), update }, ctx)
70
+
71
+ expect(bodyText(again)).toBe(bodyText(first))
72
+ expect(bodyText(again)).toBe('once')
73
+ })
74
+
75
+ it('a first write establishes the document (no stored state yet)', async () => {
76
+ const ctx = freshCtx()
77
+ const doc = await createDocument({ tenantId: 'acme', title: 'Doc' }, ctx)
78
+
79
+ const merged = await setBody({ id: String(doc['id']), update: crdtText().insert(0, 'seed').encode() }, ctx)
80
+ expect(bodyText(merged)).toBe('seed')
81
+ })
82
+
83
+ it('404s a write to a document the caller cannot see (tenant auto-scoped)', async () => {
84
+ const ctx = freshCtx()
85
+ await expect(
86
+ setBody({ id: 'doc_does_not_exist', update: crdtText().insert(0, 'x').encode() }, ctx),
87
+ ).rejects.toMatchObject({ status: 404 })
88
+ })
89
+ })
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": "../../../tsconfig.base.json",
3
+ "include": ["**/*.ts", "**/*.tsx"],
4
+ "exclude": ["node_modules", "dist"]
5
+ }
@@ -12,17 +12,17 @@
12
12
  "dependencies": {
13
13
  "@effect/platform": "^0.97.0",
14
14
  "@effect/rpc": "^0.76.0",
15
- "@voltro/cli": "0.28.0",
16
- "@voltro/database": "0.28.0",
17
- "@voltro/env": "0.28.0",
18
- "@voltro/plugin-governance": "0.28.0",
19
- "@voltro/plugin-multitenancy": "0.28.0",
20
- "@voltro/protocol": "0.28.0",
21
- "@voltro/runtime": "0.28.0",
15
+ "@voltro/cli": "0.30.0",
16
+ "@voltro/database": "0.30.0",
17
+ "@voltro/env": "0.30.0",
18
+ "@voltro/plugin-governance": "0.30.0",
19
+ "@voltro/plugin-multitenancy": "0.30.0",
20
+ "@voltro/protocol": "0.30.0",
21
+ "@voltro/runtime": "0.30.0",
22
22
  "effect": "^3.22.0"
23
23
  },
24
24
  "devDependencies": {
25
- "@voltro/testing": "0.28.0",
25
+ "@voltro/testing": "0.30.0",
26
26
  "typescript": "^6.0.3",
27
27
  "vitest": "^4.1.10"
28
28
  }
@@ -12,17 +12,17 @@
12
12
  "dependencies": {
13
13
  "@effect/platform": "^0.97.0",
14
14
  "@effect/rpc": "^0.76.0",
15
- "@voltro/cli": "0.28.0",
16
- "@voltro/database": "0.28.0",
17
- "@voltro/env": "0.28.0",
18
- "@voltro/plugin-multitenancy": "0.28.0",
19
- "@voltro/protocol": "0.28.0",
20
- "@voltro/runtime": "0.28.0",
21
- "@voltro/workflow": "0.28.0",
15
+ "@voltro/cli": "0.30.0",
16
+ "@voltro/database": "0.30.0",
17
+ "@voltro/env": "0.30.0",
18
+ "@voltro/plugin-multitenancy": "0.30.0",
19
+ "@voltro/protocol": "0.30.0",
20
+ "@voltro/runtime": "0.30.0",
21
+ "@voltro/workflow": "0.30.0",
22
22
  "effect": "^3.22.0"
23
23
  },
24
24
  "devDependencies": {
25
- "@voltro/testing": "0.28.0",
25
+ "@voltro/testing": "0.30.0",
26
26
  "typescript": "^6.0.3",
27
27
  "vitest": "^4.1.10"
28
28
  }
@@ -13,18 +13,18 @@
13
13
  "dependencies": {
14
14
  "@effect/platform": "^0.97.0",
15
15
  "@effect/rpc": "^0.76.0",
16
- "@voltro/cli": "0.28.0",
17
- "@voltro/database": "0.28.0",
18
- "@voltro/env": "0.28.0",
19
- "@voltro/plugin-flags": "0.28.0",
20
- "@voltro/plugin-multitenancy": "0.28.0",
21
- "@voltro/protocol": "0.28.0",
22
- "@voltro/runtime": "0.28.0",
23
- "@voltro/sql-postgres": "0.28.0",
16
+ "@voltro/cli": "0.30.0",
17
+ "@voltro/database": "0.30.0",
18
+ "@voltro/env": "0.30.0",
19
+ "@voltro/plugin-flags": "0.30.0",
20
+ "@voltro/plugin-multitenancy": "0.30.0",
21
+ "@voltro/protocol": "0.30.0",
22
+ "@voltro/runtime": "0.30.0",
23
+ "@voltro/sql-postgres": "0.30.0",
24
24
  "effect": "^3.22.0"
25
25
  },
26
26
  "devDependencies": {
27
- "@voltro/testing": "0.28.0",
27
+ "@voltro/testing": "0.30.0",
28
28
  "typescript": "^6.0.3",
29
29
  "vitest": "^4.1.10"
30
30
  }
@@ -13,17 +13,17 @@
13
13
  "dependencies": {
14
14
  "@effect/platform": "^0.97.0",
15
15
  "@effect/rpc": "^0.76.0",
16
- "@voltro/cli": "0.28.0",
17
- "@voltro/database": "0.28.0",
18
- "@voltro/env": "0.28.0",
19
- "@voltro/plugin-audit": "0.28.0",
20
- "@voltro/plugin-governance": "0.28.0",
21
- "@voltro/protocol": "0.28.0",
22
- "@voltro/runtime": "0.28.0",
16
+ "@voltro/cli": "0.30.0",
17
+ "@voltro/database": "0.30.0",
18
+ "@voltro/env": "0.30.0",
19
+ "@voltro/plugin-audit": "0.30.0",
20
+ "@voltro/plugin-governance": "0.30.0",
21
+ "@voltro/protocol": "0.30.0",
22
+ "@voltro/runtime": "0.30.0",
23
23
  "effect": "^3.22.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@voltro/testing": "0.28.0",
26
+ "@voltro/testing": "0.30.0",
27
27
  "typescript": "^6.0.3",
28
28
  "vitest": "^4.1.10"
29
29
  }
@@ -12,17 +12,17 @@
12
12
  "dependencies": {
13
13
  "@effect/platform": "^0.97.0",
14
14
  "@effect/rpc": "^0.76.0",
15
- "@voltro/cli": "0.28.0",
16
- "@voltro/database": "0.28.0",
17
- "@voltro/env": "0.28.0",
18
- "@voltro/kv": "0.28.0",
19
- "@voltro/plugin-multitenancy": "0.28.0",
20
- "@voltro/protocol": "0.28.0",
21
- "@voltro/runtime": "0.28.0",
15
+ "@voltro/cli": "0.30.0",
16
+ "@voltro/database": "0.30.0",
17
+ "@voltro/env": "0.30.0",
18
+ "@voltro/kv": "0.30.0",
19
+ "@voltro/plugin-multitenancy": "0.30.0",
20
+ "@voltro/protocol": "0.30.0",
21
+ "@voltro/runtime": "0.30.0",
22
22
  "effect": "^3.22.0"
23
23
  },
24
24
  "devDependencies": {
25
- "@voltro/testing": "0.28.0",
25
+ "@voltro/testing": "0.30.0",
26
26
  "typescript": "^6.0.3",
27
27
  "vitest": "^4.1.10"
28
28
  }
@@ -13,17 +13,17 @@
13
13
  "dependencies": {
14
14
  "@effect/platform": "^0.97.0",
15
15
  "@effect/rpc": "^0.76.0",
16
- "@voltro/cli": "0.28.0",
17
- "@voltro/database": "0.28.0",
18
- "@voltro/env": "0.28.0",
19
- "@voltro/plugin-moderation": "0.28.0",
20
- "@voltro/plugin-multitenancy": "0.28.0",
21
- "@voltro/protocol": "0.28.0",
22
- "@voltro/runtime": "0.28.0",
16
+ "@voltro/cli": "0.30.0",
17
+ "@voltro/database": "0.30.0",
18
+ "@voltro/env": "0.30.0",
19
+ "@voltro/plugin-moderation": "0.30.0",
20
+ "@voltro/plugin-multitenancy": "0.30.0",
21
+ "@voltro/protocol": "0.30.0",
22
+ "@voltro/runtime": "0.30.0",
23
23
  "effect": "^3.22.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@voltro/testing": "0.28.0",
26
+ "@voltro/testing": "0.30.0",
27
27
  "typescript": "^6.0.3",
28
28
  "vitest": "^4.1.10"
29
29
  }
@@ -13,17 +13,17 @@
13
13
  "dependencies": {
14
14
  "@effect/platform": "^0.97.0",
15
15
  "@effect/rpc": "^0.76.0",
16
- "@voltro/cli": "0.28.0",
17
- "@voltro/database": "0.28.0",
18
- "@voltro/plugin-multitenancy": "0.28.0",
19
- "@voltro/plugin-prometheus": "0.28.0",
20
- "@voltro/plugin-sentry": "0.28.0",
21
- "@voltro/protocol": "0.28.0",
22
- "@voltro/runtime": "0.28.0",
16
+ "@voltro/cli": "0.30.0",
17
+ "@voltro/database": "0.30.0",
18
+ "@voltro/plugin-multitenancy": "0.30.0",
19
+ "@voltro/plugin-prometheus": "0.30.0",
20
+ "@voltro/plugin-sentry": "0.30.0",
21
+ "@voltro/protocol": "0.30.0",
22
+ "@voltro/runtime": "0.30.0",
23
23
  "effect": "^3.22.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@voltro/testing": "0.28.0",
26
+ "@voltro/testing": "0.30.0",
27
27
  "typescript": "^6.0.3",
28
28
  "vitest": "^4.1.10"
29
29
  }
@@ -13,17 +13,17 @@
13
13
  "dependencies": {
14
14
  "@effect/platform": "^0.97.0",
15
15
  "@effect/rpc": "^0.76.0",
16
- "@voltro/cli": "0.28.0",
17
- "@voltro/database": "0.28.0",
18
- "@voltro/env": "0.28.0",
19
- "@voltro/plugin-multitenancy": "0.28.0",
20
- "@voltro/plugin-ratelimit": "0.28.0",
21
- "@voltro/protocol": "0.28.0",
22
- "@voltro/runtime": "0.28.0",
16
+ "@voltro/cli": "0.30.0",
17
+ "@voltro/database": "0.30.0",
18
+ "@voltro/env": "0.30.0",
19
+ "@voltro/plugin-multitenancy": "0.30.0",
20
+ "@voltro/plugin-ratelimit": "0.30.0",
21
+ "@voltro/protocol": "0.30.0",
22
+ "@voltro/runtime": "0.30.0",
23
23
  "effect": "^3.22.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@voltro/testing": "0.28.0",
26
+ "@voltro/testing": "0.30.0",
27
27
  "typescript": "^6.0.3",
28
28
  "vitest": "^4.1.10"
29
29
  }
@@ -13,17 +13,17 @@
13
13
  "dependencies": {
14
14
  "@effect/platform": "^0.97.0",
15
15
  "@effect/rpc": "^0.76.0",
16
- "@voltro/cli": "0.28.0",
17
- "@voltro/database": "0.28.0",
18
- "@voltro/env": "0.28.0",
19
- "@voltro/plugin-multitenancy": "0.28.0",
20
- "@voltro/plugin-rbac": "0.28.0",
21
- "@voltro/protocol": "0.28.0",
22
- "@voltro/runtime": "0.28.0",
16
+ "@voltro/cli": "0.30.0",
17
+ "@voltro/database": "0.30.0",
18
+ "@voltro/env": "0.30.0",
19
+ "@voltro/plugin-multitenancy": "0.30.0",
20
+ "@voltro/plugin-rbac": "0.30.0",
21
+ "@voltro/protocol": "0.30.0",
22
+ "@voltro/runtime": "0.30.0",
23
23
  "effect": "^3.22.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@voltro/testing": "0.28.0",
26
+ "@voltro/testing": "0.30.0",
27
27
  "typescript": "^6.0.3",
28
28
  "vitest": "^4.1.10"
29
29
  }
@@ -13,16 +13,16 @@
13
13
  "dependencies": {
14
14
  "@effect/platform": "^0.97.0",
15
15
  "@effect/rpc": "^0.76.0",
16
- "@voltro/cli": "0.28.0",
17
- "@voltro/database": "0.28.0",
18
- "@voltro/plugin-openapi": "0.28.0",
19
- "@voltro/protocol": "0.28.0",
20
- "@voltro/runtime": "0.28.0",
21
- "@voltro/sql-postgres": "0.28.0",
16
+ "@voltro/cli": "0.30.0",
17
+ "@voltro/database": "0.30.0",
18
+ "@voltro/plugin-openapi": "0.30.0",
19
+ "@voltro/protocol": "0.30.0",
20
+ "@voltro/runtime": "0.30.0",
21
+ "@voltro/sql-postgres": "0.30.0",
22
22
  "effect": "^3.22.0"
23
23
  },
24
24
  "devDependencies": {
25
- "@voltro/testing": "0.28.0",
25
+ "@voltro/testing": "0.30.0",
26
26
  "typescript": "^6.0.3",
27
27
  "vitest": "^4.1.10"
28
28
  }