@voltro/cli 0.55.0 → 0.56.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 (165) hide show
  1. package/CHANGELOG.md +497 -0
  2. package/bin/voltro.mjs +24 -0
  3. package/dist/{apiBuild-CMvLJM_K.js → apiBuild-Bdaetr37.js} +119 -88
  4. package/dist/apiBuild-Vw1figjO.js +2 -0
  5. package/dist/bin.js +1 -1
  6. package/dist/{build-S0QOzqPT.js → build-CI36wL4R.js} +337 -312
  7. package/dist/buildReport-52gHKgfO.js +64 -0
  8. package/dist/{checkCommand-fbj9GDjN.js → checkCommand-CAwFXrxA.js} +6 -6
  9. package/dist/{checkCommand-DNkY5kwF.js → checkCommand-D0QV_zM_.js} +1 -1
  10. package/dist/{clusterCmd-DrVFCzSj.js → clusterCmd-CdLB1GkT.js} +1 -1
  11. package/dist/{codegen-SIepQtUl.js → codegen-Bth5lUTU.js} +2 -1
  12. package/dist/codegen-DbH7NbCR.js +2 -0
  13. package/dist/{codegenCommand-3TDJezom.js → codegenCommand-CidbQzbv.js} +10 -10
  14. package/dist/{codemodRunner-C2zxZUIw.js → codemodRunner-BlQPfjzA.js} +222 -0
  15. package/dist/{commands-BBYJ7Q3B.js → commands-CWjfThXv.js} +35 -35
  16. package/dist/{dashboardCommand-D2kmyCLL.js → dashboardCommand-BekcY5Ls.js} +3 -3
  17. package/dist/{dataCommand-BEPPQiTl.js → dataCommand-2pccgbIy.js} +3 -3
  18. package/dist/{dbCommand-DZTmOFT4.js → dbCommand-DpK_vQET.js} +457 -441
  19. package/dist/dbCommand-DrycGWWt.js +2 -0
  20. package/dist/{dev-DfVZaoys.js → dev-B9Gz0k85.js} +1 -1
  21. package/dist/{dev-Ca_A_S9v.js → dev-Dw263KPu.js} +2603 -2482
  22. package/dist/doctorCommand-BMWs6aVm.js +2 -0
  23. package/dist/{doctorCommand-CGZJK_4o.js → doctorCommand-aR_bFmIi.js} +353 -251
  24. package/dist/{dormancyCommand-DY2rYpTa.js → dormancyCommand-eXTQMbHU.js} +1 -1
  25. package/dist/{embeddingsCommand-BoCqZsgp.js → embeddingsCommand-CTmiQvwa.js} +1 -1
  26. package/dist/{envCommand-Bxy2fOjc.js → envCommand-BDUgV7EM.js} +12 -12
  27. package/dist/{evolveCommand-BsbZ-XDg.js → evolveCommand-YV8qW1LU.js} +2 -2
  28. package/dist/frameworkTableAssembly-CGNC0qr7.js +2 -0
  29. package/dist/{frameworkTableAssembly-Do-cf6RJ.js → frameworkTableAssembly-DNOFXfEQ.js} +92 -84
  30. package/dist/index.js +1 -1
  31. package/dist/{infoCommand-EmM3jPKD.js → infoCommand-BjVXpMlP.js} +1 -1
  32. package/dist/inspect-CNYvNXPU.js +1484 -0
  33. package/dist/inspect-S2rWy1Ys.js +2 -0
  34. package/dist/{inspectCmd-niF97fAq.js → inspectCmd-CP-G0sVK.js} +1 -1
  35. package/dist/{inspectFetch-EMuhTG_9.js → inspectFetch-BU1NyzxV.js} +36 -24
  36. package/dist/{inspectMetrics-CGF94puw.js → inspectMetrics-BY0Sjb2F.js} +19 -19
  37. package/dist/{logsCmd-B6oNsfaZ.js → logsCmd-BU8uCdys.js} +1 -1
  38. package/dist/{manifestBuild-DjX5MoXy.js → manifestBuild-CEkjfpwc.js} +1 -1
  39. package/dist/manifestBuild-DIa_s6u0.js +2 -0
  40. package/dist/{migrate-CGFZS-1a.js → migrate-SICulyz1.js} +2 -2
  41. package/dist/precompressAssets-YhTi1aWp.js +40 -0
  42. package/dist/{probeCommand-Bs3iVBSL.js → probeCommand-6HxEkNDG.js} +2 -2
  43. package/dist/{runtimeTrace-C1BTpHGQ.js → runtimeTrace-DgYMc09E.js} +1 -1
  44. package/dist/{scheduleCmd-DQRu6BZC.js → scheduleCmd-DYBUfo_T.js} +1 -1
  45. package/dist/{sdkgen-CXMwLg9n.js → sdkgen-PY-umd6O.js} +1 -1
  46. package/dist/{seedRunner-Dgsiwk_e.js → seedRunner-DISBKow-.js} +16 -16
  47. package/dist/serveCommand-BITS8Hpj.js +2 -0
  48. package/dist/{serveCommand-C7IrCD58.js → serveCommand-DIJ3ma76.js} +910 -870
  49. package/dist/serveEntry.js +1 -1
  50. package/dist/{start-EOV7s1NZ.js → start-B9NGB8gn.js} +575 -546
  51. package/dist/{start-DH7cat4-.js → start-BFQQkL1i.js} +1 -1
  52. package/dist/startEntry.js +1 -1
  53. package/dist/staticCachePolicy-CIyj6DbS.js +15 -0
  54. package/dist/{test-DO27-x2P.js → test-jipIQ5Mx.js} +1 -1
  55. package/dist/{tracesCmd-DgtgOUdi.js → tracesCmd-BWYDqMy6.js} +1 -1
  56. package/dist/{updateCommand-C_jN1w18.js → updateCommand-C9n_Z_oG.js} +8 -2
  57. package/dist/updateCommand-DsXEAHbd.js +2 -0
  58. package/dist/webDev-C2dRz9s5.js +2 -0
  59. package/dist/{webDev-B7vNj4Bq.js → webDev-C53hJdcL.js} +1240 -1271
  60. package/dist/{webhooksCommand-B1LVcyO3.js → webhooksCommand-uuPu8qQX.js} +1 -1
  61. package/dist/{workflowsCmd-BGF-mRZ5.js → workflowsCmd-g-DNpaUc.js} +1 -1
  62. package/package.json +55 -19
  63. package/templates/AGENTS.core.md +20 -1
  64. package/templates/AGENTS.md +21 -2
  65. package/templates/agent-docs/_index.md +1 -1
  66. package/templates/agent-docs/_manifest.json +1 -1
  67. package/templates/agent-docs/cli.md +122 -0
  68. package/templates/agent-docs/data.md +145 -5
  69. package/templates/agent-docs/database/scaling.md +40 -1
  70. package/templates/agent-docs/deployment.md +53 -1
  71. package/templates/agent-docs/internationalization.md +32 -0
  72. package/templates/agent-docs/local-first-mobile.md +9 -2
  73. package/templates/agent-docs/observability.md +227 -0
  74. package/templates/agent-docs/plugins/billing.md +15 -0
  75. package/templates/agent-docs/plugins/broadcast.md +2 -1
  76. package/templates/agent-docs/plugins/ratelimit.md +6 -1
  77. package/templates/agent-docs/plugins/row-history.md +11 -0
  78. package/templates/agent-docs/plugins.md +19 -0
  79. package/templates/agent-docs/templates/appshells.md +3 -3
  80. package/templates/agent-docs/whats-new.md +432 -73
  81. package/templates/apps/api-ai/package.json +6 -6
  82. package/templates/apps/api-auth/package.json +8 -8
  83. package/templates/apps/api-backend/package.json +7 -7
  84. package/templates/apps/api-backend-deactivation/package.json +7 -7
  85. package/templates/apps/api-backend-mail/package.json +8 -8
  86. package/templates/apps/api-backend-mariadb/package.json +9 -9
  87. package/templates/apps/api-backend-sqlite/package.json +8 -8
  88. package/templates/apps/api-backend-storage/package.json +8 -8
  89. package/templates/apps/api-cms/package.json +9 -9
  90. package/templates/apps/api-collab/package.json +8 -8
  91. package/templates/apps/api-data-advanced/package.json +8 -8
  92. package/templates/apps/api-durable/package.json +8 -8
  93. package/templates/apps/api-feature-flags/package.json +9 -9
  94. package/templates/apps/api-governance/package.json +8 -8
  95. package/templates/apps/api-kv/package.json +8 -8
  96. package/templates/apps/api-moderation/package.json +8 -8
  97. package/templates/apps/api-observability/package.json +8 -8
  98. package/templates/apps/api-ratelimit/package.json +8 -8
  99. package/templates/apps/api-rbac/package.json +8 -8
  100. package/templates/apps/api-rest/package.json +7 -7
  101. package/templates/apps/api-row-history/package.json +8 -8
  102. package/templates/apps/api-saas/package.json +11 -11
  103. package/templates/apps/api-saas-starter/package.json +10 -10
  104. package/templates/apps/api-search/package.json +8 -8
  105. package/templates/apps/api-status/package.json +8 -8
  106. package/templates/apps/api-webhooks/package.json +9 -9
  107. package/templates/apps/changelog/package.json +7 -7
  108. package/templates/apps/changelog/src/pages/[locale]/page.tsx +7 -1
  109. package/templates/apps/edge-functions/package.json +2 -2
  110. package/templates/apps/frontend-admin/package.json +7 -8
  111. package/templates/apps/frontend-admin/src/pages/(marketing)/layout.tsx +1 -2
  112. package/templates/apps/frontend-admin/src/pages/admin/layout.tsx +1 -2
  113. package/templates/apps/frontend-app/package.json +8 -9
  114. package/templates/apps/frontend-app/src/pages/layout.tsx +1 -2
  115. package/templates/apps/frontend-auth/package.json +7 -8
  116. package/templates/apps/frontend-auth/src/components/AuthShell.tsx +1 -2
  117. package/templates/apps/frontend-blank/package.json +6 -7
  118. package/templates/apps/frontend-blank/src/pages/layout.tsx +1 -2
  119. package/templates/apps/frontend-cms/package.json +8 -9
  120. package/templates/apps/frontend-cms/src/pages/(app)/layout.tsx +1 -2
  121. package/templates/apps/frontend-collab/README.md +7 -2
  122. package/templates/apps/frontend-collab/package.json +9 -10
  123. package/templates/apps/frontend-collab/src/pages/layout.tsx +1 -2
  124. package/templates/apps/frontend-collab/src/pages/page.test.tsx +8 -4
  125. package/templates/apps/frontend-collab/src/pages/page.tsx +10 -5
  126. package/templates/apps/frontend-contact/package.json +7 -7
  127. package/templates/apps/frontend-contact/src/components/ContactForm.island.tsx +1 -1
  128. package/templates/apps/frontend-dashboard/package.json +6 -7
  129. package/templates/apps/frontend-dashboard/src/pages/(marketing)/layout.tsx +1 -2
  130. package/templates/apps/frontend-dashboard/src/pages/dashboard/layout.tsx +1 -2
  131. package/templates/apps/frontend-docs/package.json +8 -8
  132. package/templates/apps/frontend-i18n/package.json +6 -6
  133. package/templates/apps/frontend-landing/package.json +7 -7
  134. package/templates/apps/frontend-portal/package.json +7 -8
  135. package/templates/apps/frontend-portal/src/pages/(portal)/layout.tsx +1 -2
  136. package/templates/apps/frontend-saas/package.json +7 -8
  137. package/templates/apps/frontend-saas/src/pages/(marketing)/layout.tsx +1 -2
  138. package/templates/apps/frontend-saas/src/pages/dashboard/layout.tsx +1 -2
  139. package/templates/apps/frontend-spa/package.json +6 -7
  140. package/templates/apps/frontend-spa/src/pages/layout.tsx +1 -2
  141. package/templates/apps/frontend-ssr/package.json +6 -7
  142. package/templates/apps/frontend-ssr/src/pages/layout.tsx +1 -2
  143. package/templates/apps/frontend-ssr-api/package.json +7 -8
  144. package/templates/apps/frontend-ssr-api/src/pages/layout.tsx +1 -2
  145. package/templates/apps/frontend-static-blog/package.json +8 -8
  146. package/templates/apps/frontend-static-blog/src/components/ReadingProgress.island.tsx +1 -1
  147. package/templates/apps/frontend-static-blog/src/pages/[locale]/page.tsx +7 -1
  148. package/templates/apps/frontend-status/package.json +7 -8
  149. package/templates/apps/frontend-status/src/pages/layout.tsx +1 -2
  150. package/templates/apps/mobile-app/package.json +4 -4
  151. package/templates/baselines/compose/docker/api.Dockerfile +61 -5
  152. package/templates/baselines/compose/docker/web.Dockerfile +55 -10
  153. package/templates/baselines/compose-mariadb/docker/api.Dockerfile +61 -5
  154. package/templates/baselines/compose-mariadb/docker/web.Dockerfile +55 -10
  155. package/dist/apiBuild-Cl0IDx8c.js +0 -2
  156. package/dist/codegen-CN6vMM4J.js +0 -2
  157. package/dist/dbCommand-BTyBGhIA.js +0 -2
  158. package/dist/doctorCommand-djmqEcDC.js +0 -2
  159. package/dist/frameworkTableAssembly-Df2Ymp2f.js +0 -2
  160. package/dist/inspect-DCqILJ1G.js +0 -1197
  161. package/dist/inspect-DGJwpOAb.js +0 -2
  162. package/dist/manifestBuild-CJ2zvPvT.js +0 -2
  163. package/dist/serveCommand-Cjt5S9hD.js +0 -2
  164. package/dist/updateCommand-nnFjDbl4.js +0 -2
  165. package/dist/webDev-1XpVnYkW.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.55.0",
17
- "@voltro/database": "0.55.0",
18
- "@voltro/env": "0.55.0",
19
- "@voltro/plugin-multitenancy": "0.55.0",
20
- "@voltro/plugin-search": "0.55.0",
21
- "@voltro/protocol": "0.55.0",
22
- "@voltro/runtime": "0.55.0",
16
+ "@voltro/cli": "0.56.0",
17
+ "@voltro/database": "0.56.0",
18
+ "@voltro/env": "0.56.0",
19
+ "@voltro/plugin-multitenancy": "0.56.0",
20
+ "@voltro/plugin-search": "0.56.0",
21
+ "@voltro/protocol": "0.56.0",
22
+ "@voltro/runtime": "0.56.0",
23
23
  "effect": "^3.22.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@voltro/testing": "0.55.0",
26
+ "@voltro/testing": "0.56.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.55.0",
17
- "@voltro/database": "0.55.0",
18
- "@voltro/env": "0.55.0",
19
- "@voltro/plugin-rbac": "0.55.0",
20
- "@voltro/protocol": "0.55.0",
21
- "@voltro/runtime": "0.55.0",
22
- "@voltro/sql-postgres": "0.55.0",
16
+ "@voltro/cli": "0.56.0",
17
+ "@voltro/database": "0.56.0",
18
+ "@voltro/env": "0.56.0",
19
+ "@voltro/plugin-rbac": "0.56.0",
20
+ "@voltro/protocol": "0.56.0",
21
+ "@voltro/runtime": "0.56.0",
22
+ "@voltro/sql-postgres": "0.56.0",
23
23
  "effect": "^3.22.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@voltro/testing": "0.55.0",
26
+ "@voltro/testing": "0.56.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.55.0",
17
- "@voltro/database": "0.55.0",
18
- "@voltro/env": "0.55.0",
19
- "@voltro/plugin-multitenancy": "0.55.0",
20
- "@voltro/plugin-webhooks": "0.55.0",
21
- "@voltro/protocol": "0.55.0",
22
- "@voltro/runtime": "0.55.0",
23
- "@voltro/sql-postgres": "0.55.0",
16
+ "@voltro/cli": "0.56.0",
17
+ "@voltro/database": "0.56.0",
18
+ "@voltro/env": "0.56.0",
19
+ "@voltro/plugin-multitenancy": "0.56.0",
20
+ "@voltro/plugin-webhooks": "0.56.0",
21
+ "@voltro/protocol": "0.56.0",
22
+ "@voltro/runtime": "0.56.0",
23
+ "@voltro/sql-postgres": "0.56.0",
24
24
  "effect": "^3.22.0"
25
25
  },
26
26
  "devDependencies": {
27
- "@voltro/testing": "0.55.0",
27
+ "@voltro/testing": "0.56.0",
28
28
  "typescript": "^6.0.3",
29
29
  "@vitest/coverage-v8": "^4.1.10",
30
30
  "vitest": "^4.1.10"
@@ -12,13 +12,13 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@voltro/cli": "0.55.0",
16
- "@voltro/client": "0.55.0",
17
- "@voltro/content": "0.55.0",
18
- "@voltro/env": "0.55.0",
19
- "@voltro/i18n": "0.55.0",
20
- "@voltro/ui-shadcn": "0.55.0",
21
- "@voltro/web": "0.55.0",
15
+ "@voltro/cli": "0.56.0",
16
+ "@voltro/client": "0.56.0",
17
+ "@voltro/content": "0.56.0",
18
+ "@voltro/env": "0.56.0",
19
+ "@voltro/i18n": "0.56.0",
20
+ "@voltro/ui-shadcn": "0.56.0",
21
+ "@voltro/web": "0.56.0",
22
22
  "effect": "^3.22.0",
23
23
  "react": "^19.0.0",
24
24
  "react-dom": "^19.0.0"
@@ -5,7 +5,13 @@
5
5
  import { SUPPORTED_LOCALES, DEFAULT_LOCALE } from '../../lib/locale'
6
6
 
7
7
  export { default } from '../page'
8
- export { renderMode, interactive, meta } from '../page'
8
+ // `loader` belongs in this list: the re-exported component calls
9
+ // `useLoaderData()`, and a mirror that forwards everything EXCEPT the loader
10
+ // renders it at a level that declares none — which is a prerender failure, not
11
+ // a missing-data warning. It was absent here while the `[slug]` mirror next
12
+ // door forwarded it correctly, and no test could see the difference: a mirror
13
+ // test asserts what IS re-exported, so an omission reads as a shorter list.
14
+ export { renderMode, interactive, loader, meta } from '../page'
9
15
 
10
16
  export const getStaticPaths = async (): Promise<Array<{ params: { locale: string } }>> =>
11
17
  SUPPORTED_LOCALES
@@ -12,8 +12,8 @@
12
12
  },
13
13
  "dependencies": {
14
14
  "@effect/platform": "^0.97.0",
15
- "@voltro/cli": "0.55.0",
16
- "@voltro/serverless": "0.55.0",
15
+ "@voltro/cli": "0.56.0",
16
+ "@voltro/serverless": "0.56.0",
17
17
  "effect": "^3.22.0"
18
18
  },
19
19
  "devDependencies": {
@@ -12,18 +12,17 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@{{projectName}}/api": "0.55.0",
16
- "@voltro/cli": "0.55.0",
17
- "@voltro/client": "0.55.0",
18
- "@voltro/env": "0.55.0",
19
- "@voltro/i18n": "0.55.0",
20
- "@voltro/ui-shadcn": "0.55.0",
21
- "@voltro/web": "0.55.0",
15
+ "@{{projectName}}/api": "0.56.0",
16
+ "@voltro/cli": "0.56.0",
17
+ "@voltro/client": "0.56.0",
18
+ "@voltro/env": "0.56.0",
19
+ "@voltro/i18n": "0.56.0",
20
+ "@voltro/web": "0.56.0",
22
21
  "react": "^19.0.0",
23
22
  "react-dom": "^19.0.0"
24
23
  },
25
24
  "devDependencies": {
26
- "@voltro/devtools": "0.55.0",
25
+ "@voltro/devtools": "0.56.0",
27
26
  "@types/react": "^19.0.0",
28
27
  "@types/react-dom": "^19.0.0",
29
28
  "jsdom": "^30.0.0",
@@ -2,8 +2,7 @@
2
2
  // directory name never appears in a URL — the pages inside are `/` and
3
3
  // `/login`. Gives the public pages a header distinct from the admin sidebar.
4
4
  import type { ReactNode } from 'react'
5
- import { T, useLocale, useT } from '@voltro/i18n'
6
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
5
+ import { T, useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
7
6
  import { APP_NAME } from '../../config'
8
7
 
9
8
  const LOCALES = [
@@ -16,8 +16,7 @@ import {
16
16
  useUndoLog,
17
17
  PermissionProvider,
18
18
  } from '@voltro/client'
19
- import { T, useLocale, useT } from '@voltro/i18n'
20
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
19
+ import { T, useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
21
20
  import { APP_NAME } from '../../config'
22
21
  import { isSignedIn } from '../../lib/auth'
23
22
  import { DEMO_SCOPES } from '../../lib/admin'
@@ -12,19 +12,18 @@
12
12
  "typecheck": "tsc --noEmit"
13
13
  },
14
14
  "dependencies": {
15
- "@{{projectName}}/api": "0.55.0",
16
- "@voltro/cli": "0.55.0",
17
- "@voltro/client": "0.55.0",
18
- "@voltro/env": "0.55.0",
19
- "@voltro/i18n": "0.55.0",
20
- "@voltro/ui-shadcn": "0.55.0",
21
- "@voltro/web": "0.55.0",
15
+ "@{{projectName}}/api": "0.56.0",
16
+ "@voltro/cli": "0.56.0",
17
+ "@voltro/client": "0.56.0",
18
+ "@voltro/env": "0.56.0",
19
+ "@voltro/i18n": "0.56.0",
20
+ "@voltro/web": "0.56.0",
22
21
  "react": "^19.0.0",
23
22
  "react-dom": "^19.0.0"
24
23
  },
25
24
  "devDependencies": {
26
- "@voltro/devtools": "0.55.0",
27
- "@voltro/testing": "0.55.0",
25
+ "@voltro/devtools": "0.56.0",
26
+ "@voltro/testing": "0.56.0",
28
27
  "@types/react": "^19.0.0",
29
28
  "@types/react-dom": "^19.0.0",
30
29
  "jsdom": "^30.0.0",
@@ -8,8 +8,7 @@
8
8
  // + reloads so the framework re-renders in the chosen language.
9
9
 
10
10
  import type { ReactNode } from 'react'
11
- import { T, useLocale, useT } from '@voltro/i18n'
12
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
11
+ import { T, useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
13
12
 
14
13
  interface LayoutProps {
15
14
  readonly children: ReactNode
@@ -12,18 +12,17 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@{{projectName}}/api": "0.55.0",
16
- "@voltro/cli": "0.55.0",
17
- "@voltro/client": "0.55.0",
18
- "@voltro/env": "0.55.0",
19
- "@voltro/i18n": "0.55.0",
20
- "@voltro/ui-shadcn": "0.55.0",
21
- "@voltro/web": "0.55.0",
15
+ "@{{projectName}}/api": "0.56.0",
16
+ "@voltro/cli": "0.56.0",
17
+ "@voltro/client": "0.56.0",
18
+ "@voltro/env": "0.56.0",
19
+ "@voltro/i18n": "0.56.0",
20
+ "@voltro/web": "0.56.0",
22
21
  "react": "^19.0.0",
23
22
  "react-dom": "^19.0.0"
24
23
  },
25
24
  "devDependencies": {
26
- "@voltro/devtools": "0.55.0",
25
+ "@voltro/devtools": "0.56.0",
27
26
  "@types/react": "^19.0.0",
28
27
  "@types/react-dom": "^19.0.0",
29
28
  "jsdom": "^30.0.0",
@@ -1,8 +1,7 @@
1
1
  // The centered auth card every page renders inside — brand, title, the form
2
2
  // (children), an optional message, a footer link row, and the locale switcher.
3
3
  import type { ReactNode } from 'react'
4
- import { T, useLocale, useT } from '@voltro/i18n'
5
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
4
+ import { T, useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
6
5
  import { APP_NAME } from '../config'
7
6
 
8
7
  const LOCALES = [
@@ -12,17 +12,16 @@
12
12
  "typecheck": "tsc --noEmit"
13
13
  },
14
14
  "dependencies": {
15
- "@voltro/cli": "0.55.0",
16
- "@voltro/client": "0.55.0",
17
- "@voltro/env": "0.55.0",
18
- "@voltro/i18n": "0.55.0",
19
- "@voltro/ui-shadcn": "0.55.0",
20
- "@voltro/web": "0.55.0",
15
+ "@voltro/cli": "0.56.0",
16
+ "@voltro/client": "0.56.0",
17
+ "@voltro/env": "0.56.0",
18
+ "@voltro/i18n": "0.56.0",
19
+ "@voltro/web": "0.56.0",
21
20
  "react": "^19.0.0",
22
21
  "react-dom": "^19.0.0"
23
22
  },
24
23
  "devDependencies": {
25
- "@voltro/devtools": "0.55.0",
24
+ "@voltro/devtools": "0.56.0",
26
25
  "@types/react": "^19.0.0",
27
26
  "@types/react-dom": "^19.0.0",
28
27
  "jsdom": "^30.0.0",
@@ -11,8 +11,7 @@
11
11
  // the chosen language.
12
12
 
13
13
  import type { ReactNode } from 'react'
14
- import { useLocale, useT } from '@voltro/i18n'
15
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
14
+ import { useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
16
15
 
17
16
  interface LayoutProps {
18
17
  readonly children: ReactNode
@@ -12,19 +12,18 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@{{projectName}}/api": "0.55.0",
16
- "@voltro/cli": "0.55.0",
17
- "@voltro/client": "0.55.0",
18
- "@voltro/cms": "0.55.0",
19
- "@voltro/env": "0.55.0",
20
- "@voltro/i18n": "0.55.0",
21
- "@voltro/ui-shadcn": "0.55.0",
22
- "@voltro/web": "0.55.0",
15
+ "@{{projectName}}/api": "0.56.0",
16
+ "@voltro/cli": "0.56.0",
17
+ "@voltro/client": "0.56.0",
18
+ "@voltro/cms": "0.56.0",
19
+ "@voltro/env": "0.56.0",
20
+ "@voltro/i18n": "0.56.0",
21
+ "@voltro/web": "0.56.0",
23
22
  "react": "^19.0.0",
24
23
  "react-dom": "^19.0.0"
25
24
  },
26
25
  "devDependencies": {
27
- "@voltro/devtools": "0.55.0",
26
+ "@voltro/devtools": "0.56.0",
28
27
  "@types/react": "^19.0.0",
29
28
  "@types/react-dom": "^19.0.0",
30
29
  "jsdom": "^30.0.0",
@@ -5,8 +5,7 @@
5
5
  // `renderMode: 'ssr'` precisely so this runs per request.
6
6
  import type { ReactNode } from 'react'
7
7
  import { RedirectError, useLoaderData, type LoaderFn } from '@voltro/web'
8
- import { T, useLocale, useT } from '@voltro/i18n'
9
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
8
+ import { T, useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
10
9
  import type { Identity } from '../../lib/api'
11
10
 
12
11
  const LOCALES = [
@@ -60,13 +60,18 @@ the whole binding: `push` = the `setBody` mutation, `remote` = the `documents`
60
60
  subscription. The sync-client lifecycle, offline queue, bounded retry,
61
61
  `outstanding`/`synced` and the echo guard all live in the hook.
62
62
 
63
- ## `renderMode = 'client'`
63
+ ## `renderMode = 'spa'`
64
64
 
65
65
  `page.tsx` sets it explicitly. A rich-text editor needs a browser: `renderMode`
66
66
  defaults to `'static'`, which pre-renders at build time, and Tiptap's
67
67
  `new Editor()` finds no `window` there — the build fails. There is nothing
68
68
  worth pre-rendering for a document that arrives over a live subscription
69
- anyway.
69
+ anyway. `'spa'` skips the prerender and mounts on the client.
70
+
71
+ The value used to be `'client'`, which is not one of the four render modes
72
+ (`'static' | 'spa' | 'ssr' | 'isr'`), so this template could not be built at
73
+ all. It came from a docs page that taught the same non-existent value while
74
+ another page in the same site listed it as invalid.
70
75
 
71
76
  ## Not wired here: presence carets
72
77
 
@@ -12,24 +12,23 @@
12
12
  "typecheck": "tsc --noEmit"
13
13
  },
14
14
  "dependencies": {
15
- "@{{projectName}}/api": "0.55.0",
15
+ "@{{projectName}}/api": "0.56.0",
16
16
  "@tiptap/extension-collaboration": "^3.0.0",
17
17
  "@tiptap/extension-collaboration-caret": "^3.0.0",
18
18
  "@tiptap/react": "^3.0.0",
19
19
  "@tiptap/starter-kit": "^3.0.0",
20
- "@voltro/cli": "0.55.0",
21
- "@voltro/client": "0.55.0",
22
- "@voltro/env": "0.55.0",
23
- "@voltro/i18n": "0.55.0",
24
- "@voltro/local-first": "0.55.0",
25
- "@voltro/ui-shadcn": "0.55.0",
26
- "@voltro/web": "0.55.0",
20
+ "@voltro/cli": "0.56.0",
21
+ "@voltro/client": "0.56.0",
22
+ "@voltro/env": "0.56.0",
23
+ "@voltro/i18n": "0.56.0",
24
+ "@voltro/local-first": "0.56.0",
25
+ "@voltro/web": "0.56.0",
27
26
  "react": "^19.0.0",
28
27
  "react-dom": "^19.0.0"
29
28
  },
30
29
  "devDependencies": {
31
- "@voltro/devtools": "0.55.0",
32
- "@voltro/testing": "0.55.0",
30
+ "@voltro/devtools": "0.56.0",
31
+ "@voltro/testing": "0.56.0",
33
32
  "@types/react": "^19.0.0",
34
33
  "@types/react-dom": "^19.0.0",
35
34
  "jsdom": "^30.0.0",
@@ -8,8 +8,7 @@
8
8
  // re-renders in the chosen language.
9
9
 
10
10
  import type { ReactNode } from 'react'
11
- import { T, useLocale, useT } from '@voltro/i18n'
12
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
11
+ import { T, useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
13
12
 
14
13
  interface LayoutProps {
15
14
  readonly children: ReactNode
@@ -115,10 +115,14 @@ afterEach(() => {
115
115
 
116
116
  describe('collab editor — the page contract', () => {
117
117
  test('renders in the browser only — a rich-text editor cannot be prerendered', () => {
118
- // Pinned because the failure is a BUILD failure with an unhelpful message:
119
- // `renderMode` defaults to 'static', and Tiptap's `new Editor()` has no
120
- // `window` during prerender.
121
- expect(renderMode).toBe('client')
118
+ // Pinned because the failure is a BUILD failure: `renderMode` defaults to
119
+ // 'static', and Tiptap's `new Editor()` has no `window` during prerender.
120
+ //
121
+ // The value is 'spa'. This assertion said 'client' — the reason above was
122
+ // right and the value was not a render mode at all, so it pinned a template
123
+ // that could not be built. A green suite is not a built app; `voltro test`
124
+ // transpiles and never runs the prerender that rejects the value.
125
+ expect(renderMode).toBe('spa')
122
126
  })
123
127
  })
124
128
 
@@ -34,11 +34,16 @@ import { getCatalog } from '../locales'
34
34
 
35
35
  // A rich-text editor needs a BROWSER. `renderMode` defaults to `'static'`,
36
36
  // which pre-renders this page at build time — and Tiptap's `new Editor()` has
37
- // no `window` there, so the build fails outright. `'client'` renders the page
38
- // in the browser only, which is what a collaborative editor wants anyway: there
39
- // is nothing meaningful to pre-render for a document that arrives over a live
40
- // subscription.
41
- export const renderMode = 'client' as const
37
+ // no `window` there, so the build fails outright. `'spa'` skips the prerender
38
+ // and mounts on the client, which is what a collaborative editor wants anyway:
39
+ // there is nothing meaningful to pre-render for a document that arrives over a
40
+ // live subscription.
41
+ //
42
+ // The mode is `'spa'`, not `'client'`. This file said `'client'` — not a valid
43
+ // value, so the page threw `unknown renderMode 'client'` and the template could
44
+ // not be built at all. It survived because nothing ever BUILT a template, and
45
+ // because the test next door pinned the wrong value with a good reason attached.
46
+ export const renderMode = 'spa' as const
42
47
 
43
48
  export const meta = ({ locale }: { readonly locale: string }): PageMeta => ({
44
49
  title: getCatalog(locale)['meta.editor.title'],
@@ -15,18 +15,18 @@
15
15
  },
16
16
  "dependencies": {
17
17
  "@effect/platform": "^0.97.0",
18
- "@voltro/cli": "0.55.0",
19
- "@voltro/client": "0.55.0",
20
- "@voltro/env": "0.55.0",
21
- "@voltro/i18n": "0.55.0",
22
- "@voltro/serverless": "0.55.0",
23
- "@voltro/web": "0.55.0",
18
+ "@voltro/cli": "0.56.0",
19
+ "@voltro/client": "0.56.0",
20
+ "@voltro/env": "0.56.0",
21
+ "@voltro/i18n": "0.56.0",
22
+ "@voltro/serverless": "0.56.0",
23
+ "@voltro/web": "0.56.0",
24
24
  "effect": "^3.22.0",
25
25
  "react": "^19.0.0",
26
26
  "react-dom": "^19.0.0"
27
27
  },
28
28
  "devDependencies": {
29
- "@voltro/devtools": "0.55.0",
29
+ "@voltro/devtools": "0.56.0",
30
30
  "@types/react": "^19.0.0",
31
31
  "@types/react-dom": "^19.0.0",
32
32
  "jsdom": "^30.0.0",
@@ -18,7 +18,7 @@
18
18
 
19
19
  import type { FormEvent, ReactNode } from 'react'
20
20
  import { useState } from 'react'
21
- import { island } from '@voltro/web'
21
+ import { island } from '@voltro/web/islands'
22
22
  import { CONTACT_ENDPOINT } from '../config'
23
23
 
24
24
  // Every user-facing string the island shows, resolved per-locale by the page.
@@ -12,17 +12,16 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@voltro/cli": "0.55.0",
16
- "@voltro/client": "0.55.0",
17
- "@voltro/env": "0.55.0",
18
- "@voltro/i18n": "0.55.0",
19
- "@voltro/ui-shadcn": "0.55.0",
20
- "@voltro/web": "0.55.0",
15
+ "@voltro/cli": "0.56.0",
16
+ "@voltro/client": "0.56.0",
17
+ "@voltro/env": "0.56.0",
18
+ "@voltro/i18n": "0.56.0",
19
+ "@voltro/web": "0.56.0",
21
20
  "react": "^19.0.0",
22
21
  "react-dom": "^19.0.0"
23
22
  },
24
23
  "devDependencies": {
25
- "@voltro/devtools": "0.55.0",
24
+ "@voltro/devtools": "0.56.0",
26
25
  "@types/react": "^19.0.0",
27
26
  "@types/react-dom": "^19.0.0",
28
27
  "jsdom": "^30.0.0",
@@ -5,8 +5,7 @@
5
5
  // segment for it. Here it gives the public pages a marketing header/footer
6
6
  // distinct from the dashboard's sidebar shell.
7
7
  import type { ReactNode } from 'react'
8
- import { T, useLocale, useT } from '@voltro/i18n'
9
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
8
+ import { T, useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
10
9
  import { APP_NAME } from '../../config'
11
10
 
12
11
  const LOCALES = [
@@ -10,8 +10,7 @@
10
10
  // can't redirect per-visitor, and the build rejects a RedirectError there.
11
11
  import type { ReactNode } from 'react'
12
12
  import { RedirectError, useLoaderData, useLocation, type LoaderFn } from '@voltro/web'
13
- import { T, useLocale, useT } from '@voltro/i18n'
14
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
13
+ import { T, useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
15
14
  import { APP_NAME } from '../../config'
16
15
  import { isSignedIn } from '../../lib/auth'
17
16
 
@@ -12,19 +12,19 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@voltro/cli": "0.55.0",
16
- "@voltro/client": "0.55.0",
17
- "@voltro/content": "0.55.0",
18
- "@voltro/env": "0.55.0",
19
- "@voltro/i18n": "0.55.0",
20
- "@voltro/ui-shadcn": "0.55.0",
21
- "@voltro/web": "0.55.0",
15
+ "@voltro/cli": "0.56.0",
16
+ "@voltro/client": "0.56.0",
17
+ "@voltro/content": "0.56.0",
18
+ "@voltro/env": "0.56.0",
19
+ "@voltro/i18n": "0.56.0",
20
+ "@voltro/ui-shadcn": "0.56.0",
21
+ "@voltro/web": "0.56.0",
22
22
  "effect": "^3.22.0",
23
23
  "react": "^19.0.0",
24
24
  "react-dom": "^19.0.0"
25
25
  },
26
26
  "devDependencies": {
27
- "@voltro/devtools": "0.55.0",
27
+ "@voltro/devtools": "0.56.0",
28
28
  "@types/react": "^19.0.0",
29
29
  "@types/react-dom": "^19.0.0",
30
30
  "jsdom": "^30.0.0",
@@ -12,16 +12,16 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@voltro/cli": "0.55.0",
16
- "@voltro/client": "0.55.0",
17
- "@voltro/env": "0.55.0",
18
- "@voltro/i18n": "0.55.0",
19
- "@voltro/web": "0.55.0",
15
+ "@voltro/cli": "0.56.0",
16
+ "@voltro/client": "0.56.0",
17
+ "@voltro/env": "0.56.0",
18
+ "@voltro/i18n": "0.56.0",
19
+ "@voltro/web": "0.56.0",
20
20
  "react": "^19.0.0",
21
21
  "react-dom": "^19.0.0"
22
22
  },
23
23
  "devDependencies": {
24
- "@voltro/devtools": "0.55.0",
24
+ "@voltro/devtools": "0.56.0",
25
25
  "@types/react": "^19.0.0",
26
26
  "@types/react-dom": "^19.0.0",
27
27
  "jsdom": "^30.0.0",
@@ -12,17 +12,17 @@
12
12
  "typecheck": "tsc --noEmit"
13
13
  },
14
14
  "dependencies": {
15
- "@voltro/cli": "0.55.0",
16
- "@voltro/client": "0.55.0",
17
- "@voltro/env": "0.55.0",
18
- "@voltro/i18n": "0.55.0",
19
- "@voltro/ui-shadcn": "0.55.0",
20
- "@voltro/web": "0.55.0",
15
+ "@voltro/cli": "0.56.0",
16
+ "@voltro/client": "0.56.0",
17
+ "@voltro/env": "0.56.0",
18
+ "@voltro/i18n": "0.56.0",
19
+ "@voltro/ui-shadcn": "0.56.0",
20
+ "@voltro/web": "0.56.0",
21
21
  "react": "^19.0.0",
22
22
  "react-dom": "^19.0.0"
23
23
  },
24
24
  "devDependencies": {
25
- "@voltro/devtools": "0.55.0",
25
+ "@voltro/devtools": "0.56.0",
26
26
  "@types/react": "^19.0.0",
27
27
  "@types/react-dom": "^19.0.0",
28
28
  "jsdom": "^30.0.0",