Repository navigation
feat(setup): Setup's metadata pages open Studio's All metadata area; the catalog's Active switch moves to each item's page - #28818
Conversation
…the catalog's Active switch moves to each item's page
ADR-0146 D1: Setup carries no metadata editor and no metadata catalog.
Every /apps/<app>/metadata route and its legacy aliases (the shell's
component/metadata/*, the console's system/objects, system/metadata and
system/{roles,positions,permissions}) open the same page in Studio's All
metadata area in one hop, with ?package, ?scope and ?review kept and the
leg named by the query. The datasource stays in Setup. A bookmark of the
retired Packaged automation page opens the package's Automations pillar.
The four catalog nav entries, sys-objects and the Manage Objects card
leave Setup and Home; their labels are tombstoned. The catalog's Active
switch (M-1 ruling A) is offered on the permission set, position and
declared sharing rule item pages in the area. Studio links into no Setup
metadata page: the landing's overlay link is gone, the read-only link and
the chat's review hop open the area. The live specs aim at Studio.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QsR2jRKMRpKnN9FkAvSWGr
📓 Docs Drift CheckThis PR changes 3 package(s): 13 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 8 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 21 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin ecac2e3f10d8eb89b58adc930da9e3df9239187b && git checkout ecac2e3f10d8eb89b58adc930da9e3df9239187b
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 00918c886c0d9cac1a2271ae283dd95130e7d4d4 31ecbcd31b0f6af7ee89836c761940865944178f && git checkout -B drift-repro 00918c886c0d9cac1a2271ae283dd95130e7d4d4 && git merge --no-ff 31ecbcd31b0f6af7ee89836c761940865944178f
node scripts/docs-audit/affected-docs.mjs --json 00918c886c0d9cac1a2271ae283dd95130e7d4d4
|
…ntry The permission-set catalog entry it named leaves Setup's navigation in this change, so the symbol anchor no longer resolved. It now anchors the permission-set assignment entry, which stays in Setup. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jRKMRpKnN9FkAvSWGr
Studio's "All metadata" area offers a create page on a writable package only: a read-only package's `:type/new` lands on the type's list. The showcase is provided by code, so F2 and F3 found the object list and no designer. They now author a package first, as F4 does, and delete it afterwards. The assertions are unchanged. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jRKMRpKnN9FkAvSWGr
…s row The bookmark redirect route `component/automation/packaged` is a new `<Route>` in the app branch, and every such route declares what it reads. A redirect reads nothing: the Studio page it lands on loads its own. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jRKMRpKnN9FkAvSWGr
|
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu 维护者速读
席位核对 · ACCEPT · 2026-11-01T22:47ZHead-sha:
Generated by Claude Code |
|
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U Contract-review-claim: Taken under Generated by Claude Code |
|
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U Contract reviewServed-tier: Inputs read: card #28578 body and all seven comments (claim 6561334639, amendments 6561766478 / 6561871570 / 6564333789, landed 6563448827, dev report 6564269611), M-1 ruling 6554738464 on #28559, the PR body, its 50-file list, the net diff, the 69 check-runs on this head (57 success, 12 skipped, 0 failed, 0 pending; every skip is an opt-in or schedule-gated job, none is a gate this diff owes). ① Derived judgments
② Semver levelSix packages at ③ Boundary flags
④ Design judgment
Before: "contributed the way
The first consumer (the redirect and the switch move), read to judge the ADR. The design holds:
Should-fix (not in
Implemented-by: VERDICT: FAIL Generated by Claude Code |
… at Permission Set Assignment - ADR-0126 §7.4 keeps the words the record was written with. The retired nav id is spelled in plain quotes, the anchor drops to the file level, and a dated note says the entry is retired under N-28 and §7.4's surface moved per ADR-0146 D4. - The Studio access refusal names Setup → Permission Set Assignment in all ten packs and in the call site's default. The Permission Sets entry it named is retired, and its URL redirects into the Studio the reader cannot open. - The security plugin's comment no longer says capabilities are switched on and off: only a position and a permission set carry the switch. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsR2jRKMRpKnN9FkAvSWGr
|
director · zhuangjianguo · session_01QsR2jV5sBSzCYNEDgpYLJw Contract-review-claim: Taken by the director seat ( Generated by Claude Code |
|
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu 维护者速读
席位核对 · ACCEPT · 2026-11-02T00:41ZHead-sha: Supersedes the seat record 6565042973 (head
Generated by Claude Code |
|
director#1 · zhuangjianguo · session_01QsR2jV5sBSzCYNEDgpYLJw Contract reviewServed-tier: Fresh record on this head, after FAIL 6565939840 (triage, head Inputs read: FAIL 6565939840 and its ④ (one must-fix, three should-fixes); claim 6566121323; the interdiff (1 commit The interdiff
① Derived judgments
② Semver level
③ Boundary flagsThe FAIL record's four findings:
No new dev flag in the interdiff. The PR is still a draft. Author is ④ Design judgment
The first consumer, re-checked only where the interdiff touches it. The refusal screen a No must-fix. No should-fix left for the lane. Checks on the head64 check-runs on LandingTier H: the governed path Implemented-by: VERDICT: PASS Generated by Claude Code |
Keeps the read-only mark linking nowhere (ADR-0146 D11, ruling 3) over #28818's link into Studio's All metadata item page, whose save names no package and is refused onto a packaged item. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FEkQ5ni5yjiTswP6crgAkX
Requested by Steedos · project thread
Fixes #28578
PR 2 of 2. PR 1, #28785, retired Packaged automation's flows half and landed as
0aaad18f. This PR carries Wanted 1, 2, 4 and 5 and the card's tests. The split is recorded in claim amendment 6561871570.维护者速读
?package、?scope、?review原样保留。数据源例外,仍留在设置。设置导航移除岗位、能力、权限集、声明式共享规则四项。主页移除"对象管理"侧边栏入口和"管理对象"卡片。目录的启用开关移到每个条目自己的页面上。Studio 不再链接到设置的元数据页面。旧的打包自动化书签现在跳到对应软件包的自动化栏。setup.access、没有studio.access的管理员,今后要在 Studio 里切换这些条目,需要给他们补授studio.access。changeset 里写了这一点。旧书签和外部链接会被重定向,不会失效。回滚就是 revert 本 PR。ui/packages/app-shell/src/views/studio-design/setupMetadataRedirect.ts、ui/packages/app-shell/src/console/AppContent.tsx(SetupMetadataRoute、LegacyMetadataRedirect、PackagedAutomationRedirect)、ui/packages/app-shell/src/views/metadata-admin/CatalogActiveSwitch.tsx。/apps/setup/metadata/position?scope=environment,应跳到/studio/~all/metadata/position?scope=environment。打开一个岗位,页面上有"启用"开关。打开/apps/setup/metadata/datasource,仍停留在设置。studio.access的提示是否足够。What changes
@object-ui/app-shell). All of the/apps/<app>/metadataroutes, on bothAppContentbranches, renderSetupMetadataRoute: the index,_diagnostics,:type,:type/new,:type/:nameand:type/:name/history. It navigates tosetupMetadataStudioPath(rest, search, hash), which keeps the path belowmetadata, keeps the query, and puts the URL on the leg its query names throughareaLocationRedirect. That leg is?package=Xfor X's leg, and?scope=environmentor?package=allfor~all. The area adds no second hop.LegacyMetadataRedirect(component/metadata/{directory,resource/*}) now goes to Studio directly. Themetadata*rows leaveAPP_ROUTE_CHUNKS.setupMetadataStudioPathreturnsnullfordatasource…, so those routes render the metadata-admin pages they always did. The area's owndatasource/*route sends them back to Setup, so redirecting them would loop.@object-ui/console).ObjectRedirect,MetadataRedirectandSystemCatalogRedirectcall the same helper, exported from@object-ui/app-shell, sosystem/objects,system/metadataandsystem/{roles,positions,permissions}land in Studio in one hop.component/automation/packagedis a static route ahead ofcomponent/:ns/:name. It opens/studio/<package>/automationswith the query kept when?package=names a package. When no package is named, it opens/studio/~all/metadata/flow, the area's cross-package flow list, because the pillar is per package.DraftReviewNavigator(the chat's "Review N changes") opens…/metadata/<type>/<name>?review=1in Studio.plugin-securitydrops itsgroup_access_controlcontribution (nav_positions,nav_capabilities,nav_permission_sets), andplugin-sharingdropsnav_declared_sharing_rules. Their labels leave the four locales and the source-hash files, and the four ids join the dead-key tombstone.UnifiedSidebardropssys-objects, andQuickActionsdrops the Manage Objects card.CatalogActiveSwitch.tsx.CatalogItemActiveSwitchis that switch for one item: it reads the ledger, runs the holder-count confirm for permission sets and positions, writes, and toasts. The area's item pages mount it: position and sharing rule throughResourceEditPage's area sections, and permission set throughPermissionMatrixEditor. The area's list keeps its column.BuilderLandingdropsoverlayPathand the "Open in Setup" overlay link, along with its two Studio-namespace strings.StudioReadOnlyLinklinks the item's page in the area.ui/e2e/live).studio-object-designer,studio-editorand the nightlydeclared-sharing-rules-reach-13091now open Studio URLs.Why
ADR-0146 D1 says Setup carries no metadata editor and no metadata catalog, and Studio's "All metadata" area (#28561) serves those pages. Old Setup links should land there rather than break. The datasource is runtime configuration, so it stays in Setup.
Tests
AppContent.setupMetadataStudio-28578.test.tsxholds the redirect table over every route and alias. It runs on the with-app branch (assetupand ascrm) and the zero-app branch. Every row asserts the whole chain, which shows one hop. The table covers?package,?scope,?reviewand the hash. It checks that the datasource routes and the?type=datasourcealias stay on their pages, and thatmetadata/package/*keeps its target. It pins the Packaged automation bookmark, with a control thatautomation:packaged-actionsstill resolves.setupMetadataRedirect.test.tscovers the helper. It includes a check that each target is already on its leg, so the area adds no second hop, and it coverspackagedAutomationStudioPath.noSetupMetadataLink-28578.test.tsis the source grep pin. It reads every non-test file underviews/studio-design/with comments masked and refuses any/apps/<app>/metadataspelling. The datasource is exempt. The matcher has a control. Run against the272fec05copies ofStudioDesignSurface.tsxandBuilderLanding.tsx, it catches the base's links.CatalogActiveSwitch.itemPage-28578.test.tsxchecks the switch for each type. Off asks with the holder count, Cancel writes nothing, and on writes at once. A sharing rule writes with no holder read. A viewer who cannot author gets no click, and a refused read is stated in words. A source pin checks where the item pages mount the switch.people-org-assignment-nav-contribution.test.ts: the catalog entries are gone;systemNavObjectsHop.test.tsx: there is no Object Manager entry;systemNavSettingsTarget.test.tsx: eight entries;QuickActions.settingsTarget.test.tsx: there is no Manage Objects card.pseudoRouteSegments,noAppComponentRoutes,bootRedirectCoverage,emptyNavigationLanding-12079,setupItemRoutesVerdict-12706, and the console'slegacyRedirectsandsystemHubRoutes. Studio tests are updated for the removed link:readonlyRoutes-11808,setupExit-12513,environmentOverlayCopy-12171,StudioReadOnlyLink.overlay-27356andmetadataAreaHost.gates-28561.Verification
Head
50d583efon0aaad18f.--maxWorkers=2) on the rebased head, 3594 tests, all green. The set is every app-shell and console test that names the touched modules or a Setup metadata URL (AppContent,setupMetadataRedirect,UnifiedSidebar,QuickActions,BuilderLanding,StudioReadOnlyLink,CatalogActiveSwitch,ResourceListPage,ResourceEditPage,PermissionMatrixEditor,catalog-activation,apps/setup/metadata,automation/packaged, …). The full app-shell suite is left to CI's Test UI shards.@objectstack/platform-objects: 107 files and 1497 tests.@objectstack/plugin-security: 238 files and 5126 tests.@objectstack/plugin-sharing: 59 files and 1305 tests. All green.@object-ui/app-shelland@object-ui/consoleare green afterturbo run build --filter='@object-ui/console^...'on the new main.node scripts/pm/dispatch-gates.mjs --commands: 67 commands, 66 exit 0, includingcheck-sdui-manifest,check:i18n(bundles in sync),check:platform-checklist,check:dual-build-cjs-loadsandpnpm --dir ui exec vitest run scripts/.check-plugin-teardown-shape --self-testexits 3 because this clone is shallow, so it is left to CI.eslinton the changed ui files: 0 errors.check-changeset-no-major,check-adr-0087-registration,check-closing-keyword-parityandcheck-partof-closing-keywordare green.Clause-②: no
Metadata-protocol: none
Human Minimum
packages/specholds no runtime logic. (packages/specuntouched.)pnpm lintpasses.main, one pull request. (PR 2 of 2 for Setup: retire Setup → Metadata behind redirects into Studio (datasource kept) and retire Packaged automation's flows half; Studio stops linking into Setup #28578; the split is the seat's call, recorded on the card.)packages/spectouched: n/a.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.🤖 Generated with Claude Code
https://claude.ai/code/session_01QsR2jRKMRpKnN9FkAvSWGr