v0.15.2
๐ Fixed
- oxfmt ignores generated emit (
oke-client.d.ts,schema.drizzle.ts,flows/generated.ts) sooke devno longer fails Format on CI.
changelog
Written down before it is announced. The page is generated from changelog.md in the repo.
oke-client.d.ts, schema.drizzle.ts, flows/generated.ts) so oke dev no longer fails Format on CI.store.schema.policy plus pgPolicy. Policy grid marks declared vs live. Schema cards show Manifest RLS.relrowsecurity, same shield language as the tree). Enabled tables with policies show **N RLS**.creator_email / owner_email when present) with PK / FK marks, and rewrite USING / WITH CHECK. Create stays blocked until a column is picked.store.schema.policy.gate/owner/scope and store.schema.rls(). oke db push installs oke.* helpers before drizzle-kit.http.get() plus nameless flow({ do }) stamp path and unit.export from flows/<unit>/. oke() drains generated.ts into $routes. Unresolved path is OKE1010; duplicate method+path is OKE1011; unnamed HTTP is OKE1012.list.ts + route.ts both http.get() โ GET /notes). Different methods on one path stay allowed. Boot still refuses leftovers (OKE1011).{ asGate, asUserId }. Local-only asUserId on the SQL picker is gone โ the server stamps the full bag.userId: "gate:${name}". oke.user() is empty unless a seeded user is picked. Invoke may return rls.:param, then * โ same as Trie and RegExp. A first-registered /notes/:slug no longer eats /notes/archive.fx.store applies RLS on postgres / pglite. Apps that created Console policies and relied on the app role ignoring them now filter.oke.gate() / oke.user() / oke.has_scope(). Docs and templates no longer teach current_setting or current_user.TO roles stay unquoted (public, current_user). Manifest Table gains rls + policies..gate.public is gone. Mark a route open with .public(), sibling of .live(). gate.public stays the element sentinel.rc5 pair as the framework (orm@1.0.0-rc.5-169397b, kit@1.0.0-rc.5-ab785fc).app.ts is import "@/flows/generated" plus oke({ name }) โ .adopt(routes) is optional. Keel core.ts splits by element; the barrel stays @/core. oke ai setup prefers src/core/ai.ts when that file exists.oke dev Ready board uses aligned name / port columns, and each bound surface (Backend, Console, MCP, Docs MCP) is its own box with the URL and a one-line purpose.drizzle-orm@1.0.0-rc.5-169397b (npm rc5) and drizzle-kit@1.0.0-rc.5-ab785fc (kit rc5). There is no 1.0.0-rc.5 on the registry.fx.store stamps Gate identity per statement on postgres / pglite. Cron / CDC / signal stay table-owner.oke() auto-drains store.kv / store.index, clock(), and gate.policy / .scope / .rate the same way as store.sql / vault.secret. Import the declaring module before oke() โ no hand-built stores / clocks / gate.policies arrays.main prefix exception, QUERY vs leaves, [...slug] client key "*", and http.resource in a tree.http.get("/โฆ") + flow("unit.action") is no longer taught as the only identity._ files are importable but not routes; match order is static โ :param โ *; generate-time method+path collision.16.14.5 / MDX 15.3.0, Next to 16.3.1, plus patch/minor updates for @base-ui/react, lucide, postcss, and @types/node.oke.user() / oke.gate() / oke.has_scope().oke db seed is a separate command (intro / confirm / outro). oke dev does not ask to seed โ not every project has a seed. The live controls add s to run that command as a child (oke db seed --force), not inside the oke dev process.drizzle-orm/zod. The separate drizzle-zod package is gone.oke({ name }) โ stores, secrets, gates, clocks, and channel templates auto-register from @/core.SELECT when that table is not in the live store, and seeds a random live table (not always the first).value fills leftover grid width (same as SQL comment).frame-src 'self' blocked the blob URL. frame-src / img-src / media-src now allow blob:.kv:reminders ยท kv:reminders โ kv:reminders). SQL still shows sql:db ยท sql:tasks.z.object and drizzle-orm/zod (createSelectSchema / insert / update, tableZod().select) into Manifest JSON Schema so Call API Fields and the contract Request / Response lists populate instead of "Schema not expanded in Manifest."clock.run-now, store edit, vault write, replay, channel send-test, โฆ) return at as ISO-8601 UTC instead of epoch ms (1787305011525 โ 2026-08-21T09:36:51.525Z).:id) stay in Path params; leftover GET fields are Query params. GET /tasks/:id is path-only โ the duplicate Body id is gone.$routes from generated.ts accepts cron / signal / call-only flows โ AppRouteMap no longer requires method/path on every leaf.http.get() types resolve HttpPathPending in the trigger namespace (verbatim type import).SET LOCAL ROLE oke_app, set_config) โ a multi-command batch is rejected by PGlite's prepared query path. Concurrent identities on the shared connection are serialized.reserve() one Bun.SQL slot, then BEGIN / SET LOCAL on that slot. begin() plus parent unsafe() was deadlocking PgDog (checkout timeout). Store, journal, clock, and instances share one pool of 8; PgDog pool_size is 20.oke.* helpers install again: toPostgresParams no longer rewrites jsonb ? into $1 when there are no bound values, and oke.has_scope uses jsonb_exists.oke no longer steals domain tables: search_path is public, oke, and leftover oke.<table> rows move to public.fx.store(db).select().where() / .orderBy() compile Drizzle eq / and / or / like / asc again against the pinned drizzle-orm@1.0.0-rc.5-169397b โ that snapshot stores StringChunk.value as a string, not string[].drafts, reminders, view-prefs, webhooks) is { durable: true } and seed writes all four, so Console Store browse is not empty after Redis recreates. Seed logs keys N for kv.set.recurring.spawn (and GitHub / Slack / form intake) call tasks.create by name so the Manifest stamps effects.calls โ aliased fx.call(createTask) was inferred as createTask and threw OKE1007 every hour.oke db push treats drizzle-kit rename_or_create as create and retries, so a first-time Keel schema no longer fails missing_hints. Destructive confirm_data_loss still stops.oke db push only manages schema public (schemaFilter), so it does not try to drop oke / oke_console.flows/main/route.ts after the tree split removed main/index.ts.