@zerotal/arch 1.14.1 → 1.14.3

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.
package/docs/about.md CHANGED
@@ -84,7 +84,7 @@ bun create zerotal my-app # choose: API, Flow, React, Vue, or Minimal
84
84
  cd my-app
85
85
  cp .env.example .env # APP_KEY is pre-generated for you
86
86
  bun zt migrate # create the database schema (API template)
87
- bun run dev # dev server + hot reload at http://localhost:3000
87
+ bun zt dev # dev server + hot reload at http://localhost:3000
88
88
  ```
89
89
 
90
90
  The scaffolder writes a fresh `APP_KEY` into `.env.example` and installs
@@ -95,7 +95,7 @@ dependencies. Pick a template at the prompt:
95
95
  - **React** / **Vue** — Inertia SPA (see [Inertia](#inertia-react-vue-spa)).
96
96
  - **Minimal** — one page with JSX views on the bare framework.
97
97
 
98
- There's **no build step**: `bun run dev` starts the server, `bun test` runs the suite,
98
+ There's **no build step**: `bun zt dev` starts the server, `bun test` runs the suite,
99
99
  `bun run typecheck` type-checks. More in [Getting Started](/docs/getting-started).
100
100
 
101
101
  ## The shape of an app
@@ -631,7 +631,7 @@ bun zt migrate:rollback # roll back last batch
631
631
  bun zt migrate:fresh # drop all + re-migrate
632
632
  bun zt key:generate # fresh APP_KEY
633
633
  bun zt queue:work # start the queue worker
634
- bun zt serve --dev # dev server (aliased by `bun run dev`)
634
+ bun zt dev # dev server, hot reload (also `bun run dev`)
635
635
  bun zt list # every available command
636
636
  ```
637
637
 
@@ -658,7 +658,7 @@ The [README](../README.md) has a package-by-package table with links.
658
658
 
659
659
  - **The `zt` CLI is your control panel.** `bun zt list` shows everything —
660
660
  scaffolding, migrations, the dev server, the worker, and tests all run through it.
661
- - **No build, ever.** `bun run dev` / `bun test` / `bun run typecheck`. No compile
661
+ - **No build, ever.** `bun zt dev` / `bun test` / `bun run typecheck`. No compile
662
662
  step to remember.
663
663
  - **Starters are the fastest way in.** `bun create zerotal my-app` scaffolds a working
664
664
  app from one of six starters — `api`, `admin`, `flow`, `react`, `vue`, or `minimal`.
package/docs/assets.md CHANGED
@@ -12,20 +12,20 @@ View, Inertia) has its own pipeline and hot-reload behaviour; all three use
12
12
 
13
13
  Asset compilation is built into the framework — there's no package to install or
14
14
  provider to register for the pipeline itself. You only add Tailwind and wire up a
15
- static route, then `bun zt serve --dev` handles build-and-reload for you.
15
+ static route, then `bun zt dev` handles build-and-reload for you.
16
16
 
17
17
  > **Note** — Projects ship a `zt.ts` entry and a `zt` package script,
18
- > so commands are written `bun zt <command>` (e.g. `bun zt serve --dev`).
18
+ > so commands are written `bun zt <command>` (e.g. `bun zt dev`).
19
19
 
20
20
  ## Getting Started
21
21
 
22
22
  Asset building is part of `@zerotal/core` — nothing to install and no provider
23
- to register. `bun zt serve --dev` builds on change, and `bun zt css:build`
23
+ to register. `bun zt dev` builds on change, and `bun zt css:build`
24
24
  produces a production bundle:
25
25
 
26
26
  ```bash
27
27
  # in your project root
28
- bun zt serve --dev # watch and rebuild
28
+ bun zt dev # watch and rebuild
29
29
  bun zt css:build # one production build
30
30
  ```
31
31
 
@@ -39,7 +39,7 @@ Pick by stack — the dev server runs the right pipeline automatically:
39
39
  production. Dev rebuilds are wired up by `FlowProvider`.
40
40
  - **Inertia** (React or Vue SPA, JS + CSS bundle): `bun zt inertia:build` for
41
41
  production. Dev rebuilds are wired up by `InertiaProvider`.
42
- - **Any stack, development**: `bun zt serve --dev` — initial build, file watch,
42
+ - **Any stack, development**: `bun zt dev` — initial build, file watch,
43
43
  rebuild on save, and a browser reload over WebSocket.
44
44
 
45
45
  ## Tailwind CSS
@@ -113,7 +113,7 @@ returned HTML:
113
113
 
114
114
  ```bash
115
115
  # in your project root
116
- bun zt serve --dev
116
+ bun zt dev
117
117
  ```
118
118
 
119
119
  When `resources/css/app.css` exists, `FlowProvider.onBooted()` registers a
@@ -296,7 +296,7 @@ Inertia Vue plugin so `.vue` single-file components compile.
296
296
 
297
297
  ```bash
298
298
  # in your project root
299
- bun zt serve --dev
299
+ bun zt dev
300
300
  ```
301
301
 
302
302
  `InertiaProvider.onBooted()` registers Inertia's build routine under its own
@@ -409,14 +409,14 @@ stylesheet stays small and the fonts load in parallel. The other accepted values
409
409
 
410
410
  ## Hot reload
411
411
 
412
- Both pipelines above are driven by the same dev process. `bun zt serve --dev`
412
+ Both pipelines above are driven by the same dev process. `bun zt dev`
413
413
  builds once, spawns the server as a child process, and watches the filesystem;
414
414
  what happens on a change depends on which directory the change landed in:
415
415
 
416
416
  ```text
417
- # bun zt serve --dev process model
417
+ # bun zt dev process model
418
418
  ┌──────────────────────────────────────────────────────┐
419
- │ bun zt serve --dev │
419
+ │ bun zt dev │
420
420
  │ │
421
421
  │ Process 1: DevOrchestrator │
422
422
  │ ├─ Initial build (CSS or JS+CSS) │
@@ -699,7 +699,7 @@ test("a stale bundle is told to reload", async () => {
699
699
  | Command | Effect |
700
700
  | ----------------------------------- | ----------------------------------------------- |
701
701
  | `bun zt serve` | Serve the app; assets are built once at boot |
702
- | `bun zt serve --dev` | Dev server with hot reload |
702
+ | `bun zt dev` | Dev server with hot reload |
703
703
  | `bun zt css:build` | Production CSS build (Flow/View) |
704
704
  | `bun zt inertia:build` | Development JS+CSS build (Inertia) |
705
705
  | `bun zt inertia:build --production` | Production JS+CSS build (Inertia) |
package/docs/changelog.md CHANGED
@@ -27,6 +27,75 @@ the section for every version you cross and apply its migration notes, not only
27
27
  majors. [Releases and versioning](/docs/support-policy#releases-and-versioning) explains
28
28
  when that carve-out ends.
29
29
 
30
+ ## 1.14.3 — 2026-09-01
31
+
32
+ Consistency pass on the documentation, and two bugs it uncovered.
33
+
34
+ Everything is written `bun zt <command>` now. The scaffold still adds a `dev` script, so
35
+ `bun run dev` keeps working — the docs simply lead with the form that is the same in every
36
+ project, including one that never ran the scaffolder.
37
+
38
+ ### Fixed
39
+
40
+ - **Twenty pages taught a retired command.** `serve --dev` was retired in
41
+ [1.13.0](#1130--2026-08-31), and that release updated the runner, the codemod,
42
+ `docs/commands.md` and `docs/upgrade.md` — leaving the form in the getting-started guide,
43
+ the assets guide, two Flow pages, the logger page, and both READMEs. For three weeks the
44
+ front door told newcomers to run a command that exits 1.
45
+
46
+ A gate now scans every page against the upgrade codemods' own list of retired forms, so
47
+ what the docs teach cannot drift from what the framework accepts. Only _shipped_
48
+ retirements count: a codemod for 2.0 describes a rename that has not happened, and
49
+ flagging correct prose is how a gate becomes something people add exclusions to rather
50
+ than read.
51
+
52
+ - **`zt upgrade` never offered the 1.13.0 migrations.** The `deprecated-aliases` codemod
53
+ bundled `serve --dev` and `routes:types` — retired in 1.13.0 — with the `BaseModel`
54
+ rename, which has not shipped and is scheduled for 2.0. A codemod carries one version, so
55
+ it took the later one: `zt upgrade --to 1.13.0` selected **nothing**, and the migration
56
+ for the release that broke `serve --dev` was unreachable by every app crossing it.
57
+
58
+ Split into `deprecated-aliases` at 1.13.0 and `base-model-rename` at 2.0.0. An app moving
59
+ to any 1.13+ release gets the command rewrites; one crossing to 2.0 no longer has
60
+ `BaseModel` renamed as a side effect of a command alias.
61
+
62
+ Found by the new gate, which flagged `extends BaseModel` in the ORM docs — correct prose,
63
+ and the reason it was reported was that the codemod claimed a rename that had not
64
+ happened.
65
+
66
+ ## 1.14.2 — 2026-09-01
67
+
68
+ **`bun run dev` was broken in every app scaffolded since 1.13.0.** Take this one.
69
+
70
+ Found by starting the adoption release the obvious way — scaffolding a fresh app and
71
+ walking the first-run path as a newcomer would, rather than reasoning about it.
72
+
73
+ ### Fixed
74
+
75
+ - **The scaffold templates shipped a retired command.** Every template's `package.json`
76
+ carried `"dev": "bun zt.ts serve --dev"`, and `serve --dev` was retired in
77
+ [1.13.0](#1130--2026-08-31) — deliberately failing loudly rather than silently starting a
78
+ plain server with no watcher. So the first command a new user runs exited 1 and told them
79
+ to use something else.
80
+
81
+ Retiring an alias meant updating the runner, the documentation and the `zt upgrade`
82
+ codemod. It did not occur to me to update the thing that _writes new apps_, which is the
83
+ one place a retired form is guaranteed to keep appearing.
84
+
85
+ A test now checks the scaffolder against the codemod's own list of retired forms, so what
86
+ generates apps cannot fall behind what migrates them. It is driven by the codemod rather
87
+ than a second list, because two lists disagree.
88
+
89
+ - **`zt upgrade` did not rewrite `zt.ts serve --dev` either.** The codemod anchored on `zt`
90
+ followed by whitespace, matching `zt serve --dev` and missing `bun zt.ts serve --dev` —
91
+ the form in every scaffolded `package.json`. So an app running `zt upgrade` to migrate off
92
+ the alias was told there was nothing to do, on the file that needed it most.
93
+
94
+ Worth naming as its own failure: the first version of the new scaffolder test passed with
95
+ the bug deliberately planted, because it was driven by that same pattern. A gate is only
96
+ worth what it catches, and the way to know is to break the thing on purpose and watch it
97
+ fail.
98
+
30
99
  ## 1.14.1 — 2026-09-01
31
100
 
32
101
  Clearing the deferred list. Three of the four are fixed; the other two were sized and moved
package/docs/commands.md CHANGED
@@ -181,7 +181,7 @@ that cannot cost you anything.
181
181
  Nothing prompts when there is no terminal to answer, which covers CI, containers,
182
182
  and anything reading `serve`'s output from a pipe. There it fails with the same
183
183
  explanation, so use `--force` or `--auto-port` to say up front which way you want
184
- it decided. Both flags work with a plain `serve` and with `serve --dev`.
184
+ it decided. Both flags work with `serve` and with `dev`.
185
185
 
186
186
  The dev server is a special case worth knowing about: on every restart it waits a
187
187
  few seconds for its own previous process to let go of the socket rather than
@@ -192,8 +192,13 @@ is about to free itself anyway.
192
192
 
193
193
  `bun zt dev` starts the server, the file watcher, and every process a provider or
194
194
  your app registered — a queue worker, a type-checker, a Stripe listener — in one
195
- terminal, each in its own tab. It is `serve --dev` with those extra tabs and the
196
- keys to drive them, so anything true of one is true of the other.
195
+ terminal, each in its own tab. It subclasses `serve`, so it is the same supervisor,
196
+ the same port resolution and the same restart behaviour, plus the flags that only
197
+ make sense with a deck on screen — anything true of `serve` is true of it.
198
+
199
+ `serve --dev` was the old spelling and was retired in 1.13.0; it now fails with a
200
+ message rather than starting a plain server. The scaffold's `dev` script runs this,
201
+ so `bun run dev` and `bun zt dev` are the same thing.
197
202
 
198
203
  An app with a queue no longer needs a second terminal:
199
204
 
@@ -46,7 +46,7 @@ Registering the provider switches on the following (in lifecycle order):
46
46
 
47
47
  - `onRegister` — registers the `Router.flow()` macro and the file-route resolver so Flow pages can be declared and auto-discovered.
48
48
  - `onBooting` — builds the client runtime bundle (Alpine + the Flow bridge) and mounts the routes under `/__flow` (the WebSocket endpoint, `runtime.js`, the upload endpoint, and the session-relay endpoint).
49
- - `onBooted` — wires `serve --dev` rebuild hooks for `resources/css/app.css` and `resources/js/app.js` (a no-op when those entry points are absent).
49
+ - `onBooted` — wires `zt dev` rebuild hooks for `resources/css/app.css` and `resources/js/app.js` (a no-op when those entry points are absent).
50
50
  - `onStarting` — AOT-compiles and validates every registered page's `render()` method.
51
51
 
52
52
  ### Configuration
@@ -186,7 +186,7 @@ The cache is small (a handful of recent pages) and short-lived, same-origin only
186
186
 
187
187
  ### Fast refresh in dev
188
188
 
189
- When you edit a component under `serve --dev`, the server restarts (quickly) and the client **re-renders each mounted component from its held snapshot with the new code — keeping its state**, instead of a full reload that would reset everything. Because component state is a signed snapshot and your `APP_KEY` doesn't change across a restart, that snapshot still verifies against the fresh server; the browser also refetches the stylesheet, so a newly-used Tailwind class shows up too. Increment a counter, tweak its template, save — the counter keeps its value and the change appears in place.
189
+ When you edit a component under `zt dev`, the server restarts (quickly) and the client **re-renders each mounted component from its held snapshot with the new code — keeping its state**, instead of a full reload that would reset everything. Because component state is a signed snapshot and your `APP_KEY` doesn't change across a restart, that snapshot still verifies against the fresh server; the browser also refetches the stylesheet, so a newly-used Tailwind class shows up too. Increment a counter, tweak its template, save — the counter keeps its value and the change appears in place.
190
190
 
191
191
  Two things to know:
192
192
 
@@ -199,7 +199,7 @@ Two things to know:
199
199
 
200
200
  ### Time-travel devtools
201
201
 
202
- Because the engine signs and delta-encodes the **full component state** on every round-trip, the client already holds an exact, verifiable history of everything each component has been. Under `serve --dev`, Flow records that stream: one frame per applied patch,
202
+ Because the engine signs and delta-encodes the **full component state** on every round-trip, the client already holds an exact, verifiable history of everything each component has been. Under `zt dev`, Flow records that stream: one frame per applied patch,
203
203
  plus the initial mount. You can then **scrub back to any frame**.
204
204
 
205
205
  Jumping re-applies that frame's snapshot _and_ its HTML to the live component, so
@@ -225,7 +225,7 @@ use. Recording is capped to the most recent frames and runs **only** under the d
225
225
 
226
226
  ### Dev error overlay
227
227
 
228
- When an **unexpected** error is thrown, `serve --dev` shows a **full-screen
228
+ When an **unexpected** error is thrown, `zt dev` shows a **full-screen
229
229
  overlay** carrying the error class, message, and stack. It covers both a server
230
230
  action and the initial `GET` render (`onMount` / `render`).
231
231
 
@@ -193,11 +193,14 @@ bun zt migrate
193
193
 
194
194
  ```bash
195
195
  # in your project root
196
- bun dev # → bun zt serve --dev
196
+ bun zt dev
197
197
  ```
198
198
 
199
+ Every command in these docs is written `bun zt <command>`. The scaffold also adds a
200
+ `dev` script, so `bun run dev` does the same thing — reach for whichever you prefer.
201
+
199
202
  Your app is now running at **http://localhost:3000** with hot reload enabled —
200
- `--dev` watches your files and hot-swaps routes without dropping connections. The
203
+ `dev` watches your files and hot-swaps routes without dropping connections. The
201
204
  generated `package.json` also gives you `bun start` (production serve) and
202
205
  `bun test`.
203
206
 
package/docs/logger.md CHANGED
@@ -292,7 +292,7 @@ level you can filter and in a file you can ship. Nothing writes to the terminal
292
292
  behind the logger's back, which means a `daily` channel captures the framework's
293
293
  own account of a boot, not just your application's.
294
294
 
295
- The one deliberate exception is the CLI itself. `serve --dev`'s banner and its
295
+ The one deliberate exception is the CLI itself. `zt dev`'s banner and its
296
296
  `[zerotal:dev]` build/restart lines come from the supervisor process that watches
297
297
  your files, not from the application, and they are interactive terminal output
298
298
  rather than a record of anything. They stay on stdout.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zerotal/arch",
3
- "version": "1.14.1",
3
+ "version": "1.14.3",
4
4
  "license": "MIT",
5
5
  "maturity": "stable",
6
6
  "private": false,
@@ -35,11 +35,11 @@
35
35
  "typecheck": "tsc --noEmit"
36
36
  },
37
37
  "dependencies": {
38
- "@zerotal/core": "1.14.1"
38
+ "@zerotal/core": "1.14.3"
39
39
  },
40
40
  "devDependencies": {
41
41
  "typescript": "^5.8.0",
42
- "@zerotal/orm": "1.14.1"
42
+ "@zerotal/orm": "1.14.3"
43
43
  },
44
44
  "description": "The Zerotal agent surface — an MCP server that hands coding agents the framework's machine-readable truth: exact API signatures, live routes and schema, version-matched docs, and `zt doctor`.",
45
45
  "keywords": [