diff --git a/.changeset/console-a472b07167a3.md b/.changeset/console-a472b07167a3.md new file mode 100644 index 0000000000..1cda964017 --- /dev/null +++ b/.changeset/console-a472b07167a3.md @@ -0,0 +1,43 @@ +--- +"@objectstack/console": minor +--- + +Console (objectui) refreshed to `a472b07167a3`. Frontend changes in this range: + +Derived from the changesets objectui declared over the range — 15 releasing of 18 changesets added across 29 non-merge commits; omitted: 3 release-nothing changesets, 11 commits carrying no changeset (they ship no package code). + +- **minor** — **BREAKING** — Converge the lookup/user widget metadata on the spec's camelCase — one concept, one spelling (objectui#7155, maintainer ruling A′ of 2026-09-03, director decision batch #19). (objectui `351eb3181`) +- **minor** — **BREAKING** — One authority for `KanbanSchema` / `KanbanColumn` / `KanbanCard`: the bare names now belong to `@object-ui/plugin-kanban` (objectui#6172, closing the cross-package half of objectu… (objectui `2c71482ea`) +- **minor** — Retire `ComponentInput.inputType` — the fifth and last key objectui#5905 named (ADR-0049 enforce-or-remove, maintainer ruling 2026-08-31, option B). (objectui `1ec291c0d`) +- **minor** — `@object-ui/core` publishes `resolveRecordSourceObjectName`, the ONE reader for "which object is this block bound to" (objectui#7627). (objectui `b041b9c0c`) +- **minor** — **Published TS surface narrowed:** `DashboardComponentSchema` no longer declares the dashboard-root `title` member (objectui#7623). (objectui `5d0876c5c`) +- **minor** — **BREAKING** — BREAKING (`@object-ui/components`): the chart primitives — `ChartContainer`, `ChartTooltip`, `ChartTooltipContent`, `ChartLegend`, `ChartLegendContent`, `ChartStyle` and the `Char… (objectui `7bf244bea`) +- **minor** — ListView: fold `data={{ provider: 'object', object }}` onto `objectName`, and read the author's view kind from `specType` / `type` (objectui#7477 — step 6 of #2890, released by th… (objectui `00d2fa682`) +- **minor** — Retire the dashboard-**root** `title` read across all five surfaces (objectui#7509, maintainer ruling 2026-09-04, decision batch #29, option C, under ADR-0049). (objectui `1cca678ba`) +- **minor** — **BREAKING** — Re-home the breakpoint layout vocabulary and delete the two dead responsive implementations (objectui#7580, maintainer ruling 2026-09-04, option A). (objectui `e62c44e7e`) +- **minor** — `@object-ui/types/zod`: the zod const `StylePropsSchema` is renamed to `ClassNameStylePropsSchema` (objectui#5928). **The old name is gone** — there is no deprecated alias and no… (objectui `24e027e93`) +- **patch** — Fix `extractToc` eating the underscores out of a `SCREAMING_SNAKE` heading, so its `#id` links resolve to the heading they name again (objectui#7667). (objectui `a472b0716`) +- **patch** — Remove `src/ui/toast.tsx`, an unreferenced primitive, and the dependency only it imported (objectui `2f61238b9`) +- **patch** — Fix `extractToc` deleting tag-shaped text that lives INSIDE an inline code span, so its `#id` links resolve to the heading they name again (objectui#7658). (objectui `90c6d090d`) +- **patch** — A record-page URL now names the object the clicked rows actually came from, in `ObjectTree` and `ObjectCalendar` (objectui#7638). (objectui `2ce2612df`) +- **patch** — fix(app-shell): the object-field options editor no longer drops `default` and `visibleWhen` on save (objectui `97c3e1972`) + +⚠️ 4 of these carry a breaking change: 4 by the author's own breaking annotation in the changeset body — objectui declares no `major` inside a launch window (`scripts/check-changeset-no-major.mjs`). Each is marked **BREAKING** in the list above — read them before compiling the release record. + +**In this console build, declared nowhere** — objectui merged 11 commits in this range with no `.changeset/*.md`. The code is inside the pin above and ships here, but nothing upstream declared them, so they appear in no objectui CHANGELOG and in no entry above. Listed by subject rather than counted, because a count cannot tell a dependency bump from a form-behaviour change (objectstack#6174); the upstream gate that would prevent this is objectui#3387. + +- _(no changeset)_ fix(scripts): check-doc-links resolves the #fragment, not just the file (objectui#7644) (#7657) (objectui `f7cf7e8a9`) +- _(no changeset)_ docs(plugin-chatbot): document chatbot-floating's seven declared inputs keys (objectui#7594) (#7656) (objectui `8e501cb97`) +- _(no changeset)_ docs(agents): record the never-approve seat rule beside the governed never-list (#7630) (objectui `2e99852ca`) +- _(no changeset)_ refactor(examples): drop the inert root `title` from six catalog dashboards (#7634) (objectui `46cde8264`) +- _(no changeset)_ docs(check-skill-examples): drop the stale zero-jsonc-fences claim (#7631) (objectui `0b24d7f85`) +- _(no changeset)_ docs(governed-guard): replace the retired sha pin with the ruled approval-record predicate (#7616) (objectui `11edab88f`) +- _(no changeset)_ docs(skills): split multi-document JSON fences, drop the `...` elisions, mark every parsing fence (#7608) (objectui `89d6adf37`) +- _(no changeset)_ fix(scripts): judge spec citations at member granularity, and stop the header teaching a retired filter (objectui#7513) (#7617) (objectui `d28d87bf4`) +- _(no changeset)_ fix(governed-guard): an authorised approval record satisfies the queue leg on any commit (#7606) (objectui `0d8fd7ce3`) +- _(no changeset)_ chore(deps): Bump fumadocs-core from 16.14.4 to 16.15.4 (#7059) (objectui `1bae75bb8`) +- _(no changeset)_ docs(claude-md): collapse the two AGENTS.md excerpts to rule + hook + pointer (#7600) (objectui `c70ebaaeb`) + + + +objectui range: `00d3f09c500c...a472b07167a3` diff --git a/.objectui-sha b/.objectui-sha index 39cdb8179c..7b3b74ffde 100644 --- a/.objectui-sha +++ b/.objectui-sha @@ -1 +1 @@ -00d3f09c500c4a45b5f27aca8af80349412faaf1 +a472b07167a39e55491109e864bb5a54027dcfbd diff --git a/packages/sdui-parser/objectui-lockstep.json b/packages/sdui-parser/objectui-lockstep.json index 64f4194dee..2fecd15e0c 100644 --- a/packages/sdui-parser/objectui-lockstep.json +++ b/packages/sdui-parser/objectui-lockstep.json @@ -6,8 +6,8 @@ ], "objectui": { "repo": "https://github.com/objectstack-ai/objectui.git", - "rev": "00d3f09c500c4a45b5f27aca8af80349412faaf1", - "revDate": "2026-09-04T04:22:27Z", + "rev": "a472b07167a39e55491109e864bb5a54027dcfbd", + "revDate": "2026-09-04T17:28:55+00:00", "source": "packages/sdui-parser/src", "files": [ "packages/sdui-parser/src/codegen.ts", @@ -20,7 +20,7 @@ "packages/sdui-parser/src/validate.ts" ] }, - "recordedAgainstPin": "00d3f09c500c4a45b5f27aca8af80349412faaf1", + "recordedAgainstPin": "a472b07167a39e55491109e864bb5a54027dcfbd", "grammarRegion": { "file": "packages/sdui-parser/src/parse.ts", "delimiter": "/* ---------------------- the JS literal subset (#6614) ---------------------- */", diff --git a/packages/spec/src/data/api-methods-batch-conformance.test.ts b/packages/spec/src/data/api-methods-batch-conformance.test.ts index 40cd431655..9922c6b477 100644 --- a/packages/spec/src/data/api-methods-batch-conformance.test.ts +++ b/packages/spec/src/data/api-methods-batch-conformance.test.ts @@ -61,21 +61,26 @@ const SINGLE_RECORD_WRITE_ONLY: Record = { // `revoked` on ONE key. The multi-select surface this rule protects does not // exist for API keys, and the shape a future one would take does not need // `bulk` either — both read off the console build this release pins - // (`.objectui-sha` = `00d3f09c5`, `packages/plugin-grid`; re-measured at - // that pin, 2026-09-04 — previously measured at `67dadd602`, before that at - // `d8ec8d6d4`, `9602dc820`, `190fbd01d`, `9a3daf8d3`, originally at - // `6314e87f2`. `ObjectGrid.tsx` DID change across the move off `67dadd602` - // (171 insertions, 81 deletions), so both claims below were re-derived - // rather than carried over: `ObjectGrid.tsx:3790-3805`, whose block is - // byte-identical to the one cited at `67dadd602:3436-3451` and shifted only - // by insertions above it, and - // `hooks/useBulkExecutor.ts:284-289`, in a file byte-identical at both pins - // and re-READ there rather than carried on that identity — it still ends on - // `label = 'bulk delete'`, the line the `284-288` span cited three pins ago - // stopped short of, truncating the second of the two branches it names (the - // #10274 class of anchor error, found by re-reading rather than by the file - // changing, which is why byte-identity is never taken as proof an anchor is - // right): + // (`.objectui-sha` = `a472b0716`, `packages/plugin-grid`; re-measured at + // that pin, 2026-09-04 — previously measured at `00d3f09c5`, `67dadd602`, + // before that at `d8ec8d6d4`, `9602dc820`, `190fbd01d`, `9a3daf8d3`, + // originally at `6314e87f2`. `ObjectGrid.tsx` DID change across the move off + // `00d3f09c5` (7 insertions, 4 deletions, all at `:1204-1213`, where + // `objectName` moved onto the shared `resolveRecordSourceObjectName`), and + // the re-READ caught the previous record's OWN grid anchor as wrong rather + // than merely shifted: `3790-3805` at `00d3f09c5` is `runBulkActionAggregate` + // and says nothing about selection. The block this record means was + // `3541-3556` there — byte-identical to the one cited at + // `67dadd602:3436-3451` — and is `ObjectGrid.tsx:3544-3559` here, shifted + // only by the three insertions above it. That is the #10274 class again, and + // the reason a citation refresh re-READS instead of moving numbers: + // arithmetic on the wrong anchor would have produced `3793-3808`, a + // fresh-looking span still describing the wrong function. The second claim, + // `hooks/useBulkExecutor.ts:284-289`, is in a file byte-identical at both + // pins and re-READ there rather than carried on that identity — it still + // ends on `label = 'bulk delete'`, the line the `284-288` span cited four + // pins ago stopped short of, truncating the second of the two branches it + // names (byte-identity is never taken as proof an anchor is right): // // · No checkbox column is rendered. None of the object's four list views // declares `bulkActions` / `bulkActionDefs` / `selection`, and `ObjectGrid` diff --git a/packages/spec/src/ui/component.test.ts b/packages/spec/src/ui/component.test.ts index c0fb9893c2..d9081a04b1 100644 --- a/packages/spec/src/ui/component.test.ts +++ b/packages/spec/src/ui/component.test.ts @@ -278,13 +278,13 @@ describe('PageAccordionProps variant (#6776)', () => { // same file's `ComponentRegistry.register('accordion', …)` publishes the key to // the Studio block designer at `:966` (the `items` input, documented as // `[{ label, icon?, collapsed?, children }]`). Measured at the pin this repo -// builds against — `.objectui-sha` = `00d3f09c5`. Re-derived at that pin -// 2026-09-04: `containers.tsx` DID change across the move off `67dadd602` -// (117 insertions, 63 deletions), and this time both anchors moved by exactly -// one line — the icon block `918-924` to `919-925` and the registration input -// `965` to `966` — each re-READ there with the cited text unchanged. Every -// anchor was re-READ at the new pin, never inferred, because identity -// preserves a wrong anchor as faithfully as a right one (#10274). +// builds against — `.objectui-sha` = `a472b0716`. Re-derived at that pin +// 2026-09-04: `containers.tsx` is byte-identical to the one at `00d3f09c5`, +// the hop on which both anchors moved by exactly one line (`918-924` to +// `919-925`, `965` to `966`), so NO anchor moved here — the icon block still +// spans `919-925` and the registration input still lands on `:966`. Both were +// re-READ at the new pin rather than inferred from that identity, because +// identity preserves a wrong anchor as faithfully as a right one (#10274). // // #9397 spent a full dispatch cycle re-deriving that read point from scratch // after the sweep proposed retiring the key. This block plus the `.describe()` @@ -367,12 +367,12 @@ describe('PageTabsProps items[].value / items[].count (#5775)', () => { // same file's `ComponentRegistry.register('tabs', …)` publishes the key to the // Studio block designer at `:789` (the `items` input, documented as // `[{ label, value?, icon?, count?, visibleWhen?, children }]`). Measured at -// the pin this repo builds against — `.objectui-sha` = `00d3f09c5`. Re-derived -// at that pin 2026-09-04: `containers.tsx` DID change across the move off -// `67dadd602` (117 insertions, 63 deletions), and both anchors moved by -// exactly one line — the icon block `729-735` to `730-736` and the -// registration input `788` to `789` — each re-READ there with the cited text -// unchanged. Both were re-READ at the new pin, never inferred (#10274). +// the pin this repo builds against — `.objectui-sha` = `a472b0716`. Re-derived +// at that pin 2026-09-04: `containers.tsx` is byte-identical to the one at +// `00d3f09c5`, the hop on which both anchors moved by exactly one line +// (`729-735` to `730-736`, `788` to `789`), so NO anchor moved here — the icon +// block still spans `730-736` and the registration input still lands on +// `:789`. Both were re-READ at the new pin, never inferred (#10274). // // #9397 spent a full dispatch cycle re-deriving the accordion's read point // after the sweep proposed retiring it. This block plus the `.describe()` it @@ -2780,16 +2780,18 @@ describe('#7751 — object-* block props schemas', () => { // #9881 and #9972 recorded the accordion and tab items; these two close the set. // // The button record re-measured at the pin this repo builds against — -// `.objectui-sha` = `00d3f09c5`, re-derived there 2026-09-04. This hop is the -// first that changed the record's SUBSTANCE and not merely its line numbers: -// `resolve-icon.ts` was restructured (110 insertions), so `resolveIcon` no -// longer PascalCases and maps inline — it delegates to the new -// `describeIconLookup` seam (`:117-120`), and the tokeniser now splits on -// hyphen, underscore AND whitespace (`/[-_\s]+/`), where this record used to -// say "splits on `-` only". That sentence was true when written and is false -// now, which is exactly why a citation refresh re-READS instead of moving -// numbers (#10274). `button.tsx` also changed (18 insertions): its anchors -// moved rather than died. +// `.objectui-sha` = `a472b0716`, re-derived there 2026-09-04. Both files in +// this chain, `resolve-icon.ts` and `button.tsx`, are byte-identical to the +// ones at `00d3f09c5`, so no anchor moved; every one below was still re-READ +// at the new pin rather than inferred from that identity (#10274). The hop +// onto `00d3f09c5` was the one that changed this record's SUBSTANCE and not +// merely its line numbers: `resolve-icon.ts` was restructured (110 +// insertions), so `resolveIcon` no longer PascalCases and maps inline — it +// delegates to the `describeIconLookup` seam (`:117-120`), and the tokeniser +// splits on hyphen, underscore AND whitespace (`/[-_\s]+/`), where this record +// used to say "splits on `-` only". That sentence was true when written and +// was false by then, which is exactly why a citation refresh re-READS instead +// of moving numbers (#10274). // The one move that changed the button READ POINT and not merely its line // numbers was the one onto `9602dc820`: objectui#5993 deleted `button.tsx`'s // file-local `toPascalCase` + `iconNameMap` + `icons` index and routed the @@ -2853,7 +2855,11 @@ describe('ObjectMetricPropsSchema icon liveness (#10053)', () => { const metric = ComponentPropsMap['object-metric']; it('accepts an icon on the metric tile — the value objectui resolves via getLazyIcon', () => { - // objectui `plugin-dashboard/src/index.tsx:161` publishes the input; + // objectui `plugin-dashboard/src/index.tsx:204` publishes the input + // (this read `:161` until the `a472b0716` re-measure: wrong since written, + // not shifted — that line is a sentence in the registry shell's docblock, + // not the `object-metric` registration's `icon` input, and the file is + // byte-identical at both pins, so only a re-READ could find it); // `ObjectMetricWidget.tsx:142` destructures it and forwards it at `:474` to // `MetricWidget`, which resolves it at `MetricWidget.tsx:312-321` and draws // it at `:373-382` in the `colorVariant`-tinted square. diff --git a/packages/spec/src/ui/component.zod.ts b/packages/spec/src/ui/component.zod.ts index 6a8ede4699..a549b82496 100644 --- a/packages/spec/src/ui/component.zod.ts +++ b/packages/spec/src/ui/component.zod.ts @@ -674,12 +674,12 @@ export const PageTabsProps = strictObject({ * false candidate a component over). * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `00d3f09c5`; re-derived at that pin 2026-09-04 — - * `containers.tsx` DID change across the move off `67dadd602` (117 - * insertions, 63 deletions) and both anchors moved by exactly one line: - * the icon block from `729-735` and the registration input from `788`, - * each re-READ at the new pin with the cited text unchanged, never - * inferred): `containers.tsx:730-736` + * (`.objectui-sha` = `a472b0716`; re-derived at that pin 2026-09-04 — + * `containers.tsx` is byte-identical to the one at `00d3f09c5`, the hop on + * which both anchors moved by exactly one line (the icon block from + * `729-735`, the registration input from `788`), so NO anchor moved here; + * both were re-READ at the new pin with the cited text unchanged rather + * than inferred from that identity): `containers.tsx:730-736` * renders * `{item.icon && }` inside the * `TabsTrigger`, left of the label span (`mr-1.5 h-3.5 w-3.5 shrink-0 @@ -1733,12 +1733,12 @@ export const PageAccordionProps = strictObject({ * re-derive the same false candidate). * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `00d3f09c5`; re-derived at that pin 2026-09-04 — - * `containers.tsx` DID change across the move off `67dadd602` (117 - * insertions, 63 deletions) and both anchors moved by exactly one line: - * the icon block from `918-924` and the registration input from `965`, - * each re-READ at the new pin with the cited text unchanged, never - * inferred): `containers.tsx:919-925` + * (`.objectui-sha` = `a472b0716`; re-derived at that pin 2026-09-04 — + * `containers.tsx` is byte-identical to the one at `00d3f09c5`, the hop on + * which both anchors moved by exactly one line (the icon block from + * `918-924`, the registration input from `965`), so NO anchor moved here; + * both were re-READ at the new pin with the cited text unchanged rather + * than inferred from that identity): `containers.tsx:919-925` * renders * `{item.icon && }` inside the * `AccordionTrigger`, grouped with the label in the trigger's one wrapping @@ -1940,16 +1940,19 @@ export const ElementButtonPropsSchema = lazySchema(() => strictObject({ * the button. * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `00d3f09c5`; re-derived at that pin 2026-09-04 — BOTH - * files changed across the move off `67dadd602`, and this is the first hop - * that moved the record's SUBSTANCE rather than only its line numbers: - * `resolve-icon.ts` was restructured (110 insertions) so the resolution now - * runs through a named `describeIconLookup` seam, and its tokeniser accepts - * more spellings than this record used to claim — see the corrected - * breakdown below. `button.tsx` changed by 18 insertions and its anchors - * moved. Every anchor below was re-READ at the new pin, never carried - * (#10274); the read point first MOVED rather than died on the earlier hop - * onto `9602dc820`, which is why the anchors span a second file): + * (`.objectui-sha` = `a472b0716`; re-derived at that pin 2026-09-04 — both + * files, `resolve-icon.ts` and `button.tsx`, are byte-identical to the ones + * at `00d3f09c5`, so no anchor MOVED; the re-READ still corrected two that + * had been wrong since they were written — the registration's input list and + * its `defaultProps`, see the last paragraph of this block. The hop onto + * `00d3f09c5` was the one that moved this record's SUBSTANCE rather than + * only its line numbers: `resolve-icon.ts` was restructured (110 insertions) + * so the resolution runs through a named `describeIconLookup` seam, and its + * tokeniser accepts more spellings than this record used to claim — see the + * corrected breakdown below. Every anchor below was re-READ at the new pin, + * never carried (#10274); the read point first MOVED rather than died on the + * earlier hop onto `9602dc820`, which is why the anchors span a second + * file): * `components/src/renderers/form/ * button.tsx:43` resolves `schema.icon` through the shared `resolveIcon`, * and `:72` / `:74` render it on either side of the label per @@ -1985,9 +1988,12 @@ export const ElementButtonPropsSchema = lazySchema(() => strictObject({ * behaviour promised above is the same on both sides of that move. * * Also measured at the same pin: the renderer's registration publishes no - * `icon` input (`button.tsx:70-87` lists `label`, `variant`, `size`, - * `className`; `:88-92` is `defaultProps`), so the Studio block designer - * does not offer the key. Unpublished is not unread — the header `icon` + * `icon` input (`button.tsx:85-102` lists `label`, `variant`, `size`, + * `className`; `:103-107` is `defaultProps`), so the Studio block designer + * does not offer the key. Those two anchors read `70-87` / `88-92` until the + * `a472b0716` re-measure: wrong since written rather than shifted — + * `button.tsx` is byte-identical at `00d3f09c5` and `a472b0716`, so only a + * re-READ could find them and a line-number refresh never would (#10274). Unpublished is not unread — the header `icon` * above is refused for the second, not the first, and this docblock exists * to hold them apart. */ @@ -2575,14 +2581,14 @@ export const ObjectMetricPropsSchema = lazySchema(() => strictObject({ * same record for the metric tile. * * The key is LIVE at the objectui pin this repo builds against - * (`.objectui-sha` = `00d3f09c5`; re-derived at that pin 2026-09-04 — all + * (`.objectui-sha` = `a472b0716`; re-derived at that pin 2026-09-04 — all * five files in the chain below, `index.tsx`, `ObjectMetricWidget.tsx`, * `MetricWidget.tsx`, `MetricCard.tsx` and `lazy-icon.tsx`, are - * byte-identical to the ones at `67dadd602`, so NO anchor moved — the - * `object-metric` registration still begins at `:194` and the icon input - * still lands on `:204`. Every anchor below was re-READ at the new pin - * rather than inferred from that identity), and the chain runs - * three files: + * byte-identical to the ones at `00d3f09c5` and at `67dadd602` before it, so + * NO anchor moved — the `object-metric` registration still begins at `:194` + * and the icon input still lands on `:204`. Every anchor below was re-READ + * at the new pin rather than inferred from that identity), and the chain + * runs three files: * `plugin-dashboard/src/index.tsx:204` publishes it as a designer input * (`Icon (Lucide name)`) on the registered `object-metric` block; * `ObjectMetricWidget.tsx:142` destructures it and forwards it at `:474` to diff --git a/scripts/sdui-manifest.record.json b/scripts/sdui-manifest.record.json index c5dfdd76e4..e9c161010d 100644 --- a/scripts/sdui-manifest.record.json +++ b/scripts/sdui-manifest.record.json @@ -9,7 +9,7 @@ "a pin bump without regeneration goes RED there — that is the anti-rot half of the freshness gate.", "Regenerate + re-record: node scripts/gen-sdui-manifest-node.mjs (see its header for the offline mode)." ], - "objectuiSha": "00d3f09c500c4a45b5f27aca8af80349412faaf1", + "objectuiSha": "a472b07167a39e55491109e864bb5a54027dcfbd", "objectuiPackagesVersion": "17.6.0", "generator": "scripts/gen-sdui-manifest-node.mjs", "generatedAt": "2026-09-04",