Repository navigation
feat(cloud-connection): "Installed Apps" opens Setup Packages filtered to Source = marketplace - #24200
Conversation
…d to Source = marketplace
MARKETPLACE_INSTALLED_UI_BUNDLE's nav_marketplace_installed entry becomes a
component entry on developer:packages with params { source: 'marketplace' },
the spelling objectui#12675 published (read at the pinned .objectui-sha
5e15928b4631). Label and icon are unchanged, and the bundle is still
registered by MarketplaceInstallLocalPlugin at kernel:ready, so no plugin
still means no entry.
The bundle no longer ships the marketplace_installed page: at the pin its
widget only redirects to the same filtered view, and Packages' marketplace
rows carry the two actions the page's list carried (Details, Uninstall).
The canonical-envelope gate drops the retired page from its population.
Pins (real ObjectKernel + ObjectQLPlugin, merged Setup app read through the
metadata protocol): plugin present serves the filtered Packages entry and no
marketplace_installed page; plugin absent serves no entry.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QyoWKK9RwUNxBxmevy9Neb
…age's translations and parity rows Surface breach, declared and isolated in this commit: the files are outside the claim's file surface and each is made false by the page retirement in the previous commit. - packages/platform-objects/src/apps/translations: the pages.marketplace_installed entry leaves en, zh-CN, ja-JP and es-ES, and its two recorded source hashes leave the three translated locales' source-hashes files. Without this the default-locale parity verdict reports pages.marketplace_installed as an orphan (a bundle entry no shipped page carries). - packages/cli/test/platform-page-i18n-parity.test.ts: the bundle no longer has a pages key to read, so the population is the two plugin pages plus the record pages; the floors move 5 to 4 with the population, and the synthetic red-shape sample keeps its shape and says it is a fixture. The Setup nav label nav_marketplace_installed is unchanged in every locale. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QyoWKK9RwUNxBxmevy9Neb
…ce installs Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QyoWKK9RwUNxBxmevy9Neb
📓 Docs Drift CheckThis PR changes 2 package(s): 15 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 6 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 7 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 d5787abe5ca3f1e6d582818d97636f7073bdf622 && git checkout d5787abe5ca3f1e6d582818d97636f7073bdf622
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 8a88901be1c317e2e078e6d29f21efcae5b9485e 22c7afb9a2ea30838c018a565bec6db7ed6178b2 && git checkout -B drift-repro 8a88901be1c317e2e078e6d29f21efcae5b9485e && git merge --no-ff 22c7afb9a2ea30838c018a565bec6db7ed6178b2
node scripts/docs-audit/affected-docs.mjs --json 8a88901be1c317e2e078e6d29f21efcae5b9485e
|
Contract reviewServed-tier: Read: card #23933 (body and all three comments, the dispatch's ① Derived judgmentsAccept sets — none move. The diff touches no Public-surface changes the diff implies, each judged:
② Semver levelThe changeset's level and The committed What must change (a patch round can carry it verbatim):
③ Boundary flags
Implemented-by: VERDICT: FAIL |
…king narrowing cloud-connection moves to minor, the title carries the breaking mark, Clause-② takes the (narrowing) arm, and the body carries one ADR-0087 disposition (runtime-export-retired, operand @objectstack/cloud-connection#MARKETPLACE_INSTALLED_UI_BUNDLE.pages) with its one arrow rewrite line. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QyoWKK9RwUNxBxmevy9Neb
Contract reviewServed-tier: This record supersedes record 6237704217 (FAIL on the previous head ① Derived judgmentsUnchanged from record 6237704217, because the paths that carry them did not move — restated so this record stands on its own:
② Semver levelThe changeset now matches what the diff publishes, and the
The migration AGENTS.md asks of a breaking changeset is carried: the ③ Boundary flags
Implemented-by: VERDICT: PASS |
席位核对 — ACCEPT · PR #24200 at
|
Fixes #23933
Clause-②: no (narrowing)
What this does
Ruling B on #23892 (record 6216295104, the maintainer's 「同意」), items 2 and 3. The install-local plugin's "Installed Apps" entry (
nav_marketplace_installedinMARKETPLACE_INSTALLED_UI_BUNDLE) now opens Setup › Packages filtered to Source = marketplace, and the bundle no longer ships the separatemarketplace_installedpage. The label ("Installed Apps") and icon (package-check) are unchanged.MarketplaceInstallLocalPluginstill registers the bundle atkernel:readyexactly as before, so without the plugin there is still no entry (cloud ADR-0009).Landing point:
packages/cloud-connection/src/marketplace-ui.ts, the producer the card names.marketplace-install-local-plugin.tsandpackages/cli/scripts/check-app-nav-i18n.mjsdid not need to change.Measured before writing (objectui at the pinned
.objectui-sha5e15928b4631)Blocker cleared.
git merge-base --is-ancestor 9d857c998c 5e15928b4631exits 0. objectui#12675's merge is an ancestor of the pin, and exit 0 needs no control leg.H1, the spelling. At the pin,
packages/app-shell/src/views/metadata-admin/packageSource.tsdeclaresPACKAGES_SOURCE_PARAM = 'source'andPACKAGE_SOURCES = ['code', 'marketplace', 'authored'].readSourceFilterrefuses an unknown, empty or repeated value by name. The Setup app's route segment issetup. objectui#12675 published two spellings that open the same page:/apps/APP/component/developer/packages?source=marketplace;{ type: 'component', componentRef: 'developer:packages', params: { source: 'marketplace' } }. The console'sresolveHrefsends a component item'sparamsas the query string, and objectui'sresolveHref.test.tspins that.Route taken: the
componentspelling, not the suggestedurlone. Four reasons:UrlNavItemSchemadescribes an "external or absolute URL", andvalidate-nav-target-refstreatsurlas "external by definition".ComponentNavItemSchemais the type for a first-party console component.nav_packages) is acomponententry on the samedeveloper:packages./apps/setupis never spelled out in the entry.MARKETPLACE_BROWSE_UI_BUNDLE'surlentry targets a console route (system/marketplace), not a registered component, so it is no precedent for this target.H2, the actions. H2 holds, with one correction to its list. The Installed Apps list (
InstalledListWidget.tsxat9d857c998c^) had exactly two row actions: Details, and Uninstall on local installs only. Update and the sample-data Re-seed / Purge menu were never on that list; they are on the package page that Details opens. At the pin, Packages rows whose Source is marketplace carry both actions (MarketplaceRowActions.tsx, shown only withfeatures.installLocaland to a workspace admin), and themarketplace:installed-listwidget only redirects to the filtered Packages URL. So the bundle stops carrying the page in this PR.H3, the export surface. I compared
@objectstack/cloud-connection'sdist/index.d.tsbefore (at2bcaefba9) and after:MarketplaceInstalledPagewas never re-exported fromindex.ts.MARKETPLACE_INSTALLED_UI_BUNDLEdeclaration, nothing else differs (comments stripped; string-literal unions compared order-insensitively, because TypeScript reorders their members).pages(the full page shape), and its nav item goes from{ id; type; pageName; label; icon }to{ id; type; label; componentRef; params: { source: string }; icon }. I declare it here for the seat's contract review before the queue.content/docs.
git grep -n -i "installed apps\|marketplace_installed\|installed-list\|marketplace/installed" -- content/docs ':!content/docs/releases/**'finds nothing. As a control, the same tree mentionsmarketplacein more than 10 files. The group table incontent/docs/ui/setup-app.mdxnames the Apps group's entries generically ("marketplace and Cloud Connection —cloud-connection"), which stays true. No docs page changes.Changes
packages/cloud-connection/src/marketplace-ui.ts:MarketplaceInstalledPageand the bundle'spagesare removed;versiongoes from 0.2.0 to 0.3.0, and its description is updated to match;packages/cloud-connection/src/marketplace-installed-ui-entry.pin.test.ts(new) holds the card's pins. It boots a realObjectKernelwithObjectQLPlugin, lets the plugin's ownkernel:readyregistration run, and reads the merged Setup app through the metadata protocol:group_appsservesnav_marketplace_installedas{ type: 'component', componentRef: 'developer:packages', params: { source: 'marketplace' }, label: 'Installed Apps', icon: 'package-check' }, with nopageName.marketplace_installed. Control: the same listing includes the Cloud Connection bundle'scloud_connection_settings.nav_cloud_connectionis read from the same group.pageskey and exactly that one item.packages/cloud-connection/src/canonical-expression-envelopes.test.ts: the retired page leaves this package's envelope-gate population. The population floor moves from 2 to 1 to match; the two-way check between the scan and the list still requires them to be equal. The downgrade-control case for the retired page is removed with the page. Invitest.config.ts, one comment that counted "two pages" is updated..changeset/23933-installed-apps-packages-filter.md: patch for@objectstack/cloud-connectionand@objectstack/platform-objects.Out-of-surface changes, declared and kept in their own commit
867b780a1These files are outside the claim's file surface. Retiring the page makes each of them wrong, and their tests fail without the change:
packages/platform-objects/src/apps/translations/(domain:enginefiles): thepages.marketplace_installedentry leavesen.ts,zh-CN.ts,ja-JP.tsandes-ES.ts, and its two recorded hashes leave the three*.source-hashes.tsfiles. Without this, thepages.*default-locale parity check reportspages.marketplace_installedas an orphan. The nav labelnav_marketplace_installedkeeps all four translations.packages/cli/test/platform-page-i18n-parity.test.ts: the bundle no longer has apageskey to read, which would otherwise be a type error and an orphan. The population is now the two remaining plugin pages plus the record pages, and the floors move from 5 to 4 to match. The synthetic red-shape sample keeps its shape and is now labelled as a fixture.Tests (head
4013e2b0d)pnpm --filter @objectstack/cloud-connection test: Test Files 51 passed (51), Tests 600 passed (600).pnpm --filter @objectstack/cloud-connection typecheck: exit 0.--listFilesshows both edited or new test files in the program.pnpm --filter @objectstack/platform-objects test: Test Files 73 passed (73), Tests 1136 passed (1136).typecheck: exit 0, andcheck:test-typecheckis OK.pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2on the 9 unit-tier files that read@objectstack/cloud-connectionor the Setup translations: 9 passed, 217 tests.pnpm --filter @objectstack/cli typecheck, afterpnpm turbo run build --filter=@objectstack/cli --concurrency=2(61/61 tasks): VERDICT command-exit 0. Theintegrationtier is left to CI.pnpm --filter @objectstack/dogfood exec vitest run --maxWorkers=2 test/platform-app-object-entry-views.test.ts, which composes this bundle: Tests 51 passed (51).@objectstack/objectqlaliased tosrc), so no leg needed a rebuild. Each leg ran throughscripts/ablation-replace.mjs, which confirms the anchor hit and that the restored file's blob equals HEAD. Both legs went red, as predicted:source: 'installed'. Result: 2 failed, 2 passed (the served entry and the bundle shape). Restored blobf1e918e05ae7equals HEAD.marketplace_installedpage again. Result: 2 failed, 2 passed (no page served, and the bundle has nopages). Restored blob equals HEAD.ablation-replacerefused it because the anchor was contained in the replacement (anchor count 1 → 1). It was redone with an anchor that does not overlap the replacement.Gates (head
4013e2b0d)node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths) derived 64 commands, and all 64 exit 0.check:dual-build-cjs-loadsfirst exited 3 (PREREQUISITE NOT MET: 10 packages had nodist/). Afterpnpm turbo run build --filter='!@objectstack/docs' --concurrency=2(76/76 tasks) it was re-run and exited 0.--ran: 64 derived, 64 run, 0 NOT-MEASURED, 0 UNRUN, exit 0.pnpm check:app-nav-i18n: exit 0 ("11 contributor(s), 4 locale(s), 2 app(s) — setup: 53 merged nav id(s), account: 12 merged nav id(s)").node scripts/check-platform-checklist.mjs --changed-from origin/main: exit 0 (1 anchor judged, 0 lost).pnpm exec eslint --no-inline-configover the 12 changed.tsfiles: exit 0, no output.check:page-declaration-shape: exit 0, 34 page entries (35 at the base).#23803 item 4 (the Setup count)
This PR adds and removes no nav id. Under ruling B the entry stays; only its target moves, and the pin asserts the bundle's items are exactly
nav_marketplace_installed. Measured:check:app-nav-i18n's composition merges 53 Setup nav ids at4013e2b0d, groups included.Who lands last is not decided yet. #23890 (item 1, the single audit entry) is in flight: claimed 2026-10-17T15:59Z by
domain:services#1. Whichever of the two lands second checks the count.Item 4's 39 was set while "Installed Apps retires" was still an option. Under ruling B the entry stays, so #23803's own arithmetic (43, minus 2 for item 3, minus 1 for item 1) gives 40.
platform-core.json's "45 Setup destinations" also stays with item 4.Acceptance notes
Stale QA text (no gate fails). One item in
docs/qa/platform-checklist/areas/platform-core.jsonstill describes the retired page:sourceline reads "MARKETPLACE_INSTALLED_UI_BUNDLE → nav_marketplace_installed + the marketplace_installed page owned by install-local";The anchor it cites (
marketplace-ui.ts#MARKETPLACE_BROWSE_UI_BUNDLE) still resolves, and the steps still pass against the filtered Packages list. Carrier: none (承接者:无); it needs adomain:devxedit.Not measured in a browser (from reading objectui). The sidebar picks its highlighted item by pathname only (objectui
NavigationRenderer'sitemMatchScore). On the filtered view, "Packages" and "Installed Apps" share a path, so the tie goes to tree order, and "Installed Apps" may not be the one highlighted. The same is true for either spelling of the entry.Saved links to the old page. A favourite, recent item or bookmark that stored the old page address
/apps/setup/page/marketplace_installednow opens a missing page. The changeset tells users where to go instead. objectui'smarketplace:installed-listwidget and its legacysystem/marketplace/installedroute keep redirecting until objectui#12733.Spec still declares the widget type.
packages/specstill declaresmarketplace:installed-list(in the component-type vocabulary and in itsComponentPropsMaprow), but after this PR nothing in this repo authors it. Retiring it is adomain:specquestion to pair with objectui#12733. It is not done here, because spec paths are held off for this card.Historical mentions left as they are. The headers of
scripts/check-page-declaration-shape.mjsandpackages/cli/scripts/check-app-nav-i18n.mjsnameMarketplaceInstalledPageandmarketplace_installedin past measurements. They are left unchanged.Generated by Claude Code