@voltro/cli 0.23.0 → 0.24.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 (64) hide show
  1. package/CHANGELOG.md +111 -0
  2. package/bin/voltro.mjs +39 -4
  3. package/dist/{apiBuild-JQtIhZPy.js → apiBuild-B2m4XK_8.js} +44 -22
  4. package/dist/apiBuild-UEM3QBke.js +2 -0
  5. package/dist/bin.js +2 -2
  6. package/dist/{commands-Bsu9Buln.js → commands-CaIhTsC2.js} +2565 -2444
  7. package/dist/{dbCommand-GI7-BVZt.js → dbCommand-CC61CsAc.js} +248 -218
  8. package/dist/dbCommand-Cr__4ATv.js +2 -0
  9. package/dist/{dev-DRxF_qOB.js → dev-DPkQVUTP.js} +1 -1
  10. package/dist/{dev-jM07kq_D.js → dev-NCuEhNxs.js} +1039 -1021
  11. package/dist/index.js +1 -1
  12. package/dist/{serveCommand-Cl8sicD5.js → serveCommand-C4gzDZzc.js} +349 -336
  13. package/dist/serveEntry.js +1 -1
  14. package/package.json +17 -17
  15. package/templates/agent-docs/authentication.md +21 -0
  16. package/templates/agent-docs/cli.md +17 -0
  17. package/templates/agent-docs/data.md +185 -165
  18. package/templates/agent-docs/database/migrations.md +92 -63
  19. package/templates/agent-docs/database/seedsdialects.md +12 -0
  20. package/templates/agent-docs/deployment.md +66 -1
  21. package/templates/agent-docs/workflows.md +30 -0
  22. package/templates/apps/api-ai/package.json +8 -7
  23. package/templates/apps/api-auth/package.json +9 -8
  24. package/templates/apps/api-backend/package.json +8 -7
  25. package/templates/apps/api-backend-deactivation/package.json +8 -7
  26. package/templates/apps/api-backend-mail/package.json +9 -8
  27. package/templates/apps/api-backend-mariadb/package.json +10 -9
  28. package/templates/apps/api-backend-storage/package.json +9 -8
  29. package/templates/apps/api-data-advanced/package.json +9 -8
  30. package/templates/apps/api-durable/package.json +9 -8
  31. package/templates/apps/api-feature-flags/package.json +10 -9
  32. package/templates/apps/api-governance/package.json +9 -8
  33. package/templates/apps/api-kv/package.json +9 -8
  34. package/templates/apps/api-moderation/package.json +9 -8
  35. package/templates/apps/api-observability/package.json +9 -8
  36. package/templates/apps/api-ratelimit/package.json +9 -8
  37. package/templates/apps/api-rbac/package.json +9 -8
  38. package/templates/apps/api-rest/package.json +8 -7
  39. package/templates/apps/api-saas/package.json +12 -11
  40. package/templates/apps/api-search/package.json +9 -8
  41. package/templates/apps/api-versioning/package.json +9 -8
  42. package/templates/apps/api-webhooks/package.json +10 -9
  43. package/templates/apps/changelog/package.json +7 -6
  44. package/templates/apps/edge-functions/package.json +3 -2
  45. package/templates/apps/frontend-admin/package.json +9 -8
  46. package/templates/apps/frontend-app/package.json +9 -8
  47. package/templates/apps/frontend-blank/package.json +8 -7
  48. package/templates/apps/frontend-contact/package.json +8 -7
  49. package/templates/apps/frontend-contact/src/globals.d.ts +6 -0
  50. package/templates/apps/frontend-dashboard/package.json +8 -7
  51. package/templates/apps/frontend-docs/package.json +8 -7
  52. package/templates/apps/frontend-docs/src/globals.d.ts +6 -0
  53. package/templates/apps/frontend-i18n/package.json +7 -6
  54. package/templates/apps/frontend-landing/package.json +8 -7
  55. package/templates/apps/frontend-landing/src/globals.d.ts +6 -0
  56. package/templates/apps/frontend-spa/package.json +8 -7
  57. package/templates/apps/frontend-spa/src/globals.d.ts +6 -0
  58. package/templates/apps/frontend-ssr/package.json +8 -7
  59. package/templates/apps/frontend-ssr/src/globals.d.ts +6 -0
  60. package/templates/apps/frontend-ssr-api/package.json +9 -8
  61. package/templates/apps/frontend-static-blog/package.json +7 -6
  62. package/templates/apps/frontend-static-blog/src/globals.d.ts +6 -0
  63. package/dist/apiBuild-CD-4JLLA.js +0 -2
  64. package/dist/dbCommand-CSguuUQn.js +0 -2
@@ -225,6 +225,18 @@ DB_URL=file:./db.sqlite # or `:memory:` for ephemeral
225
225
 
226
226
  The `app.config.ts` `store:` field stays as the dev-friendly shortcut (`store: 'postgres'`, `store: 'memory'`) — env always wins.
227
227
 
228
+ ### Query timeout — bound a runaway query
229
+
230
+ ```sh
231
+ DB_STATEMENT_TIMEOUT_MS=30000 # cancel any single query after 30s
232
+ ```
233
+
234
+ A missing index or an accidental cartesian join can run for minutes, and while it does it **pins a pooled connection**. Enough of them under load and the pool is exhausted — every other request now waits on a connection that will never free, and the whole app stalls. `DB_STATEMENT_TIMEOUT_MS` puts a ceiling on it: a query that outlasts the deadline is cancelled, its connection returns to the pool, and the caller gets a normal error instead of a hang.
235
+
236
+ It applies to the **runtime query path only**. Migrations (`voltro db apply`) run legitimately long statements — backfills, index builds — and are **never** cancelled by it. (Caveat: `voltro dev`'s boot auto-migrate shares the app connection, so a very slow dev migration under a low timeout would trip it — raise the value, or run `voltro db apply` first.)
237
+
238
+ **Wired for postgres today** (the default dialect), where it maps to the server-side `statement_timeout` — a real, server-enforced cancel (SQLSTATE `57014`), not a client-side disconnect that leaves the query running. Other dialects accept the variable but currently ignore it, and the reasons are honest rather than incidental: `@effect/sql-mssql` exposes only a connection-establishment timeout, not a per-request one; MySQL/MariaDB's `max_execution_time` bounds `SELECT`s only (writes stay unbounded), which would be a misleading half-guarantee; and SQLite is in-process with a single connection, so there is no pool to protect. Unset (or any non-postgres dialect) = no timeout.
239
+
228
240
  ## Local development — bring up all five
229
241
 
230
242
  The framework ships a docker-compose at `voltro/test/docker-compose.yml` that brings up postgres + mysql + mariadb + mssql on distinct ports so per-dialect tests can run side-by-side and the dev fixture never clashes with your starter postgres on `:5432`:
@@ -918,6 +918,44 @@ under `NODE_ENV=production` (it refuses unless both fingerprints still match the
918
918
  reviewed plan). A Job runs **once per release** vs an `initContainer`'s once per
919
919
  replica, so it's the better fit for a multi-replica rollout.
920
920
 
921
+ ### Expand/contract — the migration that's safe while old pods still serve
922
+
923
+ The pre-deploy Job applies the schema **before the new pods roll** — so during a
924
+ rolling update, old pods (old code) run against the already-migrated schema for
925
+ the length of the rollout. A migration that DROPS or RENAMES a column, NARROWS a
926
+ type, or ADDS a constraint breaks those old pods mid-rollout: they 500 reading a
927
+ column that's gone, or their writes are rejected by the new constraint. The
928
+ migration "succeeded" and the app served errors anyway.
929
+
930
+ `voltro db plan` flags these — the operations unsafe under a rolling deploy are
931
+ listed with a `⚠`, separately from the data-safety (lossy / blocked) gate, since
932
+ the two are orthogonal: a `dropped()` column is blessed for data loss and *still*
933
+ breaks an old reader.
934
+
935
+ ```text
936
+ ⚠ 1 operation(s) UNSAFE under a rolling deploy
937
+ (old + new instances overlap → old code breaks against the new schema):
938
+ • drop-column: old instances still SELECT/INSERT "orders"."legacy_total"; …
939
+ → stop reading the column in code and deploy that first; drop it in a LATER deploy
940
+ ```
941
+
942
+ Two ways to handle it:
943
+
944
+ 1. **No overlap window** — a maintenance-window or **scale-to-zero** deploy (old
945
+ pods gone before new ones start) has no simultaneous old code, so a single-step
946
+ drop/rename is fine. The advisory doesn't apply; ignore it.
947
+ 2. **Zero-downtime rollout** — split the breaking change into two releases, each
948
+ of which keeps *both* code versions working (**expand/contract**):
949
+ - **Expand** (release N): add the new shape — a nullable column, a new table,
950
+ a backfill, dual-write from the new code. Old code ignores it.
951
+ - **Cut over**: the new code reads/writes the new shape; deploy it.
952
+ - **Contract** (release N+1): once no pod runs the old code, drop/rename/narrow
953
+ the now-unused old shape. This step's `db plan` is clean.
954
+
955
+ Renaming `orders.total` → `orders.amount` under zero downtime is: add `amount`
956
+ (expand) → backfill + dual-write → cut reads over → drop `total` (contract) — three
957
+ releases, never one, so no in-flight pod ever references a column that isn't there.
958
+
921
959
  ### If you DO run `voltro dev` in a cluster (dev / staging only)
922
960
 
923
961
  `voltro dev` binds a small **boot-health surface** on its own port so a probe can
@@ -1059,6 +1097,33 @@ that route to a terminating pod before k8s finishes removing it from the Service
1059
1097
  endpoints. With it, that window is drained. `terminationGracePeriodSeconds` must
1060
1098
  be larger than the sleep plus the app's own teardown, or k8s SIGKILLs mid-drain.
1061
1099
 
1100
+ **Bound the app's own teardown with `VOLTRO_SHUTDOWN_GRACE_MS`.** After
1101
+ `SIGTERM`, the runtime runs its finalizers (pool close, plugin `onDeactivate`,
1102
+ analytics flush, trace persist) and then exits — but installing the signal
1103
+ handler removes node's default kill, so a finalizer that *never* completes (a
1104
+ pool drain against a database that is already gone, a wedged `onDeactivate`)
1105
+ would otherwise hang the process forever. A hard deadline caps that: teardown
1106
+ gets until the deadline, then the process exits regardless. It defaults to
1107
+ **10s**; set `VOLTRO_SHUTDOWN_GRACE_MS` (clamped to 1s–5min) to sit JUST UNDER
1108
+ your `terminationGracePeriodSeconds` minus the preStop sleep — so the app drains
1109
+ and exits *cleanly on its own* before k8s SIGKILLs it mid-drain:
1110
+
1111
+ ```yaml
1112
+ spec:
1113
+ terminationGracePeriodSeconds: 30
1114
+ containers:
1115
+ - name: api
1116
+ env:
1117
+ # preStop sleep (5s) + app teardown (≤22s) < 30s grace, with headroom.
1118
+ - name: VOLTRO_SHUTDOWN_GRACE_MS
1119
+ value: "22000"
1120
+ ```
1121
+
1122
+ The close is clean on the client side too: on shutdown each live WebSocket is
1123
+ closed with a proper close frame (not an abrupt socket drop), and the web
1124
+ client's supervisor reconnects on any close — so an open dashboard re-attaches
1125
+ to a healthy replica across a rolling deploy without a page reload.
1126
+
1062
1127
  ## 8. Multiple replicas
1063
1128
 
1064
1129
  Cache and KV default to **in-process** (per-replica). For a shared backend across replicas:
@@ -1087,7 +1152,7 @@ Schedules and aggregates auto-coordinate via an advisory lock on SQL stores —
1087
1152
  - [ ] `auth.anonymousTenantRequired: true` (unless the app serves anonymous public data)
1088
1153
  - [ ] `OTEL_EXPORTER_OTLP_ENDPOINT` + `OTEL_SERVICE_NAME` pointed at your collector
1089
1154
  - [ ] `VOLTRO_LOG_FORMAT=json`; `sentryPlugin()` + `SENTRY_DSN` for errors
1090
- - [ ] `terminationGracePeriodSeconds` generous for graceful drain
1155
+ - [ ] `terminationGracePeriodSeconds` generous for graceful drain; `VOLTRO_SHUTDOWN_GRACE_MS` set just under it (minus the preStop sleep)
1091
1156
  - [ ] `CACHE_BACKEND` / `KV_BACKEND` + a cross-replica change bus when running >1 replica
1092
1157
 
1093
1158
 
@@ -474,6 +474,36 @@ Workflow starts persist the starter subject, trace id, source, parent execution
474
474
 
475
475
  Still include tenant/user ids that the business process must enforce in `payload`, validate them in the first step, and scope store reads/writes deliberately. Payload data is replay-safe and makes authorization decisions auditable across retries and deploys.
476
476
 
477
+ ## Calling an HTTP API from a step
478
+
479
+ The framework's `HttpClient` is available inside a workflow executor — the same one handlers `yield*`, with the same SSRF allowlist and the same automatic `traceparent` propagation. `yield*` it in a step:
480
+
481
+ ```ts
482
+ import { HttpClient, HttpClientRequest } from '@effect/platform'
483
+
484
+ export const executor = defineWorkflowExecutor(syncInvoice, (payload) =>
485
+ Effect.gen(function* () {
486
+ const remote = yield* step({ name: 'fetch-invoice' }, () =>
487
+ Effect.gen(function* () {
488
+ const client = yield* HttpClient.HttpClient
489
+ const res = yield* client.execute(
490
+ HttpClientRequest.get(`https://billing.example.com/invoices/${payload.invoiceId}`),
491
+ )
492
+ return yield* res.json
493
+ }),
494
+ )
495
+ yield* step({ name: 'persist' }, () => database.invoices.update(payload.invoiceId, remote))
496
+ }),
497
+ )
498
+ ```
499
+
500
+ Two things follow from where it sits:
501
+
502
+ - **Wrap the call in a `step`.** The result is then checkpointed, so a retry or a resume after a deploy replays the recorded response instead of calling the remote again. A bare `yield*` outside a step re-issues the request on every replay — which for a payment capture or an email send is the difference between once and several times.
503
+ - **It is the SSRF-guarded client.** Requests to internal targets are refused by the same policy handlers get; a workflow is not a way around it. Configure the allowlist once in `app.config.ts` under `http` — dev and serve read the same key, so the policy cannot differ between them.
504
+
505
+ Reaching for `fetch` instead loses both: no allowlist, no trace propagation, and nothing tying the call to the step that made it.
506
+
477
507
  ## Anti-patterns
478
508
 
479
509
  - **Using `input` in `workflow({...})`.** The current API is `payload`.
@@ -5,22 +5,23 @@
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "voltro dev .",
8
+ "lint": "voltro doctor .",
8
9
  "test": "voltro test",
9
10
  "typecheck": "tsc --noEmit"
10
11
  },
11
12
  "dependencies": {
12
13
  "@effect/platform": "^0.97.0",
13
14
  "@effect/rpc": "^0.76.0",
14
- "@voltro/ai": "0.23.0",
15
- "@voltro/cli": "0.23.0",
16
- "@voltro/database": "0.23.0",
17
- "@voltro/env": "0.23.0",
18
- "@voltro/protocol": "0.23.0",
19
- "@voltro/runtime": "0.23.0",
15
+ "@voltro/ai": "0.24.0",
16
+ "@voltro/cli": "0.24.0",
17
+ "@voltro/database": "0.24.0",
18
+ "@voltro/env": "0.24.0",
19
+ "@voltro/protocol": "0.24.0",
20
+ "@voltro/runtime": "0.24.0",
20
21
  "effect": "^3.22.0"
21
22
  },
22
23
  "devDependencies": {
23
- "@voltro/testing": "0.23.0",
24
+ "@voltro/testing": "0.24.0",
24
25
  "typescript": "^6.0.3",
25
26
  "vitest": "^4.1.10"
26
27
  }
@@ -5,6 +5,7 @@
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "voltro dev .",
8
+ "lint": "voltro doctor .",
8
9
  "migrate": "voltro migrate",
9
10
  "test": "voltro test",
10
11
  "typecheck": "tsc --noEmit"
@@ -12,17 +13,17 @@
12
13
  "dependencies": {
13
14
  "@effect/platform": "^0.97.0",
14
15
  "@effect/rpc": "^0.76.0",
15
- "@voltro/cli": "0.23.0",
16
- "@voltro/database": "0.23.0",
17
- "@voltro/env": "0.23.0",
18
- "@voltro/plugin-auth": "0.23.0",
19
- "@voltro/protocol": "0.23.0",
20
- "@voltro/runtime": "0.23.0",
21
- "@voltro/sql-postgres": "0.23.0",
16
+ "@voltro/cli": "0.24.0",
17
+ "@voltro/database": "0.24.0",
18
+ "@voltro/env": "0.24.0",
19
+ "@voltro/plugin-auth": "0.24.0",
20
+ "@voltro/protocol": "0.24.0",
21
+ "@voltro/runtime": "0.24.0",
22
+ "@voltro/sql-postgres": "0.24.0",
22
23
  "effect": "^3.22.0"
23
24
  },
24
25
  "devDependencies": {
25
- "@voltro/testing": "0.23.0",
26
+ "@voltro/testing": "0.24.0",
26
27
  "typescript": "^6.0.3",
27
28
  "vitest": "^4.1.10"
28
29
  }
@@ -5,6 +5,7 @@
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "voltro dev .",
8
+ "lint": "voltro doctor .",
8
9
  "migrate": "voltro migrate",
9
10
  "test": "voltro test",
10
11
  "typecheck": "tsc --noEmit"
@@ -12,16 +13,16 @@
12
13
  "dependencies": {
13
14
  "@effect/platform": "^0.97.0",
14
15
  "@effect/rpc": "^0.76.0",
15
- "@voltro/cli": "0.23.0",
16
- "@voltro/database": "0.23.0",
17
- "@voltro/env": "0.23.0",
18
- "@voltro/plugin-multitenancy": "0.23.0",
19
- "@voltro/protocol": "0.23.0",
20
- "@voltro/runtime": "0.23.0",
16
+ "@voltro/cli": "0.24.0",
17
+ "@voltro/database": "0.24.0",
18
+ "@voltro/env": "0.24.0",
19
+ "@voltro/plugin-multitenancy": "0.24.0",
20
+ "@voltro/protocol": "0.24.0",
21
+ "@voltro/runtime": "0.24.0",
21
22
  "effect": "^3.22.0"
22
23
  },
23
24
  "devDependencies": {
24
- "@voltro/testing": "0.23.0",
25
+ "@voltro/testing": "0.24.0",
25
26
  "typescript": "^6.0.3",
26
27
  "vitest": "^4.1.10"
27
28
  }
@@ -5,6 +5,7 @@
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "voltro dev .",
8
+ "lint": "voltro doctor .",
8
9
  "migrate": "voltro migrate",
9
10
  "test": "voltro test",
10
11
  "typecheck": "tsc --noEmit"
@@ -12,16 +13,16 @@
12
13
  "dependencies": {
13
14
  "@effect/platform": "^0.97.0",
14
15
  "@effect/rpc": "^0.76.0",
15
- "@voltro/cli": "0.23.0",
16
- "@voltro/database": "0.23.0",
17
- "@voltro/env": "0.23.0",
18
- "@voltro/plugin-deactivation": "0.23.0",
19
- "@voltro/protocol": "0.23.0",
20
- "@voltro/runtime": "0.23.0",
16
+ "@voltro/cli": "0.24.0",
17
+ "@voltro/database": "0.24.0",
18
+ "@voltro/env": "0.24.0",
19
+ "@voltro/plugin-deactivation": "0.24.0",
20
+ "@voltro/protocol": "0.24.0",
21
+ "@voltro/runtime": "0.24.0",
21
22
  "effect": "^3.22.0"
22
23
  },
23
24
  "devDependencies": {
24
- "@voltro/testing": "0.23.0",
25
+ "@voltro/testing": "0.24.0",
25
26
  "typescript": "^6.0.3",
26
27
  "vitest": "^4.1.10"
27
28
  }
@@ -5,6 +5,7 @@
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "voltro dev .",
8
+ "lint": "voltro doctor .",
8
9
  "migrate": "voltro migrate",
9
10
  "typecheck": "tsc --noEmit",
10
11
  "test": "voltro test"
@@ -12,18 +13,18 @@
12
13
  "dependencies": {
13
14
  "@react-email/components": "^1.0.12",
14
15
  "@react-email/render": "^1.4.0",
15
- "@voltro/cli": "0.23.0",
16
- "@voltro/database": "0.23.0",
17
- "@voltro/env": "0.23.0",
18
- "@voltro/plugin-mail": "0.23.0",
19
- "@voltro/plugin-multitenancy": "0.23.0",
20
- "@voltro/protocol": "0.23.0",
21
- "@voltro/runtime": "0.23.0",
16
+ "@voltro/cli": "0.24.0",
17
+ "@voltro/database": "0.24.0",
18
+ "@voltro/env": "0.24.0",
19
+ "@voltro/plugin-mail": "0.24.0",
20
+ "@voltro/plugin-multitenancy": "0.24.0",
21
+ "@voltro/protocol": "0.24.0",
22
+ "@voltro/runtime": "0.24.0",
22
23
  "effect": "^3.22.0",
23
24
  "react": "^19.0.0"
24
25
  },
25
26
  "devDependencies": {
26
- "@voltro/testing": "0.23.0",
27
+ "@voltro/testing": "0.24.0",
27
28
  "typescript": "^6.0.3",
28
29
  "vitest": "^4.1.10"
29
30
  }
@@ -5,6 +5,7 @@
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "voltro dev .",
8
+ "lint": "voltro doctor .",
8
9
  "migrate": "voltro migrate",
9
10
  "test": "voltro test",
10
11
  "typecheck": "tsc --noEmit"
@@ -12,18 +13,18 @@
12
13
  "dependencies": {
13
14
  "@effect/platform": "^0.97.0",
14
15
  "@effect/rpc": "^0.76.0",
15
- "@voltro/cli": "0.23.0",
16
- "@voltro/database": "0.23.0",
17
- "@voltro/env": "0.23.0",
18
- "@voltro/plugin-multitenancy": "0.23.0",
19
- "@voltro/plugin-storage": "0.23.0",
20
- "@voltro/protocol": "0.23.0",
21
- "@voltro/runtime": "0.23.0",
22
- "@voltro/sql-mysql": "0.23.0",
16
+ "@voltro/cli": "0.24.0",
17
+ "@voltro/database": "0.24.0",
18
+ "@voltro/env": "0.24.0",
19
+ "@voltro/plugin-multitenancy": "0.24.0",
20
+ "@voltro/plugin-storage": "0.24.0",
21
+ "@voltro/protocol": "0.24.0",
22
+ "@voltro/runtime": "0.24.0",
23
+ "@voltro/sql-mysql": "0.24.0",
23
24
  "effect": "^3.22.0"
24
25
  },
25
26
  "devDependencies": {
26
- "@voltro/testing": "0.23.0",
27
+ "@voltro/testing": "0.24.0",
27
28
  "typescript": "^6.0.3",
28
29
  "vitest": "^4.1.10"
29
30
  }
@@ -5,22 +5,23 @@
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "voltro dev .",
8
+ "lint": "voltro doctor .",
8
9
  "migrate": "voltro migrate",
9
10
  "typecheck": "tsc --noEmit",
10
11
  "test": "voltro test"
11
12
  },
12
13
  "dependencies": {
13
- "@voltro/cli": "0.23.0",
14
- "@voltro/database": "0.23.0",
15
- "@voltro/env": "0.23.0",
16
- "@voltro/plugin-multitenancy": "0.23.0",
17
- "@voltro/plugin-storage": "0.23.0",
18
- "@voltro/protocol": "0.23.0",
19
- "@voltro/runtime": "0.23.0",
14
+ "@voltro/cli": "0.24.0",
15
+ "@voltro/database": "0.24.0",
16
+ "@voltro/env": "0.24.0",
17
+ "@voltro/plugin-multitenancy": "0.24.0",
18
+ "@voltro/plugin-storage": "0.24.0",
19
+ "@voltro/protocol": "0.24.0",
20
+ "@voltro/runtime": "0.24.0",
20
21
  "effect": "^3.22.0"
21
22
  },
22
23
  "devDependencies": {
23
- "@voltro/testing": "0.23.0",
24
+ "@voltro/testing": "0.24.0",
24
25
  "typescript": "^6.0.3",
25
26
  "vitest": "^4.1.10"
26
27
  }
@@ -5,23 +5,24 @@
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "voltro dev .",
8
+ "lint": "voltro doctor .",
8
9
  "test": "voltro test",
9
10
  "typecheck": "tsc --noEmit"
10
11
  },
11
12
  "dependencies": {
12
13
  "@effect/platform": "^0.97.0",
13
14
  "@effect/rpc": "^0.76.0",
14
- "@voltro/cli": "0.23.0",
15
- "@voltro/database": "0.23.0",
16
- "@voltro/env": "0.23.0",
17
- "@voltro/plugin-governance": "0.23.0",
18
- "@voltro/plugin-multitenancy": "0.23.0",
19
- "@voltro/protocol": "0.23.0",
20
- "@voltro/runtime": "0.23.0",
15
+ "@voltro/cli": "0.24.0",
16
+ "@voltro/database": "0.24.0",
17
+ "@voltro/env": "0.24.0",
18
+ "@voltro/plugin-governance": "0.24.0",
19
+ "@voltro/plugin-multitenancy": "0.24.0",
20
+ "@voltro/protocol": "0.24.0",
21
+ "@voltro/runtime": "0.24.0",
21
22
  "effect": "^3.22.0"
22
23
  },
23
24
  "devDependencies": {
24
- "@voltro/testing": "0.23.0",
25
+ "@voltro/testing": "0.24.0",
25
26
  "typescript": "^6.0.3",
26
27
  "vitest": "^4.1.10"
27
28
  }
@@ -5,23 +5,24 @@
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "voltro dev .",
8
+ "lint": "voltro doctor .",
8
9
  "test": "voltro test",
9
10
  "typecheck": "tsc --noEmit"
10
11
  },
11
12
  "dependencies": {
12
13
  "@effect/platform": "^0.97.0",
13
14
  "@effect/rpc": "^0.76.0",
14
- "@voltro/cli": "0.23.0",
15
- "@voltro/database": "0.23.0",
16
- "@voltro/env": "0.23.0",
17
- "@voltro/plugin-multitenancy": "0.23.0",
18
- "@voltro/protocol": "0.23.0",
19
- "@voltro/runtime": "0.23.0",
20
- "@voltro/workflow": "0.23.0",
15
+ "@voltro/cli": "0.24.0",
16
+ "@voltro/database": "0.24.0",
17
+ "@voltro/env": "0.24.0",
18
+ "@voltro/plugin-multitenancy": "0.24.0",
19
+ "@voltro/protocol": "0.24.0",
20
+ "@voltro/runtime": "0.24.0",
21
+ "@voltro/workflow": "0.24.0",
21
22
  "effect": "^3.22.0"
22
23
  },
23
24
  "devDependencies": {
24
- "@voltro/testing": "0.23.0",
25
+ "@voltro/testing": "0.24.0",
25
26
  "typescript": "^6.0.3",
26
27
  "vitest": "^4.1.10"
27
28
  }
@@ -5,6 +5,7 @@
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "voltro dev .",
8
+ "lint": "voltro doctor .",
8
9
  "migrate": "voltro migrate",
9
10
  "test": "voltro test",
10
11
  "typecheck": "tsc --noEmit"
@@ -12,18 +13,18 @@
12
13
  "dependencies": {
13
14
  "@effect/platform": "^0.97.0",
14
15
  "@effect/rpc": "^0.76.0",
15
- "@voltro/cli": "0.23.0",
16
- "@voltro/database": "0.23.0",
17
- "@voltro/env": "0.23.0",
18
- "@voltro/plugin-flags": "0.23.0",
19
- "@voltro/plugin-multitenancy": "0.23.0",
20
- "@voltro/protocol": "0.23.0",
21
- "@voltro/runtime": "0.23.0",
22
- "@voltro/sql-postgres": "0.23.0",
16
+ "@voltro/cli": "0.24.0",
17
+ "@voltro/database": "0.24.0",
18
+ "@voltro/env": "0.24.0",
19
+ "@voltro/plugin-flags": "0.24.0",
20
+ "@voltro/plugin-multitenancy": "0.24.0",
21
+ "@voltro/protocol": "0.24.0",
22
+ "@voltro/runtime": "0.24.0",
23
+ "@voltro/sql-postgres": "0.24.0",
23
24
  "effect": "^3.22.0"
24
25
  },
25
26
  "devDependencies": {
26
- "@voltro/testing": "0.23.0",
27
+ "@voltro/testing": "0.24.0",
27
28
  "typescript": "^6.0.3",
28
29
  "vitest": "^4.1.10"
29
30
  }
@@ -5,6 +5,7 @@
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "voltro dev .",
8
+ "lint": "voltro doctor .",
8
9
  "migrate": "voltro migrate",
9
10
  "test": "voltro test",
10
11
  "typecheck": "tsc --noEmit"
@@ -12,17 +13,17 @@
12
13
  "dependencies": {
13
14
  "@effect/platform": "^0.97.0",
14
15
  "@effect/rpc": "^0.76.0",
15
- "@voltro/cli": "0.23.0",
16
- "@voltro/database": "0.23.0",
17
- "@voltro/env": "0.23.0",
18
- "@voltro/plugin-audit": "0.23.0",
19
- "@voltro/plugin-governance": "0.23.0",
20
- "@voltro/protocol": "0.23.0",
21
- "@voltro/runtime": "0.23.0",
16
+ "@voltro/cli": "0.24.0",
17
+ "@voltro/database": "0.24.0",
18
+ "@voltro/env": "0.24.0",
19
+ "@voltro/plugin-audit": "0.24.0",
20
+ "@voltro/plugin-governance": "0.24.0",
21
+ "@voltro/protocol": "0.24.0",
22
+ "@voltro/runtime": "0.24.0",
22
23
  "effect": "^3.22.0"
23
24
  },
24
25
  "devDependencies": {
25
- "@voltro/testing": "0.23.0",
26
+ "@voltro/testing": "0.24.0",
26
27
  "typescript": "^6.0.3",
27
28
  "vitest": "^4.1.10"
28
29
  }
@@ -5,23 +5,24 @@
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "voltro dev .",
8
+ "lint": "voltro doctor .",
8
9
  "test": "voltro test",
9
10
  "typecheck": "tsc --noEmit"
10
11
  },
11
12
  "dependencies": {
12
13
  "@effect/platform": "^0.97.0",
13
14
  "@effect/rpc": "^0.76.0",
14
- "@voltro/cli": "0.23.0",
15
- "@voltro/database": "0.23.0",
16
- "@voltro/env": "0.23.0",
17
- "@voltro/kv": "0.23.0",
18
- "@voltro/plugin-multitenancy": "0.23.0",
19
- "@voltro/protocol": "0.23.0",
20
- "@voltro/runtime": "0.23.0",
15
+ "@voltro/cli": "0.24.0",
16
+ "@voltro/database": "0.24.0",
17
+ "@voltro/env": "0.24.0",
18
+ "@voltro/kv": "0.24.0",
19
+ "@voltro/plugin-multitenancy": "0.24.0",
20
+ "@voltro/protocol": "0.24.0",
21
+ "@voltro/runtime": "0.24.0",
21
22
  "effect": "^3.22.0"
22
23
  },
23
24
  "devDependencies": {
24
- "@voltro/testing": "0.23.0",
25
+ "@voltro/testing": "0.24.0",
25
26
  "typescript": "^6.0.3",
26
27
  "vitest": "^4.1.10"
27
28
  }
@@ -5,6 +5,7 @@
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "voltro dev .",
8
+ "lint": "voltro doctor .",
8
9
  "migrate": "voltro migrate",
9
10
  "test": "voltro test",
10
11
  "typecheck": "tsc --noEmit"
@@ -12,17 +13,17 @@
12
13
  "dependencies": {
13
14
  "@effect/platform": "^0.97.0",
14
15
  "@effect/rpc": "^0.76.0",
15
- "@voltro/cli": "0.23.0",
16
- "@voltro/database": "0.23.0",
17
- "@voltro/env": "0.23.0",
18
- "@voltro/plugin-moderation": "0.23.0",
19
- "@voltro/plugin-multitenancy": "0.23.0",
20
- "@voltro/protocol": "0.23.0",
21
- "@voltro/runtime": "0.23.0",
16
+ "@voltro/cli": "0.24.0",
17
+ "@voltro/database": "0.24.0",
18
+ "@voltro/env": "0.24.0",
19
+ "@voltro/plugin-moderation": "0.24.0",
20
+ "@voltro/plugin-multitenancy": "0.24.0",
21
+ "@voltro/protocol": "0.24.0",
22
+ "@voltro/runtime": "0.24.0",
22
23
  "effect": "^3.22.0"
23
24
  },
24
25
  "devDependencies": {
25
- "@voltro/testing": "0.23.0",
26
+ "@voltro/testing": "0.24.0",
26
27
  "typescript": "^6.0.3",
27
28
  "vitest": "^4.1.10"
28
29
  }
@@ -5,6 +5,7 @@
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "voltro dev .",
8
+ "lint": "voltro doctor .",
8
9
  "migrate": "voltro migrate",
9
10
  "test": "voltro test",
10
11
  "typecheck": "tsc --noEmit"
@@ -12,17 +13,17 @@
12
13
  "dependencies": {
13
14
  "@effect/platform": "^0.97.0",
14
15
  "@effect/rpc": "^0.76.0",
15
- "@voltro/cli": "0.23.0",
16
- "@voltro/database": "0.23.0",
17
- "@voltro/plugin-multitenancy": "0.23.0",
18
- "@voltro/plugin-prometheus": "0.23.0",
19
- "@voltro/plugin-sentry": "0.23.0",
20
- "@voltro/protocol": "0.23.0",
21
- "@voltro/runtime": "0.23.0",
16
+ "@voltro/cli": "0.24.0",
17
+ "@voltro/database": "0.24.0",
18
+ "@voltro/plugin-multitenancy": "0.24.0",
19
+ "@voltro/plugin-prometheus": "0.24.0",
20
+ "@voltro/plugin-sentry": "0.24.0",
21
+ "@voltro/protocol": "0.24.0",
22
+ "@voltro/runtime": "0.24.0",
22
23
  "effect": "^3.22.0"
23
24
  },
24
25
  "devDependencies": {
25
- "@voltro/testing": "0.23.0",
26
+ "@voltro/testing": "0.24.0",
26
27
  "typescript": "^6.0.3",
27
28
  "vitest": "^4.1.10"
28
29
  }