Repository navigation
feat(console): the install result says when a package was installed without a protocol compatibility check - #30460
Conversation
…ithout a protocol compatibility check The install door answers data.protocolCheckSkipped when its protocol handshake admitted the package unchecked (no engines.protocol, or a range it cannot read). The package page's Install result, the catalog's org install message and Setup > Packages > Import now draw it as a caution line, in the reader's locale, from the notice's facts. Claude-Session: https://claude.ai/code/session_01L6bhgWZ1wrAZ2ocZovnByy Co-authored-by: Claude <noreply@anthropic.com>
…ort (removed in the next commit) Claude-Session: https://claude.ai/code/session_01L6bhgWZ1wrAZ2ocZovnByy Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L6bhgWZ1wrAZ2ocZovnByy Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L6bhgWZ1wrAZ2ocZovnByy Co-authored-by: Claude <noreply@anthropic.com>
|
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif Contract reviewServed-tier: Reviewed 2026-11-05T13:03Z. Face: the ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS |
|
domain:ui#5 · os-sales · session_01L6bhgVwQZbHRRM9CaXeKif 维护者速读
席位核对 — ACCEPT · domain:ui#5 · head
|
domain:ui#5 · os-sales · session_01L6bhgWZ1wrAZ2ocZovnByy
Requested by Sales · project thread
Fixes #30326
Clause-②: yes (widening)
Metadata-protocol: none
维护者速读
data.protocolCheckSkipped,但控制台只读成功字段,管理员看不到服务器日志,这条提醒被丢掉了。ui/packages/app-shell/src/console/marketplace/protocolCheckSkipped.ts(读字段、选词条)、MarketplacePackagePage.tsx的doInstallLocal(四个成功分支都带上提醒)、ui/packages/i18n/src/locales/zh.ts的protocolCheckSkipped。pnpm --dir ui exec vitest run packages/app-shell/src/console/marketplace/__tests__/protocolCheckSkipped-30326.test.ts packages/app-shell/src/views/metadata-admin/PackagesPage.importProtocolCheckSkipped-30326.test.tsx,预期 8 个用例全绿(需先建@object-ui/app-shell的依赖闭包)。What changes
Card #30326, the ui half. The server half landed in PR #30409 (
60fe44fdc):POST /api/v1/marketplace/install-localanswersdata.protocolCheckSkippedon a success answer when the ADR-0087 D1 handshake admitted the package without checking its range, and omits it otherwise.console/marketplace/protocolCheckSkipped.ts, modelled ondependencyMissing.ts:protocolCheckSkippedText(answer, t)draws one key perreason(no-range,unparsed-range) from the notice's facts (packageId,protocolVersion, andrequiredRangeforunparsed-range). Areasonthis Console does not know, or anunparsed-rangewithout its range, draws the server'smessageas given. An answer without the field draws nothing.useProtocolCheckSkippedText()binds it to the current locale.ProtocolCheckSkippedNote.tsx: an amber caution line with a warning icon, drawn inside the existing result note under its own sentence, since the install did succeed.MarketplacePackagePage.tsx,localResult): every success answer carries it, managed loaded now, managed loaded at restart, unmanaged copy, and the "asked for a copy, installed managed" note.MarketplacePage.tsx,orgMsg), theinstallLocalpath.metadata-admin/PackagesPage.tsx,importMsg).LocalManagedInstallResultandLocalUnmanagedInstallResultgain the optionalprotocolCheckSkipped(marketplaceApi.ts).marketplace.install.protocolCheckSkipped.noRangeand.unparsedRangein all 10 locale packs. Import reuses these through the shared hook, as it already does forDEPENDENCY_MISSING, so noengine.packages.*row is added..changeset/30326-install-result-protocol-check-skipped.md,@object-ui/app-shelland@object-ui/i18npatch.Branch: the harness-assigned
claude/project-thread-sukiom, notclaude/issue-30326-*; the card is #30326.Tests
Four new files, 14 cases:
protocolCheckSkipped-30326.test.ts(5): no-range facts; unparsed-range facts incl. the range; unknown reason draws the server message; unparsed-range without a range draws the server message; CONTROL: no field, null, undefined, nothing readable draw nothing.MarketplacePackagePage.protocolCheckSkipped-30326.test.tsx(4): managed loaded, managed loaded at restart, unmanaged with an unreadable range; CONTROL: a checked install draws no line. The realmarketplaceApiclient, one stubbedfetch.MarketplacePage.orgInstallProtocolCheckSkipped-30326.test.tsx(2): org install draws the line; CONTROL: none when checked.PackagesPage.importProtocolCheckSkipped-30326.test.tsx(3): the REAL locale packs, zh no-range sentence and en unparsed-range sentence; CONTROL: none when checked.Acceptance notes
POST /api/v1/packages, answers no notice yet; that is Package install: POST /api/v1/packages installs a package with no protocol range unchecked and says so only in the server log (the install-local door now answers it) #30412 (server).os package installdoes not print the notice either (noted by the server half's report).cloudUrlempty), so the package page and the org catalog cannot install from a catalog here. Those two are covered by the tests above, on the wire shape the live server answered.Verification
Gates and tests ran on
a58846c5; the head adds an evidence commit and its removal, the tree is byte-identical (git diff a58846c5 HEADis empty). Baseb6caa141.Live rig and screenshots (zh-CN, 1440 wide)
examples/app-showcaseobjectstack dev --seed-admin --freshon a private port, the console viaviteinui/apps/consolewithDEV_PROXY_TARGET, Chromium, browser locale zh-CN. The live door, read back before any UI work:POST /api/v1/marketplace/install-localwith{"manifest":{"id":"com.acme.probe","version":"1.0.0","type":"app"}}answeredprotocolCheckSkipped: {reason: "no-range", packageId: "com.acme.probe", protocolVersion: "18.0.0", message: "Package 'com.acme.probe' does not state which platform protocol it supports, ..."}.engines: {protocol: "whatever-1"}answeredreason: "unparsed-range",requiredRange: "whatever-1",rangeSource: "engines.protocol".Before (the reader held to draw nothing with
scripts/ablation-replace.mjs --hold, restored after, blob equals HEAD): only已导入 "com.acme.legacy-before"。刷新应用切换器后即可使用。After: the same sentence, then
com.acme.legacy-crm 未声明它支持的平台协议版本,因此已在平台协议 18.0.0 下安装,未做兼容性检查,可能无法在当前平台版本上正常运行。声明了所支持协议(engines.protocol)的软件包版本会在安装时接受检查。Tests, ablation, typecheck, lint
pnpm --dir ui exec vitest run packages/app-shell/src/console/marketplace/ packages/app-shell/src/views/metadata-admin/PackagesPage packages/i18n/: Test Files 163 passed (163), Tests 2016 passed, 13 skipped, lock VERDICT command-exit 0.scripts/ablation-replace.mjs, anchor x1 to x0, blob 1700af14 to 8e4eb802): the reader's first guard replaced by an unconditionalreturn null: 10 failed / 4 passed (the 4 CONTROL cases stay green). Restored, blob equals HEAD,git diff HEADempty.pnpm --filter @object-ui/app-shell run type-checkandpnpm --filter @object-ui/i18n run type-check(tsc --noEmitandtsc -p tsconfig.test.json): lock VERDICT command-exit 0.pnpm --dir ui run check:spec-symbols: exit 0 (0 untriaged collisions).check:i18n-keys,check:i18n-drift,check:i18n-dead-keys,check:control-bytes,check:new-line-citations,check:icon-record-names,check:phantom-deps: each exit 0.check:eager-locale-catalogues: exit 2, PREREQUISITE NOT MET (reads a built console bundle), NOT MEASURED locally; CI's run is the reading.Derived gates (35/35 exit 0)
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 35 families ata58846c5; every one ran and exited 0.--ranreconciliation: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN (a derived zero, every line carries an exit code).pnpm --dir ui exec vitest run scripts/: Test Files 170 passed, 2 skipped; Tests 4985 passed, 2 skipped. CI runs the rest.Generated by Claude Code
🤖 Generated with Claude Code
https://claude.ai/code/session_01L6bhgWZ1wrAZ2ocZovnByy