From 7ea96aca197a17b62195ae46632923f4f79f5b15 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 25 Oct 2026 00:33:25 +0000 Subject: [PATCH 1/2] chore(deps): narrow the React peer range to ^19.0.0 Every workspace package that asks its host for React now declares `react` / `react-dom` as `^19.0.0` instead of `^18.0.0 || ^19.0.0`: 31 packages, 56 peer declarations (31 react + 25 react-dom). Nothing in the tree ever installed or tested React 18, so the 18 arm was a published promise with no test behind it. Maintainer ruling A on the card. Moves with it, because the repo pins the range in several places: - react-peer-range-norm-3741 test: the norm is now `^19.0.0`; - the 12 package README peer lines and doc-version-claims' ledger keys; - QUICK_REFERENCE.md's React row (the release-block test reads the majors); - AGENTS.md section 2 and its verbatim mirror in skills/objectui/SKILL.md; - create-plugin's generated peers, the plugin skeletons in the docs, the troubleshooting page and comments that cited the old range. One minor changeset per package with a breaking note (no `major`, per the version-alignment policy). Claude-Session: https://claude.ai/code/session_01Erxd3BYXhV2mQMatxGZ9yg Co-authored-by: Claude --- .changeset/13465-react-peer-app-shell.md | 8 ++++ .changeset/13465-react-peer-auth.md | 8 ++++ .changeset/13465-react-peer-collaboration.md | 8 ++++ .changeset/13465-react-peer-components.md | 8 ++++ .changeset/13465-react-peer-create-plugin.md | 8 ++++ .changeset/13465-react-peer-fields.md | 8 ++++ .changeset/13465-react-peer-i18n.md | 8 ++++ .changeset/13465-react-peer-layout.md | 8 ++++ .changeset/13465-react-peer-mobile.md | 8 ++++ .changeset/13465-react-peer-permissions.md | 8 ++++ .changeset/13465-react-peer-plugin-ai.md | 8 ++++ .../13465-react-peer-plugin-calendar.md | 8 ++++ .changeset/13465-react-peer-plugin-charts.md | 8 ++++ .changeset/13465-react-peer-plugin-chatbot.md | 8 ++++ .../13465-react-peer-plugin-dashboard.md | 8 ++++ .../13465-react-peer-plugin-designer.md | 8 ++++ .changeset/13465-react-peer-plugin-detail.md | 8 ++++ .changeset/13465-react-peer-plugin-editor.md | 8 ++++ .changeset/13465-react-peer-plugin-form.md | 8 ++++ .changeset/13465-react-peer-plugin-gantt.md | 8 ++++ .changeset/13465-react-peer-plugin-grid.md | 8 ++++ .changeset/13465-react-peer-plugin-kanban.md | 8 ++++ .changeset/13465-react-peer-plugin-list.md | 8 ++++ .changeset/13465-react-peer-plugin-map.md | 8 ++++ .../13465-react-peer-plugin-markdown.md | 8 ++++ .changeset/13465-react-peer-plugin-report.md | 8 ++++ .../13465-react-peer-plugin-timeline.md | 8 ++++ .changeset/13465-react-peer-plugin-tree.md | 8 ++++ .changeset/13465-react-peer-plugin-view.md | 8 ++++ .changeset/13465-react-peer-providers.md | 8 ++++ .changeset/13465-react-peer-react-runtime.md | 8 ++++ .changeset/13465-react-peer-react.md | 8 ++++ AGENTS.md | 2 +- QUICK_REFERENCE.md | 2 +- content/docs/guide/plugins.md | 4 +- content/docs/guide/troubleshooting.md | 2 +- packages/app-shell/package.json | 4 +- packages/auth/README.md | 2 +- packages/auth/package.json | 2 +- .../cli/src/__tests__/app-generator.test.ts | 2 +- .../cli/src/utils/scaffold-dependencies.ts | 2 +- packages/collaboration/README.md | 2 +- packages/collaboration/package.json | 2 +- packages/components/README.md | 4 +- packages/components/docs/FilterBuilder.md | 2 +- packages/components/package.json | 4 +- .../components/src/lib/inline-markdown.tsx | 4 +- .../src/renderers/complex/README-KANBAN.md | 2 +- packages/create-plugin/src/templates.ts | 4 +- packages/fields/package.json | 4 +- packages/i18n/README.md | 2 +- packages/i18n/package.json | 2 +- packages/layout/README.md | 4 +- packages/layout/package.json | 4 +- packages/mobile/README.md | 2 +- packages/mobile/package.json | 2 +- packages/permissions/README.md | 2 +- packages/permissions/package.json | 2 +- packages/plugin-ai/README.md | 4 +- packages/plugin-ai/package.json | 4 +- packages/plugin-calendar/package.json | 4 +- packages/plugin-charts/package.json | 4 +- packages/plugin-chatbot/package.json | 4 +- packages/plugin-dashboard/package.json | 4 +- packages/plugin-designer/README.md | 4 +- packages/plugin-designer/package.json | 4 +- packages/plugin-detail/package.json | 4 +- packages/plugin-editor/package.json | 4 +- packages/plugin-form/package.json | 4 +- packages/plugin-gantt/package.json | 4 +- packages/plugin-grid/package.json | 4 +- packages/plugin-kanban/package.json | 4 +- packages/plugin-list/package.json | 4 +- packages/plugin-map/package.json | 4 +- packages/plugin-markdown/package.json | 4 +- packages/plugin-report/README.md | 4 +- packages/plugin-report/package.json | 4 +- packages/plugin-timeline/package.json | 4 +- packages/plugin-tree/package.json | 4 +- packages/plugin-view/package.json | 4 +- packages/providers/package.json | 4 +- packages/react-runtime/README.md | 2 +- packages/react-runtime/package.json | 2 +- packages/react/README.md | 4 +- packages/react/package.json | 4 +- packages/react/src/hooks/useGlobalUndo.ts | 2 +- scripts/__tests__/doc-version-claims.test.ts | 41 ++++++++++--------- .../react-peer-range-norm-3741.test.ts | 17 ++++---- skills/objectui/SKILL.md | 2 +- skills/objectui/guides/plugin-development.md | 4 +- 90 files changed, 378 insertions(+), 118 deletions(-) create mode 100644 .changeset/13465-react-peer-app-shell.md create mode 100644 .changeset/13465-react-peer-auth.md create mode 100644 .changeset/13465-react-peer-collaboration.md create mode 100644 .changeset/13465-react-peer-components.md create mode 100644 .changeset/13465-react-peer-create-plugin.md create mode 100644 .changeset/13465-react-peer-fields.md create mode 100644 .changeset/13465-react-peer-i18n.md create mode 100644 .changeset/13465-react-peer-layout.md create mode 100644 .changeset/13465-react-peer-mobile.md create mode 100644 .changeset/13465-react-peer-permissions.md create mode 100644 .changeset/13465-react-peer-plugin-ai.md create mode 100644 .changeset/13465-react-peer-plugin-calendar.md create mode 100644 .changeset/13465-react-peer-plugin-charts.md create mode 100644 .changeset/13465-react-peer-plugin-chatbot.md create mode 100644 .changeset/13465-react-peer-plugin-dashboard.md create mode 100644 .changeset/13465-react-peer-plugin-designer.md create mode 100644 .changeset/13465-react-peer-plugin-detail.md create mode 100644 .changeset/13465-react-peer-plugin-editor.md create mode 100644 .changeset/13465-react-peer-plugin-form.md create mode 100644 .changeset/13465-react-peer-plugin-gantt.md create mode 100644 .changeset/13465-react-peer-plugin-grid.md create mode 100644 .changeset/13465-react-peer-plugin-kanban.md create mode 100644 .changeset/13465-react-peer-plugin-list.md create mode 100644 .changeset/13465-react-peer-plugin-map.md create mode 100644 .changeset/13465-react-peer-plugin-markdown.md create mode 100644 .changeset/13465-react-peer-plugin-report.md create mode 100644 .changeset/13465-react-peer-plugin-timeline.md create mode 100644 .changeset/13465-react-peer-plugin-tree.md create mode 100644 .changeset/13465-react-peer-plugin-view.md create mode 100644 .changeset/13465-react-peer-providers.md create mode 100644 .changeset/13465-react-peer-react-runtime.md create mode 100644 .changeset/13465-react-peer-react.md diff --git a/.changeset/13465-react-peer-app-shell.md b/.changeset/13465-react-peer-app-shell.md new file mode 100644 index 0000000000..543aaaca8f --- /dev/null +++ b/.changeset/13465-react-peer-app-shell.md @@ -0,0 +1,8 @@ +--- +"@object-ui/app-shell": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-auth.md b/.changeset/13465-react-peer-auth.md new file mode 100644 index 0000000000..548183377b --- /dev/null +++ b/.changeset/13465-react-peer-auth.md @@ -0,0 +1,8 @@ +--- +"@object-ui/auth": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` now reads `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-collaboration.md b/.changeset/13465-react-peer-collaboration.md new file mode 100644 index 0000000000..fec9eb55e9 --- /dev/null +++ b/.changeset/13465-react-peer-collaboration.md @@ -0,0 +1,8 @@ +--- +"@object-ui/collaboration": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` now reads `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-components.md b/.changeset/13465-react-peer-components.md new file mode 100644 index 0000000000..1d4b93f943 --- /dev/null +++ b/.changeset/13465-react-peer-components.md @@ -0,0 +1,8 @@ +--- +"@object-ui/components": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-create-plugin.md b/.changeset/13465-react-peer-create-plugin.md new file mode 100644 index 0000000000..557ec2cebf --- /dev/null +++ b/.changeset/13465-react-peer-create-plugin.md @@ -0,0 +1,8 @@ +--- +"@object-ui/create-plugin": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** a generated plugin's `package.json` now declares `react` and `react-dom` peers as `^19.0.0` (was `^18.0.0 || ^19.0.0`), matching the React 19-only peer range every `@object-ui/*` package now declares. Plugins already generated are unchanged; their authors may narrow the range the same way. Declared `minor` per the version-alignment policy (objectui#13465). diff --git a/.changeset/13465-react-peer-fields.md b/.changeset/13465-react-peer-fields.md new file mode 100644 index 0000000000..9e7b68fd2b --- /dev/null +++ b/.changeset/13465-react-peer-fields.md @@ -0,0 +1,8 @@ +--- +"@object-ui/fields": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-i18n.md b/.changeset/13465-react-peer-i18n.md new file mode 100644 index 0000000000..d36268325a --- /dev/null +++ b/.changeset/13465-react-peer-i18n.md @@ -0,0 +1,8 @@ +--- +"@object-ui/i18n": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` now reads `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-layout.md b/.changeset/13465-react-peer-layout.md new file mode 100644 index 0000000000..adfa35ac63 --- /dev/null +++ b/.changeset/13465-react-peer-layout.md @@ -0,0 +1,8 @@ +--- +"@object-ui/layout": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-mobile.md b/.changeset/13465-react-peer-mobile.md new file mode 100644 index 0000000000..bdc4b1429a --- /dev/null +++ b/.changeset/13465-react-peer-mobile.md @@ -0,0 +1,8 @@ +--- +"@object-ui/mobile": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` now reads `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-permissions.md b/.changeset/13465-react-peer-permissions.md new file mode 100644 index 0000000000..245f7006b8 --- /dev/null +++ b/.changeset/13465-react-peer-permissions.md @@ -0,0 +1,8 @@ +--- +"@object-ui/permissions": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` now reads `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-plugin-ai.md b/.changeset/13465-react-peer-plugin-ai.md new file mode 100644 index 0000000000..d5dffaad46 --- /dev/null +++ b/.changeset/13465-react-peer-plugin-ai.md @@ -0,0 +1,8 @@ +--- +"@object-ui/plugin-ai": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-plugin-calendar.md b/.changeset/13465-react-peer-plugin-calendar.md new file mode 100644 index 0000000000..c22bc79ba3 --- /dev/null +++ b/.changeset/13465-react-peer-plugin-calendar.md @@ -0,0 +1,8 @@ +--- +"@object-ui/plugin-calendar": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-plugin-charts.md b/.changeset/13465-react-peer-plugin-charts.md new file mode 100644 index 0000000000..4b88eddfc9 --- /dev/null +++ b/.changeset/13465-react-peer-plugin-charts.md @@ -0,0 +1,8 @@ +--- +"@object-ui/plugin-charts": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-plugin-chatbot.md b/.changeset/13465-react-peer-plugin-chatbot.md new file mode 100644 index 0000000000..c7d399d5a7 --- /dev/null +++ b/.changeset/13465-react-peer-plugin-chatbot.md @@ -0,0 +1,8 @@ +--- +"@object-ui/plugin-chatbot": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-plugin-dashboard.md b/.changeset/13465-react-peer-plugin-dashboard.md new file mode 100644 index 0000000000..9e7f59d926 --- /dev/null +++ b/.changeset/13465-react-peer-plugin-dashboard.md @@ -0,0 +1,8 @@ +--- +"@object-ui/plugin-dashboard": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-plugin-designer.md b/.changeset/13465-react-peer-plugin-designer.md new file mode 100644 index 0000000000..c94bab9175 --- /dev/null +++ b/.changeset/13465-react-peer-plugin-designer.md @@ -0,0 +1,8 @@ +--- +"@object-ui/plugin-designer": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-plugin-detail.md b/.changeset/13465-react-peer-plugin-detail.md new file mode 100644 index 0000000000..a372fc2909 --- /dev/null +++ b/.changeset/13465-react-peer-plugin-detail.md @@ -0,0 +1,8 @@ +--- +"@object-ui/plugin-detail": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-plugin-editor.md b/.changeset/13465-react-peer-plugin-editor.md new file mode 100644 index 0000000000..bf300144d8 --- /dev/null +++ b/.changeset/13465-react-peer-plugin-editor.md @@ -0,0 +1,8 @@ +--- +"@object-ui/plugin-editor": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-plugin-form.md b/.changeset/13465-react-peer-plugin-form.md new file mode 100644 index 0000000000..c1aa9aca83 --- /dev/null +++ b/.changeset/13465-react-peer-plugin-form.md @@ -0,0 +1,8 @@ +--- +"@object-ui/plugin-form": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-plugin-gantt.md b/.changeset/13465-react-peer-plugin-gantt.md new file mode 100644 index 0000000000..24489a8330 --- /dev/null +++ b/.changeset/13465-react-peer-plugin-gantt.md @@ -0,0 +1,8 @@ +--- +"@object-ui/plugin-gantt": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-plugin-grid.md b/.changeset/13465-react-peer-plugin-grid.md new file mode 100644 index 0000000000..15279ac0e3 --- /dev/null +++ b/.changeset/13465-react-peer-plugin-grid.md @@ -0,0 +1,8 @@ +--- +"@object-ui/plugin-grid": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-plugin-kanban.md b/.changeset/13465-react-peer-plugin-kanban.md new file mode 100644 index 0000000000..789bef3aef --- /dev/null +++ b/.changeset/13465-react-peer-plugin-kanban.md @@ -0,0 +1,8 @@ +--- +"@object-ui/plugin-kanban": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-plugin-list.md b/.changeset/13465-react-peer-plugin-list.md new file mode 100644 index 0000000000..99df9b6710 --- /dev/null +++ b/.changeset/13465-react-peer-plugin-list.md @@ -0,0 +1,8 @@ +--- +"@object-ui/plugin-list": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-plugin-map.md b/.changeset/13465-react-peer-plugin-map.md new file mode 100644 index 0000000000..c66550095f --- /dev/null +++ b/.changeset/13465-react-peer-plugin-map.md @@ -0,0 +1,8 @@ +--- +"@object-ui/plugin-map": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-plugin-markdown.md b/.changeset/13465-react-peer-plugin-markdown.md new file mode 100644 index 0000000000..7c219352e0 --- /dev/null +++ b/.changeset/13465-react-peer-plugin-markdown.md @@ -0,0 +1,8 @@ +--- +"@object-ui/plugin-markdown": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-plugin-report.md b/.changeset/13465-react-peer-plugin-report.md new file mode 100644 index 0000000000..e683276611 --- /dev/null +++ b/.changeset/13465-react-peer-plugin-report.md @@ -0,0 +1,8 @@ +--- +"@object-ui/plugin-report": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-plugin-timeline.md b/.changeset/13465-react-peer-plugin-timeline.md new file mode 100644 index 0000000000..7a79a4708e --- /dev/null +++ b/.changeset/13465-react-peer-plugin-timeline.md @@ -0,0 +1,8 @@ +--- +"@object-ui/plugin-timeline": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-plugin-tree.md b/.changeset/13465-react-peer-plugin-tree.md new file mode 100644 index 0000000000..aa26439298 --- /dev/null +++ b/.changeset/13465-react-peer-plugin-tree.md @@ -0,0 +1,8 @@ +--- +"@object-ui/plugin-tree": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-plugin-view.md b/.changeset/13465-react-peer-plugin-view.md new file mode 100644 index 0000000000..de0b7852c7 --- /dev/null +++ b/.changeset/13465-react-peer-plugin-view.md @@ -0,0 +1,8 @@ +--- +"@object-ui/plugin-view": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-providers.md b/.changeset/13465-react-peer-providers.md new file mode 100644 index 0000000000..d31dde1540 --- /dev/null +++ b/.changeset/13465-react-peer-providers.md @@ -0,0 +1,8 @@ +--- +"@object-ui/providers": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-react-runtime.md b/.changeset/13465-react-peer-react-runtime.md new file mode 100644 index 0000000000..792b42eccc --- /dev/null +++ b/.changeset/13465-react-peer-react-runtime.md @@ -0,0 +1,8 @@ +--- +"@object-ui/react-runtime": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` now reads `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/.changeset/13465-react-peer-react.md b/.changeset/13465-react-peer-react.md new file mode 100644 index 0000000000..2e608f6282 --- /dev/null +++ b/.changeset/13465-react-peer-react.md @@ -0,0 +1,8 @@ +--- +"@object-ui/react": minor +--- + +Clause-②: no +Metadata-protocol: none + +**Breaking:** React 18 is no longer a supported host. `peerDependencies.react` and `peerDependencies.react-dom` now read `^19.0.0` (was `^18.0.0 || ^19.0.0`). Nothing in this repository ever installed or tested React 18, so the old range was a promise without a test behind it; a React 18 host now gets a peer-dependency warning or refusal at install time instead of an untested runtime. Declared `minor` per the version-alignment policy (a changeset never declares `major`). Upgrade the host to React 19 (objectui#13465). diff --git a/AGENTS.md b/AGENTS.md index 9cc8e265a5..a54d32ef66 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -33,7 +33,7 @@ objectui renders for every product the same way — ObjectStack Cloud, HotCRM, a ## 2. Tech Stack (strict) -- **Core:** React 18+ (Hooks), TypeScript 5.0+ (strict). +- **Core:** React 19 (Hooks), TypeScript 5.0+ (strict). - **Styling:** Tailwind CSS (utility-first). - ✅ Use `class-variance-authority` (cva) for component variants. - ✅ Use `tailwind-merge` + `clsx` (via `cn()`) for class overrides. diff --git a/QUICK_REFERENCE.md b/QUICK_REFERENCE.md index 097d88086c..f58f06776c 100644 --- a/QUICK_REFERENCE.md +++ b/QUICK_REFERENCE.md @@ -133,7 +133,7 @@ behind (objectui#5394 — that had happened once per release, three times). and `packages/data-objectstack/package.json`) - **Node.js:** ≥ 22.13 (see root `engines.node`) - **pnpm:** ≥ 10 (the workspace pins `pnpm@10.31.0` via `packageManager`) -- **React:** 18.x or 19.x (the `peerDependencies.react` range the packages declare) +- **React:** 19.x (the `peerDependencies.react` range the packages declare) - **TypeScript:** ≥ 5.0 (strict mode) — the stack floor stated in AGENTS.md §2, not a manifest fact: nothing in this tree declares a `typescript` range to check it against, so this is the one row above that no test can hold to account. diff --git a/content/docs/guide/plugins.md b/content/docs/guide/plugins.md index 3ab1f2cc10..879b343a0a 100644 --- a/content/docs/guide/plugins.md +++ b/content/docs/guide/plugins.md @@ -410,8 +410,8 @@ export default defineConfig({ "build": "vite build && tsc --emitDeclarationOnly" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, "dependencies": { "heavy-library": "^1.0.0" diff --git a/content/docs/guide/troubleshooting.md b/content/docs/guide/troubleshooting.md index 9f8a004e83..15a22c8e40 100644 --- a/content/docs/guide/troubleshooting.md +++ b/content/docs/guide/troubleshooting.md @@ -76,7 +76,7 @@ Then check that the Tailwind 4 build plugin is actually installed and wired up **Symptom:** Build or runtime errors about missing modules like `react`, `react-dom`, or `react-hook-form`. -**Cause:** ObjectUI packages declare React 18+ as a **peer dependency**. Your host project must provide them. +**Cause:** ObjectUI packages declare React 19 as a **peer dependency**. Your host project must provide them. **Fix:** diff --git a/packages/app-shell/package.json b/packages/app-shell/package.json index 4615e69833..8eb01f7b10 100644 --- a/packages/app-shell/package.json +++ b/packages/app-shell/package.json @@ -110,8 +110,8 @@ "@object-ui/plugin-list": "workspace:^", "@object-ui/plugin-report": "workspace:^", "@object-ui/plugin-view": "workspace:^", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", "react-router-dom": "^6.0.0 || ^7.0.0" }, "devDependencies": { diff --git a/packages/auth/README.md b/packages/auth/README.md index fadc3d28b4..a44e338179 100644 --- a/packages/auth/README.md +++ b/packages/auth/README.md @@ -20,7 +20,7 @@ npm install @object-ui/auth ``` **Peer Dependencies:** -- `react` ^18.0.0 || ^19.0.0 +- `react` ^19.0.0 ## Quick Start diff --git a/packages/auth/package.json b/packages/auth/package.json index 5b76ccd6a1..4043435e39 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -34,7 +34,7 @@ "lint": "eslint ." }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" + "react": "^19.0.0" }, "dependencies": { "@objectstack/spec": "^18.0.0-next.1", diff --git a/packages/cli/src/__tests__/app-generator.test.ts b/packages/cli/src/__tests__/app-generator.test.ts index 50d683b3ee..69dc4c9495 100644 --- a/packages/cli/src/__tests__/app-generator.test.ts +++ b/packages/cli/src/__tests__/app-generator.test.ts @@ -310,7 +310,7 @@ function rootRangeOf(name: string): string | undefined { * Ranges every non-root in-repo manifest declares for `name`, keyed by range. * * `peerDependencies` are excluded deliberately: a peer says what a library - * ACCEPTS (`react` at `^18.0.0 || ^19.0.0`, `react-router-dom` at + * ACCEPTS (`react` at `^19.0.0`, `react-router-dom` at * `^6.0.0 || ^7.0.0`), which is a different fact from the single version this * repo installs and tests with — and a generated app has to name the latter. */ diff --git a/packages/cli/src/utils/scaffold-dependencies.ts b/packages/cli/src/utils/scaffold-dependencies.ts index 61c0be268a..b426e7eb8a 100644 --- a/packages/cli/src/utils/scaffold-dependencies.ts +++ b/packages/cli/src/utils/scaffold-dependencies.ts @@ -102,7 +102,7 @@ export function platformPackageRange(): string { * React's range in every generated manifest. * * Quotes the repo root verbatim (an exact pin there) rather than the wider - * `^18.0.0 || ^19.0.0` the platform packages accept as a peer. The peer range + * caret range the platform packages accept as a peer. The peer range * says what CAN work; this says what is actually exercised — inside this * workspace the temp app resolves React by hoisting to the root, so the root's * version is the only one the generated code has ever run against. Declaring diff --git a/packages/collaboration/README.md b/packages/collaboration/README.md index aace287ae9..720c1f4ce0 100644 --- a/packages/collaboration/README.md +++ b/packages/collaboration/README.md @@ -19,7 +19,7 @@ npm install @object-ui/collaboration ``` **Peer Dependencies:** -- `react` ^18.0.0 || ^19.0.0 +- `react` ^19.0.0 ## Quick Start diff --git a/packages/collaboration/package.json b/packages/collaboration/package.json index 3f244be52e..1f5a2369fd 100644 --- a/packages/collaboration/package.json +++ b/packages/collaboration/package.json @@ -34,7 +34,7 @@ "lint": "eslint ." }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" + "react": "^19.0.0" }, "dependencies": { "@object-ui/i18n": "workspace:*", diff --git a/packages/components/README.md b/packages/components/README.md index 694d2f42fa..ca12a40cc5 100644 --- a/packages/components/README.md +++ b/packages/components/README.md @@ -36,8 +36,8 @@ npm install @object-ui/components @object-ui/react @object-ui/core ``` **Peer Dependencies:** -- `react` ^18.0.0 || ^19.0.0 -- `react-dom` ^18.0.0 || ^19.0.0 +- `react` ^19.0.0 +- `react-dom` ^19.0.0 - `tailwindcss` ^4.2.1 ## Setup diff --git a/packages/components/docs/FilterBuilder.md b/packages/components/docs/FilterBuilder.md index e40e76bcda..efa0ba3fc4 100644 --- a/packages/components/docs/FilterBuilder.md +++ b/packages/components/docs/FilterBuilder.md @@ -265,7 +265,7 @@ const pageSchema = { ## Technical Details -- Built with React 18+ hooks +- Built with React 19 hooks - Uses Radix UI primitives (Select, Popover) - Type-safe with TypeScript - Accessible keyboard navigation diff --git a/packages/components/package.json b/packages/components/package.json index fee5d57b1a..76ac1f5305 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -83,8 +83,8 @@ "vaul": "^1.1.2" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", "tailwindcss": "^4.2.1" }, "devDependencies": { diff --git a/packages/components/src/lib/inline-markdown.tsx b/packages/components/src/lib/inline-markdown.tsx index e2da965d15..d478b30c10 100644 --- a/packages/components/src/lib/inline-markdown.tsx +++ b/packages/components/src/lib/inline-markdown.tsx @@ -20,8 +20,8 @@ * A link keeps its `href` only for `http:`, `https:`, `mailto:` and `tel:`, or * for a scheme-less reference (a path, a query, a fragment). Anything else — * `javascript:`, `data:`, `vbscript:`, in any case — prints its text with no - * anchor. React 19 blocks `javascript:` URLs itself; this package's peer range - * admits React 18, which does not. An `href` carrying whitespace or a control + * anchor. React 19 blocks `javascript:` URLs itself; this check does not lean + * on that, and refuses the other schemes too. An `href` carrying whitespace or a control * character is refused outright, because browsers strip those before reading * the scheme (`java\tscript:` runs as `javascript:`). * diff --git a/packages/components/src/renderers/complex/README-KANBAN.md b/packages/components/src/renderers/complex/README-KANBAN.md index b4525257e9..9f1c7ff000 100644 --- a/packages/components/src/renderers/complex/README-KANBAN.md +++ b/packages/components/src/renderers/complex/README-KANBAN.md @@ -239,7 +239,7 @@ Individual columns can also be styled: ## Technical Details -- Built with React 18+ and TypeScript +- Built with React 19 and TypeScript - Uses @dnd-kit for drag-and-drop functionality - Integrates with Shadcn UI components (Card, Badge, ScrollArea) - Supports both pointer and touch interactions diff --git a/packages/create-plugin/src/templates.ts b/packages/create-plugin/src/templates.ts index 61857a509c..64c68a5f58 100644 --- a/packages/create-plugin/src/templates.ts +++ b/packages/create-plugin/src/templates.ts @@ -169,8 +169,8 @@ export function buildPackageJson(vars: PluginTemplateVars): Record { optionsRef.current = options; }); diff --git a/scripts/__tests__/doc-version-claims.test.ts b/scripts/__tests__/doc-version-claims.test.ts index 90b49b9136..c8ba5bb1bd 100644 --- a/scripts/__tests__/doc-version-claims.test.ts +++ b/scripts/__tests__/doc-version-claims.test.ts @@ -1001,9 +1001,10 @@ interface KnownClaim { * to the range its manifest actually declares, and `plugin-report` joined in * objectui#3690 from the opposite direction: it had carried this line WITHOUT the * manifest to back it, so the manifest was widened to `^18.0.0 || ^19.0.0` rather than - * the sentence rewritten. + * the sentence rewritten. objectui#13465 then narrowed every manifest and every one of + * these lines to `^19.0.0` in the same change, which is why the key below names 19. */ -const PEER_18_19 = 'react' + TICK + ' ^18.0.0'; +const PEER_19 = 'react' + TICK + ' ^19.0.0'; const PEER_RESTATEMENT_OK = 'Restates this package peerDependencies.react verbatim; asserted against the manifest by the peer-line assertion below (objectui#3717), no longer by a human reading it.'; @@ -1047,7 +1048,7 @@ const KNOWN_CLAIMS: KnownClaim[] = [ }, { file: 'content/docs/guide/plugins.md', - claim: 'react": "^18.0.0', + claim: 'react": "^19.0.0', kind: 'sample', why: 'A peerDependencies range in the plugin skeleton: what the copied plugin ACCEPTS from its host, which its author owns and may legitimately widen or narrow. Stays a sample while the two devDependency ranges in the same block became anchored in objectui#3855 - installed-here versus accepted-from-the-host is the distinction, not which fence the line sits in.', }, @@ -1099,9 +1100,9 @@ const KNOWN_CLAIMS: KnownClaim[] = [ }, { file: 'content/docs/guide/troubleshooting.md', - claim: 'React 18+', + claim: 'React 19', kind: 'unanchored', - why: 'Consistent with the ^18.0.0 || ^19.0.0 peer ranges, but stated repo-wide with no per-package anchor, so no gate can tell when it stops being true.', + why: 'Consistent with the ^19.0.0 peer ranges (narrowed from ^18.0.0 || ^19.0.0 in objectui#13465, which rewrote this sentence from "React 18+"), but stated repo-wide with no per-package anchor, so no gate can tell when it stops being true.', }, { file: 'content/docs/plugins/plugin-markdown.mdx', @@ -1117,26 +1118,26 @@ const KNOWN_CLAIMS: KnownClaim[] = [ }, // --- packages//README.md ---------------------------------------------- - { file: 'packages/auth/README.md', claim: PEER_18_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, - { file: 'packages/collaboration/README.md', claim: PEER_18_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, - { file: 'packages/components/README.md', claim: PEER_18_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, + { file: 'packages/auth/README.md', claim: PEER_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, + { file: 'packages/collaboration/README.md', claim: PEER_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, + { file: 'packages/components/README.md', claim: PEER_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, { file: 'packages/components/README.md', claim: 'tailwindcss' + TICK + ' ^4.2.1', kind: 'restatement', why: 'Restates this package peerDependencies.tailwindcss verbatim. Newly VISIBLE to the scan in objectui#3750 — the TOOLCHAIN word-boundary fix above — and repaired in the same change: it read ^3.0.0 against a ^4.2.1 manifest, and the package is Tailwind 4 only (its postcss.config.js loads @tailwindcss/postcss, which has no v3 counterpart, and src/index.css opens with an @import of tailwindcss and uses the v4-only @theme and @custom-variant at-rules, with no tailwind.config.js anywhere).', }, - { file: 'packages/i18n/README.md', claim: PEER_18_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, - { file: 'packages/layout/README.md', claim: PEER_18_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, - { file: 'packages/mobile/README.md', claim: PEER_18_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, - { file: 'packages/permissions/README.md', claim: PEER_18_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, - { file: 'packages/plugin-ai/README.md', claim: PEER_18_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, - { file: 'packages/plugin-designer/README.md', claim: PEER_18_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, - { file: 'packages/plugin-report/README.md', claim: PEER_18_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, - { file: 'packages/react/README.md', claim: PEER_18_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, + { file: 'packages/i18n/README.md', claim: PEER_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, + { file: 'packages/layout/README.md', claim: PEER_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, + { file: 'packages/mobile/README.md', claim: PEER_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, + { file: 'packages/permissions/README.md', claim: PEER_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, + { file: 'packages/plugin-ai/README.md', claim: PEER_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, + { file: 'packages/plugin-designer/README.md', claim: PEER_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, + { file: 'packages/plugin-report/README.md', claim: PEER_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, + { file: 'packages/react/README.md', claim: PEER_19, kind: 'restatement', why: PEER_RESTATEMENT_OK }, { file: 'packages/react-runtime/README.md', - claim: 'react ^18.0.0', + claim: 'react ^19.0.0', kind: 'restatement', why: 'Restates this package peerDependencies.react verbatim, in the prose spelling rather than a peer block. Until objectui#3741 both sides read ">=18": the manifest was the last react peer in the workspace with no upper bound, so the README faithfully restated a range that would have claimed React 20 the day it shipped. Narrowing the manifest to the group norm brought this line with it — the restatement was never the defect, the range it restated was.', }, @@ -1154,9 +1155,9 @@ const KNOWN_CLAIMS: KnownClaim[] = [ // the measurement and for why two of these blocks anchor and one does not. { file: 'skills/objectui/SKILL.md', - claim: 'React 18+', + claim: 'React 19', kind: 'unanchored', - why: 'The Tech Stack floor this file mirrors verbatim from AGENTS.md section 2 ("React 18+ (Hooks), TypeScript 5.0+ (Strict)"). Consistent with the ^18.0.0 || ^19.0.0 peer ranges, but stated repo-wide with no per-package anchor - the same claim, the same class and the same reason as the content/docs/guide/troubleshooting.md entry above.', + why: 'The Tech Stack line this file mirrors verbatim from AGENTS.md section 2 ("React 19 (Hooks), TypeScript 5.0+ (Strict)"); both copies read "React 18+" until objectui#13465 narrowed the peer ranges and moved them together. Consistent with the ^19.0.0 peer ranges, but stated repo-wide with no per-package anchor - the same claim, the same class and the same reason as the content/docs/guide/troubleshooting.md entry above.', }, { file: 'skills/objectui/SKILL.md', @@ -1166,7 +1167,7 @@ const KNOWN_CLAIMS: KnownClaim[] = [ }, { file: 'skills/objectui/guides/plugin-development.md', - claim: 'react": "^18.0.0', + claim: 'react": "^19.0.0', kind: 'sample', why: 'The peerDependencies range of the plugin skeleton on that page: what the copied plugin ACCEPTS from its host, which its author owns and may legitimately widen or narrow. Same line, same class and same reasoning as the content/docs/guide/plugins.md peer entry above - installed-here versus accepted-from-the-host is the distinction, not which fence the line sits in.', }, diff --git a/scripts/__tests__/react-peer-range-norm-3741.test.ts b/scripts/__tests__/react-peer-range-norm-3741.test.ts index b20c5bc1e1..89df692b8a 100644 --- a/scripts/__tests__/react-peer-range-norm-3741.test.ts +++ b/scripts/__tests__/react-peer-range-norm-3741.test.ts @@ -52,12 +52,15 @@ const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../ * which React majors this repo builds and tests against — so it is written here as the * single place that states it, and this test is what makes "declared" mean "enforced". * - * Both halves of the range are load-bearing and for different reasons. The `^18.0.0` arm - * is the floor the packages actually support. The `^19.0.0` arm is the CEILING: it is - * what stops a published manifest from promising a major that does not exist yet. The - * workspace resolves React through a root `pnpm.overrides` pin (`19.2.8` at the time of - * writing), so 19 is also the only major any of these packages has ever been exercised - * against — an upper bound above it would be a claim with no test behind it. + * The caret is both the floor and the CEILING: it is what stops a published manifest from + * promising a major that does not exist yet. The workspace resolves React through a root + * `pnpm.overrides` pin, so 19 is the only major any of these packages is ever exercised + * against, and the range claims nothing beyond it. + * + * Until objectui#13465 the norm was `^18.0.0 || ^19.0.0`. The `^18.0.0` arm was a + * published promise nothing in the tree ever installed or tested: no React 18 resolves in + * the lockfile and no CI lane runs one. The maintainer ruled to narrow the promise to the + * tested major (ruling comment 6386224339, letter A) rather than to add a React 18 lane. * * Moving the norm (adding a `^20.0.0` arm when React 20 is genuinely supported) is * deliberately a repo-wide act: every declaration moves together or this test goes red. @@ -65,7 +68,7 @@ const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../ * cannot have per-package React support windows without the difference being a lie * somewhere. */ -const REACT_PEER_NORM = '^18.0.0 || ^19.0.0'; +const REACT_PEER_NORM = '^19.0.0'; /** The React packages the norm governs. Both were widened together in objectui#3690. */ const GOVERNED = ['react', 'react-dom'] as const; diff --git a/skills/objectui/SKILL.md b/skills/objectui/SKILL.md index 827e375d11..dea84ec130 100644 --- a/skills/objectui/SKILL.md +++ b/skills/objectui/SKILL.md @@ -119,7 +119,7 @@ has the six keys the renderer reads and the release that still drops `2xl`). ## Tech stack (strict constraints) -- **Core:** React 18+ (hooks), TypeScript 5.0+ (strict). +- **Core:** React 19 (hooks), TypeScript 5.0+ (strict). - **Styling:** Tailwind CSS. Required: `class-variance-authority` for variants, `tailwind-merge` + `clsx` (`cn()`) for overrides. Forbidden: inline styles (`style={{}}`), CSS Modules, styled-components. diff --git a/skills/objectui/guides/plugin-development.md b/skills/objectui/guides/plugin-development.md index c6a0d21aba..44709edc2d 100644 --- a/skills/objectui/guides/plugin-development.md +++ b/skills/objectui/guides/plugin-development.md @@ -383,8 +383,8 @@ double-displays it. "lucide-react": "^1.43.0" }, "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, "scripts": { "build": "vite build", From 08400c4479bc64ffd63d6db47ff9f5fdbcb9e169 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 25 Oct 2026 00:42:49 +0000 Subject: [PATCH 2/2] test(doc-version-claims): retire the two React 18+ ledger entries "React 19" carries no version token the scan records, so the troubleshooting page and the skills Tech Stack mirror no longer make a claim the inventory excuses; the ratchet requires their entries to go. Claude-Session: https://claude.ai/code/session_01Erxd3BYXhV2mQMatxGZ9yg Co-authored-by: Claude --- scripts/__tests__/doc-version-claims.test.ts | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/scripts/__tests__/doc-version-claims.test.ts b/scripts/__tests__/doc-version-claims.test.ts index c8ba5bb1bd..c15b33ec1e 100644 --- a/scripts/__tests__/doc-version-claims.test.ts +++ b/scripts/__tests__/doc-version-claims.test.ts @@ -1098,12 +1098,6 @@ const KNOWN_CLAIMS: KnownClaim[] = [ kind: 'unanchored', why: 'A capability floor for RTL logical properties ("requires v3.3+ or v4"), not a claim about the version shipped here. Satisfied by the ^4.x this repo uses, but nothing can check it.', }, - { - file: 'content/docs/guide/troubleshooting.md', - claim: 'React 19', - kind: 'unanchored', - why: 'Consistent with the ^19.0.0 peer ranges (narrowed from ^18.0.0 || ^19.0.0 in objectui#13465, which rewrote this sentence from "React 18+"), but stated repo-wide with no per-package anchor, so no gate can tell when it stops being true.', - }, { file: 'content/docs/plugins/plugin-markdown.mdx', claim: 'react | 18.2.0', @@ -1153,17 +1147,11 @@ const KNOWN_CLAIMS: KnownClaim[] = [ // --- skills/objectui (objectui#4981) ----------------------------------------- // The agent-facing surface, unscanned until that card. See the header section for // the measurement and for why two of these blocks anchor and one does not. - { - file: 'skills/objectui/SKILL.md', - claim: 'React 19', - kind: 'unanchored', - why: 'The Tech Stack line this file mirrors verbatim from AGENTS.md section 2 ("React 19 (Hooks), TypeScript 5.0+ (Strict)"); both copies read "React 18+" until objectui#13465 narrowed the peer ranges and moved them together. Consistent with the ^19.0.0 peer ranges, but stated repo-wide with no per-package anchor - the same claim, the same class and the same reason as the content/docs/guide/troubleshooting.md entry above.', - }, { file: 'skills/objectui/SKILL.md', claim: 'TypeScript 5.0', kind: 'unanchored', - why: 'The second half of that same mirrored sentence, and a FLOOR ("5.0+") rather than a statement of what this repo builds with - 40 manifests declare typescript ^6.0.3, which satisfies it, and would still satisfy it after another major. Deliberately not "corrected" to 6.0 here: the sentence is copied from AGENTS.md section 2, and editing the skills copy alone would desync the two agent-facing texts. What this gate cannot measure, stated so it is not mistaken for checked: whether 5.0 is still a true floor for a CONSUMER, given the published declarations are emitted by TypeScript 6.', + why: 'The second half of the Tech Stack sentence this file mirrors verbatim from AGENTS.md section 2, and a FLOOR ("5.0+") rather than a statement of what this repo builds with - 40 manifests declare typescript ^6.0.3, which satisfies it, and would still satisfy it after another major. Deliberately not "corrected" to 6.0 here: the sentence is copied from AGENTS.md section 2, and editing the skills copy alone would desync the two agent-facing texts. What this gate cannot measure, stated so it is not mistaken for checked: whether 5.0 is still a true floor for a CONSUMER, given the published declarations are emitted by TypeScript 6.', }, { file: 'skills/objectui/guides/plugin-development.md',