You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 8963dbf
Browse filesBrowse the repository at this point in the historyBrowse files
chore(objectui): bump the console pin to 89cad75d5570 (carries objectui 0858267e, 8001068b, 3ae91930 and d0fba91aa) (#21380)
Clause-②: no
Moves the bundled Console's objectui pin from `31971ff1e28f` (the pin
17.6.0 shipped) to current objectui `main`,
`89cad75d55702cc4f267bead5bf267de575d5842`, so the Console carries the
four fixes 17.6.0's release verification found missing (#21330,
objectstack-ai/hotcrm#1982, and the "Known console issues" list in
`content/docs/releases/v17/17-6.mdx`).
## Range
`31971ff1e28f..89cad75d5570`: 64 non-merge commits, 74 releasing
changesets (16 declared breaking), 14 release-nothing, 6 commits without
a changeset. `git merge-base --is-ancestor <c> origin/main` exits 0 in
an objectui clone for the old pin and for each fix commit below;
`89cad75d5570` is `origin/main`.
Breaking entries: `990a2d616` (objectui retires its bare `tree` / `view`
node-type keys and the bare field-widget fallbacks), `063832222`
(`@object-ui/plugin-designer` TypeScript face), `f9c8c4e45` (two
`@object-ui/core` exports), `063119f2b` (an unevaluable gate is a
fault), `138ad4554` / `6aa029b63` (authored `flex` / `object-grid` take
the `properties` bag), `a1a44d621` (`page` refuses `maxWidth` /
`padding`), `e100589f3` (app `mobileNavMode` refused), `1a88ce22f`
(dashboard widget `chartConfig.*` structure keys).
## The four fixes this bump carries
| defect at `31971ff1e28f` | objectui fix |
|---|---|
| Studio's dataset designer saves a count measure with `field: ''`,
refused `422 measures.0.field` | `0858267e` (objectui#11402) |
| The datasource editor saves an External / Validate-only datasource
without the `external` block, refused `400` since #21133 | `8001068b`
(objectui#11368) |
| Both page editors send the served `requires` back, so republishing an
html page that gained a plugin component is refused `422
page-requires-disagrees-with-source` | `3ae91930` (objectui#11357) |
| zh-CN reverts to English on a full page load (objectui#11326; #21330
R4) | `d0fba91aa` |
## What changed here, and why
- `.objectui-sha` and `.changeset/console-89cad75d5570.md`, written by
`scripts/bump-objectui.sh --no-commit` (auto level `minor`). The
script's `adr-0087: TODO` placeholder is answered `not-required
(no-migration-prescription)`, in the wording the previous two bumps
used, naming all 16 upstream breaking entries: each is objectui's own
surface, or (`chartConfig.*`) mirrors keys `ui/dashboard.zod.ts` already
retired and tombstoned.
- `packages/sdui-parser/objectui-lockstep.json`, re-recorded with `pnpm
gen:sdui-lockstep`: 214 grammar lines, 25 codes, containment predicate
`76c18fb95d1f`, all unchanged; no port owed.
- `sdui.manifest.json` + `scripts/sdui-manifest.record.json`, from `node
scripts/gen-sdui-manifest-node.mjs` over the tree `pnpm objectui:build`
built at the pin: 107 components, none added or removed;
`object-kanban`, `object-calendar`, `object-gantt`, `object-timeline`,
`object-map` and `object-tree` changed their published inputs
(objectui#11168 slices 3–5, objectui#11293).
- The 49 asserting pin citations in `packages/spec/src`
(`check:objectui-pin-citations` turns red on any pin move), re-measured
at the new pin: anchors mapped through each cited file's diff and
re-read, block hashes and corpus counts re-taken with a method that
first reproduced every `31971ff1e` number. This regenerates
`packages/spec/src/migrations/registry.ts` and
`content/docs/references/ui/view.mdx`, and adds
`.changeset/objectui-pin-citations-89cad75d5570.md` (`@objectstack/spec`
patch, since the `FormField.span` describe and six migration
descriptions name the pin). Records whose claims moved, not only their
numbers: `object-map`'s declared-block `style` precedence (`mapStyle`
now first, objectui#11168 slice 3; the `getMapConfig` return quote is
rewritten); `object-tree`'s `navigation` read and `ObjectTreeSchema`
mirror now carry the row's keys uncast, and objectui's record-source
table drops the retired bare `tree` / `view:tree` keys (objectui#10859
batch 8); two `object-timeline` anchors that were already one line off
at `31971ff1e` are corrected. No key, default, enum member or export
moves.
- No example, test or gate needed adapting for the breaking entries: the
showcase's html pages compile flat JSX attributes, which the renderer
still hoists, and its `type: 'tree'` view and field are spec-level
types, not the retired bare node keys. The browser run below covers
both.
## Browser verification (`examples/app-showcase`, this branch)
`pnpm dev -- --fresh --ui --no-watch -p 41733` (own ephemeral DB, seeded
admin), `check:console-sha` = `objectui@89cad75d5570`, driven in
headless Chromium (`/opt/pw-browsers`) with every request captured. A
writable package `com.acme.pinprobe` with one object `pinprobe_item` was
created through `POST /api/v1/packages` and the metadata API for the
authoring checks.
| defect | drive | result at `89cad75d5570` |
|---|---|---|
| dataset `field: ''` | metadata editor on dataset `pin_ds` → Add
measure → name `row_count`, Aggregate `count`, Field left blank → ⌘S |
`PUT /meta/dataset/pin_ds?mode=draft` carries
`{"name":"row_count","aggregate":"count"}` (no `field` key) → **200**;
publish → **200**; the served measure has no `field` |
| datasource `external` block | Setup → Datasources → New datasource,
SQLite `:memory:`, Schema mode External, then Validate only, no
credential | `POST /api/v1/datasources` carries `"external":{}` →
**201** for both `external` and `validate-only` |
| page `requires` echo | html page published with `<box>` only (served
`requires: ["ui"]`); metadata editor Source → add `<object-kanban
objectName="pinprobe_item" groupBy="status" />` → ⌘S → publish | save
body carries no `requires` → **200**; publish → **200**; the server
stamps `requires: ["ui","plugin-kanban"]` |
| zh-CN on full load |
`/_console/apps/com.objectstack.account/component/approvals/inbox`,
`localStorage['objectui-locale']='zh-CN'`, full reload | h1 **审批中心**,
tabs **待我审批 / 我发起的 / 全部**, `<html lang="zh-CN">`, `i18n-locale-zh-*.js`
fetched (before the switch: "Approvals Inbox") |
Smoke: sign-in lands on the `/_console/home` launcher; the showcase JSX
home page (Capability Map, `<flex>` / `<box>`) renders; the
`showcase_task` list grid; a task record page; the
`showcase_ops_dashboard` dashboard with KPIs and charts; the Studio
landing and the writable package's object surface. 0 page errors.
Non-2xx responses were only `401 /auth/get-session` before sign-in, `404
/usage/storage`, `501 /ai/usage` (no AI provider) and `404 ?state=draft`
no-draft probes. Only the PIDs this run started were stopped.
## Gates and tests run locally
`check-adr-0087-registration --base origin/main`, `check:console-sha`,
`check:console-injection`, `check:sdui-lockstep`, `check-sdui-manifest`,
`check:objectui-pin-citations` (49 matching; `--verify-anchors`: 7
anchor content assertions verified at `89cad75d5`),
`check:migration-registry`, `check:objectui-bump`, `@objectstack/spec
check:generated` (after `gen:docs`) — all exit 0. `pnpm build` exit 0.
The console build passed its single-zod canary and spec-injection check.
`pnpm --filter @objectstack/spec test`: 598 files, 17512 passed, 1 todo.
`pnpm --filter @objectstack/sdui-parser test`: 218 passed. `pnpm
--filter @objectstack/spec typecheck`: exit 0.
Environment, not a product change: objectui's `jsdom` needs Node `>=
22.22.2`; the container has 22.22.0, so a Node 22.23.3 was prepended to
`PATH` for the console build and the dev boot.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01CuUktjSyZWTP2mU4ywPGA6)_
---------
Co-authored-by: Claude <noreply@anthropic.com>
The spec's objectui citations, and the shipped description text that names the `.objectui-sha` pin (the `FormField.span` describe and six migration-entry descriptions), are re-measured against the new console pin, objectui `89cad75d5570`.
6
+
7
+
Clause-②: no
8
+
9
+
Several records were corrected rather than moved, because objectui changed what they describe on this hop: `object-map` now reads `mapStyle` ahead of `map.style` on the declared-block path as well (objectui#11168 slice 3), so the `getMapConfig` return quote is rewritten; `object-tree`'s `navigation` read and `@object-ui/types`' `ObjectTreeSchema` mirror now carry the spec row's keys with no cast, and objectui's record-source table no longer lists the retired bare `tree` / `view:tree` keys (objectui#10859 batch 8); `object-map`, `object-gantt` and `object-timeline` publish the further keys their rows declare (objectui#11168 slices 3–5). Two stale `object-timeline` anchors (`filter` and `variant`) that were already one line off at the previous pin are corrected. No key, default, enum member or export moves.
|**colSpan**|`integer`| optional | Absolute column span (1-4). The renderer clamps it to the form grid's current column count, so the cell starts at a real column boundary at every surface width and never overflows (`colSpan: 4` in a 3-column grid renders as 3); a `colSpan` within the column count renders as authored, and `colSpan: 1` emits no span class at all. |
216
-
|**span**|`Enum<'auto' \| 'full'>`| optional (default: `"auto"`) | Relative field width. 'auto' (default — omit it): the renderer sizes the field from its widget type × the current column count — at the pin this repo builds against (`.objectui-sha` = `31971ff1e28f`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
216
+
|**span**|`Enum<'auto' \| 'full'>`| optional (default: `"auto"`) | Relative field width. 'auto' (default — omit it): the renderer sizes the field from its widget type × the current column count — at the pin this repo builds against (`.objectui-sha` = `89cad75d5570`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
217
217
|**widget**|`string`| optional | Custom widget/component name (overrides type-based inference) |
218
218
|**language**|`string`| optional | Code editor language (for type=code) |
|**colSpan**|`integer`| optional | Absolute column span (1-4). The renderer clamps it to the form grid's current column count, so the cell starts at a real column boundary at every surface width and never overflows (`colSpan: 4` in a 3-column grid renders as 3); a `colSpan` within the column count renders as authored, and `colSpan: 1` emits no span class at all. |
346
-
|**span**|`Enum<'auto' \| 'full'>`| optional (default: `"auto"`) | Relative field width. 'auto' (default — omit it): the renderer sizes the field from its widget type × the current column count — at the pin this repo builds against (`.objectui-sha` = `31971ff1e28f`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
346
+
|**span**|`Enum<'auto' \| 'full'>`| optional (default: `"auto"`) | Relative field width. 'auto' (default — omit it): the renderer sizes the field from its widget type × the current column count — at the pin this repo builds against (`.objectui-sha` = `89cad75d5570`), only textarea, markdown, html, richtext and repeater resolve to the full column count (repeater reaches it through the wide `field:grid` widget it maps to). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at that same pin the renderer emits one clamped col-span class per multi-column tier (`@md:col-span-2 @2xl:col-span-3` for a 3-column grid), so the field takes the whole row at every multi-column tier, not just the widest. |
347
347
|**widget**|`string`| optional | Custom widget/component name (overrides type-based inference) |
348
348
|**language**|`string`| optional | Code editor language (for type=code) |
Copy file name to clipboardExpand all lines: packages/spec/src/migrations/entries/semantic/18.kernel-health-check-and-hot-reload-durations-unit-in-key.ts
+'neither def and neither key: all thirteen exports of plugin-lifecycle-advanced.zod.ts and '
57
-
+'the string debounceDelay each occur 0 times across its 9912 tracked files (0 across the 9800 at e420df310, the 9546 at db11afd49, the 9283 at dd3f7e1be, the '
57
+
+'the string debounceDelay each occur 0 times across its 10071 tracked files (0 across the 9912 at 31971ff1e, the 9800 at e420df310, the 9546 at db11afd49, the 9283 at dd3f7e1be, the '
58
58
+'8512 at f8a9d0fb0 and the 8303 at 62597c588 too), against lit '
59
59
+'controls objectstack 12966 and @objectstack/spec 4997 on the same corpus at 87af769e9, '
60
60
+'which re-count to 13125 and 5043 respectively at 62597c588, to 13347 and 5123 at '
61
-
+'f8a9d0fb0, to 13745 and 5466 at dd3f7e1be, to 14704 and 5545 at db11afd49, to 15352 and 6024 at e420df310 and to 15691 and 6206 at this pin (git grep -o -F, the method that reproduces '
61
+
+'f8a9d0fb0, to 13745 and 5466 at dd3f7e1be, to 14704 and 5545 at db11afd49, to 15352 and 6024 at e420df310, to 15691 and 6206 at 31971ff1e and to 16044 and 6461 at this pin (git grep -o -F, the method that reproduces '
62
62
+'every earlier count).',
63
63
acceptanceCriteria:
64
64
'Every producer and reader of a PluginHealthCheck spells intervalMs and timeoutMs, and every '
+'spells timeout 0 times; outside the zod file and its test the only live occurrences are the '
47
47
+'generated rows in content/docs/references/kernel/plugin-security-advanced.mdx, which this '
48
48
+'rename regenerates. The pinned objectui checkout — this is the pin we build against, '
49
-
+'`.objectui-sha` = `31971ff1e28f89cfc45f0c19bc5b05e443f28b79`, re-read from this tree — '
49
+
+'`.objectui-sha` = `89cad75d55702cc4f267bead5bf267de575d5842`, re-read from this tree — '
50
50
+'spells resourceLimits.timeout 0 times across '
51
-
+'9912 tracked files, against lit controls timeout 1303, RuntimeConfig 273 and resourceLimits '
52
-
+'2 on the same corpus (0 across 9800, and 1293 / 273 / 2, at e420df310; 0 across 9546, and 1197 / 273 / 2, at db11afd49; 0 across 9283, and 1172 / 263 / 2, at dd3f7e1be; 0 across 8512, and 1096 / 245 / 2, at f8a9d0fb0; 0 across 8303, and '
51
+
+'10071 tracked files, against lit controls timeout 1331, RuntimeConfig 273 and resourceLimits '
52
+
+'2 on the same corpus (0 across 9912, and 1303 / 273 / 2, at 31971ff1e; 0 across 9800, and 1293 / 273 / 2, at e420df310; 0 across 9546, and 1197 / 273 / 2, at db11afd49; 0 across 9283, and 1172 / 263 / 2, at dd3f7e1be; 0 across 8512, and 1096 / 245 / 2, at f8a9d0fb0; 0 across 8303, and '
53
53
+'1086 / 240 / 2, at 62597c588); both resourceLimits hits are prose in packages/app-shell recording '
54
54
+'that objectui\'s own AppShellRuntimeConfig shares not one key with the spec\'s '
55
55
+'RuntimeConfig, so nothing there authors this key and no pin bump is owed. ADR-0087.',
+'across its 9912 tracked files, against lit controls `useState` 2469 and `timeout` 1303 on '
53
-
+'the same corpus (all four 0 across 9800, against 2464 and 1293, at e420df310, 0 across 9546, against 2449 and 1197, at db11afd49, 0 across 9283, against 2435 and 1172, at dd3f7e1be, 0 across 8512, '
52
+
+'across its 10071 tracked files, against lit controls `useState` 2470 and `timeout` 1331 on '
53
+
+'the same corpus (all four 0 across 9912, against 2469 and 1303, at 31971ff1e, 0 across 9800, against 2464 and 1293, at e420df310, 0 across 9546, against 2449 and 1197, at db11afd49, 0 across 9283, against 2435 and 1172, at dd3f7e1be, 0 across 8512, '
54
54
+'against 2391 and 1096, at f8a9d0fb0, and 0 across '
0 commit comments