From 24bf78cfd0b540e9622a85b70b027001e1546f15 Mon Sep 17 00:00:00 2001 From: Chris Tate Date: Wed, 1 Jul 2026 18:56:21 -0500 Subject: [PATCH] prepare v0.19.1 Bump all @json-render/* packages to 0.19.1, add changelog entry for the zod 4.4 compatibility fixes, dangling-children autofix, render type fixes, and harness-chat example, and update the web app changelog page. --- CHANGELOG.md | 22 +++++++++++++++++-- apps/web/app/(main)/docs/changelog/page.mdx | 24 +++++++++++++++++++++ packages/codegen/package.json | 2 +- packages/core/package.json | 2 +- packages/devtools-react/package.json | 2 +- packages/devtools-solid/package.json | 2 +- packages/devtools-svelte/package.json | 2 +- packages/devtools-vue/package.json | 2 +- packages/devtools/package.json | 2 +- packages/directives/package.json | 2 +- packages/image/package.json | 2 +- packages/ink/package.json | 2 +- packages/jotai/package.json | 2 +- packages/mcp/package.json | 2 +- packages/next/package.json | 2 +- packages/react-email/package.json | 2 +- packages/react-native/package.json | 2 +- packages/react-pdf/package.json | 2 +- packages/react-three-fiber/package.json | 2 +- packages/react/package.json | 2 +- packages/redux/package.json | 2 +- packages/remotion/package.json | 2 +- packages/shadcn-svelte/package.json | 2 +- packages/shadcn/package.json | 2 +- packages/solid/package.json | 2 +- packages/svelte/package.json | 2 +- packages/vue/package.json | 2 +- packages/xstate/package.json | 2 +- packages/yaml/package.json | 2 +- packages/zustand/package.json | 2 +- 30 files changed, 72 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6cc8c37a..add4b4bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,27 @@ # Changelog -## 0.19.0 +## 0.19.1 +### Bug Fixes + +- **zod 4.4+ compatibility** — `@json-render/core` and `@json-render/shadcn-svelte` listed zod in both `dependencies` and `peerDependencies`, which could give the library its own zod copy distinct from your app's. zod 4 embeds a version literal in its types, so the duplicate copies surfaced as `Type '4' is not assignable to type '3'` errors on `_zod.version.minor` and blocked upgrading to zod 4.4+. zod is now a peer-only dependency, so your app's zod is always the single copy (#297, #303) +- **`visible` validation on zod 4.4+** — `catalog.validate()` accepted specs that omit an element's `visible` field on zod 4.3 but rejected them on zod 4.4+, where `z.any()` object keys became non-optional. `visible` is now explicitly optional so all zod 4.x versions agree (#287, #299) +- **Dangling children autofix** — `autoFixSpec` now prunes `children` references to elements that don't exist in the spec, the dominant remaining first-attempt validation failure for AI-generated specs. The renderer already skipped missing children at runtime, so pruning renders identically while letting the spec validate; each removal is reported in `fixes` (#300) +- **PDF and image render types** — Fixed `Buffer`/`Uint8Array` type errors in `@json-render/image`'s `renderToPng` and `@json-render/react-pdf`'s `renderToBuffer` under current `@types/node`, and corrected `renderToStream`'s declared return type to `NodeJS.ReadableStream`, which is what `@react-pdf/renderer` actually returns (#304) + +### Improvements + +- **Prompt rules for children** — The default prompt now states explicitly that every element must include a `children` array (`[]` for leaves), which models otherwise omitted on roughly a third of first attempts (#299) +- **Harness agent chat example** — New `examples/harness-chat` demo running a coding agent (Claude Code, Codex, or Pi) in a Vercel Sandbox via the AI SDK `HarnessAgent` API, rendering its work reports as json-render generative UI instead of markdown (#302) + +### Contributors + +- @ctate + + +## 0.19.0 + ### New Features - **Custom directives API** — `@json-render/core` now supports custom directives via `defineDirective`, letting you declare new JSON shapes (like `$format`, `$math`) that resolve to computed values at render time. Directives compose naturally — nest `$format` over `$math` over `$state` and they resolve inside-out. All four renderers (React, Vue, Svelte, Solid) have built-in directive resolution (#279) @@ -15,7 +34,6 @@ ### Contributors - @ctate - ## 0.18.0 diff --git a/apps/web/app/(main)/docs/changelog/page.mdx b/apps/web/app/(main)/docs/changelog/page.mdx index a5ca4e97..acf5ad11 100644 --- a/apps/web/app/(main)/docs/changelog/page.mdx +++ b/apps/web/app/(main)/docs/changelog/page.mdx @@ -5,6 +5,30 @@ export const metadata = pageMetadata("docs/changelog") Notable changes and updates to json-render. +## v0.19.1 + +July 1, 2026 + +### Fixed: zod 4.4+ compatibility + +`@json-render/core` and `@json-render/shadcn-svelte` listed zod in both `dependencies` and `peerDependencies`, which could give the library its own zod copy distinct from your app's. zod 4 embeds a version literal in its types, so the duplicate copies surfaced as `Type '4' is not assignable to type '3'` errors on `_zod.version.minor` and blocked upgrading to zod 4.4+. zod is now a peer-only dependency, so your app's zod is always the single copy. + +Relatedly, `catalog.validate()` accepted specs that omit an element's `visible` field on zod 4.3 but rejected them on zod 4.4+, where `z.any()` object keys became non-optional. `visible` is now explicitly optional so all zod 4.x versions agree. + +### Fixed: dangling children autofix + +`autoFixSpec` now prunes `children` references to elements that don't exist in the spec -- the dominant remaining first-attempt validation failure for AI-generated specs. The renderer already skipped missing children at runtime, so pruning renders identically while letting the spec validate; each removal is reported in `fixes`. + +### Fixed: PDF and image render types + +Fixed `Buffer`/`Uint8Array` type errors in `@json-render/image`'s `renderToPng` and `@json-render/react-pdf`'s `renderToBuffer` under current `@types/node`, and corrected `renderToStream`'s declared return type to `NodeJS.ReadableStream`, which is what `@react-pdf/renderer` actually returns. + +### New: harness agent chat example + +New `examples/harness-chat` demo running a coding agent (Claude Code, Codex, or Pi) in a Vercel Sandbox via the AI SDK `HarnessAgent` API, rendering its work reports as json-render generative UI instead of markdown. + +--- + ## v0.19.0 May 6, 2026 diff --git a/packages/codegen/package.json b/packages/codegen/package.json index 956c0404..5ad891c7 100644 --- a/packages/codegen/package.json +++ b/packages/codegen/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/codegen", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "Utilities for generating code from json-render UI trees", "keywords": [ diff --git a/packages/core/package.json b/packages/core/package.json index 979338b7..e219a6c3 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/core", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "JSON becomes real things. Define your catalog, register your components, let AI generate.", "keywords": [ diff --git a/packages/devtools-react/package.json b/packages/devtools-react/package.json index a6e62dee..25aeb61c 100644 --- a/packages/devtools-react/package.json +++ b/packages/devtools-react/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/devtools-react", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "React adapter for @json-render/devtools. Drop-in component.", "keywords": [ diff --git a/packages/devtools-solid/package.json b/packages/devtools-solid/package.json index bcafb3df..303cda1b 100644 --- a/packages/devtools-solid/package.json +++ b/packages/devtools-solid/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/devtools-solid", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "SolidJS adapter for @json-render/devtools. Drop-in component.", "keywords": [ diff --git a/packages/devtools-svelte/package.json b/packages/devtools-svelte/package.json index 176e7e87..ebe68128 100644 --- a/packages/devtools-svelte/package.json +++ b/packages/devtools-svelte/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/devtools-svelte", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "Svelte adapter for @json-render/devtools. Drop-in component.", "keywords": [ diff --git a/packages/devtools-vue/package.json b/packages/devtools-vue/package.json index 7891db3f..30d0a69b 100644 --- a/packages/devtools-vue/package.json +++ b/packages/devtools-vue/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/devtools-vue", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "Vue adapter for @json-render/devtools. Drop-in component.", "keywords": [ diff --git a/packages/devtools/package.json b/packages/devtools/package.json index 1d49952a..c5c21967 100644 --- a/packages/devtools/package.json +++ b/packages/devtools/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/devtools", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "Framework-agnostic devtools core for json-render: event store, panel UI, picker, stream taps.", "keywords": [ diff --git a/packages/directives/package.json b/packages/directives/package.json index db354dd9..98e5b6f2 100644 --- a/packages/directives/package.json +++ b/packages/directives/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/directives", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "Pre-built directives for @json-render/core — $format, $math, $concat, $count, $truncate, $pluralize, $join, and $t (i18n).", "keywords": [ diff --git a/packages/image/package.json b/packages/image/package.json index 791bd21c..35001a75 100644 --- a/packages/image/package.json +++ b/packages/image/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/image", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "Image renderer for @json-render/core. JSON becomes SVG and PNG images via Satori.", "keywords": [ diff --git a/packages/ink/package.json b/packages/ink/package.json index dfe465aa..1ef0d7fa 100644 --- a/packages/ink/package.json +++ b/packages/ink/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/ink", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "Ink terminal renderer for @json-render/core. JSON becomes terminal UIs.", "keywords": [ diff --git a/packages/jotai/package.json b/packages/jotai/package.json index b2c1828c..88f98396 100644 --- a/packages/jotai/package.json +++ b/packages/jotai/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/jotai", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "Jotai adapter for json-render StateStore", "keywords": [ diff --git a/packages/mcp/package.json b/packages/mcp/package.json index 0aef4cd3..5f1b5bf0 100644 --- a/packages/mcp/package.json +++ b/packages/mcp/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/mcp", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "MCP Apps integration for @json-render/core. Serve json-render UIs as interactive MCP Apps in Claude, ChatGPT, Cursor, and VS Code.", "keywords": [ diff --git a/packages/next/package.json b/packages/next/package.json index 298bf89b..d3e175bc 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/next", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "Next.js renderer for @json-render/core. JSON becomes full Next.js applications with routes, layouts, metadata, and SSR.", "keywords": [ diff --git a/packages/react-email/package.json b/packages/react-email/package.json index 4f8355a8..5af1dccd 100644 --- a/packages/react-email/package.json +++ b/packages/react-email/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/react-email", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "React Email renderer for @json-render/core. JSON becomes HTML emails.", "keywords": [ diff --git a/packages/react-native/package.json b/packages/react-native/package.json index ffcb46ac..35900247 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/react-native", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "React Native renderer for @json-render/core. JSON becomes React Native components.", "keywords": [ diff --git a/packages/react-pdf/package.json b/packages/react-pdf/package.json index a9b0b5ce..dbd41b63 100644 --- a/packages/react-pdf/package.json +++ b/packages/react-pdf/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/react-pdf", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "React PDF renderer for @json-render/core. JSON becomes PDF documents.", "keywords": [ diff --git a/packages/react-three-fiber/package.json b/packages/react-three-fiber/package.json index 278aca0f..d4683fb3 100644 --- a/packages/react-three-fiber/package.json +++ b/packages/react-three-fiber/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/react-three-fiber", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "React Three Fiber renderer for @json-render/core. JSON becomes 3D scenes.", "keywords": [ diff --git a/packages/react/package.json b/packages/react/package.json index d64678f2..629354c4 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/react", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "React renderer for @json-render/core. JSON becomes React components.", "keywords": [ diff --git a/packages/redux/package.json b/packages/redux/package.json index f27edf85..bec510df 100644 --- a/packages/redux/package.json +++ b/packages/redux/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/redux", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "Redux adapter for json-render StateStore", "keywords": [ diff --git a/packages/remotion/package.json b/packages/remotion/package.json index 85d9abf3..52a7b7b3 100644 --- a/packages/remotion/package.json +++ b/packages/remotion/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/remotion", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "Remotion renderer for @json-render/core. JSON becomes video compositions.", "keywords": [ diff --git a/packages/shadcn-svelte/package.json b/packages/shadcn-svelte/package.json index 122718b2..c282319f 100644 --- a/packages/shadcn-svelte/package.json +++ b/packages/shadcn-svelte/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/shadcn-svelte", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "shadcn-svelte component library for @json-render/svelte. JSON becomes beautiful Tailwind-styled Svelte components.", "keywords": [ diff --git a/packages/shadcn/package.json b/packages/shadcn/package.json index 18569b07..60719ba4 100644 --- a/packages/shadcn/package.json +++ b/packages/shadcn/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/shadcn", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "shadcn/ui component library for @json-render/core. JSON becomes beautiful Tailwind-styled React components.", "keywords": [ diff --git a/packages/solid/package.json b/packages/solid/package.json index 12ebe16c..d5447a51 100644 --- a/packages/solid/package.json +++ b/packages/solid/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/solid", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "SolidJS renderer for @json-render/core. JSON becomes Solid components.", "keywords": [ diff --git a/packages/svelte/package.json b/packages/svelte/package.json index c64549d7..e2ec4020 100644 --- a/packages/svelte/package.json +++ b/packages/svelte/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/svelte", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "Svelte 5 renderer for @json-render/core. JSON becomes Svelte components.", "keywords": [ diff --git a/packages/vue/package.json b/packages/vue/package.json index 608741a1..3e9bd91f 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/vue", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "Vue renderer for @json-render/core. JSON becomes Vue components.", "keywords": [ diff --git a/packages/xstate/package.json b/packages/xstate/package.json index 8e5e631c..c948b867 100644 --- a/packages/xstate/package.json +++ b/packages/xstate/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/xstate", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "XState Store adapter for json-render StateStore", "keywords": [ diff --git a/packages/yaml/package.json b/packages/yaml/package.json index 7fafb4eb..4782cd30 100644 --- a/packages/yaml/package.json +++ b/packages/yaml/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/yaml", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "YAML wire format for @json-render/core. Progressive rendering and surgical edits via streaming YAML.", "keywords": [ diff --git a/packages/zustand/package.json b/packages/zustand/package.json index bf33f826..f8477cdc 100644 --- a/packages/zustand/package.json +++ b/packages/zustand/package.json @@ -1,6 +1,6 @@ { "name": "@json-render/zustand", - "version": "0.19.0", + "version": "0.19.1", "license": "Apache-2.0", "description": "Zustand adapter for json-render StateStore", "keywords": [