@voltro/cli 0.53.0 → 0.54.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 (181) hide show
  1. package/CHANGELOG.md +195 -0
  2. package/dist/{agentsMd-0l980yhL.js → agentsMd-BaLC10Na.js} +110 -82
  3. package/dist/agentsMd-DCY1RSs8.js +2 -0
  4. package/dist/apiBuild-CeUN55uk.js +2 -0
  5. package/dist/{apiBuild-CaPfoWku.js → apiBuild-DTWp0S_q.js} +2 -2
  6. package/dist/bin.js +1 -1
  7. package/dist/{build-D-OnvNMf.js → build-D4ygSbnV.js} +114 -114
  8. package/dist/{checkCommand-C5elt0tW.js → checkCommand-Dg1G7Gwd.js} +6 -6
  9. package/dist/{checkCommand-D2ZduVlh.js → checkCommand-L7DTlpIF.js} +1 -1
  10. package/dist/{cloudCmd-QUXh-b5w.js → cloudCmd-DzKcSYuy.js} +1 -1
  11. package/dist/{codegen-FEk8AZHb.js → codegen-DSLM8Su9.js} +2 -2
  12. package/dist/codegen-DjgxEOnD.js +2 -0
  13. package/dist/codegenCommand-CG_Vx4lc.js +41 -0
  14. package/dist/{codemodRunner-BjtB2lq6.js → codemodRunner-Cd4xkC6u.js} +9 -9
  15. package/dist/{commands-DyxAmhP0.js → commands-6Kzi92Np.js} +96 -73
  16. package/dist/{dashboardCommand-BdKTyT13.js → dashboardCommand-Cq1PWvI1.js} +3 -3
  17. package/dist/{dataCommand-Bab9X7s8.js → dataCommand-DYzW8vkv.js} +3 -3
  18. package/dist/{dbCommand-06O2finM.js → dbCommand-B4NWZtGL.js} +3 -3
  19. package/dist/dbCommand-CSFWs9ev.js +2 -0
  20. package/dist/{dev-C6LGF4iY.js → dev-CmuvUKRq.js} +2236 -2219
  21. package/dist/{dev-GjJWAYo2.js → dev-cKUiZZsB.js} +1 -1
  22. package/dist/{doctorCommand-etMkflRc.js → doctorCommand-DCiFVMtZ.js} +21 -21
  23. package/dist/doctorCommand-J3qu4E0Y.js +2 -0
  24. package/dist/{dormancyCommand-UwZ1AZzB.js → dormancyCommand-w1TrmgYP.js} +1 -1
  25. package/dist/{embeddingsCommand-C70zWHwo.js → embeddingsCommand-CMgPyRTr.js} +1 -1
  26. package/dist/{envCommand-dSyKvRkM.js → envCommand-Cyynmcfa.js} +15 -15
  27. package/dist/{evolveCommand-CG0_ebO5.js → evolveCommand-BwvQ8dVH.js} +2 -2
  28. package/dist/fileConventions-l-RIXbx8.js +36 -0
  29. package/dist/{fileTaxonomy-B7uxipWS.js → fileTaxonomy-CbyMQYx_.js} +37 -37
  30. package/dist/{frameworkTableAssembly-DKx3ba3S.js → frameworkTableAssembly-D7LJuALW.js} +5 -5
  31. package/dist/frameworkTableAssembly-IPD1pUnZ.js +2 -0
  32. package/dist/index.js +2 -2
  33. package/dist/{infoCommand-_53iOc_j.js → infoCommand-DlYlUPqs.js} +1 -1
  34. package/dist/{metaCommands-Cn2oboG4.js → metaCommands-x7RCi2AF.js} +2 -2
  35. package/dist/{migrate-Cko9rswM.js → migrate-BK_Bbx-_.js} +2 -2
  36. package/dist/mobileCommand-D9O6iq3D.js +428 -0
  37. package/dist/mobileCommand-DAum7tsG.js +2 -0
  38. package/dist/{pageConvention-C938S8oC.js → pageConvention-CMpfDN6r.js} +1 -1
  39. package/dist/{privacyCommand-DWTQMC6R.js → privacyCommand-BCa2OoZG.js} +2 -2
  40. package/dist/{probeCommand-DkGGLknv.js → probeCommand-_C0YU207.js} +1 -1
  41. package/dist/{projectScaffold-EzlErR4E.js → projectScaffold-CJfP-xbT.js} +1 -1
  42. package/dist/{projectScaffold-B4dmTlwT.js → projectScaffold-CSN0OzBV.js} +2 -2
  43. package/dist/renderModeScan-43yQ2opo.js +147 -0
  44. package/dist/{renderProfile-CskIgAfn.js → renderProfile-DvrhVJHa.js} +2 -2
  45. package/dist/{runtimeTrace-c0APJz7E.js → runtimeTrace-CGWx1Q6l.js} +1 -1
  46. package/dist/{sdkgen-BiQCgIEr.js → sdkgen-CDGHQUFj.js} +1 -1
  47. package/dist/serveCommand-BiPe8BJm.js +2 -0
  48. package/dist/{serveCommand-CueKQgzl.js → serveCommand-Bje09q1v.js} +708 -708
  49. package/dist/serveEntry.js +1 -1
  50. package/dist/start-B0bnJgxI.js +3 -0
  51. package/dist/{start-ekPan8BT.js → start-Clz-1BHB.js} +511 -504
  52. package/dist/startEntry.js +1 -1
  53. package/dist/{staticCommand-xlSL-IWk.js → staticCommand-ey0kYmOT.js} +1 -1
  54. package/dist/{subcommandNames-DpYs3DXr.js → subcommandNames-CDzfEtKV.js} +3 -3
  55. package/dist/{templates-BR-fb4SP.js → templates-BTWZkJJT.js} +41 -9
  56. package/dist/{test-BWPQcRoB.js → test-D_kW4KMj.js} +1 -1
  57. package/dist/updateCommand-CIoVDKnj.js +2 -0
  58. package/dist/{updateCommand-C_8I8Rzo.js → updateCommand-CRJlAOaM.js} +1 -1
  59. package/dist/{webDev-oczpugbx.js → webDev-DSI9SOhs.js} +1127 -1090
  60. package/dist/{webDev-C7jWJ5dX.js → webDev-DlvZO30c.js} +1 -1
  61. package/dist/{webhooksCommand-4SVPDjKg.js → webhooksCommand-BvzXNHji.js} +1 -1
  62. package/dist/workspaceDeps-RKEkX92S.js +45 -0
  63. package/package.json +19 -19
  64. package/templates/AGENTS.core.md +2 -0
  65. package/templates/AGENTS.md +4 -2
  66. package/templates/agent-docs/_index.md +2 -2
  67. package/templates/agent-docs/_manifest.json +1 -1
  68. package/templates/agent-docs/ai.md +4 -4
  69. package/templates/agent-docs/authentication.md +72 -0
  70. package/templates/agent-docs/cli.md +4 -1
  71. package/templates/agent-docs/data.md +61 -12
  72. package/templates/agent-docs/database/advancedqueries.md +1 -1
  73. package/templates/agent-docs/database/migrations.md +1 -1
  74. package/templates/agent-docs/database/seedsdialects.md +64 -2
  75. package/templates/agent-docs/internationalization.md +2 -0
  76. package/templates/agent-docs/introduction.md +25 -0
  77. package/templates/agent-docs/local-first-mobile.md +139 -41
  78. package/templates/agent-docs/observability.md +4 -2
  79. package/templates/agent-docs/plugins/atlassian.md +2 -2
  80. package/templates/agent-docs/plugins/audit.md +2 -2
  81. package/templates/agent-docs/plugins/billing.md +1 -1
  82. package/templates/agent-docs/plugins/cdc-out.md +8 -3
  83. package/templates/agent-docs/plugins/comments.md +22 -0
  84. package/templates/agent-docs/plugins/presence.md +32 -3
  85. package/templates/agent-docs/plugins/prometheus.md +2 -0
  86. package/templates/agent-docs/plugins/queue.md +47 -4
  87. package/templates/agent-docs/plugins.md +6 -6
  88. package/templates/agent-docs/reference.md +20 -1
  89. package/templates/agent-docs/routing.md +63 -9
  90. package/templates/agent-docs/scheduling.md +1 -1
  91. package/templates/agent-docs/schema-driven-ui.md +12 -1
  92. package/templates/agent-docs/templates/appshells.md +36 -4
  93. package/templates/agent-docs/whats-new.md +109 -135
  94. package/templates/apps/api-ai/package.json +6 -6
  95. package/templates/apps/api-auth/package.json +8 -8
  96. package/templates/apps/api-backend/package.json +7 -7
  97. package/templates/apps/api-backend-deactivation/package.json +7 -7
  98. package/templates/apps/api-backend-mail/package.json +8 -8
  99. package/templates/apps/api-backend-mariadb/package.json +9 -9
  100. package/templates/apps/api-backend-sqlite/package.json +8 -8
  101. package/templates/apps/api-backend-storage/package.json +8 -8
  102. package/templates/apps/api-cms/package.json +9 -9
  103. package/templates/apps/api-collab/README.md +3 -3
  104. package/templates/apps/api-collab/app.config.ts +1 -1
  105. package/templates/apps/api-collab/database/schema.ts +12 -8
  106. package/templates/apps/api-collab/mutations/documents.create.mutation.server.ts +1 -1
  107. package/templates/apps/api-collab/mutations/documents.setBody.mutation.server.ts +1 -1
  108. package/templates/apps/api-collab/mutations/documents.setBody.mutation.ts +1 -1
  109. package/templates/apps/api-collab/package.json +8 -8
  110. package/templates/apps/api-collab/template.json +1 -1
  111. package/templates/apps/api-collab/tests/documents.setBody.test.ts +10 -2
  112. package/templates/apps/api-data-advanced/package.json +8 -8
  113. package/templates/apps/api-durable/package.json +8 -8
  114. package/templates/apps/api-feature-flags/package.json +9 -9
  115. package/templates/apps/api-governance/package.json +8 -8
  116. package/templates/apps/api-kv/package.json +8 -8
  117. package/templates/apps/api-moderation/package.json +8 -8
  118. package/templates/apps/api-observability/package.json +8 -8
  119. package/templates/apps/api-ratelimit/package.json +8 -8
  120. package/templates/apps/api-rbac/package.json +8 -8
  121. package/templates/apps/api-rest/package.json +7 -7
  122. package/templates/apps/api-row-history/package.json +8 -8
  123. package/templates/apps/api-saas/package.json +11 -10
  124. package/templates/apps/api-saas-starter/package.json +10 -10
  125. package/templates/apps/api-search/package.json +8 -8
  126. package/templates/apps/api-status/package.json +8 -8
  127. package/templates/apps/api-webhooks/package.json +9 -9
  128. package/templates/apps/changelog/package.json +7 -6
  129. package/templates/apps/edge-functions/package.json +2 -2
  130. package/templates/apps/frontend-admin/package.json +8 -8
  131. package/templates/apps/frontend-app/package.json +9 -9
  132. package/templates/apps/frontend-auth/package.json +8 -8
  133. package/templates/apps/frontend-blank/package.json +7 -7
  134. package/templates/apps/frontend-cms/package.json +9 -9
  135. package/templates/apps/frontend-collab/README.md +43 -24
  136. package/templates/apps/frontend-collab/app.config.ts +3 -3
  137. package/templates/apps/frontend-collab/package.json +14 -10
  138. package/templates/apps/frontend-collab/src/locales/de.ts +1 -2
  139. package/templates/apps/frontend-collab/src/locales/en.ts +1 -2
  140. package/templates/apps/frontend-collab/src/pages/page.test.tsx +72 -76
  141. package/templates/apps/frontend-collab/src/pages/page.tsx +45 -22
  142. package/templates/apps/frontend-collab/template.json +2 -2
  143. package/templates/apps/frontend-contact/package.json +7 -7
  144. package/templates/apps/frontend-dashboard/package.json +7 -7
  145. package/templates/apps/frontend-docs/package.json +8 -7
  146. package/templates/apps/frontend-i18n/package.json +6 -6
  147. package/templates/apps/frontend-landing/README.md +48 -0
  148. package/templates/apps/frontend-landing/app.config.ts +28 -0
  149. package/templates/apps/frontend-landing/package.json +7 -6
  150. package/templates/apps/frontend-landing/src/assets/hero.jpg +0 -0
  151. package/templates/apps/frontend-landing/src/fonts/Geist-Variable.woff2 +0 -0
  152. package/templates/apps/frontend-landing/src/fonts/LICENSE-Geist.txt +92 -0
  153. package/templates/apps/frontend-landing/src/globals.css +15 -0
  154. package/templates/apps/frontend-landing/src/globals.d.ts +17 -0
  155. package/templates/apps/frontend-landing/src/locales/de.ts +3 -2
  156. package/templates/apps/frontend-landing/src/locales/en.ts +5 -2
  157. package/templates/apps/frontend-landing/src/pages/page.test.tsx +79 -0
  158. package/templates/apps/frontend-landing/src/pages/page.tsx +26 -3
  159. package/templates/apps/frontend-landing/template.json +2 -2
  160. package/templates/apps/frontend-portal/package.json +8 -8
  161. package/templates/apps/frontend-saas/package.json +8 -8
  162. package/templates/apps/frontend-spa/package.json +7 -7
  163. package/templates/apps/frontend-ssr/package.json +7 -7
  164. package/templates/apps/frontend-ssr-api/package.json +8 -8
  165. package/templates/apps/frontend-static-blog/package.json +8 -7
  166. package/templates/apps/frontend-status/package.json +8 -8
  167. package/templates/apps/mobile-app/package.json +12 -11
  168. package/templates/apps/mobile-app/src/lib/deeplinks.ts +29 -17
  169. package/templates/apps/mobile-app/tests/deeplinks.test.ts +16 -0
  170. package/dist/agentsMd-SDDSkyl4.js +0 -2
  171. package/dist/apiBuild-DHtLXYx9.js +0 -2
  172. package/dist/codegen-BWpt3VgF.js +0 -2
  173. package/dist/codegenCommand-BOiWQ5hz.js +0 -137
  174. package/dist/dbCommand-B1EXBC6f.js +0 -2
  175. package/dist/doctorCommand-B0hX0tdz.js +0 -2
  176. package/dist/fileConventions-DASGEmj-.js +0 -35
  177. package/dist/frameworkTableAssembly-C_7Z-rMs.js +0 -2
  178. package/dist/renderModeScan-CUbOeOAg.js +0 -122
  179. package/dist/serveCommand-DsnrVN3U.js +0 -2
  180. package/dist/start-BJzZLbt8.js +0 -3
  181. package/dist/updateCommand-Bqql_rsQ.js +0 -2
@@ -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.53.0",
17
- "@voltro/database": "0.53.0",
18
- "@voltro/env": "0.53.0",
19
- "@voltro/plugin-multitenancy": "0.53.0",
20
- "@voltro/plugin-rbac": "0.53.0",
21
- "@voltro/protocol": "0.53.0",
22
- "@voltro/runtime": "0.53.0",
16
+ "@voltro/cli": "0.54.0",
17
+ "@voltro/database": "0.54.0",
18
+ "@voltro/env": "0.54.0",
19
+ "@voltro/plugin-multitenancy": "0.54.0",
20
+ "@voltro/plugin-rbac": "0.54.0",
21
+ "@voltro/protocol": "0.54.0",
22
+ "@voltro/runtime": "0.54.0",
23
23
  "effect": "^3.22.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@voltro/testing": "0.53.0",
26
+ "@voltro/testing": "0.54.0",
27
27
  "typescript": "^6.0.3",
28
28
  "@vitest/coverage-v8": "^4.1.10",
29
29
  "vitest": "^4.1.10"
@@ -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.53.0",
17
- "@voltro/database": "0.53.0",
18
- "@voltro/plugin-openapi": "0.53.0",
19
- "@voltro/protocol": "0.53.0",
20
- "@voltro/runtime": "0.53.0",
21
- "@voltro/sql-postgres": "0.53.0",
16
+ "@voltro/cli": "0.54.0",
17
+ "@voltro/database": "0.54.0",
18
+ "@voltro/plugin-openapi": "0.54.0",
19
+ "@voltro/protocol": "0.54.0",
20
+ "@voltro/runtime": "0.54.0",
21
+ "@voltro/sql-postgres": "0.54.0",
22
22
  "effect": "^3.22.0"
23
23
  },
24
24
  "devDependencies": {
25
- "@voltro/testing": "0.53.0",
25
+ "@voltro/testing": "0.54.0",
26
26
  "typescript": "^6.0.3",
27
27
  "@vitest/coverage-v8": "^4.1.10",
28
28
  "vitest": "^4.1.10"
@@ -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.53.0",
17
- "@voltro/database": "0.53.0",
18
- "@voltro/env": "0.53.0",
19
- "@voltro/plugin-multitenancy": "0.53.0",
20
- "@voltro/plugin-row-history": "0.53.0",
21
- "@voltro/protocol": "0.53.0",
22
- "@voltro/runtime": "0.53.0",
16
+ "@voltro/cli": "0.54.0",
17
+ "@voltro/database": "0.54.0",
18
+ "@voltro/env": "0.54.0",
19
+ "@voltro/plugin-multitenancy": "0.54.0",
20
+ "@voltro/plugin-row-history": "0.54.0",
21
+ "@voltro/protocol": "0.54.0",
22
+ "@voltro/runtime": "0.54.0",
23
23
  "effect": "^3.22.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@voltro/testing": "0.53.0",
26
+ "@voltro/testing": "0.54.0",
27
27
  "typescript": "^6.0.3",
28
28
  "@vitest/coverage-v8": "^4.1.10",
29
29
  "vitest": "^4.1.10"
@@ -13,19 +13,20 @@
13
13
  "dependencies": {
14
14
  "@effect/platform": "^0.97.0",
15
15
  "@effect/rpc": "^0.76.0",
16
- "@voltro/cli": "0.53.0",
17
- "@voltro/database": "0.53.0",
18
- "@voltro/plugin-billing": "0.53.0",
19
- "@voltro/plugin-multitenancy": "0.53.0",
20
- "@voltro/plugin-notifications": "0.53.0",
21
- "@voltro/plugin-presence": "0.53.0",
22
- "@voltro/protocol": "0.53.0",
23
- "@voltro/runtime": "0.53.0",
24
- "@voltro/sql-postgres": "0.53.0",
16
+ "@voltro/cli": "0.54.0",
17
+ "@voltro/database": "0.54.0",
18
+ "@voltro/plugin-analytics-postgres": "0.54.0",
19
+ "@voltro/plugin-billing": "0.54.0",
20
+ "@voltro/plugin-multitenancy": "0.54.0",
21
+ "@voltro/plugin-notifications": "0.54.0",
22
+ "@voltro/plugin-presence": "0.54.0",
23
+ "@voltro/protocol": "0.54.0",
24
+ "@voltro/runtime": "0.54.0",
25
+ "@voltro/sql-postgres": "0.54.0",
25
26
  "effect": "^3.22.0"
26
27
  },
27
28
  "devDependencies": {
28
- "@voltro/testing": "0.53.0",
29
+ "@voltro/testing": "0.54.0",
29
30
  "typescript": "^6.0.3",
30
31
  "@vitest/coverage-v8": "^4.1.10",
31
32
  "vitest": "^4.1.10"
@@ -16,19 +16,19 @@
16
16
  "dependencies": {
17
17
  "@effect/platform": "^0.97.0",
18
18
  "@effect/rpc": "^0.76.0",
19
- "@voltro/cli": "0.53.0",
20
- "@voltro/database": "0.53.0",
21
- "@voltro/env": "0.53.0",
22
- "@voltro/plugin-auth": "0.53.0",
23
- "@voltro/plugin-billing": "0.53.0",
24
- "@voltro/plugin-multitenancy": "0.53.0",
25
- "@voltro/protocol": "0.53.0",
26
- "@voltro/runtime": "0.53.0",
27
- "@voltro/sql-postgres": "0.53.0",
19
+ "@voltro/cli": "0.54.0",
20
+ "@voltro/database": "0.54.0",
21
+ "@voltro/env": "0.54.0",
22
+ "@voltro/plugin-auth": "0.54.0",
23
+ "@voltro/plugin-billing": "0.54.0",
24
+ "@voltro/plugin-multitenancy": "0.54.0",
25
+ "@voltro/protocol": "0.54.0",
26
+ "@voltro/runtime": "0.54.0",
27
+ "@voltro/sql-postgres": "0.54.0",
28
28
  "effect": "^3.22.0"
29
29
  },
30
30
  "devDependencies": {
31
- "@voltro/testing": "0.53.0",
31
+ "@voltro/testing": "0.54.0",
32
32
  "typescript": "^6.0.3",
33
33
  "@vitest/coverage-v8": "^4.1.10",
34
34
  "vitest": "^4.1.10"
@@ -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.53.0",
17
- "@voltro/database": "0.53.0",
18
- "@voltro/env": "0.53.0",
19
- "@voltro/plugin-multitenancy": "0.53.0",
20
- "@voltro/plugin-search": "0.53.0",
21
- "@voltro/protocol": "0.53.0",
22
- "@voltro/runtime": "0.53.0",
16
+ "@voltro/cli": "0.54.0",
17
+ "@voltro/database": "0.54.0",
18
+ "@voltro/env": "0.54.0",
19
+ "@voltro/plugin-multitenancy": "0.54.0",
20
+ "@voltro/plugin-search": "0.54.0",
21
+ "@voltro/protocol": "0.54.0",
22
+ "@voltro/runtime": "0.54.0",
23
23
  "effect": "^3.22.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@voltro/testing": "0.53.0",
26
+ "@voltro/testing": "0.54.0",
27
27
  "typescript": "^6.0.3",
28
28
  "@vitest/coverage-v8": "^4.1.10",
29
29
  "vitest": "^4.1.10"
@@ -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.53.0",
17
- "@voltro/database": "0.53.0",
18
- "@voltro/env": "0.53.0",
19
- "@voltro/plugin-rbac": "0.53.0",
20
- "@voltro/protocol": "0.53.0",
21
- "@voltro/runtime": "0.53.0",
22
- "@voltro/sql-postgres": "0.53.0",
16
+ "@voltro/cli": "0.54.0",
17
+ "@voltro/database": "0.54.0",
18
+ "@voltro/env": "0.54.0",
19
+ "@voltro/plugin-rbac": "0.54.0",
20
+ "@voltro/protocol": "0.54.0",
21
+ "@voltro/runtime": "0.54.0",
22
+ "@voltro/sql-postgres": "0.54.0",
23
23
  "effect": "^3.22.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@voltro/testing": "0.53.0",
26
+ "@voltro/testing": "0.54.0",
27
27
  "typescript": "^6.0.3",
28
28
  "@vitest/coverage-v8": "^4.1.10",
29
29
  "vitest": "^4.1.10"
@@ -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.53.0",
17
- "@voltro/database": "0.53.0",
18
- "@voltro/env": "0.53.0",
19
- "@voltro/plugin-multitenancy": "0.53.0",
20
- "@voltro/plugin-webhooks": "0.53.0",
21
- "@voltro/protocol": "0.53.0",
22
- "@voltro/runtime": "0.53.0",
23
- "@voltro/sql-postgres": "0.53.0",
16
+ "@voltro/cli": "0.54.0",
17
+ "@voltro/database": "0.54.0",
18
+ "@voltro/env": "0.54.0",
19
+ "@voltro/plugin-multitenancy": "0.54.0",
20
+ "@voltro/plugin-webhooks": "0.54.0",
21
+ "@voltro/protocol": "0.54.0",
22
+ "@voltro/runtime": "0.54.0",
23
+ "@voltro/sql-postgres": "0.54.0",
24
24
  "effect": "^3.22.0"
25
25
  },
26
26
  "devDependencies": {
27
- "@voltro/testing": "0.53.0",
27
+ "@voltro/testing": "0.54.0",
28
28
  "typescript": "^6.0.3",
29
29
  "@vitest/coverage-v8": "^4.1.10",
30
30
  "vitest": "^4.1.10"
@@ -12,13 +12,14 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@voltro/content": "0.53.0",
15
+ "@voltro/cli": "0.54.0",
16
+ "@voltro/client": "0.54.0",
17
+ "@voltro/content": "0.54.0",
18
+ "@voltro/env": "0.54.0",
19
+ "@voltro/i18n": "0.54.0",
20
+ "@voltro/ui-shadcn": "0.54.0",
21
+ "@voltro/web": "0.54.0",
16
22
  "effect": "^3.22.0",
17
- "@voltro/cli": "0.53.0",
18
- "@voltro/client": "0.53.0",
19
- "@voltro/env": "0.53.0",
20
- "@voltro/i18n": "0.53.0",
21
- "@voltro/web": "0.53.0",
22
23
  "react": "^19.0.0",
23
24
  "react-dom": "^19.0.0"
24
25
  },
@@ -12,8 +12,8 @@
12
12
  },
13
13
  "dependencies": {
14
14
  "@effect/platform": "^0.97.0",
15
- "@voltro/cli": "0.53.0",
16
- "@voltro/serverless": "0.53.0",
15
+ "@voltro/cli": "0.54.0",
16
+ "@voltro/serverless": "0.54.0",
17
17
  "effect": "^3.22.0"
18
18
  },
19
19
  "devDependencies": {
@@ -12,18 +12,18 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@{{projectName}}/api": "0.53.0",
16
- "@voltro/cli": "0.53.0",
17
- "@voltro/client": "0.53.0",
18
- "@voltro/env": "0.53.0",
19
- "@voltro/i18n": "0.53.0",
20
- "@voltro/ui-shadcn": "0.53.0",
21
- "@voltro/web": "0.53.0",
15
+ "@{{projectName}}/api": "0.54.0",
16
+ "@voltro/cli": "0.54.0",
17
+ "@voltro/client": "0.54.0",
18
+ "@voltro/env": "0.54.0",
19
+ "@voltro/i18n": "0.54.0",
20
+ "@voltro/ui-shadcn": "0.54.0",
21
+ "@voltro/web": "0.54.0",
22
22
  "react": "^19.0.0",
23
23
  "react-dom": "^19.0.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@voltro/devtools": "0.53.0",
26
+ "@voltro/devtools": "0.54.0",
27
27
  "@types/react": "^19.0.0",
28
28
  "@types/react-dom": "^19.0.0",
29
29
  "jsdom": "^30.0.0",
@@ -12,19 +12,19 @@
12
12
  "typecheck": "tsc --noEmit"
13
13
  },
14
14
  "dependencies": {
15
- "@{{projectName}}/api": "0.53.0",
16
- "@voltro/cli": "0.53.0",
17
- "@voltro/client": "0.53.0",
18
- "@voltro/env": "0.53.0",
19
- "@voltro/i18n": "0.53.0",
20
- "@voltro/ui-shadcn": "0.53.0",
21
- "@voltro/web": "0.53.0",
15
+ "@{{projectName}}/api": "0.54.0",
16
+ "@voltro/cli": "0.54.0",
17
+ "@voltro/client": "0.54.0",
18
+ "@voltro/env": "0.54.0",
19
+ "@voltro/i18n": "0.54.0",
20
+ "@voltro/ui-shadcn": "0.54.0",
21
+ "@voltro/web": "0.54.0",
22
22
  "react": "^19.0.0",
23
23
  "react-dom": "^19.0.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@voltro/devtools": "0.53.0",
27
- "@voltro/testing": "0.53.0",
26
+ "@voltro/devtools": "0.54.0",
27
+ "@voltro/testing": "0.54.0",
28
28
  "@types/react": "^19.0.0",
29
29
  "@types/react-dom": "^19.0.0",
30
30
  "jsdom": "^30.0.0",
@@ -12,18 +12,18 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@{{projectName}}/api": "0.53.0",
16
- "@voltro/cli": "0.53.0",
17
- "@voltro/client": "0.53.0",
18
- "@voltro/env": "0.53.0",
19
- "@voltro/i18n": "0.53.0",
20
- "@voltro/ui-shadcn": "0.53.0",
21
- "@voltro/web": "0.53.0",
15
+ "@{{projectName}}/api": "0.54.0",
16
+ "@voltro/cli": "0.54.0",
17
+ "@voltro/client": "0.54.0",
18
+ "@voltro/env": "0.54.0",
19
+ "@voltro/i18n": "0.54.0",
20
+ "@voltro/ui-shadcn": "0.54.0",
21
+ "@voltro/web": "0.54.0",
22
22
  "react": "^19.0.0",
23
23
  "react-dom": "^19.0.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@voltro/devtools": "0.53.0",
26
+ "@voltro/devtools": "0.54.0",
27
27
  "@types/react": "^19.0.0",
28
28
  "@types/react-dom": "^19.0.0",
29
29
  "jsdom": "^30.0.0",
@@ -12,17 +12,17 @@
12
12
  "typecheck": "tsc --noEmit"
13
13
  },
14
14
  "dependencies": {
15
- "@voltro/cli": "0.53.0",
16
- "@voltro/client": "0.53.0",
17
- "@voltro/env": "0.53.0",
18
- "@voltro/i18n": "0.53.0",
19
- "@voltro/ui-shadcn": "0.53.0",
20
- "@voltro/web": "0.53.0",
15
+ "@voltro/cli": "0.54.0",
16
+ "@voltro/client": "0.54.0",
17
+ "@voltro/env": "0.54.0",
18
+ "@voltro/i18n": "0.54.0",
19
+ "@voltro/ui-shadcn": "0.54.0",
20
+ "@voltro/web": "0.54.0",
21
21
  "react": "^19.0.0",
22
22
  "react-dom": "^19.0.0"
23
23
  },
24
24
  "devDependencies": {
25
- "@voltro/devtools": "0.53.0",
25
+ "@voltro/devtools": "0.54.0",
26
26
  "@types/react": "^19.0.0",
27
27
  "@types/react-dom": "^19.0.0",
28
28
  "jsdom": "^30.0.0",
@@ -12,19 +12,19 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@{{projectName}}/api": "0.53.0",
16
- "@voltro/cli": "0.53.0",
17
- "@voltro/client": "0.53.0",
18
- "@voltro/cms": "0.53.0",
19
- "@voltro/env": "0.53.0",
20
- "@voltro/i18n": "0.53.0",
21
- "@voltro/ui-shadcn": "0.53.0",
22
- "@voltro/web": "0.53.0",
15
+ "@{{projectName}}/api": "0.54.0",
16
+ "@voltro/cli": "0.54.0",
17
+ "@voltro/client": "0.54.0",
18
+ "@voltro/cms": "0.54.0",
19
+ "@voltro/env": "0.54.0",
20
+ "@voltro/i18n": "0.54.0",
21
+ "@voltro/ui-shadcn": "0.54.0",
22
+ "@voltro/web": "0.54.0",
23
23
  "react": "^19.0.0",
24
24
  "react-dom": "^19.0.0"
25
25
  },
26
26
  "devDependencies": {
27
- "@voltro/devtools": "0.53.0",
27
+ "@voltro/devtools": "0.54.0",
28
28
  "@types/react": "^19.0.0",
29
29
  "@types/react-dom": "^19.0.0",
30
30
  "jsdom": "^30.0.0",
@@ -2,7 +2,7 @@
2
2
 
3
3
  Voltro collaborative-editing frontend (template: **frontend-collab**).
4
4
 
5
- A document editor whose textarea is bound to a `crdtText()` body over the
5
+ A **rich-text** document editor Tiptap, bound to a `crdtDoc()` body over the
6
6
  framework's reactive loop. Type in **two browser tabs at once** and the edits
7
7
  **converge** — no last-write-wins loser — because the api merges every update
8
8
  into the shared document server-side, then broadcasts the merged result back
@@ -30,45 +30,64 @@ same URL and type in both. Every keystroke merges — both tabs' edits survive.
30
30
  ```
31
31
  Tab A api (api-collab)
32
32
  ───── ────────────────
33
- local crdtText() handle documents.setBody (crdtText 'body' column)
34
- keystrokeinsert/delete └─ runtime folds the update into the
35
- │ → handle.encode() ──rpc──► STORED state (mergeCrdtStates) → merged
33
+ useCrdtDoc → CrdtDocHandle documents.setBody (crdtDoc 'body' column)
34
+ editor edit doc.onUpdate └─ runtime folds the update into the
35
+ (local:true) push ──rpc──► STORED state (mergeCrdtStates) → merged
36
36
  ▼ └─► reactive delta ──WS──► every tab
37
37
  useSubscription('app',
38
- 'documents.list') ◄──WS── merged body ── handle.merge(body)textarea
38
+ 'documents.list') ◄──WS── merged body ── folded (local:falseno push back)
39
+
40
+ └─ useCrdtEditor({ doc }) → Tiptap <EditorContent>
39
41
  ```
40
42
 
41
43
  1. **`useSubscription('app', 'documents.list')`** streams the shared document,
42
- including its **merged** `body` (encoded CRDT bytes), on every write.
43
- 2. A **local `crdtText()` handle** (`@voltro/local-first`) is seeded from that
44
- body. Each keystroke applies a contiguous insert/delete to the handle and
45
- sends `handle.encode()` via **`useMutation('app', 'documents.setBody')`**.
46
- 3. The api's **authoritative server-side merge** folds the update into the
44
+ including its **merged** `body` (encoded CRDT bytes), on every write. That
45
+ value is `useCrdtDoc`'s `remote` `null` means *not loaded*, not *empty*.
46
+ 2. **`useCrdtDoc`** owns one sync client and one live CRDT document for the
47
+ cell. **`useCrdtEditor({ doc })`** mounts a Tiptap editor over it, so typing
48
+ mutates the shared document directly.
49
+ 3. Those edits surface as `doc.onUpdate(update, { local: true })` and are queued
50
+ as **incremental** updates through **`useMutation('app',
51
+ 'documents.setBody')`** — a keystroke is bytes, not the whole document.
52
+ 4. The api's **authoritative server-side merge** folds each update into the
47
53
  stored state before broadcasting — so concurrent edits converge.
48
- 4. Incoming server bodies are **folded back** into the local handle
49
- (idempotent), keeping every tab in sync.
54
+ 5. Incoming bodies are **folded back** into the same document. Those folds
55
+ report `local: false`, and the hook's **echo guard** drops them: without it,
56
+ one keystroke becomes one server write *per open tab*.
50
57
 
51
- This page is exactly the app-level binding the local-first docs describe as the
52
- `SyncClient` transport: `push` = the `setBody` mutation, `onRemoteState` = the
53
- `documents` subscription.
58
+ The two names the framework cannot derive are the app's to supply, and they are
59
+ the whole binding: `push` = the `setBody` mutation, `remote` = the `documents`
60
+ subscription. The sync-client lifecycle, offline queue, bounded retry,
61
+ `outstanding`/`synced` and the echo guard all live in the hook.
54
62
 
55
- ## Not wired here: presence cursors
63
+ ## `renderMode = 'client'`
56
64
 
57
- Live "who else is editing" cursors (`usePresence` from
58
- `@voltro/local-first/react`) need a `PresenceChannel` bound to the app's
59
- broadcast broker a runtime binding, not zero-infra in a single dev process
60
- across tabs so this template omits them. The CRDT text convergence above needs
61
- none of that; it rides the reactive engine you already have.
65
+ `page.tsx` sets it explicitly. A rich-text editor needs a browser: `renderMode`
66
+ defaults to `'static'`, which pre-renders at build time, and Tiptap's
67
+ `new Editor()` finds no `window` there the build fails. There is nothing
68
+ worth pre-rendering for a document that arrives over a live subscription
69
+ anyway.
70
+
71
+ ## Not wired here: presence carets
72
+
73
+ Live "who else is editing" carets need two things this template does not ship:
74
+ a `PresenceChannel` bound to the app's broadcast broker, and an
75
+ `AwarenessTransport` over a `delivery: 'latest'` event
76
+ (`useCrdtEditor({ doc, awareness, user })`). Both are runtime bindings, not
77
+ zero-infra in a single dev process across tabs. The convergence above needs
78
+ none of it — it rides the reactive engine you already have.
62
79
 
63
80
  ## Files
64
81
 
65
82
  ```
66
83
  app.config.ts type:web + the `apis: { app }` wiring
67
- package.json depends on @{{projectName}}/api (the sibling) + @voltro/local-first
84
+ package.json depends on @{{projectName}}/api (the sibling),
85
+ @voltro/local-first + the four @tiptap/* peers
68
86
  src/pages/
69
87
  layout.tsx root shell (header + <main>)
70
- page.tsx the collaborative editor — subscription + CRDT handle + setBody
71
- page.test.tsx render + edit-dispatch tests (jsdom)
88
+ page.tsx the collaborative editor — subscription + useCrdtDoc + useCrdtEditor
89
+ page.test.tsx page-contract tests (jsdom) — states, create, and a
90
+ server-side fold converging into the open editor
72
91
  src/locales/{en,de}.ts bilingual UI strings
73
92
  ```
74
93
 
@@ -1,8 +1,8 @@
1
1
  // Web app for the {{projectName}} project. Read by `voltro dev` / `voltro start`.
2
2
  //
3
- // This is the COLLABORATIVE-EDITING frontend — a textarea bound to a
4
- // `crdtText()` document body over the framework's reactive loop. Open it in two
5
- // browser tabs and type in both: the edits CONVERGE (no last-write-wins loser)
3
+ // This is the COLLABORATIVE-EDITING frontend — a Tiptap rich-text editor bound
4
+ // to a `crdtDoc()` document body over the framework's reactive loop. Open it in
5
+ // two browser tabs and type in both: the edits CONVERGE (no last-write-wins loser)
6
6
  // because the api's server-authoritative CRDT merge folds every update into the
7
7
  // stored state, then the reactive engine broadcasts the merged row back. Zero
8
8
  // infra — the merge + broadcast are in-process on a single `voltro dev`.
@@ -12,20 +12,24 @@
12
12
  "typecheck": "tsc --noEmit"
13
13
  },
14
14
  "dependencies": {
15
- "@{{projectName}}/api": "0.53.0",
16
- "@voltro/cli": "0.53.0",
17
- "@voltro/client": "0.53.0",
18
- "@voltro/env": "0.53.0",
19
- "@voltro/i18n": "0.53.0",
20
- "@voltro/local-first": "0.53.0",
21
- "@voltro/ui-shadcn": "0.53.0",
22
- "@voltro/web": "0.53.0",
15
+ "@{{projectName}}/api": "0.54.0",
16
+ "@tiptap/extension-collaboration": "^3.0.0",
17
+ "@tiptap/extension-collaboration-caret": "^3.0.0",
18
+ "@tiptap/react": "^3.0.0",
19
+ "@tiptap/starter-kit": "^3.0.0",
20
+ "@voltro/cli": "0.54.0",
21
+ "@voltro/client": "0.54.0",
22
+ "@voltro/env": "0.54.0",
23
+ "@voltro/i18n": "0.54.0",
24
+ "@voltro/local-first": "0.54.0",
25
+ "@voltro/ui-shadcn": "0.54.0",
26
+ "@voltro/web": "0.54.0",
23
27
  "react": "^19.0.0",
24
28
  "react-dom": "^19.0.0"
25
29
  },
26
30
  "devDependencies": {
27
- "@voltro/devtools": "0.53.0",
28
- "@voltro/testing": "0.53.0",
31
+ "@voltro/devtools": "0.54.0",
32
+ "@voltro/testing": "0.54.0",
29
33
  "@types/react": "^19.0.0",
30
34
  "@types/react-dom": "^19.0.0",
31
35
  "jsdom": "^30.0.0",
@@ -14,7 +14,7 @@ export default defineLocale<typeof en>()({
14
14
  'lang.label': 'Sprache',
15
15
 
16
16
  'editor.heading': 'Kollaborativer Editor',
17
- 'editor.intro': 'Öffne diese Seite in <strong>zwei Browser-Tabs</strong> und tippe in beiden. Die Änderungen <strong>konvergieren</strong> — kein Last-Write-Wins-Verlierer — weil die API jedes Update serverseitig in den gemeinsamen <code>crdtText()</code>-Body mergt und live zurücksendet.',
17
+ 'editor.intro': 'Öffne diese Seite in <strong>zwei Browser-Tabs</strong> und tippe in beiden. Die Änderungen <strong>konvergieren</strong> — kein Last-Write-Wins-Verlierer — weil die API jedes Update serverseitig in den gemeinsamen <code>crdtDoc()</code>-Body mergt und live zurücksendet.',
18
18
  'editor.status.tenant': 'Mandant <code>{tenant}</code> · Revision {revision}',
19
19
  'editor.status.saving': ' · synchronisiere…',
20
20
  'editor.status.loading': ' · lädt…',
@@ -24,6 +24,5 @@ export default defineLocale<typeof en>()({
24
24
  'editor.create': 'Dokument erstellen',
25
25
  'editor.creating': 'Wird erstellt…',
26
26
  'editor.docLabel': 'Bearbeite <strong>{title}</strong>',
27
- 'editor.placeholder': 'Fang an zu tippen — jeder Tastendruck synchronisiert und mergt.',
28
27
  'editor.hint': 'Tipp: Öffne einen zweiten Tab und tippe gleichzeitig. Beide Änderungen bleiben erhalten.',
29
28
  })
@@ -16,7 +16,7 @@ export default defineCatalog({
16
16
 
17
17
  // ---- Editor page (pages/page.tsx) ----
18
18
  'editor.heading': 'Collaborative editor',
19
- 'editor.intro': 'Open this page in <strong>two browser tabs</strong> and type in both. Edits <strong>converge</strong> — no last-write-wins loser — because the api merges every update into the shared <code>crdtText()</code> body server-side, then broadcasts it back live.',
19
+ 'editor.intro': 'Open this page in <strong>two browser tabs</strong> and type in both. Edits <strong>converge</strong> — no last-write-wins loser — because the api merges every update into the shared <code>crdtDoc()</code> body server-side, then broadcasts it back live.',
20
20
  'editor.status.tenant': 'Tenant <code>{tenant}</code> · revision {revision}',
21
21
  'editor.status.saving': ' · syncing…',
22
22
  'editor.status.loading': ' · loading…',
@@ -26,6 +26,5 @@ export default defineCatalog({
26
26
  'editor.create': 'Create document',
27
27
  'editor.creating': 'Creating…',
28
28
  'editor.docLabel': 'Editing <strong>{title}</strong>',
29
- 'editor.placeholder': 'Start typing — every keystroke syncs and merges.',
30
29
  'editor.hint': 'Tip: open a second tab and type at the same time. Both edits survive.',
31
30
  } as const)