@voltro/cli 0.1.3 → 0.1.5

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 (52) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +1 -1
  3. package/dist/apiBuild-B-SMjwR_.js +62 -0
  4. package/dist/apiBuild-Blk0vma3.js +2 -0
  5. package/dist/bin.js +2 -1
  6. package/dist/commands-BHIaKj-w.js +8430 -0
  7. package/dist/dev-BhBMpHkm.js +9695 -0
  8. package/dist/dev-BjylpfGQ.js +2 -0
  9. package/dist/index.js +1 -1
  10. package/dist/startup.js +1 -1
  11. package/dist/{startupRunner-CRhuUl91.js → startupRunner-DAexyPkM.js} +17 -15
  12. package/package.json +22 -22
  13. package/templates/agent-docs/internationalization.md +26 -1
  14. package/templates/agent-docs/workflows.md +34 -0
  15. package/templates/apps/api-ai/package.json +7 -7
  16. package/templates/apps/api-auth/package.json +7 -7
  17. package/templates/apps/api-backend/package.json +7 -7
  18. package/templates/apps/api-backend-deactivation/package.json +7 -7
  19. package/templates/apps/api-backend-mail/package.json +8 -8
  20. package/templates/apps/api-backend-mariadb/package.json +9 -9
  21. package/templates/apps/api-backend-storage/package.json +8 -8
  22. package/templates/apps/api-data-advanced/package.json +8 -8
  23. package/templates/apps/api-durable/package.json +8 -8
  24. package/templates/apps/api-feature-flags/package.json +8 -8
  25. package/templates/apps/api-governance/package.json +8 -8
  26. package/templates/apps/api-kv/package.json +8 -8
  27. package/templates/apps/api-moderation/package.json +8 -8
  28. package/templates/apps/api-observability/package.json +8 -8
  29. package/templates/apps/api-ratelimit/package.json +8 -8
  30. package/templates/apps/api-rbac/package.json +8 -8
  31. package/templates/apps/api-rest/package.json +6 -6
  32. package/templates/apps/api-saas/package.json +10 -10
  33. package/templates/apps/api-search/package.json +8 -8
  34. package/templates/apps/api-versioning/package.json +8 -8
  35. package/templates/apps/api-webhooks/package.json +7 -7
  36. package/templates/apps/changelog/package.json +6 -6
  37. package/templates/apps/edge-functions/package.json +2 -2
  38. package/templates/apps/frontend-admin/package.json +8 -8
  39. package/templates/apps/frontend-app/package.json +8 -8
  40. package/templates/apps/frontend-blank/package.json +7 -7
  41. package/templates/apps/frontend-contact/package.json +7 -7
  42. package/templates/apps/frontend-dashboard/package.json +7 -7
  43. package/templates/apps/frontend-docs/package.json +7 -7
  44. package/templates/apps/frontend-i18n/package.json +6 -6
  45. package/templates/apps/frontend-landing/package.json +7 -7
  46. package/templates/apps/frontend-spa/package.json +7 -7
  47. package/templates/apps/frontend-ssr/package.json +7 -7
  48. package/templates/apps/frontend-ssr-api/package.json +8 -8
  49. package/templates/apps/frontend-static-blog/package.json +6 -6
  50. package/templates/baselines/compose/docker/api.Dockerfile +7 -1
  51. package/templates/baselines/compose-mariadb/docker/api.Dockerfile +7 -1
  52. package/dist/commands-C0o6Clo9.js +0 -18061
@@ -0,0 +1,2 @@
1
+ import { o as e } from "./dev-BhBMpHkm.js";
2
+ export { e as loadApiConfig };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { i as e, n as t, r as n, t as r } from "./commands-C0o6Clo9.js";
1
+ import { i as e, n as t, r as n, t as r } from "./commands-BHIaKj-w.js";
2
2
  //#region src/index.ts
3
3
  var i = "framework";
4
4
  //#endregion
package/dist/startup.js CHANGED
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./startupRunner-CRhuUl91.js";
1
+ import { n as e, t } from "./startupRunner-DAexyPkM.js";
2
2
  export { t as loadStartupFiles, e as runStartups };
@@ -1,30 +1,32 @@
1
1
  import { basename as e } from "node:path";
2
2
  import { pathToFileURL as t } from "node:url";
3
3
  import { publishServerError as n } from "@voltro/protocol";
4
- //#region src/startupRunner.ts
5
- var r = (e) => e.replace(/\.startup\.tsx?$/, ""), i = async (n, i) => {
6
- let a = [];
7
- for (let o of n) {
8
- let n;
4
+ //#region src/appModuleLoader.ts
5
+ var r = /* @__PURE__ */ new Map(), i = (e) => {
6
+ for (let [t, n] of Object.entries(e)) r.set(t, n);
7
+ }, a = async (e) => r.get(e) || await import(t(e).href), o = (e) => e.replace(/\.startup\.tsx?$/, ""), s = async (t, n) => {
8
+ let r = [];
9
+ for (let i of t) {
10
+ let t;
9
11
  try {
10
- n = await import(t(o).href);
12
+ t = await a(i);
11
13
  } catch (e) {
12
- i.warn("startup: failed to import", { file: o }, e);
14
+ n.warn("startup: failed to import", { file: i }, e);
13
15
  continue;
14
16
  }
15
- let s = n.default;
17
+ let s = t.default;
16
18
  if (typeof s != "function") {
17
- i.warn("startup: no default-export function", { file: o });
19
+ n.warn("startup: no default-export function", { file: i });
18
20
  continue;
19
21
  }
20
- a.push({
21
- file: o,
22
- id: r(e(o)),
22
+ r.push({
23
+ file: i,
24
+ id: o(e(i)),
23
25
  fn: s
24
26
  });
25
27
  }
26
- return a;
27
- }, a = async (e, t, r) => {
28
+ return r;
29
+ }, c = async (e, t, r) => {
28
30
  let i = [];
29
31
  for (let a of e) {
30
32
  let e = r.child(`startup:${a.id}`), o = {
@@ -68,4 +70,4 @@ var r = (e) => e.replace(/\.startup\.tsx?$/, ""), i = async (n, i) => {
68
70
  } };
69
71
  };
70
72
  //#endregion
71
- export { a as n, i as t };
73
+ export { i, c as n, a as r, s as t };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voltro/cli",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "The `voltro` CLI — dev server, codegen, migrations, project scaffolding, agent-docs seeding, and production serve.",
5
5
  "keywords": [
6
6
  "voltro",
@@ -49,27 +49,27 @@
49
49
  "@effect/workflow": "^0.18.2",
50
50
  "@tailwindcss/vite": "^4.3.2",
51
51
  "@vitejs/plugin-react": "^6.0.3",
52
- "@voltro/ai": "0.1.3",
53
- "@voltro/cache": "0.1.3",
54
- "@voltro/data-transfer": "0.1.3",
55
- "@voltro/database": "0.1.3",
56
- "@voltro/env": "0.1.3",
57
- "@voltro/kv": "0.1.3",
58
- "@voltro/logger": "0.1.3",
59
- "@voltro/plugin-auth": "0.1.3",
60
- "@voltro/plugin-broadcast": "0.1.3",
61
- "@voltro/plugin-mail": "0.1.3",
62
- "@voltro/plugin-storage": "0.1.3",
63
- "@voltro/plugin-webhooks": "0.1.3",
64
- "@voltro/protocol": "0.1.3",
65
- "@voltro/runtime": "0.1.3",
66
- "@voltro/serverless": "0.1.3",
67
- "@voltro/sql-mssql": "0.1.3",
68
- "@voltro/sql-mysql": "0.1.3",
69
- "@voltro/sql-postgres": "0.1.3",
70
- "@voltro/sql-sqlite": "0.1.3",
71
- "@voltro/sql-turso": "0.1.3",
72
- "@voltro/workflow": "0.1.3",
52
+ "@voltro/ai": "0.1.5",
53
+ "@voltro/cache": "0.1.5",
54
+ "@voltro/data-transfer": "0.1.5",
55
+ "@voltro/database": "0.1.5",
56
+ "@voltro/env": "0.1.5",
57
+ "@voltro/kv": "0.1.5",
58
+ "@voltro/logger": "0.1.5",
59
+ "@voltro/plugin-auth": "0.1.5",
60
+ "@voltro/plugin-broadcast": "0.1.5",
61
+ "@voltro/plugin-mail": "0.1.5",
62
+ "@voltro/plugin-storage": "0.1.5",
63
+ "@voltro/plugin-webhooks": "0.1.5",
64
+ "@voltro/protocol": "0.1.5",
65
+ "@voltro/runtime": "0.1.5",
66
+ "@voltro/serverless": "0.1.5",
67
+ "@voltro/sql-mssql": "0.1.5",
68
+ "@voltro/sql-mysql": "0.1.5",
69
+ "@voltro/sql-postgres": "0.1.5",
70
+ "@voltro/sql-sqlite": "0.1.5",
71
+ "@voltro/sql-turso": "0.1.5",
72
+ "@voltro/workflow": "0.1.5",
73
73
  "chokidar": "^5.0.0",
74
74
  "esbuild": "^0.28.0",
75
75
  "ioredis": "^5.11.1",
@@ -13,7 +13,7 @@ _Voltro's i18n layer (@voltro/i18n) — an opinionated wrap over react-intl, aut
13
13
 
14
14
  Voltro ships internationalization in **`@voltro/i18n`** — an opinionated, thin wrap over [`react-intl`](https://formatjs.io/docs/react-intl/) plus framework auto-wiring. A web app gets a working `<I18nProvider>` from a single field in `app.config.ts`. You never write the provider, and you never import `@voltro/i18n` in your layout.
15
15
 
16
- The public surface is intentionally small — `<I18nProvider>`, `<T>`, `useT`, `useTFn`, `useLocale`, `defineCatalog`, `defineLocale`. Power users who need an API the wrap doesn't expose (custom formatters, rich-text with React-element values, `IntlProvider`'s `timeZone` / `formats` props) `import { … } from 'react-intl'` directly. The wrap is **opt-in, not lock-in** — the library is in your `node_modules`, the wrap is optional.
16
+ The public surface is intentionally small — `<I18nProvider>`, `<T>`, `useT`, `useTFn`, `useLocale`, `useMessages`, `defineCatalog`, `defineLocale`, `pickCatalog`. Power users who need an API the wrap doesn't expose (custom formatters, rich-text with React-element values, `IntlProvider`'s `timeZone` / `formats` props) `import { … } from 'react-intl'` directly. The wrap is **opt-in, not lock-in** — the library is in your `node_modules`, the wrap is optional.
17
17
 
18
18
  ## When to enable
19
19
 
@@ -142,6 +142,31 @@ const locale = useLocale()
142
142
  - **`useT(id, values?)`** — imperative form returning a plain string, for non-JSX call sites: `placeholder`, `aria-label`, `document.title`, toasts, error messages.
143
143
  - **`useTFn()`** — returns a `(id, values?) => string` translator the component captures once. Use when one component needs `t` inside helper functions or `.map()` callbacks — `react-intl` runs once, the closure replays.
144
144
  - **`useLocale()`** — the active locale code, as React state inside the provider.
145
+ - **`useMessages()`** — the active locale's RAW catalog (`useMessages()['some.id']`): the unformatted ICU template, not the formatted output. For when you need the raw string — e.g. to feed your own formatter, or a lookup that must not run ICU.
146
+
147
+ ## Reading a message outside React — `meta({ locale })`
148
+
149
+ `useT` is a hook — it only runs inside a component, against the *active* locale. A page's `meta({ locale })` runs OUTSIDE React (at build / SSR meta-resolution time) and is handed an arbitrary locale string. Use **`pickCatalog`** to resolve a message there:
150
+
151
+ ```ts
152
+ // src/locales/index.ts
153
+ import { pickCatalog } from '@voltro/i18n'
154
+ import en from './en'
155
+ import de from './de'
156
+
157
+ export const getCatalog = (locale?: string) => pickCatalog({ en, de }, locale, 'en')
158
+ ```
159
+
160
+ ```tsx
161
+ // any page — meta gets the active locale (from the URL prefix, or the voltro:lang cookie)
162
+ import { getCatalog } from '../locales'
163
+
164
+ export const meta = ({ locale }: { readonly locale: string }): PageMeta => ({
165
+ title: getCatalog(locale)['meta.home.title'],
166
+ })
167
+ ```
168
+
169
+ `pickCatalog(catalogs, locale, defaultLocale)` returns the concrete catalog type, so a known-key lookup is `string` (not `string | undefined`) — exactly what `PageMeta.title` needs. An unknown or `undefined` locale falls back to `defaultLocale`.
145
170
 
146
171
  ## The react-intl escape hatch
147
172
 
@@ -819,6 +819,8 @@ You do not call the cluster layer yourself — the CLI does. The boot log tells
819
819
  [voltro:dev] workflow engine: cluster-sql, dialect=mariadb
820
820
  ```
821
821
 
822
+ Two settings tune this for demanding topologies: **`VOLTRO_WORKFLOW_SHARD_LOCK`** keeps cross-pod handoff correct on a Galera / Percona XtraDB cluster (see [Galera and multi-primary clusters](#galera-and-multi-primary-clusters)), and **`VOLTRO_WORKFLOW_RUNNER_STORAGE`** opts out of SQL runner storage when you don't need handoff (see [Single-process runner storage](#single-process-runner-storage)).
823
+
822
824
  ### The deployment contract
823
825
 
824
826
  A real multi-instance deployment has to give each pod a routable identity. This is the entire operational surface of clustering, and it is what the framework's Helm baseline injects:
@@ -848,6 +850,38 @@ env:
848
850
 
849
851
  That is the whole contract: stable per-pod identity (`POD_NAME` → `server_id`), routable runner host (`POD_IP`), a pinned runner port, the shared `DB_URL`, and CDC on. No application code changes between one instance and four.
850
852
 
853
+ ### Galera and multi-primary clusters
854
+
855
+ Multi-primary MariaDB (Galera) and Percona XtraDB are first-class **and keep full cross-pod handoff** — no proxy, no single-writer endpoint, no loss of durability. This is handled automatically; the paragraphs below are the *why* for operators who need it.
856
+
857
+ By default `@effect/cluster` coordinates which runner owns which shard with **session advisory locks** (`GET_LOCK` on MySQL/MariaDB, `pg_advisory_lock` on Postgres). Advisory locks are **node-local** — a lock held on one Galera node is invisible on the others, and Galera never replicates them. So on a Galera cluster whose app pods reach the database through a load-balancing Service (connections spread across nodes), advisory-lock coordination can't see itself: pods split-brain shard ownership, and the runner-storage bootstrap can wedge before it creates `cluster_runners` (the pod stays **un-Ready** while a shard-lock refresher errors against a `cluster_runners` table it thinks is missing).
858
+
859
+ Voltro resolves this with the **`VOLTRO_WORKFLOW_SHARD_LOCK`** setting (`auto` | `row` | `advisory`, default `auto`):
860
+
861
+ - **`auto`** — probe the live connection (`@@wsrep_on`) and switch to the row-lease path on a Galera / PXC cluster, keep advisory locks everywhere else. No operator config needed.
862
+ - **`row`** — force the row-lease path. `SqlRunnerStorage` coordinates shard ownership with a **certified conditional upsert** on the `cluster_locks` table (`INSERT … ON DUPLICATE KEY UPDATE … WHERE acquired_at < <expiry>`) instead of `GET_LOCK`. Galera certifies that write across *all* nodes — the same reason the cron `advisoryLock` tier uses a claims row, not a session lock — so shard ownership is coordinated correctly no matter which node a connection lands on. Cross-pod handoff works: a dead pod's lease ages out and a surviving pod takes over the shard.
863
+ - **`advisory`** — force the classic `GET_LOCK` path (single-primary only).
864
+
865
+ The boot log reports the resolved mode, and `voltro cluster status` shows it per instance (`shard-lock=row`):
866
+
867
+ ```text
868
+ [voltro:serve] shard-lock coordination: row-based (dialect=mariadb, mode=auto, wsrep/Galera cluster detected)
869
+ ```
870
+
871
+ **Two honest caveats.** Row-lease failover is **expiry-based, not instant** — a dead pod's shards are reclaimed after the lease timeout (seconds), where advisory locks release the instant a connection drops. That's why `auto` keeps the faster advisory path on a single-primary server and only pays the timeout on Galera. And MySQL **Group Replication** (and other non-wsrep multi-primary topologies) aren't auto-detected — set `VOLTRO_WORKFLOW_SHARD_LOCK=row` explicitly there.
872
+
873
+ ### Single-process runner storage
874
+
875
+ If a deployment genuinely does **not** need cross-pod handoff — dev, a single-region single-replica service, or one where each pod owning its own workflows is acceptable — set **`VOLTRO_WORKFLOW_RUNNER_STORAGE=memory`** to skip the SQL runner storage entirely:
876
+
877
+ ```text
878
+ VOLTRO_WORKFLOW_RUNNER_STORAGE=memory
879
+ ```
880
+
881
+ This is the engine `sqlite` uses. It **skips `SqlRunnerStorage`** (no `cluster_runners` / `cluster_locks`, no advisory locks) while **durability is unaffected** — run/message/reply state still persists via `SqlMessageStorage`. The tradeoff is the point: **no cross-pod handoff** — a workflow started on a now-dead pod will not resume on a surviving one. Prefer the row-lease coordination above for multi-replica deployments that need handoff; reach for `memory` only when they don't.
882
+
883
+ `VOLTRO_WORKFLOW_RUNNER_STORAGE=sql` is rejected on `sqlite` / `turso` (no advisory-lock branch there), and an unrecognized `VOLTRO_WORKFLOW_SHARD_LOCK` value fails boot loudly — a misconfiguration never silently selects a broken engine.
884
+
851
885
  ## Durable workflows resume on any instance
852
886
 
853
887
  Workflow durability lives in `@effect/cluster`'s engine, not in any Voltro table. Each workflow's journal (steps, idempotency keys, signals) is persisted to the cluster's storage on the shared database. When a pod dies mid-step:
@@ -11,16 +11,16 @@
11
11
  "dependencies": {
12
12
  "@effect/platform": "^0.96.1",
13
13
  "@effect/rpc": "^0.75.1",
14
- "@voltro/ai": "0.1.3",
15
- "@voltro/cli": "0.1.3",
16
- "@voltro/database": "0.1.3",
17
- "@voltro/env": "0.1.3",
18
- "@voltro/protocol": "0.1.3",
19
- "@voltro/runtime": "0.1.3",
14
+ "@voltro/ai": "0.1.5",
15
+ "@voltro/cli": "0.1.5",
16
+ "@voltro/database": "0.1.5",
17
+ "@voltro/env": "0.1.5",
18
+ "@voltro/protocol": "0.1.5",
19
+ "@voltro/runtime": "0.1.5",
20
20
  "effect": "^3.21.2"
21
21
  },
22
22
  "devDependencies": {
23
- "@voltro/testing": "0.1.3",
23
+ "@voltro/testing": "0.1.5",
24
24
  "typescript": "^5.7.0",
25
25
  "vitest": "^3.0.0"
26
26
  }
@@ -12,16 +12,16 @@
12
12
  "dependencies": {
13
13
  "@effect/platform": "^0.96.1",
14
14
  "@effect/rpc": "^0.75.1",
15
- "@voltro/cli": "0.1.3",
16
- "@voltro/database": "0.1.3",
17
- "@voltro/env": "0.1.3",
18
- "@voltro/plugin-auth": "0.1.3",
19
- "@voltro/protocol": "0.1.3",
20
- "@voltro/runtime": "0.1.3",
15
+ "@voltro/cli": "0.1.5",
16
+ "@voltro/database": "0.1.5",
17
+ "@voltro/env": "0.1.5",
18
+ "@voltro/plugin-auth": "0.1.5",
19
+ "@voltro/protocol": "0.1.5",
20
+ "@voltro/runtime": "0.1.5",
21
21
  "effect": "^3.21.2"
22
22
  },
23
23
  "devDependencies": {
24
- "@voltro/testing": "0.1.3",
24
+ "@voltro/testing": "0.1.5",
25
25
  "typescript": "^5.7.0",
26
26
  "vitest": "^3.0.0"
27
27
  }
@@ -12,16 +12,16 @@
12
12
  "dependencies": {
13
13
  "@effect/platform": "^0.96.1",
14
14
  "@effect/rpc": "^0.75.1",
15
- "@voltro/cli": "0.1.3",
16
- "@voltro/database": "0.1.3",
17
- "@voltro/env": "0.1.3",
18
- "@voltro/plugin-multitenancy": "0.1.3",
19
- "@voltro/protocol": "0.1.3",
20
- "@voltro/runtime": "0.1.3",
15
+ "@voltro/cli": "0.1.5",
16
+ "@voltro/database": "0.1.5",
17
+ "@voltro/env": "0.1.5",
18
+ "@voltro/plugin-multitenancy": "0.1.5",
19
+ "@voltro/protocol": "0.1.5",
20
+ "@voltro/runtime": "0.1.5",
21
21
  "effect": "^3.21.2"
22
22
  },
23
23
  "devDependencies": {
24
- "@voltro/testing": "0.1.3",
24
+ "@voltro/testing": "0.1.5",
25
25
  "typescript": "^5.7.0",
26
26
  "vitest": "^3.0.0"
27
27
  }
@@ -12,16 +12,16 @@
12
12
  "dependencies": {
13
13
  "@effect/platform": "^0.96.1",
14
14
  "@effect/rpc": "^0.75.1",
15
- "@voltro/cli": "0.1.3",
16
- "@voltro/database": "0.1.3",
17
- "@voltro/env": "0.1.3",
18
- "@voltro/plugin-deactivation": "0.1.3",
19
- "@voltro/protocol": "0.1.3",
20
- "@voltro/runtime": "0.1.3",
15
+ "@voltro/cli": "0.1.5",
16
+ "@voltro/database": "0.1.5",
17
+ "@voltro/env": "0.1.5",
18
+ "@voltro/plugin-deactivation": "0.1.5",
19
+ "@voltro/protocol": "0.1.5",
20
+ "@voltro/runtime": "0.1.5",
21
21
  "effect": "^3.21.2"
22
22
  },
23
23
  "devDependencies": {
24
- "@voltro/testing": "0.1.3",
24
+ "@voltro/testing": "0.1.5",
25
25
  "typescript": "^5.7.0",
26
26
  "vitest": "^3.0.0"
27
27
  }
@@ -12,18 +12,18 @@
12
12
  "dependencies": {
13
13
  "@react-email/components": "^1.0.12",
14
14
  "@react-email/render": "^1.4.0",
15
- "@voltro/cli": "0.1.3",
16
- "@voltro/database": "0.1.3",
17
- "@voltro/env": "0.1.3",
18
- "@voltro/plugin-mail": "0.1.3",
19
- "@voltro/plugin-multitenancy": "0.1.3",
20
- "@voltro/protocol": "0.1.3",
21
- "@voltro/runtime": "0.1.3",
15
+ "@voltro/cli": "0.1.5",
16
+ "@voltro/database": "0.1.5",
17
+ "@voltro/env": "0.1.5",
18
+ "@voltro/plugin-mail": "0.1.5",
19
+ "@voltro/plugin-multitenancy": "0.1.5",
20
+ "@voltro/protocol": "0.1.5",
21
+ "@voltro/runtime": "0.1.5",
22
22
  "effect": "^3.21.2",
23
23
  "react": "^19.0.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@voltro/testing": "0.1.3",
26
+ "@voltro/testing": "0.1.5",
27
27
  "typescript": "^5.7.0",
28
28
  "vitest": "^3.0.0"
29
29
  }
@@ -12,18 +12,18 @@
12
12
  "dependencies": {
13
13
  "@effect/platform": "^0.96.1",
14
14
  "@effect/rpc": "^0.75.1",
15
- "@voltro/cli": "0.1.3",
16
- "@voltro/database": "0.1.3",
17
- "@voltro/env": "0.1.3",
18
- "@voltro/plugin-multitenancy": "0.1.3",
19
- "@voltro/plugin-storage": "0.1.3",
20
- "@voltro/protocol": "0.1.3",
21
- "@voltro/runtime": "0.1.3",
22
- "@voltro/sql-mysql": "0.1.3",
15
+ "@voltro/cli": "0.1.5",
16
+ "@voltro/database": "0.1.5",
17
+ "@voltro/env": "0.1.5",
18
+ "@voltro/plugin-multitenancy": "0.1.5",
19
+ "@voltro/plugin-storage": "0.1.5",
20
+ "@voltro/protocol": "0.1.5",
21
+ "@voltro/runtime": "0.1.5",
22
+ "@voltro/sql-mysql": "0.1.5",
23
23
  "effect": "^3.21.2"
24
24
  },
25
25
  "devDependencies": {
26
- "@voltro/testing": "0.1.3",
26
+ "@voltro/testing": "0.1.5",
27
27
  "typescript": "^5.7.0",
28
28
  "vitest": "^3.0.0"
29
29
  }
@@ -10,17 +10,17 @@
10
10
  "test": "voltro test"
11
11
  },
12
12
  "dependencies": {
13
- "@voltro/cli": "0.1.3",
14
- "@voltro/database": "0.1.3",
15
- "@voltro/env": "0.1.3",
16
- "@voltro/plugin-multitenancy": "0.1.3",
17
- "@voltro/plugin-storage": "0.1.3",
18
- "@voltro/protocol": "0.1.3",
19
- "@voltro/runtime": "0.1.3",
13
+ "@voltro/cli": "0.1.5",
14
+ "@voltro/database": "0.1.5",
15
+ "@voltro/env": "0.1.5",
16
+ "@voltro/plugin-multitenancy": "0.1.5",
17
+ "@voltro/plugin-storage": "0.1.5",
18
+ "@voltro/protocol": "0.1.5",
19
+ "@voltro/runtime": "0.1.5",
20
20
  "effect": "^3.21.2"
21
21
  },
22
22
  "devDependencies": {
23
- "@voltro/testing": "0.1.3",
23
+ "@voltro/testing": "0.1.5",
24
24
  "typescript": "^5.7.0",
25
25
  "vitest": "^3.0.0"
26
26
  }
@@ -11,17 +11,17 @@
11
11
  "dependencies": {
12
12
  "@effect/platform": "^0.96.1",
13
13
  "@effect/rpc": "^0.75.1",
14
- "@voltro/cli": "0.1.3",
15
- "@voltro/database": "0.1.3",
16
- "@voltro/env": "0.1.3",
17
- "@voltro/plugin-governance": "0.1.3",
18
- "@voltro/plugin-multitenancy": "0.1.3",
19
- "@voltro/protocol": "0.1.3",
20
- "@voltro/runtime": "0.1.3",
14
+ "@voltro/cli": "0.1.5",
15
+ "@voltro/database": "0.1.5",
16
+ "@voltro/env": "0.1.5",
17
+ "@voltro/plugin-governance": "0.1.5",
18
+ "@voltro/plugin-multitenancy": "0.1.5",
19
+ "@voltro/protocol": "0.1.5",
20
+ "@voltro/runtime": "0.1.5",
21
21
  "effect": "^3.21.2"
22
22
  },
23
23
  "devDependencies": {
24
- "@voltro/testing": "0.1.3",
24
+ "@voltro/testing": "0.1.5",
25
25
  "typescript": "^5.7.0",
26
26
  "vitest": "^3.0.0"
27
27
  }
@@ -11,17 +11,17 @@
11
11
  "dependencies": {
12
12
  "@effect/platform": "^0.96.1",
13
13
  "@effect/rpc": "^0.75.1",
14
- "@voltro/cli": "0.1.3",
15
- "@voltro/database": "0.1.3",
16
- "@voltro/env": "0.1.3",
17
- "@voltro/plugin-multitenancy": "0.1.3",
18
- "@voltro/protocol": "0.1.3",
19
- "@voltro/runtime": "0.1.3",
20
- "@voltro/workflow": "0.1.3",
14
+ "@voltro/cli": "0.1.5",
15
+ "@voltro/database": "0.1.5",
16
+ "@voltro/env": "0.1.5",
17
+ "@voltro/plugin-multitenancy": "0.1.5",
18
+ "@voltro/protocol": "0.1.5",
19
+ "@voltro/runtime": "0.1.5",
20
+ "@voltro/workflow": "0.1.5",
21
21
  "effect": "^3.21.2"
22
22
  },
23
23
  "devDependencies": {
24
- "@voltro/testing": "0.1.3",
24
+ "@voltro/testing": "0.1.5",
25
25
  "typescript": "^5.7.0",
26
26
  "vitest": "^3.0.0"
27
27
  }
@@ -12,17 +12,17 @@
12
12
  "dependencies": {
13
13
  "@effect/platform": "^0.96.1",
14
14
  "@effect/rpc": "^0.75.1",
15
- "@voltro/cli": "0.1.3",
16
- "@voltro/database": "0.1.3",
17
- "@voltro/env": "0.1.3",
18
- "@voltro/plugin-flags": "0.1.3",
19
- "@voltro/plugin-multitenancy": "0.1.3",
20
- "@voltro/protocol": "0.1.3",
21
- "@voltro/runtime": "0.1.3",
15
+ "@voltro/cli": "0.1.5",
16
+ "@voltro/database": "0.1.5",
17
+ "@voltro/env": "0.1.5",
18
+ "@voltro/plugin-flags": "0.1.5",
19
+ "@voltro/plugin-multitenancy": "0.1.5",
20
+ "@voltro/protocol": "0.1.5",
21
+ "@voltro/runtime": "0.1.5",
22
22
  "effect": "^3.21.2"
23
23
  },
24
24
  "devDependencies": {
25
- "@voltro/testing": "0.1.3",
25
+ "@voltro/testing": "0.1.5",
26
26
  "typescript": "^5.7.0",
27
27
  "vitest": "^3.0.0"
28
28
  }
@@ -12,17 +12,17 @@
12
12
  "dependencies": {
13
13
  "@effect/platform": "^0.96.1",
14
14
  "@effect/rpc": "^0.75.1",
15
- "@voltro/cli": "0.1.3",
16
- "@voltro/database": "0.1.3",
17
- "@voltro/env": "0.1.3",
18
- "@voltro/plugin-audit": "0.1.3",
19
- "@voltro/plugin-governance": "0.1.3",
20
- "@voltro/protocol": "0.1.3",
21
- "@voltro/runtime": "0.1.3",
15
+ "@voltro/cli": "0.1.5",
16
+ "@voltro/database": "0.1.5",
17
+ "@voltro/env": "0.1.5",
18
+ "@voltro/plugin-audit": "0.1.5",
19
+ "@voltro/plugin-governance": "0.1.5",
20
+ "@voltro/protocol": "0.1.5",
21
+ "@voltro/runtime": "0.1.5",
22
22
  "effect": "^3.21.2"
23
23
  },
24
24
  "devDependencies": {
25
- "@voltro/testing": "0.1.3",
25
+ "@voltro/testing": "0.1.5",
26
26
  "typescript": "^5.7.0",
27
27
  "vitest": "^3.0.0"
28
28
  }
@@ -11,17 +11,17 @@
11
11
  "dependencies": {
12
12
  "@effect/platform": "^0.96.1",
13
13
  "@effect/rpc": "^0.75.1",
14
- "@voltro/cli": "0.1.3",
15
- "@voltro/database": "0.1.3",
16
- "@voltro/env": "0.1.3",
17
- "@voltro/kv": "0.1.3",
18
- "@voltro/plugin-multitenancy": "0.1.3",
19
- "@voltro/protocol": "0.1.3",
20
- "@voltro/runtime": "0.1.3",
14
+ "@voltro/cli": "0.1.5",
15
+ "@voltro/database": "0.1.5",
16
+ "@voltro/env": "0.1.5",
17
+ "@voltro/kv": "0.1.5",
18
+ "@voltro/plugin-multitenancy": "0.1.5",
19
+ "@voltro/protocol": "0.1.5",
20
+ "@voltro/runtime": "0.1.5",
21
21
  "effect": "^3.21.2"
22
22
  },
23
23
  "devDependencies": {
24
- "@voltro/testing": "0.1.3",
24
+ "@voltro/testing": "0.1.5",
25
25
  "typescript": "^5.7.0",
26
26
  "vitest": "^3.0.0"
27
27
  }
@@ -12,17 +12,17 @@
12
12
  "dependencies": {
13
13
  "@effect/platform": "^0.96.1",
14
14
  "@effect/rpc": "^0.75.1",
15
- "@voltro/cli": "0.1.3",
16
- "@voltro/database": "0.1.3",
17
- "@voltro/env": "0.1.3",
18
- "@voltro/plugin-moderation": "0.1.3",
19
- "@voltro/plugin-multitenancy": "0.1.3",
20
- "@voltro/protocol": "0.1.3",
21
- "@voltro/runtime": "0.1.3",
15
+ "@voltro/cli": "0.1.5",
16
+ "@voltro/database": "0.1.5",
17
+ "@voltro/env": "0.1.5",
18
+ "@voltro/plugin-moderation": "0.1.5",
19
+ "@voltro/plugin-multitenancy": "0.1.5",
20
+ "@voltro/protocol": "0.1.5",
21
+ "@voltro/runtime": "0.1.5",
22
22
  "effect": "^3.21.2"
23
23
  },
24
24
  "devDependencies": {
25
- "@voltro/testing": "0.1.3",
25
+ "@voltro/testing": "0.1.5",
26
26
  "typescript": "^5.7.0",
27
27
  "vitest": "^3.0.0"
28
28
  }
@@ -12,17 +12,17 @@
12
12
  "dependencies": {
13
13
  "@effect/platform": "^0.96.1",
14
14
  "@effect/rpc": "^0.75.1",
15
- "@voltro/cli": "0.1.3",
16
- "@voltro/database": "0.1.3",
17
- "@voltro/plugin-multitenancy": "0.1.3",
18
- "@voltro/plugin-prometheus": "0.1.3",
19
- "@voltro/plugin-sentry": "0.1.3",
20
- "@voltro/protocol": "0.1.3",
21
- "@voltro/runtime": "0.1.3",
15
+ "@voltro/cli": "0.1.5",
16
+ "@voltro/database": "0.1.5",
17
+ "@voltro/plugin-multitenancy": "0.1.5",
18
+ "@voltro/plugin-prometheus": "0.1.5",
19
+ "@voltro/plugin-sentry": "0.1.5",
20
+ "@voltro/protocol": "0.1.5",
21
+ "@voltro/runtime": "0.1.5",
22
22
  "effect": "^3.21.2"
23
23
  },
24
24
  "devDependencies": {
25
- "@voltro/testing": "0.1.3",
25
+ "@voltro/testing": "0.1.5",
26
26
  "typescript": "^5.7.0",
27
27
  "vitest": "^3.0.0"
28
28
  }
@@ -12,17 +12,17 @@
12
12
  "dependencies": {
13
13
  "@effect/platform": "^0.96.1",
14
14
  "@effect/rpc": "^0.75.1",
15
- "@voltro/cli": "0.1.3",
16
- "@voltro/database": "0.1.3",
17
- "@voltro/env": "0.1.3",
18
- "@voltro/plugin-multitenancy": "0.1.3",
19
- "@voltro/plugin-ratelimit": "0.1.3",
20
- "@voltro/protocol": "0.1.3",
21
- "@voltro/runtime": "0.1.3",
15
+ "@voltro/cli": "0.1.5",
16
+ "@voltro/database": "0.1.5",
17
+ "@voltro/env": "0.1.5",
18
+ "@voltro/plugin-multitenancy": "0.1.5",
19
+ "@voltro/plugin-ratelimit": "0.1.5",
20
+ "@voltro/protocol": "0.1.5",
21
+ "@voltro/runtime": "0.1.5",
22
22
  "effect": "^3.21.2"
23
23
  },
24
24
  "devDependencies": {
25
- "@voltro/testing": "0.1.3",
25
+ "@voltro/testing": "0.1.5",
26
26
  "typescript": "^5.7.0",
27
27
  "vitest": "^3.0.0"
28
28
  }