create-objectstack 17.0.0-rc.0 → 17.0.0-rc.1

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/CHANGELOG.md ADDED
@@ -0,0 +1,657 @@
1
+ # create-objectstack
2
+
3
+ ## 17.0.0-rc.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 2e836de: chore(packaging): CHANGELOG.md ships in every npm tarball (#4261)
8
+
9
+ The AGENTS.md post-task checklist requires breaking changesets to carry their
10
+ FROM → TO migration because "this text ships to consumers as `CHANGELOG.md`
11
+ inside the npm package and is what an upgrading agent greps after the tombstone
12
+ error." That delivery path was severed for 68 of the 69 publishable packages:
13
+ npm packs `package.json` / `README*` / `LICENSE*` unconditionally but — unlike
14
+ older npm versions — not `CHANGELOG.md`, and the canonical
15
+ `"files": ["dist", "README.md"]` whitelist never named it. Measured on npm
16
+ 10.9.7: `npm pack --dry-run` on `@objectstack/types` shipped 3 files while its
17
+ 70KB `CHANGELOG.md` stayed behind. Only `@objectstack/spec` listed it
18
+ explicitly.
19
+
20
+ The tombstone-error scenario is precisely the one where the repo is out of
21
+ reach — the upgrading agent has `node_modules` and nothing else — so the
22
+ migration text has to ride in the tarball. Every publishable package now
23
+ declares `CHANGELOG.md` in `files`, and the canonical whitelist is
24
+ `["dist", "README.md", "CHANGELOG.md"]`.
25
+
26
+ The other half is the gate: `check:published-files` gains a fifth invariant,
27
+ COMPLETE — a whitelist that fails to cover `CHANGELOG.md` fails the
28
+ always-required lint job, so the next package cannot silently sever the path
29
+ again. `@objectstack/spec`'s per-package EXTRA_ENTRIES exemption dissolves
30
+ into the canonical set.
31
+
32
+ Consumer-visible change: one more file per install (the package's changelog,
33
+ e.g. 70.8KB for `@objectstack/types`), and `grep -r "removed key"
34
+ node_modules/@objectstack/*/CHANGELOG.md` now finds the migration it was
35
+ promised.
36
+
37
+ - 7309c81: chore(cli,create-objectstack): scaffolds no longer name a driver (#4065)
38
+
39
+ `os init` and the `create-objectstack` blank template both listed
40
+ `@objectstack/driver-memory` in the generated `dependencies`. It was the only
41
+ driver named, which read as an endorsement — "this is the driver your app runs
42
+ on" — when it is in fact the **last-resort rung** of the dev step-down (native
43
+ `better-sqlite3` → WASM SQLite → mingo). A new project's first impression of the
44
+ data layer should not be the engine that enforces no primary keys, no
45
+ uniqueness, no `NOT NULL` and no column types.
46
+
47
+ It was also redundant: `@objectstack/runtime` already depends on `driver-sql`,
48
+ `driver-sqlite-wasm` and `driver-memory`, and every script in both scaffolds runs
49
+ through the CLI, which carries all four. Removing the line changes nothing a
50
+ generated project can do — `objectstack dev` still resolves SQLite by default,
51
+ and `OS_DATABASE_URL` still selects Postgres / MySQL / MongoDB.
52
+
53
+ Docs updated to match: the "packages you depend on" table in _Your first project_
54
+ no longer lists a driver row (it now says where drivers come from), and the
55
+ Memory Driver section of _Database Drivers_ documents the opt-in persistence
56
+ default, carries a migration callout for the old `'auto'` behaviour, and points
57
+ test authors at in-memory SQLite. That section also claimed "Data is lost when
58
+ the process exits", which was simply false while `'auto'` was the default — it
59
+ wrote a file into the working directory.
60
+
61
+ ## 17.0.0-rc.0
62
+
63
+ ### Major Changes
64
+
65
+ - e47b342: feat!: require Node.js 22 — promise the runtime we actually test (#3825)
66
+
67
+ Every published package declared `engines.node: ">=18.0.0"`. **Node 18 reached
68
+ end-of-life on 2025-04-30 and Node 20 on 2026-04-30**, so the compatibility
69
+ promise covered two runtimes nobody patches — and, after #3830 moved CI to Node
70
+ 22, two runtimes nothing in this repo verifies.
71
+
72
+ That left the promise and the evidence with **no overlap at all**:
73
+
74
+ | | Node version |
75
+ | ----------------------------------------------------------------------------------------------- | ------------ |
76
+ | What CI validates every PR on | **22** |
77
+ | What `release.yml` publishes from | **22** |
78
+ | What every shipped Docker image runs (`docker/Dockerfile`, `blank` template, self-hosting docs) | **22** |
79
+ | What `engines.node` promised users | **>=18** |
80
+
81
+ `engines.node` is now `>=22.0.0` across all 50 manifests. This is the honest
82
+ floor: it is the only runtime the packages are built, tested and shipped on.
83
+
84
+ ## Migration
85
+
86
+ **If you are on Node 22 or newer, nothing changes.** Node 24 (Active LTS since
87
+ 2025-10-28) and Node 26 both satisfy the new range.
88
+
89
+ If you are on Node 18 or 20, upgrade to Node 22+. Both are past end-of-life and
90
+ receive no security patches:
91
+
92
+ ```bash
93
+ nvm install 22 && nvm use 22
94
+ ```
95
+
96
+ npm and pnpm surface an unsatisfied `engines` as an **`EBADENGINE` warning**, not
97
+ a hard failure, so an existing install will not break the moment you upgrade —
98
+ but the package is no longer tested on that runtime, and the failures are the
99
+ kind that do not announce themselves. #3812 is the worked example: a native
100
+ dependency whose `engines` required a newer Node loaded anyway on the older one
101
+ and then killed the test worker at the process level, with no JS error and a
102
+ summary that still said "passed".
103
+
104
+ If your CI pins Node, pin it to 22 as well — running your gates on a runtime
105
+ your dependencies no longer support is exactly the split this change closes.
106
+
107
+ ## Also updated
108
+
109
+ The "Node 18+" prerequisite was restated in ten user-facing places
110
+ (`README.md`, `CONTRIBUTING.md`, the getting-started and deployment docs, the
111
+ todo example, and the `objectstack-platform` skill's `compatibility` field).
112
+ All now say 22. Changelogs and ADRs are historical records and were left alone.
113
+
114
+ ### Patch Changes
115
+
116
+ - 9f060e5: chore(deps)!: better-auth 1.7.0-rc.2 (account identity restructuring) + the
117
+ production-dependency batch from #3517
118
+
119
+ **better-auth 1.7.0-rc.1 → 1.7.0-rc.2** across the family (`better-auth`,
120
+ `@better-auth/core`, `@better-auth/oauth-provider`, `@better-auth/sso`, and the
121
+ adapter/telemetry overrides). `@better-auth/scim` deliberately stays on
122
+ 1.7.0-rc.1 — rc.2 replaces its whole model (code-defined connections; the
123
+ `scimProvider` model and the generate-token endpoint are gone), which is a
124
+ feature migration, not a version bump. Its peer range accepts rc.2 core, and the
125
+ advisory that forced the original pin (GHSA-j8v8-g9cx-5qf4) is still fixed.
126
+
127
+ **BREAKING — account identity.** better-auth renamed `account.accountId` to
128
+ `account.providerAccountId` and added a REQUIRED `account.issuer`; sign-in now
129
+ resolves accounts by `(issuer, providerAccountId)`.
130
+
131
+ - FROM `fields: { accountId: 'account_id' }` → TO
132
+ `fields: { issuer: 'issuer', providerAccountId: 'account_id' }`. The provider
133
+ account id keeps its `account_id` column — only the better-auth-side name
134
+ moved — and `sys_account` gains an `issuer` column.
135
+ - FROM `internalAdapter.createAccount({ providerId, accountId, … })` → TO
136
+ `createAccount({ providerId, issuer, providerAccountId, … })`. A local
137
+ password account carries the issuer better-auth mints for itself,
138
+ `local:credential`.
139
+ - FROM `client.auth.accounts.unlink({ providerId, accountId })` → TO
140
+ `unlink({ accountId })`, where `accountId` is now the account ROW id (the `id`
141
+ from `accounts.list()`), matching better-auth's narrowed body.
142
+ `accounts.list()` returns `issuer` + `providerAccountId` in place of
143
+ `accountId`.
144
+
145
+ **Existing deployments:** rows written before 1.7 have no issuer and are
146
+ invisible to sign-in until stamped. The auth plugin now runs an idempotent
147
+ boot-time backfill that stamps what it can derive — `local:credential` for
148
+ password accounts, `local:oauth:<providerId>` for configured social providers,
149
+ and the registered IdP's real `iss` from `sys_sso_provider` for federated ones.
150
+ Accounts from a federated IdP that is no longer registered cannot be derived;
151
+ they are logged with their provider id and row count rather than guessed, and
152
+ those users cannot sign in through that provider until the row is stamped with
153
+ the IdP's issuer or removed so a fresh login re-links it.
154
+
155
+ **Also required by 1.7:** `SecondaryStorage` gained two mandatory methods, both
156
+ now implemented over the kernel cache service — `getAndDelete` (single-use
157
+ verification values) and `increment` (fixed-window rate-limit counter;
158
+ `rateLimit.storage: 'secondary-storage'` throws at boot without it).
159
+
160
+ The rest of #3517's production-dependency batch rides along: `@oclif/core`
161
+ 4.13.0, `@hono/node-server` 2.0.12, `hono` 4.12.32, `tar` 7.5.22, `jose` 6.2.4,
162
+ `pinyin-pro` 3.28.2, plus the private docs app's fumadocs/next/react bumps.
163
+
164
+ - 4e9e184: chore(deps): OSV security batch — bump tar to ^7.5.21 (GHSA-r292-9mhp-454m) and
165
+ js-yaml to ^5.2.2 (GHSA-pm4m-ph32-ghv5)
166
+
167
+ Both are declared-range bumps to the patched releases, so downstream installs
168
+ resolve the fixed versions from the published manifests, not just this
169
+ workspace's lockfile. The same batch clears the remaining transitive advisories
170
+ (next 16.2.11 in apps/docs; workspace overrides for brace-expansion, sharp,
171
+ react-router, @sveltejs/kit, @hono/node-server) — those live in pnpm-workspace.yaml
172
+ and the private docs app, which do not ship.
173
+
174
+ ## 16.1.0
175
+
176
+ ## 16.0.0
177
+
178
+ ### Minor Changes
179
+
180
+ - 3f218e4: feat(create-objectstack): the blank scaffold ships the three generic connector executors by default
181
+
182
+ `npm create objectstack` now generates an `objectstack.config.ts` that wires the
183
+ `rest`, `openapi`, and `mcp` connector executor plugins (ADR-0022/0023/0024 +
184
+ ADR-0097) into `plugins:`, alongside `requires: ['automation']`. This closes the
185
+ last authoring gap in the ADR-0097 promise that integrations are expressible
186
+ **and executable** as pure metadata: an author (human or AI) can now add a
187
+ declarative `connectors:` entry naming `provider: 'rest' | 'openapi' | 'mcp'`
188
+ and have it materialize into a live, dispatchable connector at boot — with no
189
+ host-code edit.
190
+
191
+ - `plugins:` — `new ConnectorRestPlugin()`, `new ConnectorOpenApiPlugin()`,
192
+ `new ConnectorMcpPlugin()` (zero-arg = contribute the provider factory only).
193
+ - `requires: ['automation']` — the automation service performs the
194
+ materialization and owns the registry the executors register into. It is also
195
+ a hard dependency of the connector plugins, so a scaffold that lists them in
196
+ `plugins:` without it fails boot; automation ships transitively via
197
+ `@objectstack/cli`.
198
+ - deps — `@objectstack/connector-rest`, `@objectstack/connector-openapi`,
199
+ `@objectstack/connector-mcp`.
200
+ - Security (#3055): declarative `mcp` stdio transports stay denied by default —
201
+ opt in per host with `new ConnectorMcpPlugin({ declarativeStdio: ['node'] })`.
202
+
203
+ Brand connectors (Slack, …) remain marketplace/opt-in.
204
+
205
+ ### Patch Changes
206
+
207
+ - 83e8f7d: feat(mcp): decouple the stdio auto-start switch from the HTTP surface + surface the MCP endpoint on `os dev` boot (#3167)
208
+
209
+ The MCP HTTP surface (`/api/v1/mcp`) and the long-lived stdio transport used to
210
+ share one env var: `OS_MCP_SERVER_ENABLED=true` turned the HTTP surface on **and**
211
+ silently auto-started the stdio transport — which bridges the raw metadata service
212
+
213
+ - data engine with no per-request principal (unscoped). An operator setting it to
214
+ "make sure MCP is on" got an unscoped transport as a side effect.
215
+
216
+ * **`@objectstack/types`** — new `resolveMcpStdioAutoStart()`. Stdio auto-start is
217
+ now its own switch, `OS_MCP_STDIO_ENABLED` (default off); `OS_MCP_SERVER_ENABLED`
218
+ governs only the HTTP surface. The legacy `OS_MCP_SERVER_ENABLED=true` trigger
219
+ still starts stdio for one release, flagged as deprecated. `=false` is unchanged
220
+ (it only ever gated HTTP).
221
+ * **`@objectstack/mcp`** — `MCPServerPlugin.start()` gates stdio on the new switch
222
+ and logs a one-time deprecation warning when started via the legacy alias.
223
+ * **`@objectstack/cli`** — `os dev` now prints the MCP endpoint, the agent-skill
224
+ URL, and a ready-to-paste `claude mcp add` command on boot (gated on the HTTP
225
+ surface being on), so the "an agent operates the app it's building" loop is
226
+ discoverable at dev time.
227
+ * **`create-objectstack`** — the blank scaffold README documents that the app is
228
+ itself an MCP server (the serve side), distinct from the consume-side connector.
229
+
230
+ - 3b6ef8a: Scaffolded projects ship with a `.gitignore` again — `npx create-objectstack` produced none, leaving `node_modules/` and `.env` un-ignored for every new user.
231
+
232
+ `npm pack` / `pnpm pack` strip `.gitignore` from a tarball unconditionally, at every depth. The blank template committed one at `src/templates/blank/.gitignore` and the build faithfully copied it to `dist/templates/blank/.gitignore`, but `files: ["dist"]` publishing dropped it on the way to the registry — so the file was present in the repo, present in every local build, and absent from all 11 files of a real scaffold. Verified against the published 15.1.1 tarball, which ships `dist/templates/blank/.dockerignore` and no `.gitignore`.
233
+
234
+ The template is now committed as `_gitignore` (a name npm does not strip) and restored to `.gitignore` when the template is copied, via a `TEMPLATE_FILE_ALIASES` map in the new `template-copy.ts`. Only `.gitignore` is aliased: the strip list is `.gitignore` and `.npmrc`, not "every dotfile" — `.dockerignore` packs fine and stays literal.
235
+
236
+ The restored ignore rules also cover `.env` / `.env.*`, which they never did. The template README has users write `OS_AUTH_SECRET` and `OS_SECRET_KEY` into a `.env`, and `docker-compose.yml` calls that file "never committed" — but only the prose said so, and `.dockerignore` was the only file that listed it.
237
+
238
+ A packing ratchet in `template-consistency.test.ts` guards both halves: it packs the real package, scaffolds from the extracted tarball with the real copy logic, and asserts every template file lands under its intended name. Source-level assertions cannot see this class of bug — the file only vanishes at publish.
239
+
240
+ - 3a8ce9d: fix(create-objectstack): the blank scaffold declares pnpm build approvals, so a fresh `pnpm install` no longer exits 1 on pnpm 11
241
+
242
+ pnpm 11 turned an unapproved dependency build script from a warning into a hard
243
+ error. The blank template declared no build approvals, so the very first command
244
+ a new user runs failed on any current pnpm:
245
+
246
+ ```
247
+ npx create-objectstack myapp && cd myapp && pnpm install
248
+ # [ERR_PNPM_IGNORED_BUILDS] Ignored build scripts: better-sqlite3@12.11.1, esbuild@0.28.1
249
+ # exit 1
250
+ ```
251
+
252
+ The scaffold now ships a `pnpm-workspace.yaml` approving the two packages it
253
+ actually depends on building — `better-sqlite3` (the native sqlite driver behind
254
+ `@objectstack/driver-sql`) and `esbuild` (compiles `objectstack.config.ts`).
255
+
256
+ Both approval keys are present because pnpm reads them by version, and neither
257
+ alone covers the supported range:
258
+
259
+ - `allowBuilds` (a package → boolean map) — the only key pnpm 11 honors, and
260
+ understood back to pnpm 10.31. `onlyBuiltDependencies` alone still errors.
261
+ - `onlyBuiltDependencies` (a list) — pnpm 10.0–10.30, which ignore `allowBuilds`.
262
+
263
+ npm and yarn ignore the file, so the npm install path is unaffected. Both
264
+ packages ship prebuilt binaries, so this was an install-time hard stop rather
265
+ than a runtime defect — the project ran fine once installed.
266
+
267
+ This is the #3091 failure class (in-repo settings masking what users resolve)
268
+ and was caught by the publish smoke gate added in #3100, which installs the
269
+ release candidate the way a user does — on whatever pnpm corepack hands a fresh
270
+ machine.
271
+
272
+ - 809214f: Stop leaking repo-internal skills into scaffolded projects. The scaffolder (and the docs) advertised `npx skills add objectstack-ai/objectstack --all`, and the skills CLI's `--all` implies `--skill '*'` — which includes even `metadata.internal` skills — so repo-internal tooling like `.claude/skills/dogfood-verification` landed in every new project's `.agents/skills/`. All install commands are now scoped to the published catalog via the `/skills` subpath (`npx skills add objectstack-ai/objectstack/skills --all`), the internal skill is additionally marked `metadata.internal: true` to hide it from interactive discovery, and a template-consistency ratchet plus a scaffold-e2e assertion keep the boundary from regressing.
273
+
274
+ ## 16.0.0-rc.1
275
+
276
+ ## 16.0.0-rc.0
277
+
278
+ ### Minor Changes
279
+
280
+ - 3f218e4: feat(create-objectstack): the blank scaffold ships the three generic connector executors by default
281
+
282
+ `npm create objectstack` now generates an `objectstack.config.ts` that wires the
283
+ `rest`, `openapi`, and `mcp` connector executor plugins (ADR-0022/0023/0024 +
284
+ ADR-0097) into `plugins:`, alongside `requires: ['automation']`. This closes the
285
+ last authoring gap in the ADR-0097 promise that integrations are expressible
286
+ **and executable** as pure metadata: an author (human or AI) can now add a
287
+ declarative `connectors:` entry naming `provider: 'rest' | 'openapi' | 'mcp'`
288
+ and have it materialize into a live, dispatchable connector at boot — with no
289
+ host-code edit.
290
+
291
+ - `plugins:` — `new ConnectorRestPlugin()`, `new ConnectorOpenApiPlugin()`,
292
+ `new ConnectorMcpPlugin()` (zero-arg = contribute the provider factory only).
293
+ - `requires: ['automation']` — the automation service performs the
294
+ materialization and owns the registry the executors register into. It is also
295
+ a hard dependency of the connector plugins, so a scaffold that lists them in
296
+ `plugins:` without it fails boot; automation ships transitively via
297
+ `@objectstack/cli`.
298
+ - deps — `@objectstack/connector-rest`, `@objectstack/connector-openapi`,
299
+ `@objectstack/connector-mcp`.
300
+ - Security (#3055): declarative `mcp` stdio transports stay denied by default —
301
+ opt in per host with `new ConnectorMcpPlugin({ declarativeStdio: ['node'] })`.
302
+
303
+ Brand connectors (Slack, …) remain marketplace/opt-in.
304
+
305
+ ### Patch Changes
306
+
307
+ - 83e8f7d: feat(mcp): decouple the stdio auto-start switch from the HTTP surface + surface the MCP endpoint on `os dev` boot (#3167)
308
+
309
+ The MCP HTTP surface (`/api/v1/mcp`) and the long-lived stdio transport used to
310
+ share one env var: `OS_MCP_SERVER_ENABLED=true` turned the HTTP surface on **and**
311
+ silently auto-started the stdio transport — which bridges the raw metadata service
312
+
313
+ - data engine with no per-request principal (unscoped). An operator setting it to
314
+ "make sure MCP is on" got an unscoped transport as a side effect.
315
+
316
+ * **`@objectstack/types`** — new `resolveMcpStdioAutoStart()`. Stdio auto-start is
317
+ now its own switch, `OS_MCP_STDIO_ENABLED` (default off); `OS_MCP_SERVER_ENABLED`
318
+ governs only the HTTP surface. The legacy `OS_MCP_SERVER_ENABLED=true` trigger
319
+ still starts stdio for one release, flagged as deprecated. `=false` is unchanged
320
+ (it only ever gated HTTP).
321
+ * **`@objectstack/mcp`** — `MCPServerPlugin.start()` gates stdio on the new switch
322
+ and logs a one-time deprecation warning when started via the legacy alias.
323
+ * **`@objectstack/cli`** — `os dev` now prints the MCP endpoint, the agent-skill
324
+ URL, and a ready-to-paste `claude mcp add` command on boot (gated on the HTTP
325
+ surface being on), so the "an agent operates the app it's building" loop is
326
+ discoverable at dev time.
327
+ * **`create-objectstack`** — the blank scaffold README documents that the app is
328
+ itself an MCP server (the serve side), distinct from the consume-side connector.
329
+
330
+ - 3b6ef8a: Scaffolded projects ship with a `.gitignore` again — `npx create-objectstack` produced none, leaving `node_modules/` and `.env` un-ignored for every new user.
331
+
332
+ `npm pack` / `pnpm pack` strip `.gitignore` from a tarball unconditionally, at every depth. The blank template committed one at `src/templates/blank/.gitignore` and the build faithfully copied it to `dist/templates/blank/.gitignore`, but `files: ["dist"]` publishing dropped it on the way to the registry — so the file was present in the repo, present in every local build, and absent from all 11 files of a real scaffold. Verified against the published 15.1.1 tarball, which ships `dist/templates/blank/.dockerignore` and no `.gitignore`.
333
+
334
+ The template is now committed as `_gitignore` (a name npm does not strip) and restored to `.gitignore` when the template is copied, via a `TEMPLATE_FILE_ALIASES` map in the new `template-copy.ts`. Only `.gitignore` is aliased: the strip list is `.gitignore` and `.npmrc`, not "every dotfile" — `.dockerignore` packs fine and stays literal.
335
+
336
+ The restored ignore rules also cover `.env` / `.env.*`, which they never did. The template README has users write `OS_AUTH_SECRET` and `OS_SECRET_KEY` into a `.env`, and `docker-compose.yml` calls that file "never committed" — but only the prose said so, and `.dockerignore` was the only file that listed it.
337
+
338
+ A packing ratchet in `template-consistency.test.ts` guards both halves: it packs the real package, scaffolds from the extracted tarball with the real copy logic, and asserts every template file lands under its intended name. Source-level assertions cannot see this class of bug — the file only vanishes at publish.
339
+
340
+ - 3a8ce9d: fix(create-objectstack): the blank scaffold declares pnpm build approvals, so a fresh `pnpm install` no longer exits 1 on pnpm 11
341
+
342
+ pnpm 11 turned an unapproved dependency build script from a warning into a hard
343
+ error. The blank template declared no build approvals, so the very first command
344
+ a new user runs failed on any current pnpm:
345
+
346
+ ```
347
+ npx create-objectstack myapp && cd myapp && pnpm install
348
+ # [ERR_PNPM_IGNORED_BUILDS] Ignored build scripts: better-sqlite3@12.11.1, esbuild@0.28.1
349
+ # exit 1
350
+ ```
351
+
352
+ The scaffold now ships a `pnpm-workspace.yaml` approving the two packages it
353
+ actually depends on building — `better-sqlite3` (the native sqlite driver behind
354
+ `@objectstack/driver-sql`) and `esbuild` (compiles `objectstack.config.ts`).
355
+
356
+ Both approval keys are present because pnpm reads them by version, and neither
357
+ alone covers the supported range:
358
+
359
+ - `allowBuilds` (a package → boolean map) — the only key pnpm 11 honors, and
360
+ understood back to pnpm 10.31. `onlyBuiltDependencies` alone still errors.
361
+ - `onlyBuiltDependencies` (a list) — pnpm 10.0–10.30, which ignore `allowBuilds`.
362
+
363
+ npm and yarn ignore the file, so the npm install path is unaffected. Both
364
+ packages ship prebuilt binaries, so this was an install-time hard stop rather
365
+ than a runtime defect — the project ran fine once installed.
366
+
367
+ This is the #3091 failure class (in-repo settings masking what users resolve)
368
+ and was caught by the publish smoke gate added in #3100, which installs the
369
+ release candidate the way a user does — on whatever pnpm corepack hands a fresh
370
+ machine.
371
+
372
+ - 809214f: Stop leaking repo-internal skills into scaffolded projects. The scaffolder (and the docs) advertised `npx skills add objectstack-ai/objectstack --all`, and the skills CLI's `--all` implies `--skill '*'` — which includes even `metadata.internal` skills — so repo-internal tooling like `.claude/skills/dogfood-verification` landed in every new project's `.agents/skills/`. All install commands are now scoped to the published catalog via the `/skills` subpath (`npx skills add objectstack-ai/objectstack/skills --all`), the internal skill is additionally marked `metadata.internal: true` to hide it from interactive discovery, and a template-consistency ratchet plus a scaffold-e2e assertion keep the boundary from regressing.
373
+
374
+ ## 15.1.1
375
+
376
+ ## 15.1.0
377
+
378
+ ### Minor Changes
379
+
380
+ - f531a26: feat(protocol): complete ADR-0087 — load-seam handshake, chain backfill 12–15, release artifacts (#2643)
381
+
382
+ Closes the remaining ADR-0087 gaps (see the ADR's as-built Addendum):
383
+
384
+ - **P0 load seams (D1).** The protocol handshake now runs on the boot-time
385
+ durable-package rehydration path (`@objectstack/service-package` refuses an
386
+ incompatible `sys_packages` row with the structured `OS_PROTOCOL_INCOMPATIBLE`
387
+ diagnostic and keeps booting) and on `AppPlugin` for code-defined stacks
388
+ (fail-fast before the manifest is decomposed). `objectstack lint` gains
389
+ `protocol/missing-engines-range` (warning + fix-it) and the
390
+ `create-objectstack` blank template stamps `engines: { protocol: '^<major>' }`
391
+ (re-stamped at version time by `scripts/sync-template-versions.mjs`) — the
392
+ two ends of the grandfathering ratchet.
393
+ - **Chain backfill (D2/D3).** `MetadataConversion.retiredFromLoadPath`
394
+ implements the load-window's second half (retired entries replay only via
395
+ `migrate meta` / fixture CI). Steps 12–15 land: the `api.requireAuth` flip
396
+ (semantic), the ADR-0090 wave (3 retired conversions + 5 semantic TODOs), the
397
+ `BookAudience` rename (retired conversion), and the ADR-0089 visibility
398
+ unification (`visibleOn`/`visibility` → `visibleWhen` as LIVE load-window
399
+ conversions) + the `.strict()` flip (semantic). The protocol-11
400
+ `compactLayout` → `highlightFields` rename is backfilled as a retired step-11
401
+ conversion. `migrate meta --from 10` now reaches protocol 15.
402
+ - **Release artifacts (D4).** `spec-changes.json` is generated from the
403
+ registries (`gen:spec-changes`, CI drift-checked), ships in the npm artifact
404
+ together with `api-surface.json`, and is attached to each `@objectstack/spec`
405
+ GitHub Release with `added[]`/`removed[]` filled from the api-surface diff
406
+ against the previously published release. The upgrade guide
407
+ (`docs/protocol-upgrade-guide.md`) is generated from the same registries and
408
+ CI drift-checked — a projection that cannot drift.
409
+
410
+ - f531a26: Scaffolded projects are now container-ready out of the box: the `blank` template ships a `Dockerfile` (two-stage build onto the official `ghcr.io/objectstack-ai/objectstack` runtime image), a `docker-compose.yml` (app + Postgres single-host stack), and a `.dockerignore`, plus a Deploy section in the project README. `docker build -t my-app .` works immediately after `npm create objectstack`.
411
+
412
+ ## 15.0.0
413
+
414
+ ## 14.8.0
415
+
416
+ ### Patch Changes
417
+
418
+ - eaff014: Scaffolded projects now install the current framework release instead of a stale major. The bundled `blank` template had `^6.0.0` ranges frozen in while the registry was publishing 14.x, so `npm create objectstack` produced a project eight majors behind the docs — and the template's code no longer compiled against 14.x anyway (`Field.longText` removed, `api.rest` no longer a `defineStack` key, `sharingModel` now required by the ADR-0090 security gate). The template is updated to the current API, and the scaffolder now rewrites every `@objectstack/*` range in the generated `package.json` to `^<its own version>` (all packages version in lockstep), so generated projects track the release even if the committed template drifts again. A consistency test ratchets the template's major and the README's template table against the registry. The template README also documents the seeded dev-admin sign-in that data-API curls need.
419
+
420
+ ## 14.7.0
421
+
422
+ ## 14.6.0
423
+
424
+ ## 14.5.0
425
+
426
+ ## 14.4.0
427
+
428
+ ## 14.3.0
429
+
430
+ ## 14.2.0
431
+
432
+ ## 14.1.0
433
+
434
+ ## 14.0.0
435
+
436
+ ## 13.0.0
437
+
438
+ ## 12.6.0
439
+
440
+ ## 12.5.0
441
+
442
+ ## 12.4.0
443
+
444
+ ## 12.3.0
445
+
446
+ ## 12.2.0
447
+
448
+ ## 12.1.0
449
+
450
+ ## 12.0.0
451
+
452
+ ## 11.10.0
453
+
454
+ ## 11.9.0
455
+
456
+ ## 11.8.0
457
+
458
+ ## 11.7.0
459
+
460
+ ## 11.6.0
461
+
462
+ ## 11.5.0
463
+
464
+ ## 11.4.0
465
+
466
+ ## 11.3.0
467
+
468
+ ## 11.2.0
469
+
470
+ ## 11.1.0
471
+
472
+ ## 11.0.0
473
+
474
+ ## 10.3.0
475
+
476
+ ## 10.2.0
477
+
478
+ ## 10.1.0
479
+
480
+ ### Minor Changes
481
+
482
+ - 7cf283a: Make `os validate` the author-time verification gate and steer scaffolds toward it.
483
+
484
+ - **`os validate`** now runs the same CEL/predicate gate as `os build`/`os compile`
485
+ (ADR-0032): every `visible`/`disabled`/`requiredWhen`/validation/flow/sharing
486
+ predicate is checked for CEL syntax and `record.<field>` existence on the target
487
+ object. It already ran the protocol schema and widget-binding checks; the
488
+ expression gate closes the gap so a bare field ref (`done` instead of
489
+ `record.done`) — which silently hides an action on every record at runtime
490
+ (#2183/#2185) — fails validation instead of shipping. `os validate` is now a
491
+ read-only superset of the build's checks (no artifact emitted).
492
+ - **`create-objectstack`** now emits an `AGENTS.md` (and `.github/copilot-instructions.md`)
493
+ into every generated project instructing coding agents to run `npm run validate`
494
+ after editing metadata, aligns the blank template's `dev`/`start` scripts with the
495
+ example apps (`objectstack dev`/`objectstack start`), and sharpens the post-create
496
+ "Next steps" output.
497
+
498
+ ## 10.0.0
499
+
500
+ ## 9.11.0
501
+
502
+ ## 9.10.0
503
+
504
+ ## 9.9.1
505
+
506
+ ## 9.9.0
507
+
508
+ ## 9.8.0
509
+
510
+ ## 9.7.0
511
+
512
+ ## 9.6.0
513
+
514
+ ## 9.5.1
515
+
516
+ ## 9.5.0
517
+
518
+ ## 9.4.0
519
+
520
+ ## 9.3.0
521
+
522
+ ## 9.2.0
523
+
524
+ ## 9.1.0
525
+
526
+ ## 9.0.1
527
+
528
+ ## 9.0.0
529
+
530
+ ## 8.0.1
531
+
532
+ ## 8.0.0
533
+
534
+ ## 7.9.0
535
+
536
+ ## 7.8.0
537
+
538
+ ## 7.7.0
539
+
540
+ ## 7.6.0
541
+
542
+ ## 7.5.0
543
+
544
+ ## 7.4.1
545
+
546
+ ## 7.4.0
547
+
548
+ ## 7.3.0
549
+
550
+ ## 7.2.1
551
+
552
+ ## 7.2.0
553
+
554
+ ## 7.1.0
555
+
556
+ ## 7.0.0
557
+
558
+ ## 6.9.0
559
+
560
+ ## 6.8.1
561
+
562
+ ## 6.8.0
563
+
564
+ ## 6.7.1
565
+
566
+ ## 6.7.0
567
+
568
+ ## 6.6.0
569
+
570
+ ## 6.5.1
571
+
572
+ ## 6.5.0
573
+
574
+ ## 6.4.0
575
+
576
+ ### Patch Changes
577
+
578
+ - 15fc484: Upgrade `@object-ui/*` packages to **v6.0**.
579
+
580
+ - `@objectstack/cli`: `@object-ui/console` and `@object-ui/studio` from `^5.4.2` → `^6.0.0` — bundled Studio + Console assets now ship the v6 UI shell (new design language, refreshed sidebar, redesigned record header).
581
+ - `@objectstack/account`: `@object-ui/i18n` from `^5.4.2` → `^6.0.0` — i18n runtime now matches the v6 console/studio API.
582
+ - Root devDependency `@object-ui/console` from `^5.4.2` → `^6.0.0` so workspace scripts and the docs build pick up v6.
583
+ - `create-objectstack`: `tar` from `^7.4.3` → `^7.5.15` (security + perf fixes when unpacking remote templates).
584
+
585
+ **Heads-up for consumers:** `@object-ui/*` v6 is a major release of the bundled UI; pages rendered through the CLI's `studio` / `console` mounts may look different from v5. The protocol surface is unchanged.
586
+
587
+ ## 6.3.0
588
+
589
+ ## 6.2.0
590
+
591
+ ## 6.1.1
592
+
593
+ ## 6.1.0
594
+
595
+ ## 6.0.0
596
+
597
+ ## 5.2.0
598
+
599
+ ## 5.1.0
600
+
601
+ ## 5.0.0
602
+
603
+ ## 4.2.0
604
+
605
+ ## 4.1.1
606
+
607
+ ## 4.1.0
608
+
609
+ ## 4.0.5
610
+
611
+ ### Patch Changes
612
+
613
+ - 15e0df6: chore: unify all package versions to a single patch release
614
+
615
+ ## 4.0.4
616
+
617
+ ## 4.0.3
618
+
619
+ ## 4.0.2
620
+
621
+ ## 4.0.0
622
+
623
+ ## 3.3.1
624
+
625
+ ## 3.3.0
626
+
627
+ ## 3.2.9
628
+
629
+ ## 3.2.8
630
+
631
+ ## 3.2.7
632
+
633
+ ## 3.2.6
634
+
635
+ ## 3.2.5
636
+
637
+ ## 3.2.4
638
+
639
+ ## 3.2.3
640
+
641
+ ## 3.2.2
642
+
643
+ ## 3.2.1
644
+
645
+ ## 3.2.0
646
+
647
+ ## 3.1.1
648
+
649
+ ## 3.1.0
650
+
651
+ ## 3.0.11
652
+
653
+ ## 3.0.10
654
+
655
+ ## 3.0.9
656
+
657
+ ## 3.0.8
@@ -13,7 +13,6 @@
13
13
  "dependencies": {
14
14
  "@objectstack/spec": "^17.0.0",
15
15
  "@objectstack/runtime": "^17.0.0",
16
- "@objectstack/driver-memory": "^17.0.0",
17
16
  "@objectstack/plugin-hono-server": "^17.0.0",
18
17
  "@objectstack/connector-rest": "^17.0.0",
19
18
  "@objectstack/connector-openapi": "^17.0.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-objectstack",
3
- "version": "17.0.0-rc.0",
3
+ "version": "17.0.0-rc.1",
4
4
  "description": "Create a new ObjectStack project — npx create-objectstack",
5
5
  "bin": {
6
6
  "create-objectstack": "./bin/create-objectstack.js"
@@ -37,13 +37,15 @@
37
37
  },
38
38
  "files": [
39
39
  "dist",
40
- "README.md"
40
+ "README.md",
41
+ "CHANGELOG.md"
41
42
  ],
42
43
  "engines": {
43
44
  "node": ">=22.0.0"
44
45
  },
45
46
  "scripts": {
46
47
  "build": "tsup",
48
+ "typecheck": "tsc --noEmit",
47
49
  "dev": "tsup --watch",
48
50
  "test": "vitest run"
49
51
  }