Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
10000 commits
Select commit Hold shift + click to select a range
4c68855
fix(plugin-detail): fold a declared pointer pair type half into its r…
Oct 20, 2026
2d8a8b7
fix(components): label a select nameField on the record heading's dec…
Oct 20, 2026
4b67746
fix(plugin-grid): name bulk-confirm records by the declared nameField…
Oct 20, 2026
ed28057
feat(app-shell): the create entry uses the object's create form view …
Oct 20, 2026
0b36ffa
test(e2e/live): the eleven stale live specs, each brought back to the…
Oct 20, 2026
a57d80a
fix(plugin-list): an ungrouped list asks for the declared nameField (…
Oct 20, 2026
427e59c
fix(app-shell): hold an unnamed RLS policy instead of autosaving it, …
Oct 20, 2026
96036bd
test(app-shell): wait for the counted backfill checkbox in the unchec…
Oct 20, 2026
d05f33b
fix(plugin-grid): send a csv-declared saved mapping CSV text, not JSO…
Oct 20, 2026
cbac9d7
feat(plugin-list,plugin-view,types,app-shell)!: retire the filterable…
Oct 20, 2026
5dbc6a5
fix(app-shell): the app-missing screen offers the way home beside Ret…
Oct 20, 2026
91b658a
fix(app-shell): a chart saved view keeps the view tabs (#13171)
Oct 20, 2026
4c36eab
fix(app-shell): show the server's reasons under a refused package pub…
Oct 20, 2026
157694c
fix(app-shell): bind Studio create-dialog labels to their inputs (obj…
Oct 20, 2026
616df65
fix(core, app-shell): an action param dialog keeps the typed input wh…
Oct 20, 2026
186b78d
fix(app-shell): Add branch on a Decision never overwrites a connectio…
Oct 20, 2026
f48a4d5
fix(fields): a lookup pick after a search reaches the field, and the …
Oct 20, 2026
961b69f
fix(console): settings text boxes clear to unset; Reset to default be…
Oct 20, 2026
5a8d40f
fix(plugin-grid): title the phone-width card by the declared nameFiel…
Oct 20, 2026
673a71c
fix(app-shell): packaged automation does not show "On" for a flow the…
Oct 20, 2026
74e37aa
fix(i18n,app-shell): pluralise the inbox header notification count (#…
Oct 20, 2026
f7aac4c
fix(app-shell): offer no write action on a read-only package in the P…
Oct 20, 2026
9840695
fix(plugin-grid): a finished import no longer says "Review data befor…
Oct 20, 2026
aaa1296
fix(plugin-grid,app-shell): the phone list scrolls its last card clea…
Oct 20, 2026
c209c93
fix(console): Audit Log's object filter is picked from the served obj…
Oct 20, 2026
7e62822
fix(app-shell): New package dialog drops the retired "project-scoped"…
Oct 20, 2026
768960e
fix(app-shell): draw a flow branch that skips a node around it, its l…
Oct 20, 2026
5115c1f
fix(plugin-charts): advanced chart axis ticks use the muted foregroun…
Oct 20, 2026
c9cb896
fix(app-shell): Studio Data rail's empty sentence points at the "+" a…
Oct 20, 2026
e81a37c
fix(app-shell): Pending changes field rows lead with the label; injec…
Oct 20, 2026
05e3f34
fix(app-shell): flow header meta pills ellipsize instead of clipping …
Oct 20, 2026
3cec090
fix(plugin-calendar): truncate the header date title and shorten it a…
Oct 20, 2026
5129caa
fix(fields): the lookup option preview never cuts a badge to a glyph …
Oct 20, 2026
5666e19
fix(app-shell): Studio field pickers leave out the platform's hidden …
Oct 20, 2026
19b4f64
fix(app-shell): flow designer names nodes by label, not id (objectui#…
Oct 20, 2026
7a5f267
fix(console): a settings page asks before leaving with unsaved edits …
Oct 20, 2026
2782e6d
fix(app-shell): Home's pending-drafts row names the package as Studio…
Oct 20, 2026
7d497de
fix(app-shell): the draft preview bar's count follows a runtime view-…
Oct 20, 2026
2af42d9
fix(app-shell): translate "base" in the zh Studio home new-package bu…
Oct 20, 2026
8d4e453
fix(app-shell): Setup › Packages draws Actions only over rows that ca…
Oct 20, 2026
5c12dcd
fix(app-shell): a blocked Create View type card says why on its face …
Oct 20, 2026
d722045
fix(app-shell): the form designer type tag names the type as the pick…
Oct 20, 2026
f466b0a
fix(app-shell,i18n): the Pending changes summary agrees each type wit…
Oct 20, 2026
da307ef
fix(console): Audit Log's action filter offers sys_audit_log.action's…
Oct 20, 2026
9eb1479
fix(console): skip link as the shell's first Tab stop; record dialogs…
Oct 20, 2026
58798ec
fix(app-shell,i18n): tell an override reassign what a reassign does (…
Oct 20, 2026
42bd926
fix(app-shell): the draft preview bar promises sample data only while…
Oct 20, 2026
d4d9ddb
fix(app-shell): the Studio list-view panel names the view by its disp…
Oct 20, 2026
52907d7
fix(console): a refused settings save toasts the settings by label, n…
Oct 20, 2026
f0300be
fix(plugin-grid): an empty grid with no query draws the first-run sta…
Oct 20, 2026
8803ca5
fix(app-shell,i18n): word the stored_expression strip reason ahead of…
Oct 20, 2026
599a8a5
fix(app-shell): flow Problems and selection labels name nodes by labe…
Oct 20, 2026
ab4e4d7
fix(plugin-form): the record drawer opens on its first field, not on …
Oct 20, 2026
24001c1
fix(app-shell): Pending changes group headings name their type in the…
Oct 20, 2026
06be396
fix(app-shell,i18n): a submitter's own recall is not an override, and…
Oct 20, 2026
7c05f21
fix(plugin-grid): the import result screen says what happened — succe…
Oct 20, 2026
878a4af
fix(app-shell): datasource Test and Sync draw a refusal as a refusal …
Oct 20, 2026
f22b980
fix(plugin-grid, plugin-list): $select asks for a shown column's depe…
Oct 20, 2026
80843d0
fix(app-shell): flow designer names nodes by label in the last 13 id-…
Oct 20, 2026
4b92c5a
fix(components): a collapsible form section header is keyboard-operab…
Oct 20, 2026
e70c21d
fix(app-shell): the remediation overlay offers Stop impersonating on …
Oct 20, 2026
e537636
perf(scripts): the body-dialect census skips the pinned @objectstack …
Oct 20, 2026
3650d94
fix(components): Combobox search finds an option by its label, not on…
Oct 20, 2026
e077b8a
fix(app-shell): shell menu departures ask before dropping a page's un…
Oct 20, 2026
039e0b9
fix(console): Audit Log filter labels name their controls (objectui#1…
Oct 20, 2026
12cde04
fix(app-shell): approval history rows draw the authored step label (o…
Oct 20, 2026
84b4326
fix(plugin-grid): head a date / datetime group the way its cell draws…
Oct 20, 2026
ff128e3
fix(plugin-form): opening a collapsed section keeps focus on its head…
Oct 20, 2026
9a3bcfc
fix(console): a settings page loads its namespace on the namespace al…
Oct 20, 2026
cbc312d
chore(release): exit Changesets pre mode (`next`), so the next versio…
Oct 20, 2026
588d11d
fix(app-shell): the language menu asks before a switch drops a page's…
Oct 20, 2026
9a4ddb2
fix(plugin-charts): rotate and cut an x-axis label only when its band…
Oct 20, 2026
c8833c5
fix(app-shell): the command palette, the inbox and the AI entry ask b…
Oct 20, 2026
1ca759a
fix(console): block a settings save while a visible required field is…
Oct 20, 2026
2a15427
chore(deps): move .objectstack-sha to objectstack 18.0.0 version comm…
Oct 20, 2026
a29f615
fix(plugin-form): a record drawer stays open on its first open (objec…
Oct 20, 2026
8cd4db4
fix(components): recompile a react page on its content, not its schem…
Oct 20, 2026
8e649da
fix(fields): seed a relation-backed defaultFromRow param with the sto…
Oct 20, 2026
8556295
feat(types): chain the spec's navItemVisibleDataNeedsDataSource on ev…
Oct 20, 2026
36b70c0
feat(app-shell): the package edit dialog edits `dependencies` (#13277)
Oct 20, 2026
b001d21
docs(app-shell): the organization administrator creates and removes S…
Oct 20, 2026
5235d6d
fix(app-shell): offer switch-source-off and open-in-Studio on the pac…
Oct 20, 2026
7f6a2dd
docs(console): teach a navigation visible that both validators accept…
Oct 20, 2026
cf153eb
fix(app-shell): retire the permission-set clone notice once the copy …
Oct 20, 2026
9e1bff6
fix(app-shell): the app report index lists the reports its navigation…
Oct 20, 2026
53dea27
fix(app-shell): give the package dialog's Dependencies row a key/valu…
Oct 20, 2026
3aa2f52
chore: release packages (#11600)
Oct 20, 2026
a91f6bb
feat(console): the approvals inbox opens a request on its served page…
Oct 21, 2026
8701f1e
fix(components,fields): head a widget-hinted nameField through its fa…
Oct 21, 2026
fbb4b23
fix(components,plugin-grid): selecting a cell's text neither opens th…
Oct 21, 2026
c8f8b10
fix(components): select-all, the row checkboxes and the row numbers s…
Oct 21, 2026
f669732
fix(plugin-detail): show an object-level rule refusal without the _re…
Oct 21, 2026
7c405b7
fix(components): a page:tabs item visibleWhen that faults withholds i…
Oct 21, 2026
0093b2c
fix(console): a settings value that misses its declared format blocks…
Oct 21, 2026
813c3d9
fix(fields): password inputs carry an autocomplete token (objectui#13…
Oct 21, 2026
3aafc0d
fix(react): a page node whose visibility predicate faults is withheld…
Oct 21, 2026
601c406
fix(react): the withholding console line names an element, not a navi…
Oct 21, 2026
2794254
fix(app-shell): Position preview lists the permission sets a position…
Oct 21, 2026
13c92e7
test(data-objectstack): state the batch-6 DroppedFieldsEvent reason p…
Oct 21, 2026
f5e42ca
test(types): stop authoring the retired addRecord.mode / formView in …
Oct 21, 2026
78bd6d7
feat(app-shell): the /data filter bar offers single-value relation fi…
Oct 21, 2026
7e9708e
fix(app-shell): register the console home blocks under the app-shell …
Oct 21, 2026
56cf4d8
fix(plugin-grid,app-shell): a CSV file reaches the import door as CSV…
Oct 22, 2026
cd14d8e
fix(plugin-grid,types): read bulk confirmText as a string or a templa…
Oct 22, 2026
b8fa223
fix(app-shell): offer Sync objects only on a federation-source dataso…
Oct 22, 2026
4c212b9
test(console): wait on the leave guard itself after a settings save, …
Oct 22, 2026
1aa8851
fix(hooks): port subst_end() into guard-main-checkout-bash (objectsta…
Oct 22, 2026
74ebad0
fix(pin): the missing-entry remedy builds with declarations whatever …
Oct 22, 2026
0d12e95
fix(console,permissions): a non-admin approver sees the whole approva…
Oct 22, 2026
b911ebb
fix(react,app-shell): a nav entry and a page element bound to the sam…
Oct 22, 2026
5fef032
fix(ci): the Test gate asks a shard's own check run when the jobs API…
Oct 22, 2026
56b65c0
fix(plugin-charts): a single-series bar chart draws one colour (#13346)
Oct 23, 2026
a14737b
feat(app-shell): Setup positions list shows holders and granted permi…
Oct 23, 2026
2c4e5f5
fix(app-shell): a member who may read none of an app's objects lands …
Oct 23, 2026
fcbf1b2
feat(app-shell): confirm a permission set or position deactivation, n…
Oct 23, 2026
1d178e0
feat(plugin-dashboard): a dataset chart's null bucket reads the name …
Oct 23, 2026
f2f4b7d
fix(app-shell): the pre-publish capability lint reads the registry's …
Oct 23, 2026
4603b8c
fix(app-shell): toasts sit top-centre, clear of the page header's act…
Oct 23, 2026
fb25620
fix(layout): a navigation group opens unless it declares otherwise (o…
Oct 23, 2026
404ccae
fix(app-shell,plugin-detail): Setup deletes confirm in-app and name w…
Oct 23, 2026
8cf3a86
fix(layout): AppShell draws one main landmark, not two nested ones (o…
Oct 23, 2026
d019aaa
fix(plugin-grid): the import wizard preselects the object's only appl…
Oct 23, 2026
6fb31dc
fix(types): a bulk action's confirmText envelope types source as opti…
Oct 23, 2026
49a536d
fix(plugin-detail): record header highlights write the year on every …
Oct 23, 2026
0f4adc3
feat(app-shell): Packaged automation Clone opens with a proposed name…
Oct 23, 2026
241cb78
fix(app-shell): Setup refusals lead with one plain sentence, the code…
Oct 23, 2026
05049f8
fix(app-shell): a refused screen-flow end shows its message alone (ob…
Oct 23, 2026
ff77cfc
feat(app-shell, auth, plugin-grid, plugin-list): Setup → Users and th…
Oct 23, 2026
ec627ab
fix(fields): an unreadable lookup reads "Restricted record", not its …
Oct 23, 2026
fa31856
fix(app-shell): Connect an Agent mints an API key only under a typed,…
Oct 23, 2026
5b40cea
fix(app-shell): SchemaForm rows show the label only, machine key on d…
Oct 23, 2026
3a73c07
fix(app-shell): Setup → Installed Apps is titled Installed Apps and s…
Oct 23, 2026
8d305ab
fix(app-shell): the package sheet's Adopt loose items asks in-app, re…
Oct 23, 2026
4824ad7
fix(console): resolve a form entry's inline locale map to the visitor…
Oct 23, 2026
6183aa9
fix(app-shell): host an app-relative onSuccess.navigate under the cur…
Oct 23, 2026
3ec84be
feat(app-shell): Setup → Positions creates with permission sets, labe…
Oct 23, 2026
889d028
chore(deps): lock vite 8.3.5 and pin next 16.3.8, with no manifest ra…
Oct 23, 2026
b93c9f6
fix(plugin-detail, plugin-grid): one explain request per question aft…
Oct 23, 2026
f1a4b08
fix(grid): a lookup or master_detail cell draws no tooltip carrying t…
Oct 23, 2026
8e90779
feat(core,react,app-shell): action confirmText, successMessage and er…
Oct 23, 2026
01b85d8
fix(app-shell): changing the ⌘K query no longer unmounts the console …
Oct 23, 2026
78e00db
fix(app-shell): say when a display name derives no identifier, and as…
Oct 23, 2026
4b1ddf3
fix(app-shell): a record page's onSuccess.navigate opens in its own a…
Oct 23, 2026
d17f670
fix(console): settings pages re-read their namespace after a save or …
Oct 23, 2026
afcf654
fix(i18n): zh admin-override copy says 管理员代为/代办, not 越权 (objectui#134…
Oct 23, 2026
3a8a117
fix(console): Integrations → Connect an AI agent mints an API key onl…
Oct 23, 2026
cee3bc5
fix(fields): a boolean false is neutral whatever the field is named (…
Oct 23, 2026
eadceab
fix(plugin-charts): a line or area chart no longer cuts its edge x-ax…
Oct 23, 2026
da2c0a7
chore(deps): move .objectstack-sha to objectstack 915e940499, past 92…
Oct 23, 2026
130c77d
fix(app-shell): Assigned Users confirms Remove and offers organizatio…
Oct 23, 2026
ad74e98
fix(plugin-list): translate the synthetic "All records" user-filter t…
Oct 23, 2026
d9aff15
fix(app-shell): Setup record pages carry the managed-by note on the h…
Oct 23, 2026
7f60e9d
fix(core): refuse a single-record action's row count before its dialo…
Oct 23, 2026
2c3dc72
fix(plugin-charts): a sankey names its nodes and colours its flows, a…
Oct 23, 2026
b317942
fix(plugin-charts): a dataset object-chart draws a select dimension i…
Oct 23, 2026
4eeb174
fix(app-shell): refuse a toolbar flow's row count before its dialog, …
Oct 23, 2026
2958f17
fix(auth): label the external organization role objectstack#25515 add…
Oct 23, 2026
06ce712
fix(console): evaluate a setting's visible predicate with the express…
Oct 24, 2026
f3044f7
fix(fields): sanitize html and richtext values with rehype-sanitize (…
Oct 24, 2026
3688e5c
ci(repo-gates): restore the build's turbo cache, save and prune on pu…
Oct 24, 2026
cf24190
ci(test-shard-timings-refresh): push and open the refresh pull reques…
Oct 24, 2026
861fdff
fix(ci): the affected-tests fast path runs: the shard step compares t…
Oct 24, 2026
7981384
ci: pin credential-holding third-party actions by sha and default ci.…
Oct 24, 2026
a78608f
fix(components): create form no longer locks fields through readonlyW…
Oct 24, 2026
576fd25
fix(console): open a form action inside the app it was fired from (#1…
Oct 24, 2026
47138b7
perf(console): keep the chat UI out of the first page load via @objec…
Oct 24, 2026
0984c77
chore(deps): move .objectstack-sha to the objectstack 18.1.0 release …
Oct 24, 2026
a3c0da9
chore: release packages (#13289)
Oct 24, 2026
cd70b78
tooling(objectui-readiness): make the objectui tree merge-ready in it…
Oct 24, 2026
c85408f
tooling(objectui-readiness 2): readers of pnpm-workspace.yaml, turbo.…
Oct 25, 2026
723776b
chore(test): refresh the per-file test timings (objectui#12208) (#13028)
Oct 25, 2026
b41ed7f
fix(app-shell): the translation preview draws the positions and permi…
Oct 25, 2026
ee7e3a6
fix(plugin-calendar): show the lookup display name for a lookup title…
Oct 25, 2026
46c56ee
feat(plugin-detail): fold a kept all-empty record section, and an all…
Oct 25, 2026
23e912e
fix(app-shell): resolve a report's inline locale label and descriptio…
Oct 25, 2026
96c3649
fix(plugin-list,plugin-map,plugin-timeline): record preview overlay m…
Oct 25, 2026
6f629a7
chore(deps): narrow the React peer range to ^19.0.0 (objectui#13465) …
Oct 25, 2026
6c3340c
tooling(objectui-readiness 4): paths handed to git use git's cwd-rela…
Oct 25, 2026
d0c9650
fix(console, app-shell): localise API Console, Public Forms, Integrat…
Oct 25, 2026
5698ec7
fix(app-shell): show a position's label in a permission set's Assigne…
Oct 25, 2026
4aa90ba
fix(a11y): name icon-only buttons and give clickable div/span control…
Oct 25, 2026
85b6a48
chore(packages): declare `sideEffects` on every published package (ob…
Oct 25, 2026
e1627fd
chore(deps): move .objectstack-sha to objectstack main 43edf90b56 (ob…
Oct 25, 2026
ee4f1ef
fix(bulk): keep per-row bulk results and refresh bound views once per…
Oct 25, 2026
610d9ef
feat(components,types)!: retire the raw-HTML html node type (objectui…
Oct 25, 2026
84ce59c
feat(core): show a holeless confirmText / successMessage as written (…
Oct 25, 2026
320ec35
fix(plugin-gantt, app-shell): refuse an invalid gantt block; designer…
Oct 25, 2026
899f381
feat(core,types)!: retire the module widget source and its runtime dy…
Oct 25, 2026
bba96ce
tooling(objectui-readiness 5): the workspace's own files come from wo…
Oct 25, 2026
ebd20ec
fix(app-shell): readable option labels for unlabeled datasource enum …
Oct 25, 2026
76c560e
fix(plugin-chatbot): render an answer's text and charts in stream ord…
Oct 25, 2026
db9af10
fix(app-shell,components): resolve a page's inline locale label and d…
Oct 25, 2026
5399bbc
feat(console): second-pass i18n for Audit Log, Flow Runs, Agent Conne…
Oct 25, 2026
0063f22
refactor!: retire nine zero-consumer modules, make runner private, ta…
Oct 25, 2026
d12c615
feat(plugin-chatbot): the plan card says how the build will land (obj…
Oct 25, 2026
7c83e70
test(cutover-prep F): ui tests pay the first load of the specifiers c…
Oct 25, 2026
be64bf6
chore(deps): objectui-readiness 3 round 2 — pin objectstack 5874d2530…
Oct 25, 2026
1212e3e
feat(types)!: nine duration keys carry their unit in their name, old …
Oct 25, 2026
867b937
chore(skills): mark the two repo-internal .claude skills metadata.int…
Oct 25, 2026
f27eafa
ci(dependabot-auto-merge): turn the job off until the objectstack cut…
Oct 25, 2026
699156a
refactor(providers)!: retire the DataSourceProvider, MetadataProvider…
Oct 25, 2026
e6a06d2
docs(patches): link the radix focus-scope patch to radix-ui/primitive…
Oct 25, 2026
3b7b040
feat(core): the react-pages capability defaults off; a host turns it …
Oct 25, 2026
9e1fe03
chore(pin): bump .objectstack-sha to objectstack main 5e7cf63e71 at t…
Oct 25, 2026
ad4e738
merge(ui): import objectui main at its frozen tip 9e1fe03286 as the u…
Oct 25, 2026
9fead6f
build(ui): objectui's overrides and focus-scope patch move to the roo…
Oct 25, 2026
eee56b9
chore(cutover): every @objectstack/* range in the ui/ manifests resol…
Oct 25, 2026
d7c0c8c
chore(cutover): the ui/ tree stops being a workspace root of its own …
Oct 25, 2026
ca283e6
chore(cutover): the ui/ root manifest drops its turbo-recursive scrip…
Oct 25, 2026
1c86fea
tooling(cutover): scripts/ui-import carries objectui's lockfile resol…
Oct 25, 2026
1c0d02e
build(ui): one lockfile for the merged workspace, objectui's resoluti…
Oct 25, 2026
25b5d2b
lint(cutover): the root ESLint config leaves ui/** to ui/eslint.confi…
Oct 25, 2026
02c4c02
tooling(cutover): check:agent-test-spelling declares ui/AGENTS.md as …
Oct 25, 2026
8b3a99f
tooling(cutover): check:adr-anchors excuses released objectui changel…
Oct 25, 2026
87bd93d
tooling(cutover): check:undeclared-dep-imports ledgers the objectui C…
Oct 25, 2026
059c98f
tooling(cutover): four population declarations name the ui/ members (…
Oct 25, 2026
7ba9ffd
tooling(cutover): the merge driver records shadcn:update as not drive…
Oct 25, 2026
9018747
tooling(cutover): check:cross-package-test-inputs recognises ui/ and …
Oct 25, 2026
cc28062
tooling(cutover): check-closing-keyword-parity explains the three imp…
Oct 25, 2026
9a9379a
tooling(cutover): check:type-check-coverage judges ui/ members by obj…
Oct 25, 2026
e63cef1
tooling(cutover): check:test-source-alias asks the vitest-alias half …
Oct 25, 2026
5a28620
tooling(cutover): check:dts-closure expands exports subpath patterns …
Oct 25, 2026
e52c8fd
test(cutover): the envelope caller census reads objectui live, 28 to …
Oct 25, 2026
76dfa51
tooling(cutover): js-comment-mask reads JSX children text as content,…
Oct 25, 2026
de86a2d
tooling(cutover): check:pnpm-flag-spellings names the ui/ manifests i…
Oct 25, 2026
8d5ae1e
tooling(cutover): check:manifest-repository-directory names the ui/ m…
Oct 25, 2026
9c8694b
tooling(cutover): check:published-files leaves the imported ui/ tree …
Oct 25, 2026
cbee74d
chore(cutover): the happy-dom floor's comment names the objectui line…
Oct 25, 2026
cac002c
chore(cutover): delete the .objectstack-pin snapshot manifests from t…
Oct 25, 2026
0bd8ea8
chore(cutover): point each published @object-ui manifest's repository…
Oct 25, 2026
35eee67
docs(cutover): QUICK_REFERENCE spells build, type-check and lint the …
Oct 25, 2026
19c9bce
skills(cutover): move the objectui skill bundle into the root skills/…
Oct 25, 2026
f5fc321
test(cutover): the ui lazy-node pins count five since spec's shared c…
Oct 25, 2026
ca943b8
tooling(cutover): the compound self-test anchor ledger classifies the…
Oct 25, 2026
071be25
chore(cutover): the @object-ui packages join the Changesets fixed gro…
Oct 25, 2026
cba73d0
chore(cutover): the private ui root package stays out of the Changese…
Oct 25, 2026
3ee2fbc
Revert "skills(cutover): move the objectui skill bundle into the root…
Oct 25, 2026
0b8ae93
skills(cutover): hide the objectui bundle from the root skills CLI un…
Oct 25, 2026
d2342a1
build(cutover): the ui cli build drops sourcesContent through the sha…
Oct 25, 2026
1180de6
chore(cutover): the root tsc program and the coverage walker leave ui…
Oct 25, 2026
7bb4b9e
chore(cutover): the ui root's wait-on devDependency moves to ^9.5.1, …
Oct 25, 2026
0f496b8
chore(cutover): @object-ui/components' shadcn devDependency moves to …
Oct 25, 2026
9584656
chore(cutover): the docs site moves to next 16.4.1, off three next ad…
Oct 25, 2026
7e99e6a
chore(cutover): three root overrides and the recomputed lock clear th…
Oct 25, 2026
0b060f1
test(cutover): the envelope caller census records objectui instead of…
Oct 25, 2026
bf5c588
tooling(cutover): bare-root-worklist records ALIAS_HALF_EXCLUDED_DIR …
Oct 25, 2026
454818a
test(cutover): the ui pin tests assert the merged workspace, and the …
Oct 25, 2026
c04b36d
build(cutover): the ui cli spells the sourcesContent hook inline inst…
Oct 25, 2026
c326d2f
test(cutover): the ui pin test drops the readWorkspace import it no l…
Oct 25, 2026
ac3de5a
merge(cutover): bring main e2aaaf1c07 into the cutover branch (run 6)
Oct 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
42 changes: 40 additions & 2 deletions .changeset/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -80,13 +80,51 @@
"@objectstack/account",
"create-objectstack",
"@objectstack/connector-openapi",
"@objectstack/verify"
"@objectstack/verify",
"@object-ui/app-shell",
"@object-ui/auth",
"@object-ui/cli",
"@object-ui/collaboration",
"@object-ui/components",
"@object-ui/console",
"@object-ui/core",
"@object-ui/create-plugin",
"@object-ui/data-objectstack",
"@object-ui/fields",
"@object-ui/i18n",
"@object-ui/layout",
"@object-ui/mobile",
"@object-ui/permissions",
"@object-ui/plugin-ai",
"@object-ui/plugin-calendar",
"@object-ui/plugin-charts",
"@object-ui/plugin-chatbot",
"@object-ui/plugin-dashboard",
"@object-ui/plugin-designer",
"@object-ui/plugin-detail",
"@object-ui/plugin-editor",
"@object-ui/plugin-form",
"@object-ui/plugin-gantt",
"@object-ui/plugin-grid",
"@object-ui/plugin-kanban",
"@object-ui/plugin-list",
"@object-ui/plugin-map",
"@object-ui/plugin-markdown",
"@object-ui/plugin-report",
"@object-ui/plugin-timeline",
"@object-ui/plugin-tree",
"@object-ui/plugin-view",
"@object-ui/providers",
"@object-ui/react",
"@object-ui/react-runtime",
"@object-ui/sdui-parser",
"@object-ui/types"
]
],
"linked": [],
"access": "public",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"ignore": [],
"ignore": ["@object-ui/example-*", "@object-ui/site", "@object-ui/runner", "@object-ui/test-support"],
"privatePackages": { "version": true, "tag": false }
}
4 changes: 2 additions & 2 deletions content/docs/protocol/backward-compatibility.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ Read the **Breaking?** column, not the version number: in the 17.x minors every
1. **RFC (Request for Comments)** — Breaking changes are proposed as GitHub issues with the `protocol:breaking` label.
2. **Deprecation** — The old behavior is deprecated in a MINOR release (see timeline above).
3. **Migration Guide** — A detailed migration guide is published before the removal lands, in the release notes for the version that carries it.
4. **Release** — In the 17.x minors the breaking change shipped in the next **MINOR** version, carrying a changeset entry marked `**BREAKING**`, and `scripts/check-changeset-no-major.mjs` failed a pull request that declared a `major` bump, because under lockstep one `major` would promote all 73 published packages. During the v18 prerelease it shipped in the next `18.0.0-next.N`, because the guard stood aside in pre mode and a pull request could declare a major bump. Changesets has exited pre mode, so the guard fails a `major` bump again. See [how a breaking stage lands on the v18 line](/docs/releases/v18#how-a-breaking-stage-lands-on-this-line).
4. **Release** — In the 17.x minors the breaking change shipped in the next **MINOR** version, carrying a changeset entry marked `**BREAKING**`, and `scripts/check-changeset-no-major.mjs` failed a pull request that declared a `major` bump, because under lockstep one `major` would promote all 111 published packages. During the v18 prerelease it shipped in the next `18.0.0-next.N`, because the guard stood aside in pre mode and a pull request could declare a major bump. Changesets has exited pre mode, so the guard fails a `major` bump again. See [how a breaking stage lands on the v18 line](/docs/releases/v18#how-a-breaking-stage-lands-on-this-line).

---

Expand Down Expand Up @@ -196,7 +196,7 @@ The `@objectstack/spec` package provides additional stability guarantees:

### Which surfaces this covers

**All of them.** It was not scoped to an experimental corner or a pre-release channel: all **73** packages published from this repository belong to a single Changesets `fixed` group, so they share one version number and one policy. No published surface was exempt.
**All of them.** It was not scoped to an experimental corner or a pre-release channel: all **111** packages published from this repository belong to a single Changesets `fixed` group, so they share one version number and one policy. No published surface was exempt.

The convention was enforced rather than informal — `scripts/check-changeset-no-major.mjs` failed a pull request that introduced a `major` bump, because under lockstep a single `major` on one package would promote the entire stack. During the v18 prerelease Changesets was in pre mode with the tag `next` and the guard stood aside, so a pull request on the v18 line could declare a major bump. Changesets has exited pre mode, and the guard fails a `major` bump again.

Expand Down
26 changes: 25 additions & 1 deletion eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -912,6 +912,30 @@ const NEVER_LINTED = Object.freeze([
'**/.turbo/**',
]);

// ───────────────────────────────────────────────────────────────────────────
// Source trees linted by THEIR OWN flat config, not by this one. Global-only:
// unlike NEVER_LINTED this is authored source, so it is not spread into the
// per-object `ignores` below — the one global object removes it from this
// config's population, and nothing here may ever start matching it by accident
// of a `files` glob.
//
// `ui/**` is the objectui tree imported at the cutover (decision G1 on #25752,
// verbatim 「17e · 17f · 17g · 同意」): `ui/eslint.config.js` lints it, the
// `Lint UI` CI job runs that config, and the two configs converge in the
// aftercare card #25753. Census of what this one line stops, measured over the
// merged tree on the verify branch (9e37acd126, `pnpm lint` exactly as
// package.json spells it): 121 errors and 16,511 warnings, every one of them
// under `ui/**` (dominant rule `react-hooks/static-components`, then
// `react-hooks/purity`, `no-restricted-imports`,
// `@typescript-eslint/no-empty-object-type`, `no-console`). Outside `ui/` the
// population this config lints is byte-for-byte the pre-import one, so its
// verdict there does not move. Delete the entry in the PR that adopts this
// config across `ui/` — never by widening a per-object `ignores` instead.
// ───────────────────────────────────────────────────────────────────────────
const LINTED_BY_OWN_CONFIG = Object.freeze([
'ui/**',
]);

export default [
// ───────────────────────────────────────────────────────────────────────────
// GLOBAL ignore. This is the ONLY object in this array with no `files` key,
Expand Down Expand Up @@ -965,7 +989,7 @@ export default [
// either of them becoming the next `.next`. See #12334 / #12304.
// ───────────────────────────────────────────────────────────────────────────
{
ignores: [...NEVER_LINTED],
ignores: [...NEVER_LINTED, ...LINTED_BY_OWN_CONFIG],
},
{
files: ['**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}'],
Expand Down
67 changes: 39 additions & 28 deletions packages/client/src/envelope-caller-census.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,13 @@
* ships to consumers no repo sweep can see; the changeset carries their
* migration. This census bounds the first-party population only.
* - **`objectui` is a RECORDED constant, not a live scan.** A test in this
* repo cannot read that checkout. `OBJECTUI_CENSUS` carries the revision it
* was measured at and the command that reproduces it.
* repo could not read that checkout. Since objectui was imported under `ui/`
* (objectstack#25803) it can, but the walk still skips the top-level `ui/`:
* reading it would make `ui/**` an input of `@objectstack/client#test`,
* and ci.yml's `crosspkg` filter does not cover that path yet
* (`check-ci-filter-parity`). `OBJECTUI_CENSUS` is re-recorded at the
* imported revision, and the live scan returns with the card that adds the
* path to that filter.
* - **The ratchet in section 3 is only as live as turbo's cache — for the
* trees still undeclared.** This suite walks the whole workspace, while
* `@objectstack/client#test` declares as inputs its own package plus the
Expand Down Expand Up @@ -199,9 +204,18 @@ interface Site {
index: number;
}

/**
* [#25803] Top-level directories of THIS repository the walk does not enter:
* the imported objectui tree, recorded as `OBJECTUI_CENSUS` instead (see the
* header). Matched at the repository root only, never as a name at any depth
* the way `SKIP_DIRS` is: `packages/spec/src/ui` is this census's own ground.
*/
const SKIP_TOP_LEVEL = new Set(['ui']);

function walk(dir: string, acc: string[] = []): string[] {
for (const entry of readdirSync(dir)) {
if (SKIP_DIRS.has(entry)) continue;
if (dir === REPO_ROOT && SKIP_TOP_LEVEL.has(entry)) continue;
const p = join(dir, entry);
let st;
try { st = statSync(p); } catch { continue; }
Expand Down Expand Up @@ -566,41 +580,31 @@ const LEDGER: readonly LedgerRow[] = [
];

/**
* `objectui` @ b84dc1854922c266850d6e573daf3ad59cbd0623 (origin/main,
* 2026-08-31). Recorded, not live-scanned — a test here cannot read that
* checkout. Reproduce with `OBJECTUI_CENSUS_COMMAND`.
*
* ⭐ The single production call site in either reachable repo, and it SURVIVES
* the convergence untouched. `aggregate()` feeds the resolved value through a
* tolerant chain that accepts both spellings:
*
* const rawRows = Array.isArray(data) ? data
* : data?.rows && Array.isArray(data.rows) ? data.rows // post-#13079: this branch
* : data?.data && Array.isArray(data.data) ? data.data
* : data?.data?.rows && Array.isArray(data.data.rows) ? data.data.rows // pre-#13079: this branch
* : data?.results && Array.isArray(data.results) ? data.results
* : [];
* `objectui` @ 9e1fe032866965c7cb0460cff2b6af09350236b7, the revision imported
* under `ui/` (objectstack#25803; first recorded at b84dc18549, 2026-08-31).
* Recorded, not live-scanned: the walk skips `ui/` (see the header). Reproduce
* with `OBJECTUI_CENSUS_COMMAND`; the file count is the walk's own rule applied
* to the tracked `ui/` tree.
*
* Before #13079 branch 4 matched; after it branch 2 matches. ⚠️ It survives
* by DEFENSIVE CODING, not by a designed migration path — the adapter was
* written tolerant because the producer was ambiguous, which is the shape a
* contract-first fix removes rather than relies on. Ruling item 3: objectui#7028
* tightens the chain to the single post-unwrap spelling, time-gated behind
* this convergence landing and objectui taking the SDK version — the chain is
* load-bearing until then, so it is deliberately NOT part of this change.
* ⭐ The single production call site in either tree. `aggregate()` used to feed
* the resolved value through a tolerant chain that accepted both the
* pre-#13079 envelope and the post-unwrap `AnalyticsResult`. objectui#7028, the
* tightening this record named as owed, has landed: the adapter reads `rows`
* off the post-unwrap result and throws `AnalyticsResultShapeError` on any
* other shape, so it is payload-dependent and reads no envelope.
*/
const OBJECTUI_CENSUS = {
revision: 'b84dc1854922c266850d6e573daf3ad59cbd0623',
filesScanned: 4024,
revision: '9e1fe032866965c7cb0460cff2b6af09350236b7',
filesScanned: 7954,
sdkCallSites: 1,
productionCallSites: 1,
wouldBreak: 0,
site: 'packages/data-objectstack/src/index.ts:4846 (analytics.query, via this.client)',
site: 'ui/packages/data-objectstack/src/index.ts:6625 (analytics.query, via this.client)',
tighteningOwner: 'objectui#7028',
} as const;

const OBJECTUI_CENSUS_COMMAND =
"git -C <objectui> grep -nE 'analytics\\s*\\.\\s*(query|meta|explain)\\s*\\(|automation\\s*\\.\\s*trigger\\s*\\(' origin/main -- '*.ts' '*.tsx' '*.js'";
"git grep -nE 'analytics\\s*\\.\\s*(query|meta|explain)\\s*\\(|automation\\s*\\.\\s*trigger\\s*\\(' HEAD -- 'ui/*.ts' 'ui/*.tsx' 'ui/*.js'";

/**
* ⛔ `objectstack-ai/cloud` is NOT MEASURED — see the header. Post-#13079
Expand Down Expand Up @@ -819,6 +823,9 @@ describe('#13079 §3 — every call site is classified', () => {
// The three above are LEDGER sums and cannot move on a census reading;
// this one is census-derived, so it carries the note. [#13874]
expect(sdkSites.length, literalNote()).toBe(28);
// [#25803] 28 -> 29 first-party SDK sites since the objectui import: the
// walk's 28 plus the recorded objectui one, which it does not enter.
expect(sdkSites.length + OBJECTUI_CENSUS.sdkCallSites, literalNote()).toBe(29);
});
});

Expand Down Expand Up @@ -859,7 +866,11 @@ describe('#13079 §5 — what was NOT measured', () => {
expect(OBJECTUI_CENSUS.wouldBreak).toBe(0);
expect(OBJECTUI_CENSUS.revision).toMatch(/^[0-9a-f]{40}$/);
expect(OBJECTUI_CENSUS.tighteningOwner).toBe('objectui#7028');
expect(OBJECTUI_CENSUS_COMMAND).toContain('origin/main');
expect(OBJECTUI_CENSUS.site.startsWith('ui/')).toBe(true);
expect(OBJECTUI_CENSUS_COMMAND).toContain("'ui/*.ts'");
// [#25803] And the walk really does not enter it, so the record is the
// only reading of that tree here.
expect(CENSUS.sites.some((s) => s.file.startsWith('ui/'))).toBe(false);
});

it('⛔ cloud is NOT MEASURED, ruled so, and must not be read as clean', () => {
Expand Down
50 changes: 50 additions & 0 deletions patches/@radix-ui__react-focus-scope.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
diff --git a/dist/index.js b/dist/index.js
index e8906db3b1e87bfc568b75d72b7ed3d8d1d3c09a..7a05e0e4cffba466301ba1fb67067c0861af0a4d 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -110,6 +110,10 @@ var FocusScope = /* @__PURE__ */ React.forwardRef(
}, [trapped, container, focusScope.paused]);
React.useEffect(() => {
if (container) {
+ if (focusScope.__pendingStackRemove !== void 0) {
+ clearTimeout(focusScope.__pendingStackRemove);
+ focusScope.__pendingStackRemove = void 0;
+ }
focusScopesStack.add(focusScope);
const previouslyFocusedElement = document.activeElement;
const hasFocusedCandidate = container.contains(previouslyFocusedElement);
@@ -126,7 +130,8 @@ var FocusScope = /* @__PURE__ */ React.forwardRef(
}
return () => {
container.removeEventListener(AUTOFOCUS_ON_MOUNT, onMountAutoFocus);
- setTimeout(() => {
+ focusScope.__pendingStackRemove = setTimeout(() => {
+ focusScope.__pendingStackRemove = void 0;
const unmountEvent = new CustomEvent(AUTOFOCUS_ON_UNMOUNT, EVENT_OPTIONS);
container.addEventListener(AUTOFOCUS_ON_UNMOUNT, onUnmountAutoFocus);
container.dispatchEvent(unmountEvent);
diff --git a/dist/index.mjs b/dist/index.mjs
index 030ff1a4d2383c9a0a1ba850aa4591890f028784..3dd39a90db9886bc495014a6e4136773e3548448 100644
--- a/dist/index.mjs
+++ b/dist/index.mjs
@@ -75,6 +75,10 @@ var FocusScope = /* @__PURE__ */ React.forwardRef(
}, [trapped, container, focusScope.paused]);
React.useEffect(() => {
if (container) {
+ if (focusScope.__pendingStackRemove !== void 0) {
+ clearTimeout(focusScope.__pendingStackRemove);
+ focusScope.__pendingStackRemove = void 0;
+ }
focusScopesStack.add(focusScope);
const previouslyFocusedElement = document.activeElement;
const hasFocusedCandidate = container.contains(previouslyFocusedElement);
@@ -91,7 +95,8 @@ var FocusScope = /* @__PURE__ */ React.forwardRef(
}
return () => {
container.removeEventListener(AUTOFOCUS_ON_MOUNT, onMountAutoFocus);
- setTimeout(() => {
+ focusScope.__pendingStackRemove = setTimeout(() => {
+ focusScope.__pendingStackRemove = void 0;
const unmountEvent = new CustomEvent(AUTOFOCUS_ON_UNMOUNT, EVENT_OPTIONS);
container.addEventListener(AUTOFOCUS_ON_UNMOUNT, onUnmountAutoFocus);
container.dispatchEvent(unmountEvent);
Loading