From 49074ee7a1292a8c1795ea1ddab8e92245c965c3 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 13 Oct 2026 09:09:37 +0000 Subject: [PATCH 01/19] chore(deps): move @objectstack/* to the next prerelease ^18.0.0-next.0 (objectui#12030) Every @objectstack/* range in dependencies, devDependencies and peerDependencies (40 ranges in 32 manifests) moves from ^17.x to ^18.0.0-next.0. The ranges were raised textually, so no other manifest byte moved, and pnpm-lock.yaml was regenerated by `pnpm install` only. A frozen install exits 0 and a second plain install leaves the lockfile byte-identical. Claude-Session: https://claude.ai/code/session_01CsyMRsFJBKNEMa4oPY1b5z Co-authored-by: Claude --- apps/console/package.json | 6 +- apps/site/package.json | 2 +- package.json | 2 +- packages/app-shell/package.json | 6 +- packages/auth/package.json | 2 +- packages/cli/package.json | 2 +- packages/collaboration/package.json | 2 +- packages/components/package.json | 2 +- packages/core/package.json | 4 +- packages/data-objectstack/package.json | 4 +- packages/fields/package.json | 2 +- packages/layout/package.json | 2 +- packages/mobile/package.json | 2 +- packages/permissions/package.json | 2 +- packages/plugin-charts/package.json | 2 +- packages/plugin-chatbot/package.json | 2 +- packages/plugin-dashboard/package.json | 2 +- packages/plugin-designer/package.json | 2 +- packages/plugin-detail/package.json | 2 +- packages/plugin-form/package.json | 2 +- packages/plugin-gantt/package.json | 2 +- packages/plugin-grid/package.json | 4 +- packages/plugin-list/package.json | 4 +- packages/plugin-report/package.json | 2 +- packages/plugin-timeline/package.json | 2 +- packages/plugin-tree/package.json | 2 +- packages/plugin-view/package.json | 2 +- packages/react/package.json | 2 +- packages/runner/package.json | 2 +- packages/sdui-parser/package.json | 2 +- packages/test-support/package.json | 2 +- packages/types/package.json | 2 +- pnpm-lock.yaml | 212 ++++++++++++------------- 33 files changed, 146 insertions(+), 146 deletions(-) diff --git a/apps/console/package.json b/apps/console/package.json index 23993d7e9c..f81889ba13 100644 --- a/apps/console/package.json +++ b/apps/console/package.json @@ -91,9 +91,9 @@ "@object-ui/react": "workspace:*", "@object-ui/test-support": "workspace:*", "@object-ui/types": "workspace:*", - "@objectstack/client": "^17.3.0", - "@objectstack/lint": "^17.0.0", - "@objectstack/spec": "^17.0.0", + "@objectstack/client": "^18.0.0-next.0", + "@objectstack/lint": "^18.0.0-next.0", + "@objectstack/spec": "^18.0.0-next.0", "@tailwindcss/postcss": "^4.3.3", "@tailwindcss/typography": "^0.5.20", "@testing-library/jest-dom": "^7.0.1", diff --git a/apps/site/package.json b/apps/site/package.json index f4558dcecf..2373af3fce 100644 --- a/apps/site/package.json +++ b/apps/site/package.json @@ -32,7 +32,7 @@ "@object-ui/plugin-view": "workspace:*", "@object-ui/react": "workspace:*", "@object-ui/types": "workspace:*", - "@objectstack/spec": "^17.0.0", + "@objectstack/spec": "^18.0.0-next.0", "fumadocs-core": "16.15.4", "fumadocs-mdx": "15.2.3", "fumadocs-ui": "16.15.4", diff --git a/package.json b/package.json index 407dbca74a..d615cbd6c8 100644 --- a/package.json +++ b/package.json @@ -143,7 +143,7 @@ "@changesets/cli": "^3.0.0", "@eslint/js": "^10.0.1", "@object-ui/test-support": "workspace:*", - "@objectstack/spec": "^17.0.0", + "@objectstack/spec": "^18.0.0-next.0", "@playwright/test": "^1.62.1", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^7.0.1", diff --git a/packages/app-shell/package.json b/packages/app-shell/package.json index 29d94ebe9e..5c11242433 100644 --- a/packages/app-shell/package.json +++ b/packages/app-shell/package.json @@ -87,9 +87,9 @@ "@object-ui/providers": "workspace:*", "@object-ui/react": "workspace:*", "@object-ui/types": "workspace:*", - "@objectstack/formula": "^17.5.0", - "@objectstack/lint": "^17.0.0", - "@objectstack/spec": "^17.6.0", + "@objectstack/formula": "^18.0.0-next.0", + "@objectstack/lint": "^18.0.0-next.0", + "@objectstack/spec": "^18.0.0-next.0", "@sentry/react": "^10.70.0", "jsonc-parser": "^3.3.1", "lucide-react": "^1.43.0", diff --git a/packages/auth/package.json b/packages/auth/package.json index ebd629546d..c37030323d 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -37,7 +37,7 @@ "react": "^18.0.0 || ^19.0.0" }, "dependencies": { - "@objectstack/spec": "^17.3.0", + "@objectstack/spec": "^18.0.0-next.0", "better-auth": "^1.7.2" }, "devDependencies": { diff --git a/packages/cli/package.json b/packages/cli/package.json index 134f0af87f..ac488ae329 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -56,7 +56,7 @@ "@object-ui/components": "workspace:*", "@object-ui/react": "workspace:*", "@object-ui/types": "workspace:*", - "@objectstack/spec": "^17.1.0", + "@objectstack/spec": "^18.0.0-next.0", "@tailwindcss/postcss": "^4.3.3", "@types/glob": "^9.0.0", "@vitejs/plugin-react": "^6.0.5", diff --git a/packages/collaboration/package.json b/packages/collaboration/package.json index 7dd34aea1e..990a9c97c1 100644 --- a/packages/collaboration/package.json +++ b/packages/collaboration/package.json @@ -41,7 +41,7 @@ "@object-ui/types": "workspace:*" }, "devDependencies": { - "@objectstack/spec": "^17.0.0", + "@objectstack/spec": "^18.0.0-next.0", "@types/react": "19.2.18", "react": "19.2.8", "typescript": "^6.0.3", diff --git a/packages/components/package.json b/packages/components/package.json index 455a96ebd6..989dde646b 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -39,7 +39,7 @@ "@object-ui/react-runtime": "workspace:*", "@object-ui/sdui-parser": "workspace:*", "@object-ui/types": "workspace:*", - "@objectstack/spec": "^17.5.0", + "@objectstack/spec": "^18.0.0-next.0", "@radix-ui/react-accordion": "^1.2.20", "@radix-ui/react-alert-dialog": "^1.1.23", "@radix-ui/react-aspect-ratio": "^1.1.15", diff --git a/packages/core/package.json b/packages/core/package.json index b5ef850b45..cc12a97153 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -32,8 +32,8 @@ }, "dependencies": { "@object-ui/types": "workspace:*", - "@objectstack/formula": "^17.5.0", - "@objectstack/spec": "^17.6.0" + "@objectstack/formula": "^18.0.0-next.0", + "@objectstack/spec": "^18.0.0-next.0" }, "devDependencies": { "@object-ui/test-support": "workspace:*", diff --git a/packages/data-objectstack/package.json b/packages/data-objectstack/package.json index d2cada9bf9..629ec8d480 100644 --- a/packages/data-objectstack/package.json +++ b/packages/data-objectstack/package.json @@ -31,8 +31,8 @@ "dependencies": { "@object-ui/core": "workspace:*", "@object-ui/types": "workspace:*", - "@objectstack/client": "^17.3.0", - "@objectstack/spec": "^17.5.0" + "@objectstack/client": "^18.0.0-next.0", + "@objectstack/spec": "^18.0.0-next.0" }, "devDependencies": { "@object-ui/test-support": "workspace:*", diff --git a/packages/fields/package.json b/packages/fields/package.json index 34ca223f2d..a936906264 100644 --- a/packages/fields/package.json +++ b/packages/fields/package.json @@ -37,7 +37,7 @@ "@object-ui/providers": "workspace:*", "@object-ui/react": "workspace:*", "@object-ui/types": "workspace:*", - "@objectstack/spec": "^17.6.0", + "@objectstack/spec": "^18.0.0-next.0", "lucide-react": "^1.43.0", "react-markdown": "^10.1.0", "rehype-sanitize": "^6.0.0", diff --git a/packages/layout/package.json b/packages/layout/package.json index e8bc83fbcf..dff2c1512b 100644 --- a/packages/layout/package.json +++ b/packages/layout/package.json @@ -31,7 +31,7 @@ "@object-ui/core": "workspace:*", "@object-ui/react": "workspace:*", "@object-ui/types": "workspace:*", - "@objectstack/spec": "^17.0.0", + "@objectstack/spec": "^18.0.0-next.0", "lucide-react": "^1.43.0" }, "peerDependencies": { diff --git a/packages/mobile/package.json b/packages/mobile/package.json index 385f592a03..a4dcd90a7a 100644 --- a/packages/mobile/package.json +++ b/packages/mobile/package.json @@ -40,7 +40,7 @@ "@object-ui/types": "workspace:*" }, "devDependencies": { - "@objectstack/spec": "^17.0.0", + "@objectstack/spec": "^18.0.0-next.0", "@types/react": "19.2.18", "react": "19.2.8", "typescript": "^6.0.3", diff --git a/packages/permissions/package.json b/packages/permissions/package.json index e7a44d0e85..e71f49d306 100644 --- a/packages/permissions/package.json +++ b/packages/permissions/package.json @@ -38,7 +38,7 @@ }, "dependencies": { "@object-ui/types": "workspace:*", - "@objectstack/spec": "^17.7.0" + "@objectstack/spec": "^18.0.0-next.0" }, "devDependencies": { "@types/react": "19.2.18", diff --git a/packages/plugin-charts/package.json b/packages/plugin-charts/package.json index 1a801f7f43..5c75e25bba 100644 --- a/packages/plugin-charts/package.json +++ b/packages/plugin-charts/package.json @@ -45,7 +45,7 @@ }, "devDependencies": { "@object-ui/test-support": "workspace:*", - "@objectstack/spec": "^17.0.0", + "@objectstack/spec": "^18.0.0-next.0", "@types/react": "19.2.18", "@types/react-dom": "19.2.4", "@vitejs/plugin-react": "^6.0.5", diff --git a/packages/plugin-chatbot/package.json b/packages/plugin-chatbot/package.json index cb77b7aa67..296fe9aa70 100644 --- a/packages/plugin-chatbot/package.json +++ b/packages/plugin-chatbot/package.json @@ -38,7 +38,7 @@ "@object-ui/react": "workspace:*", "@object-ui/types": "workspace:*", "@radix-ui/react-slot": "^1.3.3", - "@objectstack/spec": "^17.0.0", + "@objectstack/spec": "^18.0.0-next.0", "@radix-ui/react-use-controllable-state": "^1.2.6", "ai": "^7.0.65", "class-variance-authority": "^0.7.1", diff --git a/packages/plugin-dashboard/package.json b/packages/plugin-dashboard/package.json index 306325b777..b7ebab166b 100644 --- a/packages/plugin-dashboard/package.json +++ b/packages/plugin-dashboard/package.json @@ -31,7 +31,7 @@ "@object-ui/permissions": "workspace:*", "@object-ui/react": "workspace:*", "@object-ui/types": "workspace:*", - "@objectstack/spec": "^17.6.0", + "@objectstack/spec": "^18.0.0-next.0", "lucide-react": "^1.43.0" }, "peerDependencies": { diff --git a/packages/plugin-designer/package.json b/packages/plugin-designer/package.json index ad87664c5a..f4842b0cc1 100644 --- a/packages/plugin-designer/package.json +++ b/packages/plugin-designer/package.json @@ -42,7 +42,7 @@ "@object-ui/plugin-grid": "workspace:*", "@object-ui/react": "workspace:*", "@object-ui/types": "workspace:*", - "@objectstack/spec": "^17.4.0", + "@objectstack/spec": "^18.0.0-next.0", "clsx": "^2.1.1", "lucide-react": "^1.43.0", "sonner": "^2.0.8", diff --git a/packages/plugin-detail/package.json b/packages/plugin-detail/package.json index f7874d4906..8a4b0044fc 100644 --- a/packages/plugin-detail/package.json +++ b/packages/plugin-detail/package.json @@ -32,7 +32,7 @@ }, "dependencies": { "@object-ui/i18n": "workspace:*", - "@objectstack/spec": "^17.5.0", + "@objectstack/spec": "^18.0.0-next.0", "lucide-react": "^1.43.0" }, "peerDependencies": { diff --git a/packages/plugin-form/package.json b/packages/plugin-form/package.json index f0993a9d4e..92d4f8f66a 100644 --- a/packages/plugin-form/package.json +++ b/packages/plugin-form/package.json @@ -28,7 +28,7 @@ "@object-ui/permissions": "workspace:*", "@object-ui/react": "workspace:*", "@object-ui/types": "workspace:*", - "@objectstack/spec": "^17.7.0", + "@objectstack/spec": "^18.0.0-next.0", "lucide-react": "^1.43.0" }, "peerDependencies": { diff --git a/packages/plugin-gantt/package.json b/packages/plugin-gantt/package.json index 5f0c0cdf4c..2c41dafbac 100644 --- a/packages/plugin-gantt/package.json +++ b/packages/plugin-gantt/package.json @@ -39,7 +39,7 @@ "@object-ui/plugin-detail": "workspace:*", "@object-ui/react": "workspace:*", "@object-ui/types": "workspace:*", - "@objectstack/spec": "^17.5.0", + "@objectstack/spec": "^18.0.0-next.0", "lucide-react": "^1.43.0", "sonner": "^2.0.8" }, diff --git a/packages/plugin-grid/package.json b/packages/plugin-grid/package.json index 96551955a3..1a2cfcc8a1 100644 --- a/packages/plugin-grid/package.json +++ b/packages/plugin-grid/package.json @@ -31,7 +31,7 @@ "@object-ui/plugin-detail": "workspace:*", "@object-ui/react": "workspace:*", "@object-ui/types": "workspace:*", - "@objectstack/spec": "^17.5.0", + "@objectstack/spec": "^18.0.0-next.0", "@tanstack/react-virtual": "^3.14.9", "exceljs": "^4.4.0", "lucide-react": "^1.43.0" @@ -44,7 +44,7 @@ "@object-ui/data-objectstack": "workspace:*", "@object-ui/sdui-parser": "workspace:*", "@object-ui/test-support": "workspace:*", - "@objectstack/spec": "^17.5.0", + "@objectstack/spec": "^18.0.0-next.0", "@tailwindcss/postcss": "^4.3.3", "@vitejs/plugin-react": "^6.0.5", "msw": "^2.15.0", diff --git a/packages/plugin-list/package.json b/packages/plugin-list/package.json index c6aaee257a..4bd7f8cfe3 100644 --- a/packages/plugin-list/package.json +++ b/packages/plugin-list/package.json @@ -42,7 +42,7 @@ "@object-ui/permissions": "workspace:^", "@object-ui/react": "workspace:^", "@object-ui/types": "workspace:^", - "@objectstack/spec": "^17.0.0", + "@objectstack/spec": "^18.0.0-next.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, @@ -56,7 +56,7 @@ "@object-ui/react": "workspace:*", "@object-ui/test-support": "workspace:*", "@object-ui/types": "workspace:*", - "@objectstack/spec": "^17.0.0", + "@objectstack/spec": "^18.0.0-next.0", "@types/react": "19.2.18", "@types/react-dom": "19.2.4", "@vitejs/plugin-react": "^6.0.5", diff --git a/packages/plugin-report/package.json b/packages/plugin-report/package.json index 435efe7978..be1105adb5 100644 --- a/packages/plugin-report/package.json +++ b/packages/plugin-report/package.json @@ -40,7 +40,7 @@ }, "devDependencies": { "@object-ui/test-support": "workspace:*", - "@objectstack/spec": "^17.0.0", + "@objectstack/spec": "^18.0.0-next.0", "@types/node": "^26.2.0", "@types/react": "19.2.18", "@types/react-dom": "19.2.4", diff --git a/packages/plugin-timeline/package.json b/packages/plugin-timeline/package.json index b9c93ac7b7..f2a71765a5 100644 --- a/packages/plugin-timeline/package.json +++ b/packages/plugin-timeline/package.json @@ -38,7 +38,7 @@ "@object-ui/permissions": "workspace:*", "@object-ui/react": "workspace:*", "@object-ui/types": "workspace:*", - "@objectstack/spec": "^17.0.0", + "@objectstack/spec": "^18.0.0-next.0", "class-variance-authority": "^0.7.1", "zod": "^4.4.3" }, diff --git a/packages/plugin-tree/package.json b/packages/plugin-tree/package.json index 7620f5c494..51ac3d3b8a 100644 --- a/packages/plugin-tree/package.json +++ b/packages/plugin-tree/package.json @@ -39,7 +39,7 @@ "@object-ui/plugin-detail": "workspace:*", "@object-ui/react": "workspace:*", "@object-ui/types": "workspace:*", - "@objectstack/spec": "^17.0.0", + "@objectstack/spec": "^18.0.0-next.0", "lucide-react": "^1.43.0" }, "peerDependencies": { diff --git a/packages/plugin-view/package.json b/packages/plugin-view/package.json index 39b56bced5..17f6860601 100644 --- a/packages/plugin-view/package.json +++ b/packages/plugin-view/package.json @@ -32,7 +32,7 @@ "@object-ui/plugin-grid": "workspace:*", "@object-ui/react": "workspace:*", "@object-ui/types": "workspace:*", - "@objectstack/spec": "^17.0.0", + "@objectstack/spec": "^18.0.0-next.0", "class-variance-authority": "^0.7.1", "lucide-react": "^1.43.0" }, diff --git a/packages/react/package.json b/packages/react/package.json index f8a750ce3d..08df381bcc 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -34,7 +34,7 @@ "@object-ui/data-objectstack": "workspace:*", "@object-ui/i18n": "workspace:*", "@object-ui/types": "workspace:*", - "@objectstack/spec": "^17.1.0" + "@objectstack/spec": "^18.0.0-next.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", diff --git a/packages/runner/package.json b/packages/runner/package.json index 499319fe81..4dac6ea2a9 100644 --- a/packages/runner/package.json +++ b/packages/runner/package.json @@ -34,7 +34,7 @@ "tailwindcss-animate": "^1.0.7" }, "devDependencies": { - "@objectstack/spec": "^17.0.0", + "@objectstack/spec": "^18.0.0-next.0", "@tailwindcss/postcss": "^4.3.3", "@types/react": "19.2.18", "@types/react-dom": "19.2.4", diff --git a/packages/sdui-parser/package.json b/packages/sdui-parser/package.json index d27994f72b..385b465d80 100644 --- a/packages/sdui-parser/package.json +++ b/packages/sdui-parser/package.json @@ -34,6 +34,6 @@ "@object-ui/core": "workspace:*", "@object-ui/react": "workspace:*", "@object-ui/types": "workspace:*", - "@objectstack/spec": "^17.0.0" + "@objectstack/spec": "^18.0.0-next.0" } } diff --git a/packages/test-support/package.json b/packages/test-support/package.json index 707f957326..27bb45530d 100644 --- a/packages/test-support/package.json +++ b/packages/test-support/package.json @@ -22,7 +22,7 @@ "lint": "eslint ." }, "devDependencies": { - "@objectstack/spec": "^17.0.0", + "@objectstack/spec": "^18.0.0-next.0", "@types/node": "^26.2.0", "typescript": "^6.0.3", "zod": "^4.4.3" diff --git a/packages/types/package.json b/packages/types/package.json index 5134df1eb1..1d34c93b9a 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -93,7 +93,7 @@ "directory": "packages/types" }, "dependencies": { - "@objectstack/spec": "^17.7.0", + "@objectstack/spec": "^18.0.0-next.0", "zod": "^4.6.1" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fb1a4949ab..845df7d78d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,8 +34,8 @@ importers: specifier: workspace:* version: link:packages/test-support '@objectstack/spec': - specifier: ^17.0.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@playwright/test': specifier: ^1.62.1 version: 1.62.1 @@ -272,14 +272,14 @@ importers: specifier: workspace:* version: link:../../packages/types '@objectstack/client': - specifier: ^17.3.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@objectstack/lint': - specifier: ^17.0.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@objectstack/spec': - specifier: ^17.0.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@tailwindcss/postcss': specifier: ^4.3.3 version: 4.3.3 @@ -416,8 +416,8 @@ importers: specifier: workspace:* version: link:../../packages/types '@objectstack/spec': - specifier: ^17.0.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) fumadocs-core: specifier: 16.15.4 version: 16.15.4(@mdx-js/mdx@3.1.1)(@tanstack/react-router@1.170.8(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.43.0(react@19.2.8))(next@16.3.6(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react-router@7.18.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(zod@4.6.5) @@ -774,14 +774,14 @@ importers: specifier: workspace:* version: link:../types '@objectstack/formula': - specifier: ^17.5.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@objectstack/lint': - specifier: ^17.0.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@objectstack/spec': - specifier: ^17.6.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@sentry/react': specifier: ^10.70.0 version: 10.70.0(react@19.2.8) @@ -871,8 +871,8 @@ importers: packages/auth: dependencies: '@objectstack/spec': - specifier: ^17.3.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) better-auth: specifier: ^1.7.2 version: 1.7.2(@opentelemetry/api@1.9.1)(better-sqlite3@12.9.0)(mongodb@7.2.0(socks@2.8.9))(next@16.3.6(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.10) @@ -902,8 +902,8 @@ importers: specifier: workspace:* version: link:../types '@objectstack/spec': - specifier: ^17.1.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@tailwindcss/postcss': specifier: ^4.3.3 version: 4.3.3 @@ -970,8 +970,8 @@ importers: version: link:../types devDependencies: '@objectstack/spec': - specifier: ^17.0.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@types/react': specifier: 19.2.18 version: 19.2.18 @@ -1006,8 +1006,8 @@ importers: specifier: workspace:* version: link:../types '@objectstack/spec': - specifier: ^17.5.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@radix-ui/react-accordion': specifier: ^1.2.20 version: 1.2.20(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -1190,11 +1190,11 @@ importers: specifier: workspace:* version: link:../types '@objectstack/formula': - specifier: ^17.5.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@objectstack/spec': - specifier: ^17.6.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) devDependencies: '@object-ui/test-support': specifier: workspace:* @@ -1249,11 +1249,11 @@ importers: specifier: workspace:* version: link:../types '@objectstack/client': - specifier: ^17.3.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@objectstack/spec': - specifier: ^17.5.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) devDependencies: '@object-ui/test-support': specifier: workspace:* @@ -1292,8 +1292,8 @@ importers: specifier: workspace:* version: link:../types '@objectstack/spec': - specifier: ^17.6.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) lucide-react: specifier: ^1.43.0 version: 1.43.0(react@19.2.8) @@ -1396,8 +1396,8 @@ importers: specifier: workspace:* version: link:../types '@objectstack/spec': - specifier: ^17.0.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) lucide-react: specifier: ^1.43.0 version: 1.43.0(react@19.2.8) @@ -1437,8 +1437,8 @@ importers: version: link:../types devDependencies: '@objectstack/spec': - specifier: ^17.0.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@types/react': specifier: 19.2.18 version: 19.2.18 @@ -1458,8 +1458,8 @@ importers: specifier: workspace:* version: link:../types '@objectstack/spec': - specifier: ^17.7.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) devDependencies: '@types/react': specifier: 19.2.18 @@ -1621,8 +1621,8 @@ importers: specifier: workspace:* version: link:../test-support '@objectstack/spec': - specifier: ^17.0.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@types/react': specifier: 19.2.18 version: 19.2.18 @@ -1663,8 +1663,8 @@ importers: specifier: workspace:* version: link:../types '@objectstack/spec': - specifier: ^17.0.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@radix-ui/react-slot': specifier: ^1.3.3 version: 1.3.3(@types/react@19.2.18)(react@19.2.8) @@ -1754,8 +1754,8 @@ importers: specifier: workspace:* version: link:../types '@objectstack/spec': - specifier: ^17.6.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) lucide-react: specifier: ^1.43.0 version: 1.43.0(react@19.2.8) @@ -1824,8 +1824,8 @@ importers: specifier: workspace:* version: link:../types '@objectstack/spec': - specifier: ^17.4.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -1876,8 +1876,8 @@ importers: specifier: workspace:* version: link:../i18n '@objectstack/spec': - specifier: ^17.5.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) lucide-react: specifier: ^1.43.0 version: 1.43.0(react@19.2.8) @@ -2001,8 +2001,8 @@ importers: specifier: workspace:* version: link:../types '@objectstack/spec': - specifier: ^17.7.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) lucide-react: specifier: ^1.43.0 version: 1.43.0(react@19.2.8) @@ -2062,8 +2062,8 @@ importers: specifier: workspace:* version: link:../types '@objectstack/spec': - specifier: ^17.5.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) lucide-react: specifier: ^1.43.0 version: 1.43.0(react@19.2.8) @@ -2132,8 +2132,8 @@ importers: specifier: workspace:* version: link:../types '@objectstack/spec': - specifier: ^17.5.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@tanstack/react-virtual': specifier: ^3.14.9 version: 3.14.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -2306,8 +2306,8 @@ importers: specifier: workspace:* version: link:../types '@objectstack/spec': - specifier: ^17.0.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@types/react': specifier: 19.2.18 version: 19.2.18 @@ -2483,8 +2483,8 @@ importers: specifier: workspace:* version: link:../test-support '@objectstack/spec': - specifier: ^17.0.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@types/node': specifier: ^26.2.0 version: 26.2.0 @@ -2531,8 +2531,8 @@ importers: specifier: workspace:* version: link:../types '@objectstack/spec': - specifier: ^17.0.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -2601,8 +2601,8 @@ importers: specifier: workspace:* version: link:../types '@objectstack/spec': - specifier: ^17.0.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) lucide-react: specifier: ^1.43.0 version: 1.43.0(react@19.2.8) @@ -2674,8 +2674,8 @@ importers: specifier: workspace:* version: link:../types '@objectstack/spec': - specifier: ^17.0.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -2739,8 +2739,8 @@ importers: specifier: workspace:* version: link:../types '@objectstack/spec': - specifier: ^17.1.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) react: specifier: 19.2.8 version: 19.2.8 @@ -2804,8 +2804,8 @@ importers: version: 1.0.7(tailwindcss@4.3.3) devDependencies: '@objectstack/spec': - specifier: ^17.0.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@tailwindcss/postcss': specifier: ^4.3.3 version: 4.3.3 @@ -2846,14 +2846,14 @@ importers: specifier: workspace:* version: link:../types '@objectstack/spec': - specifier: ^17.0.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) packages/test-support: devDependencies: '@objectstack/spec': - specifier: ^17.0.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) '@types/node': specifier: ^26.2.0 version: 26.2.0 @@ -2867,8 +2867,8 @@ importers: packages/types: dependencies: '@objectstack/spec': - specifier: ^17.7.0 - version: 17.7.0(ai@7.0.65(zod@4.6.5)) + specifier: ^18.0.0-next.0 + version: 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) zod: specifier: ^4.6.1 version: 4.6.5 @@ -4229,26 +4229,26 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@objectstack/client@17.7.0': - resolution: {integrity: sha512-PFnr58tb1usCSMP+jNyuMBn9a6fEcaVFOiGRox9B88VQvttXo99akGzI8utFX8DsEobLQbh9YZBtXR51VI+JQg==} + '@objectstack/client@18.0.0-next.0': + resolution: {integrity: sha512-gFflUycBVPIvc1a44psjRBQ3z1NuaDkmfBOcVRhc6nvc7paVXr4kqYG1NdlmnmCwm8qfAvGL7BuftWCYUWqtYg==} engines: {node: '>=22.0.0'} - '@objectstack/core@17.7.0': - resolution: {integrity: sha512-2/NqNk41eNo0nPgBsClefme2HwtLhwCdxKZER+XTOD345KAb4L0suyu2vGxHAN82MGkfNu4ticZzrRAHDT7tYQ==} + '@objectstack/core@18.0.0-next.0': + resolution: {integrity: sha512-6Ms8bsOdnIKxY4EwXyVl2OfQ3ydB5eH0J/u7KA1lWXquZgSDggLk05upOzf7XtuUeLb8JSLbmG25OIKuamBi3Q==} engines: {node: '>=22.0.0'} - '@objectstack/formula@17.7.0': - resolution: {integrity: sha512-jf7SA/8QawVEKmQhwxjtyGxz+DIX+3V7M/Kt3z79jMhby5tjh5vwTbJI3PdyWCKQ1pS0epO6sSK7MddwLbEJ9Q==} + '@objectstack/formula@18.0.0-next.0': + resolution: {integrity: sha512-UyVOqJz1QLvjnr6qSCFnex6BiU1Ly3N6vLBiB6/8FmqHdnboozfNGdLgjhmS/m3wWq0ZGoY9d5RYkpDfC65UDQ==} - '@objectstack/lint@17.7.0': - resolution: {integrity: sha512-ddCHHRJKRSEirb74UNWd8DwdpqvQtMzsKH/bBiUslwXlYucQJPlQMd+ZVYN4V0IJoeD+IpD5el3P6S5H/wqPuQ==} + '@objectstack/lint@18.0.0-next.0': + resolution: {integrity: sha512-cxEbba3qAbQ2Pvc76tcY+pqTMiO79XoruOo3uQCttR7w8abrikFFCXv2cprawXIEgYkshQeJaAExCdqp01aG6Q==} engines: {node: '>=22.0.0'} - '@objectstack/sdui-parser@17.7.0': - resolution: {integrity: sha512-BaEt37YGK2lBgBXrM+w/tVI+kz5Gz6xhbmCDwgdeGCj8qKALNO8l/oQh/3qdsf6pLIBMfIi+IMqryOICgqwUdw==} + '@objectstack/sdui-parser@18.0.0-next.0': + resolution: {integrity: sha512-fACYC57H+MbpW8cfjtY4J+0HDgaxBjnVgNTMVrJ742JP2FtGn3zsgLt34EMYYoMS41w+spwaBq+5s/sWt3xheA==} - '@objectstack/spec@17.7.0': - resolution: {integrity: sha512-PmKFK2C+NHiVoCAC+hYifJJWKiiJxZxN/FlpCQKwqPwajPxCcEUk0oVH0Af0yG3AFRQVCXxwIgEHGGeAa8Z4tA==} + '@objectstack/spec@18.0.0-next.0': + resolution: {integrity: sha512-ASTh6+q5jo2y8VhYT5osOb4H0JUyGAVYHIUPE39OnxSAD3fYg12x1YiNz09JA0aP+8JxigeA0otHWB3j16i2Ow==} engines: {node: '>=22.0.0'} peerDependencies: ai: ^7.0.0 @@ -4256,8 +4256,8 @@ packages: ai: optional: true - '@objectstack/types@17.7.0': - resolution: {integrity: sha512-7EIBYXZsZrBMihmmhwfcafI7F8WUvWNRAylJsZ25mBO7okQLhL4J3GX4wYBiyAJUmroIF3R9lCi+noaoWj5E5g==} + '@objectstack/types@18.0.0-next.0': + resolution: {integrity: sha512-rR+m5ZnBB4zSKn3RKiTKmiksTHjUa66Iz1etHVxUf57rW2qFrp8tQtH7UJlX4V5+5O0HjiRPvPnOgOK2mvV9Qw==} engines: {node: '>=22.0.0'} '@open-draft/deferred-promise@2.2.0': @@ -12331,33 +12331,33 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@objectstack/client@17.7.0(ai@7.0.65(zod@4.6.5))': + '@objectstack/client@18.0.0-next.0(ai@7.0.65(zod@4.6.5))': dependencies: - '@objectstack/core': 17.7.0(ai@7.0.65(zod@4.6.5)) - '@objectstack/spec': 17.7.0(ai@7.0.65(zod@4.6.5)) + '@objectstack/core': 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) + '@objectstack/spec': 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) transitivePeerDependencies: - ai - '@objectstack/core@17.7.0(ai@7.0.65(zod@4.6.5))': + '@objectstack/core@18.0.0-next.0(ai@7.0.65(zod@4.6.5))': dependencies: - '@objectstack/spec': 17.7.0(ai@7.0.65(zod@4.6.5)) - '@objectstack/types': 17.7.0(ai@7.0.65(zod@4.6.5)) + '@objectstack/spec': 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) + '@objectstack/types': 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) zod: 4.6.5 transitivePeerDependencies: - ai - '@objectstack/formula@17.7.0(ai@7.0.65(zod@4.6.5))': + '@objectstack/formula@18.0.0-next.0(ai@7.0.65(zod@4.6.5))': dependencies: '@marcbachmann/cel-js': 8.0.0 - '@objectstack/spec': 17.7.0(ai@7.0.65(zod@4.6.5)) + '@objectstack/spec': 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) transitivePeerDependencies: - ai - '@objectstack/lint@17.7.0(ai@7.0.65(zod@4.6.5))': + '@objectstack/lint@18.0.0-next.0(ai@7.0.65(zod@4.6.5))': dependencies: - '@objectstack/formula': 17.7.0(ai@7.0.65(zod@4.6.5)) - '@objectstack/sdui-parser': 17.7.0 - '@objectstack/spec': 17.7.0(ai@7.0.65(zod@4.6.5)) + '@objectstack/formula': 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) + '@objectstack/sdui-parser': 18.0.0-next.0 + '@objectstack/spec': 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) ajv: 8.20.0 ajv-formats: 3.0.1(ajv@8.20.0) sucrase: 3.35.1 @@ -12365,18 +12365,18 @@ snapshots: transitivePeerDependencies: - ai - '@objectstack/sdui-parser@17.7.0': {} + '@objectstack/sdui-parser@18.0.0-next.0': {} - '@objectstack/spec@17.7.0(ai@7.0.65(zod@4.6.5))': + '@objectstack/spec@18.0.0-next.0(ai@7.0.65(zod@4.6.5))': dependencies: pg-connection-string: 2.14.0 zod: 4.6.5 optionalDependencies: ai: 7.0.65(zod@4.6.5) - '@objectstack/types@17.7.0(ai@7.0.65(zod@4.6.5))': + '@objectstack/types@18.0.0-next.0(ai@7.0.65(zod@4.6.5))': dependencies: - '@objectstack/spec': 17.7.0(ai@7.0.65(zod@4.6.5)) + '@objectstack/spec': 18.0.0-next.0(ai@7.0.65(zod@4.6.5)) transitivePeerDependencies: - ai From a3f41ed9f8ff02f45cdcd93d5b86ea400ce43b77 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 13 Oct 2026 09:57:24 +0000 Subject: [PATCH 02/19] chore(changeset): declare the ^18.0.0-next.0 range move as minor (objectui#12030) The 22 published packages whose dependencies or peerDependencies name an @objectstack/* range take a minor, with the consumer-facing break stated in the body. No major is declared. Claude-Session: https://claude.ai/code/session_01CsyMRsFJBKNEMa4oPY1b5z Co-authored-by: Claude --- .changeset/12030-objectstack-next-18.md | 30 +++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .changeset/12030-objectstack-next-18.md diff --git a/.changeset/12030-objectstack-next-18.md b/.changeset/12030-objectstack-next-18.md new file mode 100644 index 0000000000..9e4797113d --- /dev/null +++ b/.changeset/12030-objectstack-next-18.md @@ -0,0 +1,30 @@ +--- +"@object-ui/app-shell": minor +"@object-ui/auth": minor +"@object-ui/cli": minor +"@object-ui/components": minor +"@object-ui/core": minor +"@object-ui/data-objectstack": minor +"@object-ui/fields": minor +"@object-ui/layout": minor +"@object-ui/permissions": minor +"@object-ui/plugin-chatbot": minor +"@object-ui/plugin-dashboard": minor +"@object-ui/plugin-designer": minor +"@object-ui/plugin-detail": minor +"@object-ui/plugin-form": minor +"@object-ui/plugin-gantt": minor +"@object-ui/plugin-grid": minor +"@object-ui/plugin-list": minor +"@object-ui/plugin-timeline": minor +"@object-ui/plugin-tree": minor +"@object-ui/plugin-view": minor +"@object-ui/react": minor +"@object-ui/types": minor +--- + +Depend on the `@objectstack/*` 18 prerelease line (objectui#12030). + +Every `@objectstack/*` range these packages declare in `dependencies` or `peerDependencies` moves from `^17.x` to `^18.0.0-next.0`, the `next` prerelease of `@objectstack/*` 18. + +**Breaking for consumers:** an install that resolves `@objectstack/spec` (or `@objectstack/client`, `@objectstack/formula`, `@objectstack/lint`) 17.x no longer satisfies these ranges. A consumer must move its own `@objectstack/*` packages to the 18 line, starting with `18.0.0-next.0`, at the same time as it takes this release. From 6a765da0a0f4904b33dcfe48aaacdd27f990c108 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 13 Oct 2026 13:23:58 +0000 Subject: [PATCH 03/19] fix(data-objectstack,app-shell): follow spec 18's env-only overlay scope and its refusal of a bare unique index (objectui#12030) @objectstack/spec 18 narrows the metadata overlay scope to 'env' (the 'org' member is gone), so the overlay fixtures write 'env' and the scope's docblock and type pin read the one-member enum. The zh scope label table keeps its 'org' row beside the union, unchanged, for a server still on 17.x. Protocol 18 refuses a bare `unique: true` on an index: the index-fallback probe now pins that refusal with a `false` control, and the validation-preview help text names the scoped spellings ('organization', 'global') instead. The connect lifecycle in data-objectstack's index.ts is not touched. Claude-Session: https://claude.ai/code/session_01CsyMRsFJBKNEMa4oPY1b5z Co-authored-by: Claude --- .../EmbeddedItemEditor.indexFallback.test.tsx | 21 ++++++++++------ .../ResourceEditPage.resetVerdict.test.tsx | 6 ++--- .../src/views/metadata-admin/i18n.ts | 13 +++++----- ...gnSurface.listViewInspector-11823.test.tsx | 2 +- .../metadata-client.layeredEnvelope.test.ts | 6 ++--- .../src/metadata-client.layeredRoute.test.ts | 4 +-- .../src/metadata-client.overlayScope.test.ts | 25 +++++++++---------- .../data-objectstack/src/metadata-client.ts | 7 +++--- packages/types/src/data-protocol.ts | 7 +++--- 9 files changed, 48 insertions(+), 43 deletions(-) diff --git a/packages/app-shell/src/views/metadata-admin/EmbeddedItemEditor.indexFallback.test.tsx b/packages/app-shell/src/views/metadata-admin/EmbeddedItemEditor.indexFallback.test.tsx index 5004d1e0ad..f9bb3a83b1 100644 --- a/packages/app-shell/src/views/metadata-admin/EmbeddedItemEditor.indexFallback.test.tsx +++ b/packages/app-shell/src/views/metadata-admin/EmbeddedItemEditor.indexFallback.test.tsx @@ -117,7 +117,9 @@ describe('every control the console offers is a real authoring surface', () => { // Completeness, the other direction. A tombstone rejects every probe; a // live key accepts at least one, so this needs no hand-listed key set and // survives the next key the spec adds. - const probes: unknown[] = ['x', true, 1, ['x'], {}]; + // `false` too: since protocol 18 the index `unique` takes `false | 'global' | + // 'organization'` and refuses every other probe here (objectui#12030). + const probes: unknown[] = ['x', true, false, 1, ['x'], {}]; const authorable = Object.keys(IndexSchema.shape).filter((key) => probes.some((probe) => IndexSchema.safeParse({ fields: ['c'], [key]: probe }).success), ); @@ -160,16 +162,19 @@ describe('`unique` mirrors the ADR-0120 scope union', () => { } }); - it('does not offer the deprecated bare `true` as a selectable option', () => { - // Bare `true` is the positional spelling of `'global'`: lint - // `unique/unscoped-declared-index` warns in 17.x and protocol 18 rejects it - // (objectstack#5082). It parses today — so this is a claim about what the - // console EMITS, which is why it is asserted on the control, not the parse. + it('does not offer the retired bare `true` as a selectable option', () => { + // Bare `true` was the positional spelling of `'global'`; protocol 18 refuses + // it at parse (objectstack#22103, closing objectstack#5082), which the + // control below now pins. The scope select never offered it, so this stays + // a claim about what the console EMITS, asserted on the control. const branch = (CONSOLE_PROPS.unique.anyOf as Array>)[0]; expect(branch.enum).not.toContain(true); expect(branch.enum).not.toContain('true'); - // Control: it is still ACCEPTED, so legacy indexes are readable/savable. - expect(IndexSchema.safeParse({ fields: ['c'], unique: true }).success).toBe(true); + // Control: the spec REFUSES it since protocol 18 (objectui#11864, objectui#12030). + // A server on 18 serves a stored legacy `true` as `'global'`, so the switch + // branch below renders only a row that never came from such a server. + expect(IndexSchema.safeParse({ fields: ['c'], unique: true }).success).toBe(false); + expect(IndexSchema.safeParse({ fields: ['c'], unique: false }).success).toBe(true); }); it("rejects 'tenant' — the word is 'organization' (ADR-0120 §Terminology)", () => { diff --git a/packages/app-shell/src/views/metadata-admin/ResourceEditPage.resetVerdict.test.tsx b/packages/app-shell/src/views/metadata-admin/ResourceEditPage.resetVerdict.test.tsx index efe6f7e160..bfb5af4125 100644 --- a/packages/app-shell/src/views/metadata-admin/ResourceEditPage.resetVerdict.test.tsx +++ b/packages/app-shell/src/views/metadata-admin/ResourceEditPage.resetVerdict.test.tsx @@ -179,7 +179,7 @@ function pathname(): string { const ORG_OWN_SENTINEL = { code: { ...objectDef, _packageId: 'sys_metadata' }, overlay: { ...objectDef, label: 'Account (customized)' }, - overlayScope: 'org', + overlayScope: 'env', effective: { ...objectDef, label: 'Account (customized)' }, packageId: 'sys_metadata', editable: true, @@ -187,11 +187,11 @@ const ORG_OWN_SENTINEL = { resettable: false, }; -/** A genuine packaged artifact carrying an org overlay on top. */ +/** A genuine packaged artifact carrying an environment overlay on top. */ const PACKAGED_WITH_OVERLAY = { code: { ...objectDef, _packageId: 'com.example.showcase', _provenance: 'package' }, overlay: { ...objectDef, label: 'Account (customized)' }, - overlayScope: 'org', + overlayScope: 'env', effective: { ...objectDef, label: 'Account (customized)' }, provenance: 'package', packageId: 'com.example.showcase', diff --git a/packages/app-shell/src/views/metadata-admin/i18n.ts b/packages/app-shell/src/views/metadata-admin/i18n.ts index 83221928ef..2d7839db7c 100644 --- a/packages/app-shell/src/views/metadata-admin/i18n.ts +++ b/packages/app-shell/src/views/metadata-admin/i18n.ts @@ -1838,7 +1838,7 @@ const ENGINE_STRINGS_EN: Record = { 'engine.validationPreview.noMessage': 'no message set', 'engine.validationPreview.tags': 'Tags', 'engine.validationPreview.removed.unique': - 'Uniqueness is a unique INDEX, not a validation rule: declare it on the object as `indexes: [{ fields: [...], unique: true }]` (or `unique: true` on the field). A SELECT-then-INSERT rule is inherently racy (TOCTOU); a database constraint is not.', + 'Uniqueness is a unique INDEX, not a validation rule: declare it on the object as `indexes: [{ fields: [...], unique: \'organization\' }]` — one holder per organization — or `unique: \'global\'` for one holder across the installation (or `unique: true` on the field). A SELECT-then-INSERT rule is inherently racy (TOCTOU); a database constraint is not.', 'engine.validationPreview.removed.async': 'Remote/async validation is a form-layer concern — on the server write path it is an SSRF and latency hazard. Keep it in the form, or enforce the underlying invariant with a unique index or a lifecycle hook.', 'engine.validationPreview.removed.custom': @@ -5180,7 +5180,7 @@ const ENGINE_STRINGS_ZH: Record = { 'engine.validationPreview.noMessage': '未设置消息', 'engine.validationPreview.tags': '标签', 'engine.validationPreview.removed.unique': - '唯一性是唯一索引(INDEX),不是校验规则:请在对象上声明为 `indexes: [{ fields: [...], unique: true }]`(或在字段上设置 `unique: true`)。先 SELECT 再 INSERT 的规则天生存在竞态(TOCTOU);数据库约束则不会。', + '唯一性是唯一索引(INDEX),不是校验规则:请在对象上声明为 `indexes: [{ fields: [...], unique: \'organization\' }]`(每个组织一个持有者),或用 `unique: \'global\'` 表示整个安装唯一(或在字段上设置 `unique: true`)。先 SELECT 再 INSERT 的规则天生存在竞态(TOCTOU);数据库约束则不会。', 'engine.validationPreview.removed.async': '远程/异步校验属于表单层的职责 —— 放在服务端写入路径上会带来 SSRF 与延迟风险。请把它留在表单中,或用唯一索引或生命周期钩子来强制其背后的约束。', 'engine.validationPreview.removed.custom': @@ -7192,11 +7192,10 @@ export function translateFlowMeta( * whether to extend it is a separate decision, not a rider on this fix. * * `org` is keyed beside the spec's union, not through it (objectui#12093): - * the installed `@objectstack/spec` declares `org | env`, and objectstack - * `main` narrows the enum to `env` (objectstack#15206 S5, ADR-0131), where a - * keyed `org` would be an unknown property and stop this file compiling in the - * Spec Main Shape Gate. A server on the installed release still sends `org`, - * so its label stays; the completeness check above is unchanged on both specs. + * `@objectstack/spec` 18 narrows the enum to `env` (objectstack#15206 S5, + * ADR-0131, installed by objectui#12030), where a keyed `org` would be an + * unknown property. A server still on 17.x sends `org`, so its label stays; + * the completeness check above is unchanged. */ const LAYER_SCOPE_ZH: Record | 'org', string> = { org: '组织', diff --git a/packages/app-shell/src/views/studio-design/StudioDesignSurface.listViewInspector-11823.test.tsx b/packages/app-shell/src/views/studio-design/StudioDesignSurface.listViewInspector-11823.test.tsx index 00e4fc2234..dfc84b172a 100644 --- a/packages/app-shell/src/views/studio-design/StudioDesignSurface.listViewInspector-11823.test.tsx +++ b/packages/app-shell/src/views/studio-design/StudioDesignSurface.listViewInspector-11823.test.tsx @@ -73,7 +73,7 @@ const mockClient = { if (type === 'object') return { effective: OBJECT_DEF, code: OBJECT_DEF }; if (type === 'view') { const row = views[name]; - return row ? { code: null, overlay: row, overlayScope: 'org', effective: row } : { code: null, overlay: null, overlayScope: null, effective: null }; + return row ? { code: null, overlay: row, overlayScope: 'env', effective: row } : { code: null, overlay: null, overlayScope: null, effective: null }; } return { effective: { name } }; }), diff --git a/packages/data-objectstack/src/metadata-client.layeredEnvelope.test.ts b/packages/data-objectstack/src/metadata-client.layeredEnvelope.test.ts index 0a23c49ec5..b5727885a4 100644 --- a/packages/data-objectstack/src/metadata-client.layeredEnvelope.test.ts +++ b/packages/data-objectstack/src/metadata-client.layeredEnvelope.test.ts @@ -72,7 +72,7 @@ const CONFORMING = { name: 'showcase_project', code: { name: 'showcase_project', label: 'Project' }, overlay: { label: 'Projects (ours)' }, - overlayScope: 'org', + overlayScope: 'env', effective: { name: 'showcase_project', label: 'Projects (ours)' }, lock: 'no-delete', lockReason: 'shipped by the crm package', @@ -108,7 +108,7 @@ describe('objectui#5676 · (a) a conforming envelope types cleanly', () => { it('hands back all seven ruled fields with the values the server sent', async () => { const layered = await clientAnswering(CONFORMING).layered('object', 'showcase_project'); - expect(layered.overlayScope).toBe('org'); + expect(layered.overlayScope).toBe('env'); expect(layered.lock).toBe('no-delete'); expect(layered.lockSource).toBe('package'); expect(layered.provenance).toBe('package'); @@ -166,7 +166,7 @@ describe('objectui#5676 · (b) an unknown token degrades ONE field, and is label // undefined, so a boundary that leaned on it alone would degrade the WHOLE // envelope every time a server spoke a newer dialect — a subtler version of // the bug being fixed. These six are the assertion that it does not. - expect(layered.overlayScope).toBe('org'); + expect(layered.overlayScope).toBe('env'); expect(layered.lockSource).toBe('package'); expect(layered.provenance).toBe('package'); expect(layered.editable).toBe(true); diff --git a/packages/data-objectstack/src/metadata-client.layeredRoute.test.ts b/packages/data-objectstack/src/metadata-client.layeredRoute.test.ts index 46cf6184c5..95d1d49ab7 100644 --- a/packages/data-objectstack/src/metadata-client.layeredRoute.test.ts +++ b/packages/data-objectstack/src/metadata-client.layeredRoute.test.ts @@ -86,7 +86,7 @@ const LAYERED_BODY = { name: 'showcase_project', code: { name: 'showcase_project', label: 'Project', fields: { code: { type: 'text' } } }, overlay: { label: 'Projects (ours)' }, - overlayScope: 'org', + overlayScope: 'env', effective: { name: 'showcase_project', label: 'Projects (ours)', fields: { code: { type: 'text' } } }, _diagnostics: { valid: false, errors: [{ path: 'label', message: 'too long', code: 'too_big' }] }, lock: 'no-delete', @@ -160,7 +160,7 @@ describe('objectui#4016 · the layered read goes to its declared path', () => { expect(layered).toEqual({ code: LAYERED_BODY.code, overlay: LAYERED_BODY.overlay, - overlayScope: 'org', + overlayScope: 'env', effective: LAYERED_BODY.effective, _diagnostics: LAYERED_BODY._diagnostics, lock: 'no-delete', diff --git a/packages/data-objectstack/src/metadata-client.overlayScope.test.ts b/packages/data-objectstack/src/metadata-client.overlayScope.test.ts index a966c69aa6..ab7d41b3a7 100644 --- a/packages/data-objectstack/src/metadata-client.overlayScope.test.ts +++ b/packages/data-objectstack/src/metadata-client.overlayScope.test.ts @@ -46,10 +46,10 @@ import type { MetadataLayered, MetadataOverlayScope } from './metadata-client'; // // This file is compiled against TWO specs: the pull-request type-check against // the INSTALLED `@objectstack/spec`, and the Spec Main Shape Gate against one -// built from objectstack `main`. The two vocabularies differ today: objectstack -// PR #22628 (objectstack#15206 S5, ADR-0131) narrowed `overlayScope` on `main` -// to `env`, while the installed release still declares `org | env`. So the -// expected set is READ OFF THE SCHEMA VALUE, never written down here +// built from objectstack `main`. objectstack PR #22628 (objectstack#15206 S5, +// ADR-0131) narrowed `overlayScope` to `env`, and the installed release carries +// that narrowing since objectui#12030 moved to the 18 prerelease line. The +// expected set is still READ OFF THE SCHEMA VALUE, never written down here // (objectui#12093): each line below holds on either spec and fails on either // when the alias stops being the spec's. @@ -68,12 +68,12 @@ const _noWider = null as unknown as MetadataOverlayScope satisfies SpecOverlaySc // both specs. It is the line that fails the day the spec adds a scope — // deliberately, because a new scope needs a zh-CN label rather than silently // reaching the badge. -const _labelled = null as unknown as MetadataOverlayScope satisfies 'org' | 'env' | null; +const _labelled = null as unknown as MetadataOverlayScope satisfies 'env' | null; // The interface field is the alias, not a widened `string`. const _fieldIsAlias = null as unknown as MetadataLayered['overlayScope'] satisfies MetadataOverlayScope; -// `env` and `null` are values on both specs. An `org` literal stood here, and -// `org` is a value on the installed spec only; `_specCovers` above carries it -// wherever the spec declares it. +// `env` and `null` are the whole vocabulary since S5. An `org` literal stood +// here while the installed spec still declared it; `_specCovers` above carries +// any scope the spec declares. const _env: MetadataLayered['overlayScope'] = 'env'; const _none: MetadataLayered['overlayScope'] = null; // @ts-expect-error — objectui#4982: the spelling the old comment claimed is not @@ -85,12 +85,11 @@ const _notASpecScope: MetadataLayered['overlayScope'] = 'organization'; // // vitest runs against the INSTALLED spec only (the Spec Main Shape Gate // type-checks and runs no test), so the literal below is a reading of that -// release. objectstack `main` declares `env` alone (objectstack#15206 S5): at -// the pin that carries it, this line and `LAYER_SCOPE_ZH`'s `org` entry move -// together. +// release. objectstack#15206 S5 narrowed the vocabulary to `env` alone, and +// `LAYER_SCOPE_ZH`'s `org` entry left with it (objectui#12030). describe('MetadataLayered.overlayScope tracks the spec enum (objectui#4982)', () => { - it('the producer vocabulary is exactly org | env, plus null, on the installed spec', () => { + it('the producer vocabulary is exactly env, plus null, on the installed spec', () => { // Read through `@object-ui/test-support` rather than `.unwrap().options` // (objectui#5872 class (4)). The bare spelling was a SEVENTH way to ask this // question and the only one with neither a cast nor a guard: it answered @@ -98,7 +97,7 @@ describe('MetadataLayered.overlayScope tracks the spec enum (objectui#4982)', () // kept `.options` where it is. `enumOptions` walks the wrappers and answers // `[]` when it cannot read — and `[]` fails this assertion, which is the // non-vacuity duty that reader's docblock leaves with every caller. - expect(enumOptions(specOverlayScope)).toEqual(['org', 'env']); + expect(enumOptions(specOverlayScope)).toEqual(['env']); expect(specOverlayScope.safeParse(null).success).toBe(true); }); diff --git a/packages/data-objectstack/src/metadata-client.ts b/packages/data-objectstack/src/metadata-client.ts index 93ee19e070..0aa982825f 100644 --- a/packages/data-objectstack/src/metadata-client.ts +++ b/packages/data-objectstack/src/metadata-client.ts @@ -351,12 +351,13 @@ export interface MetadataDeleteOptions extends MetadataClientSaveOptions { } /** - * Which layer an overlay was saved at — `'org'` for a tenant overlay, `'env'` - * for an environment-level one, `null` exactly when `overlay` is null. + * Which layer an overlay was saved at — `'env'` for an environment-level one, + * `null` exactly when `overlay` is null. Every metadata read is environment → + * code since objectstack#15206 S5, which retired the `'org'` tenant scope. * * DERIVED from `@objectstack/spec`, not restated: the vocabulary lives once, in * `GetMetaItemLayeredResponseSchema`'s `overlayScope` - * (`z.enum(['org', 'env']).nullable()`), and this alias indexes the published + * (`z.enum(['env']).nullable()`), and this alias indexes the published * response type so a scope the spec adds arrives here with no edit. Restating * the union locally is the fork `scripts/check-spec-symbol-derivation.mjs` * exists to reject, and the mirror-image mistake — a consumer re-spelling a diff --git a/packages/types/src/data-protocol.ts b/packages/types/src/data-protocol.ts index 4ce05a33c4..4567f00cb4 100644 --- a/packages/types/src/data-protocol.ts +++ b/packages/types/src/data-protocol.ts @@ -810,9 +810,10 @@ export type ConditionalValidation = Omit< * `{ fields, unique: 'global' | 'organization' }`. `'organization'` is one * holder per organization (the driver prepends the NULL-safe organization * key part); `'global'` is one holder across the installation. On THIS - * surface bare `unique: true` is the deprecated positional spelling of - * `'global'` — lint `unique/unscoped-declared-index` warns in 17.x and - * protocol 18 rejects it. + * surface bare `unique: true` was the positional spelling of `'global'`; + * protocol 18 REFUSES it at parse, at `os validate` and at the metadata save + * door (objectstack#22103), and the server serves a stored legacy `true` as + * `'global'`. * - Field-level `unique` for a single-field constraint. The same token does * NOT mean the same thing on both surfaces: at field level bare `true` is * the positional spelling of `'organization'` and stays valid, though new From 69ffac18d9bce432f17a013fafd1c3f4f97d1ba0 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 13 Oct 2026 13:24:47 +0000 Subject: [PATCH 04/19] =?UTF-8?q?fix(fields,i18n):=20label=20spec=2018's?= =?UTF-8?q?=20capability=20set=20=E2=80=94=20manage=5Fmailboxes=20in,=20ma?= =?UTF-8?q?nage=5Forg=5Fpresentation=20out=20(objectui#12030)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @objectstack/spec 18 adds `manage_mailboxes` to PLATFORM_CAPABILITIES and retires `manage_org_presentation` (objectstack#15206 S3). The curated label set the spec-parity pin compares against follows, the default label and the ten locale packs swap the retired key's label for the new one. Claude-Session: https://claude.ai/code/session_01CsyMRsFJBKNEMa4oPY1b5z Co-authored-by: Claude --- packages/fields/src/widgets/CapabilityMultiSelectField.tsx | 5 ++++- packages/fields/src/widgets/useFieldTranslation.ts | 2 +- packages/i18n/src/locales/ar.ts | 2 +- packages/i18n/src/locales/de.ts | 2 +- packages/i18n/src/locales/en.ts | 2 +- packages/i18n/src/locales/es.ts | 2 +- packages/i18n/src/locales/fr.ts | 2 +- packages/i18n/src/locales/ja.ts | 2 +- packages/i18n/src/locales/ko.ts | 2 +- packages/i18n/src/locales/pt.ts | 2 +- packages/i18n/src/locales/ru.ts | 2 +- packages/i18n/src/locales/zh.ts | 2 +- 12 files changed, 15 insertions(+), 12 deletions(-) diff --git a/packages/fields/src/widgets/CapabilityMultiSelectField.tsx b/packages/fields/src/widgets/CapabilityMultiSelectField.tsx index d970f96f65..1c0be82824 100644 --- a/packages/fields/src/widgets/CapabilityMultiSelectField.tsx +++ b/packages/fields/src/widgets/CapabilityMultiSelectField.tsx @@ -153,7 +153,8 @@ const CURATED_CAPABILITY_LABELS = new Set([ 'manage_users', 'manage_org_users', 'manage_metadata', - 'manage_org_presentation', + // `manage_org_presentation` left `PLATFORM_CAPABILITIES` in `@objectstack/spec` 18 + // (objectstack#15206 stage S3), so a grant of it admits nothing (objectui#12030). 'manage_platform_settings', // The spec spells these three with a dot (`setup.access`, `setup.write`, // `studio.access`). `labelFor` normalises dots to underscores before building @@ -166,6 +167,8 @@ const CURATED_CAPABILITY_LABELS = new Set([ 'manage_sharing', // `@objectstack/spec` 17.7.0 added it to `PLATFORM_CAPABILITIES` (objectui#11717). 'view_all_audit_log', + // `@objectstack/spec` 18 added it to `PLATFORM_CAPABILITIES` (objectui#12030). + 'manage_mailboxes', ]); export function CapabilityMultiSelectField({ diff --git a/packages/fields/src/widgets/useFieldTranslation.ts b/packages/fields/src/widgets/useFieldTranslation.ts index 5788b76995..1db88788d4 100644 --- a/packages/fields/src/widgets/useFieldTranslation.ts +++ b/packages/fields/src/widgets/useFieldTranslation.ts @@ -238,13 +238,13 @@ const FIELD_DEFAULTS: Record = { 'capability.label.manage_users': 'Manage Users', 'capability.label.manage_org_users': 'Manage Organization Users', 'capability.label.manage_metadata': 'Manage Metadata', - 'capability.label.manage_org_presentation': 'Manage Organization Presentation', 'capability.label.manage_platform_settings': 'Manage Platform Settings', 'capability.label.setup_access': 'Setup Access', 'capability.label.setup_write': 'Write Settings', 'capability.label.studio_access': 'Studio Access', 'capability.label.manage_sharing': 'Manage Sharing', 'capability.label.view_all_audit_log': 'View All Audit Log', + 'capability.label.manage_mailboxes': 'Manage Mailboxes', }; export const useFieldTranslation = createSafeTranslation( diff --git a/packages/i18n/src/locales/ar.ts b/packages/i18n/src/locales/ar.ts index a3b6c09ab7..42947123cc 100644 --- a/packages/i18n/src/locales/ar.ts +++ b/packages/i18n/src/locales/ar.ts @@ -19,7 +19,7 @@ const ar = { manage_users: "إدارة المستخدمين", manage_org_users: "إدارة مستخدمي المؤسسة", manage_metadata: "إدارة البيانات الوصفية", - manage_org_presentation: "إدارة عرض المؤسسة", + manage_mailboxes: "إدارة صناديق البريد", manage_platform_settings: "إدارة إعدادات المنصة", setup_access: "الوصول إلى الإعداد", setup_write: "كتابة الإعدادات", diff --git a/packages/i18n/src/locales/de.ts b/packages/i18n/src/locales/de.ts index 208a5e4bf6..0cc5797102 100644 --- a/packages/i18n/src/locales/de.ts +++ b/packages/i18n/src/locales/de.ts @@ -19,7 +19,7 @@ const de = { manage_users: "Benutzer verwalten", manage_org_users: "Organisationsbenutzer verwalten", manage_metadata: "Metadaten verwalten", - manage_org_presentation: "Organisationsdarstellung verwalten", + manage_mailboxes: "Postfächer verwalten", manage_platform_settings: "Plattformeinstellungen verwalten", setup_access: "Zugriff auf die Einrichtung", setup_write: "Einstellungen schreiben", diff --git a/packages/i18n/src/locales/en.ts b/packages/i18n/src/locales/en.ts index 17a220215d..0a59822b84 100644 --- a/packages/i18n/src/locales/en.ts +++ b/packages/i18n/src/locales/en.ts @@ -30,7 +30,7 @@ const en = { manage_users: 'Manage Users', manage_org_users: 'Manage Organization Users', manage_metadata: 'Manage Metadata', - manage_org_presentation: 'Manage Organization Presentation', + manage_mailboxes: 'Manage Mailboxes', manage_platform_settings: 'Manage Platform Settings', setup_access: 'Setup Access', setup_write: 'Write Settings', diff --git a/packages/i18n/src/locales/es.ts b/packages/i18n/src/locales/es.ts index 29fa8b2cab..6ecc9278e9 100644 --- a/packages/i18n/src/locales/es.ts +++ b/packages/i18n/src/locales/es.ts @@ -19,7 +19,7 @@ const es = { manage_users: "Gestionar usuarios", manage_org_users: "Gestionar usuarios de la organización", manage_metadata: "Gestionar metadatos", - manage_org_presentation: "Gestionar la presentación de la organización", + manage_mailboxes: "Gestionar los buzones", manage_platform_settings: "Gestionar la configuración de la plataforma", setup_access: "Acceso a la configuración", setup_write: "Escritura de la configuración", diff --git a/packages/i18n/src/locales/fr.ts b/packages/i18n/src/locales/fr.ts index ab62a9606d..027910f25a 100644 --- a/packages/i18n/src/locales/fr.ts +++ b/packages/i18n/src/locales/fr.ts @@ -19,7 +19,7 @@ const fr = { manage_users: "Gérer les utilisateurs", manage_org_users: "Gérer les utilisateurs de l'organisation", manage_metadata: "Gérer les métadonnées", - manage_org_presentation: "Gérer la présentation de l'organisation", + manage_mailboxes: "Gérer les boîtes aux lettres", manage_platform_settings: "Gérer les paramètres de la plateforme", setup_access: "Accès à la configuration", setup_write: "Écriture des paramètres", diff --git a/packages/i18n/src/locales/ja.ts b/packages/i18n/src/locales/ja.ts index f28e56707f..cc13c6078c 100644 --- a/packages/i18n/src/locales/ja.ts +++ b/packages/i18n/src/locales/ja.ts @@ -19,7 +19,7 @@ const ja = { manage_users: "ユーザー管理", manage_org_users: "組織ユーザーの管理", manage_metadata: "メタデータ管理", - manage_org_presentation: "組織表示の管理", + manage_mailboxes: "メールボックスの管理", manage_platform_settings: "プラットフォーム設定の管理", setup_access: "設定へのアクセス", setup_write: "設定の書き込み", diff --git a/packages/i18n/src/locales/ko.ts b/packages/i18n/src/locales/ko.ts index 73a816a325..14ba1960ec 100644 --- a/packages/i18n/src/locales/ko.ts +++ b/packages/i18n/src/locales/ko.ts @@ -19,7 +19,7 @@ const ko = { manage_users: "사용자 관리", manage_org_users: "조직 사용자 관리", manage_metadata: "메타데이터 관리", - manage_org_presentation: "조직 표시 관리", + manage_mailboxes: "메일함 관리", manage_platform_settings: "플랫폼 설정 관리", setup_access: "설정 접근", setup_write: "설정 쓰기", diff --git a/packages/i18n/src/locales/pt.ts b/packages/i18n/src/locales/pt.ts index 074f381cbc..355b369c3c 100644 --- a/packages/i18n/src/locales/pt.ts +++ b/packages/i18n/src/locales/pt.ts @@ -19,7 +19,7 @@ const pt = { manage_users: "Gerenciar usuários", manage_org_users: "Gerenciar usuários da organização", manage_metadata: "Gerenciar metadados", - manage_org_presentation: "Gerenciar a apresentação da organização", + manage_mailboxes: "Gerenciar caixas de correio", manage_platform_settings: "Gerenciar configurações da plataforma", setup_access: "Acesso à configuração", setup_write: "Gravação de configurações", diff --git a/packages/i18n/src/locales/ru.ts b/packages/i18n/src/locales/ru.ts index a7ddbdaa3a..b77eac62bb 100644 --- a/packages/i18n/src/locales/ru.ts +++ b/packages/i18n/src/locales/ru.ts @@ -19,7 +19,7 @@ const ru = { manage_users: "Управление пользователями", manage_org_users: "Управление пользователями организации", manage_metadata: "Управление метаданными", - manage_org_presentation: "Управление представлением организации", + manage_mailboxes: "Управление почтовыми ящиками", manage_platform_settings: "Управление настройками платформы", setup_access: "Доступ к настройке", setup_write: "Запись настроек", diff --git a/packages/i18n/src/locales/zh.ts b/packages/i18n/src/locales/zh.ts index e176100157..898d18dc2b 100644 --- a/packages/i18n/src/locales/zh.ts +++ b/packages/i18n/src/locales/zh.ts @@ -29,7 +29,7 @@ const zh = { manage_users: '管理用户', manage_org_users: '管理组织用户', manage_metadata: '管理元数据', - manage_org_presentation: '管理组织展示', + manage_mailboxes: '管理邮箱', manage_platform_settings: '管理平台设置', setup_access: '访问 Setup', setup_write: '保存设置', From 2416f5437341b8036fd22e9c4b45edab0c017614 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 13 Oct 2026 13:24:59 +0000 Subject: [PATCH 05/19] fix(types,components,console): follow spec 18's page-block and view contract (objectui#12030) @objectstack/spec 18 retires the flat query keys of element:number, element:repeater and element:record_picker (object / filter / sort / limit and the record_picker display keys' query siblings, objectstack#11509) and object-grid's `defaultFilters` as tombstones that refuse by name. The number / repeater arms drop their pre-18 waiver and take the row by reference; the record_picker node and registration stop publishing the four keys; the parity, arm and harvest pins read the tombstones. The spec adds `checkPageSlotPair`, now attached to both page node schemas beside the other page checks (its siblings `checkPagePrintComposition` and `checkListViewChartBinding` read a discriminator and are listed as not attachable); ListView gains `requiredPermissions` (pinned as the one pending declaration, see the PR), ObjectSchema gains `attachedOnRead` (45 keys), record:details sections gain an experimental `count`, and three new record component types (approvals, attachments, approval_decision) stay out of the block palette, as today. Claude-Session: https://claude.ai/code/session_01CsyMRsFJBKNEMa4oPY1b5z Co-authored-by: Claude --- .../registry-inputs-spec-parity.test.ts | 101 ++++-- ...tadataService.retiredObjectEnabled.test.ts | 5 +- ...tadataService.specKeyObjectPayload.test.ts | 5 +- .../ObjectView.relayRungCensus-7559.test.ts | 1 + .../previews/__tests__/block-config.test.ts | 6 +- .../metadata-admin/previews/block-types.ts | 9 + ...tered-types-validate-ratchet-10859.test.ts | 20 +- .../record-picker-inputs-spec-parity.test.ts | 324 ++++-------------- .../record-picker-sort-members.test.tsx | 10 +- .../element-list-inputs-11168.test.tsx | 6 +- .../src/renderers/basic/record-picker.tsx | 108 +----- packages/plugin-detail/src/index.tsx | 6 +- .../element-number-arm-10872.test.ts | 270 ++++++--------- ...element-repeater-data-source-11880.test.ts | 119 +++---- .../flat-props-refusal-10872.test.ts | 6 +- ...ters-gantt-map-filter-round10-6152.test.ts | 69 ++-- .../held-block-content-channels-10872.test.ts | 2 +- .../held-public-block-arms-10872.test.ts | 22 +- .../object-view-slot-key-lists.test.ts | 12 +- .../object-view-unmirrored-keys-7779.test.ts | 37 +- .../__tests__/public-block-arms-10872.test.ts | 18 +- .../spec-object-refinements-7715.test.ts | 42 ++- packages/types/src/authoring-nodes.ts | 21 +- packages/types/src/zod/layout.zod.ts | 26 +- packages/types/src/zod/objectql.zod.ts | 17 +- packages/types/src/zod/public-blocks.zod.ts | 238 ++++--------- 26 files changed, 570 insertions(+), 930 deletions(-) diff --git a/apps/console/src/__tests__/registry-inputs-spec-parity.test.ts b/apps/console/src/__tests__/registry-inputs-spec-parity.test.ts index 1e2b465485..f2f81f3dd5 100644 --- a/apps/console/src/__tests__/registry-inputs-spec-parity.test.ts +++ b/apps/console/src/__tests__/registry-inputs-spec-parity.test.ts @@ -976,6 +976,12 @@ const UNJUDGED_SPEC_BLOCKS: Record = { 'EMPTY SPEC SHAPE. New in `@objectstack/spec` 17.3.0, which declares it with no top-level key at all. Registered propless by `@object-ui/app-shell` (`src/console/marketplace/InstalledListWidget.tsx`), outside this file\'s import graph; the empty shape is the load-bearing half either way. objectui#7122, ledger objectui#8176.', 'mcp:connect-agent': 'EMPTY SPEC SHAPE. New in `@objectstack/spec` 17.3.0, which declares it with no top-level key at all. Registered propless by `@object-ui/app-shell` (`src/console/connect/ConnectAgentWidget.tsx`), outside this file\'s import graph; the empty shape is the load-bearing half either way. objectui#7122, ledger objectui#8176.', + 'record:approval_decision': + 'EMPTY SPEC SHAPE. New in `@objectstack/spec` 18 (objectui#12030), which declares it with no top-level key at all, so neither direction has a question to ask. `ApprovalDecisionRenderer` (`@object-ui/app-shell` `src/views/approval-decision/ApprovalDecisionPanel.tsx`) is written, and no registration mounts it yet; the empty shape is the load-bearing half either way. objectui#12030, ledger objectui#8176.', + 'record:approvals': + 'EMPTY SPEC SHAPE. New in `@objectstack/spec` 18 (objectui#12030), which declares it with no top-level key at all. Registered by `@object-ui/app-shell` (`src/views/record-approvals-renderer.tsx`), outside this file\'s import graph; the empty shape is the load-bearing half either way, exactly as for `app:launcher` above. objectui#12030, ledger objectui#8176.', + 'record:attachments': + 'EMPTY SPEC SHAPE. New in `@objectstack/spec` 18 (objectui#12030), which declares it with no top-level key at all. Registered by `@object-ui/app-shell` (`src/views/record-attachments-renderer.tsx`), outside this file\'s import graph; the empty shape is the load-bearing half either way, exactly as for `app:launcher` above. objectui#12030, ledger objectui#8176.', // The fourth class, and the only one that is not mechanically "unjudgeable": // OWED. The 17.5.0 bump booked four blocks here — new in that spec, registered // with `registerLazy` by the console (`register-plugins.ts`) and not loaded by @@ -1274,7 +1280,7 @@ const UNPUBLISHED_EXEMPTIONS: Record = { // five extra (`showPagination`, `defaultSort`, `defaultFilters`, // `resizableColumns`, `title`) are the same class by the same test, so they are // carved out with it. `defaultSort` has since been harvested — spec 17.3.0 - // tombstoned it (see the note below), and `resizableColumns` followed at 17.7.0, leaving eight. Trimming back to exactly five is a one-line reversal + // tombstoned it (see the note below), `resizableColumns` followed at 17.7.0 and `defaultFilters` at 18 (objectui#12030), leaving seven. Trimming back to exactly five is a one-line reversal // (delete the entry, declare the input); publishing first and withdrawing later // is not, which is why the exemption is the direction taken while the card is // open. @@ -1311,8 +1317,14 @@ const UNPUBLISHED_EXEMPTIONS: Record = { * declared already, and publishing a key the contract rejects by name is the * one resolution the test below forbids in so many words. */ - 'object-grid.defaultFilters': - '@deprecated in ObjectGridSchema ("Use filter instead"); GA describes it as the "Legacy base-filter fallback, read only when `filter` is absent. Prefer `filter`". Read as back-compat, deliberately not published — the canonical `filter` IS declared. Same ruled carve-out class as the five the ruling enumerated, measured on this branch — objectui#4648 (maintainer 2026-08-16).', + /* + * `object-grid.defaultFilters` WAS THE ELEVENTH TOMBSTONE HARVESTED HERE — + * `@objectstack/spec` 18 (objectstack#11509, objectui#12030), the way + * `defaultSort` above was at 17.3.0 and `resizableColumns` below at 17.7.0. + * The row now refuses the key by name (`invalid_type`, `expected: 'never'`), + * so the entry went dangling and stale and was deleted, and the key left + * `GA_PENDING_UNPUBLISHED_KEYS` and the ruled carve-out list with it. + */ /* * `object-grid.resizableColumns` WAS THE TENTH TOMBSTONE HARVESTED HERE — * `@objectstack/spec` 17.7.0 (objectstack#21445, PR objectstack#21463), the way @@ -1557,21 +1569,13 @@ const UNPUBLISHED_EXEMPTIONS: Record = { // `carries no stale unpublished-key exemption` would refuse it. // ── objectui#12085: the element-layer flat binding keys objectstack#11509 retires ── - // The repeater still READS its four as a fallback for metadata written - // before the retirement; the metric reads neither of its two. Each entry - // dies on its own at the pin that carries the tombstones. - 'element:repeater.object': - 'objectui#12085: NOT published, and publishing it would be WRONG, not premature. `@objectstack/spec` retires the repeater\'s flat `object` as a tombstone (objectstack#11509, objectstack PR #22421), and the manifest this registration feeds is read by objectstack\'s `os validate` against that spec: a published `object` made the html tier accept the retired spelling, and its `required: true` refused a repeater bound through `dataSource` alone. The binding\'s `dataSource.object` is the published door (the injected `dataSource` input). The renderer still READS the flat key as the binding\'s fallback, for metadata written before the retirement; a back-compat read is not an authoring surface (the split `page:card.body` records above). The installed pin predates the retirement, which is why the reverse direction still asks for the key here; at the pin that carries objectstack#11509\'s tombstone the key leaves the accepted set, and `carries no stale unpublished-key exemption` deletes this entry there.', - 'element:repeater.filter': - 'objectui#12085: NOT published, and publishing it would be WRONG, not premature. `@objectstack/spec` retires the repeater\'s flat `filter` as a tombstone (objectstack#11509, objectstack PR #22421), and the manifest this registration feeds is read by objectstack\'s `os validate` against that spec: a published `filter` made the html tier accept the retired spelling. The binding\'s `dataSource.filter` is the published door (the injected `dataSource` input). The renderer still READS the flat key as the binding\'s fallback, for metadata written before the retirement; a back-compat read is not an authoring surface (the split `page:card.body` records above). The installed pin predates the retirement, which is why the reverse direction still asks for the key here; at the pin that carries objectstack#11509\'s tombstone the key leaves the accepted set, and `carries no stale unpublished-key exemption` deletes this entry there.', - 'element:repeater.sort': - 'objectui#12085: NOT published, and publishing it would be WRONG, not premature. `@objectstack/spec` retires the repeater\'s flat `sort` as a tombstone (objectstack#11509, objectstack PR #22421), and the manifest this registration feeds is read by objectstack\'s `os validate` against that spec: a published `sort` made the html tier accept the retired spelling. The binding\'s `dataSource.sort` is the published door (the injected `dataSource` input). The renderer still READS the flat key as the binding\'s fallback, for metadata written before the retirement; a back-compat read is not an authoring surface (the split `page:card.body` records above). The installed pin predates the retirement, which is why the reverse direction still asks for the key here; at the pin that carries objectstack#11509\'s tombstone the key leaves the accepted set, and `carries no stale unpublished-key exemption` deletes this entry there.', - 'element:repeater.limit': - 'objectui#12085: NOT published, and publishing it would be WRONG, not premature. `@objectstack/spec` retires the repeater\'s flat `limit` as a tombstone (objectstack#11509, objectstack PR #22421), and the manifest this registration feeds is read by objectstack\'s `os validate` against that spec: a published `limit` made the html tier accept the retired spelling. The binding\'s `dataSource.limit` is the published door (the injected `dataSource` input). The renderer still READS the flat key as the binding\'s fallback, for metadata written before the retirement; a back-compat read is not an authoring surface (the split `page:card.body` records above). The installed pin predates the retirement, which is why the reverse direction still asks for the key here; at the pin that carries objectstack#11509\'s tombstone the key leaves the accepted set, and `carries no stale unpublished-key exemption` deletes this entry there.', - 'element:number.object': - 'objectui#12085: NOT published, and publishing it would be WRONG, not premature. The renderer does not read the flat `object` (since objectui#11880 the metric\'s query is the node-level `dataSource` only), and `@objectstack/spec` retires it as a tombstone (objectstack#11509, objectstack PR #22421), so a published `object` advertised configuration the platform drops and its own spec refuses. The binding\'s `dataSource.object` is the published door (the injected `dataSource` input). The installed pin predates the retirement, which is why the reverse direction still asks for the key here; at the pin that carries objectstack#11509\'s tombstone the key leaves the accepted set, and `carries no stale unpublished-key exemption` deletes this entry there.', - 'element:number.filter': - 'objectui#12085: NOT published, and publishing it would be WRONG, not premature. The renderer does not read the flat `filter` (since objectui#11880 the metric\'s query is the node-level `dataSource` only), and `@objectstack/spec` retires it as a tombstone (objectstack#11509, objectstack PR #22421), so a published `filter` advertised configuration the platform drops and its own spec refuses. The binding\'s `dataSource.filter` is the published door (the injected `dataSource` input). The installed pin predates the retirement, which is why the reverse direction still asks for the key here; at the pin that carries objectstack#11509\'s tombstone the key leaves the accepted set, and `carries no stale unpublished-key exemption` deletes this entry there.', + // Six entries stood here — `element:repeater.object` / `.filter` / `.sort` / + // `.limit` and `element:number.object` / `.filter` — each "dies on its own at + // the pin that carries the tombstones". `@objectstack/spec` 18 is that pin + // (objectui#12030): every one of the six is a tombstone now, so each entry + // went dangling and stale and was deleted. The repeater still READS its four + // as a fallback for metadata written before the retirement; that read is the + // renderer's, and nothing here publishes the keys. }; /** @@ -1690,7 +1694,6 @@ const GA_PENDING_UNPUBLISHED_KEYS = [ 'object-grid.pageSize', 'object-grid.showSearch', 'object-grid.showPagination', - 'object-grid.defaultFilters', 'object-grid.title', ]; @@ -2803,10 +2806,11 @@ const MEMBER_PINS: Record = { file: 'apps/console/src/__tests__/component-input-union-specimens.test.ts', pins: 'The `object` arm is the inline translation map, asserted at the render site that actually resolves one, with the non-matching controls (`42`, `["No records"]`) still reported (objectui#3832).', }, - 'element:record_picker.filter': { - file: 'packages/components/src/__tests__/record-picker-inputs-spec-parity.test.ts', - pins: 'The `array` arm is `ViewFilterRuleSchema[]` — the one filter orthography this map\'s array-declared `filter` doors share — with the MongoDB-style RECORD spelling (`{ status }`, `{ $and }`) refused by kind at `filter` and a bare tuple refused at `filter.0`, and the description pinned to say the key is NOT READ and to name `dataSource.filter`, the one filter the renderer reads since objectui#11880 (`composed?.filter`). objectui#3830 declared the key; objectstack#14406 converged it off the record form and objectui#7663 moved this side onto the array arm; it stays published until the spec\'s v18 retirement (objectstack#11509).', - }, + // `element:record_picker.filter` and `.sort` stood here until the `@objectstack/spec` + // 18 bump retired both as tombstones and the registration stopped publishing them + // (objectui#12030): a member pin names a key still array/object-armed on a covered + // block, and neither is. The binding's `dataSource.sort` reach is still pinned by + // `record-picker-sort-members.test.tsx`, and the binding itself by `.dataSource` below. 'element:record_picker.label': { file: 'packages/components/src/renderers/basic/__tests__/record-picker-label-placeholder-i18n.test.tsx', pins: 'The I18nLabel object arm, resolved at ITS OWN read site rather than through the row-value helper `toText` it used to share: the map resolves to the active language rather than always to its `en` entry (the pre-fix harm rendered ENGLISH to a zh-CN viewer), a region tag falls back to the base language an author actually wrote, and — the quiet failure — a legal map that simply omits `en` used to delete the `