Repository navigation
fix(cli,i18n,console): the hosted product reads "ObjectOS Cloud" everywhere; the Community Console carries a "Powered by ObjectStack" mark - #26215
Conversation
…ywhere; the Community Console carries a "Powered by ObjectStack" mark ObjectOS is one product in three editions (Community, Cloud, Enterprise); ObjectStack is the protocol, SDK, CLI and framework. The CLI's cloud commands, the CLI README, the deployment CLI reference and the Console's cloud-connection / cloud-install strings in all ten locales now say "ObjectOS Cloud". Internal identifiers are unchanged. The sign-in layout shows a small "Powered by ObjectStack" link to objectstack.ai while the deployment carries the default product name (`isDefaultProductName()` in app-shell); a runtime that pushed its own `branding.productName` shows its own name and no second brand line. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FMuBZmssbfQkVrKRtxNvng
…le change `check:sdui-manifest` hashes `ui/packages/i18n` sources; the "ObjectOS Cloud" strings and the new `auth.shell.poweredBy` key moved that digest. Regenerated with `node scripts/gen-sdui-manifest-node.mjs`: the manifest artefact itself is byte-identical (106 components, sha256 unchanged), only the i18n record moves. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FMuBZmssbfQkVrKRtxNvng
Takes main's `scripts/sdui-manifest.sources/i18n.json` record for now; the record is regenerated on the merged tree in the next commit. Also flips the one "ObjectStack Cloud" phrase the slimmed README (PR 26148) still carried. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FMuBZmssbfQkVrKRtxNvng
…tree Regenerated with `node scripts/gen-sdui-manifest-node.mjs` after merging origin/main (which had re-recorded the same package for the zh sign-out label): the manifest artefact is byte-identical, only the i18n record moves. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FMuBZmssbfQkVrKRtxNvng
📓 Docs Drift CheckThis PR changes 1 package(s): 11 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 4 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 31 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 df6ced6160bc7a69011d261e3ec411957c1b73ff && git checkout df6ced6160bc7a69011d261e3ec411957c1b73ff
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 69aa630b9fd6ef20f76cbac9ed4d9b9efa69c804 f442ea21ce5d409e49c8d9814a392bb9bfa907a7 && git checkout -B drift-repro 69aa630b9fd6ef20f76cbac9ed4d9b9efa69c804 && git merge --no-ff f442ea21ce5d409e49c8d9814a392bb9bfa907a7
node scripts/docs-audit/affected-docs.mjs --json 69aa630b9fd6ef20f76cbac9ed4d9b9efa69c804
|
CI note ·
|
席位核对 · ACCEPT · 2026-10-26T16:17Z ·
|
Takes main's `scripts/sdui-manifest.sources/i18n.json` record for now; the record is regenerated on the merged tree in the next commit. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FMuBZmssbfQkVrKRtxNvng
…tree Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FMuBZmssbfQkVrKRtxNvng
Resolves the one conflict in the generated record scripts/sdui-manifest.sources/i18n.json by taking main's side wholesale; the record is re-derived by the sdui generator in the follow-up commit. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FMuBZmssbfQkVrKRtxNvng
…tree Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FMuBZmssbfQkVrKRtxNvng
Takes main's `scripts/sdui-manifest.sources/i18n.json` record for now; the record is regenerated on the merged tree in the next commit. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FMuBZmssbfQkVrKRtxNvng
…tree Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FMuBZmssbfQkVrKRtxNvng
Fixes #26136
What changed
ObjectOS is one product in three editions — Community (this repository's runtime and Console, open source), Cloud (cloud.objectos.ai) and Enterprise — and ObjectStack is the name of the protocol, SDK, CLI and framework (maintainer ruling 2026-10-26 13:18Z, model 2). The hosted product is "ObjectOS Cloud" wherever a user reads it; this PR flips the places that still said "ObjectStack Cloud" and gives the Community Console its "Powered by ObjectStack" mark.
packages/cli(string literals and help text only):os cloud login/logout/whoami,os package publishandos plugin publishdescriptions, the--url/--server/--token/--visibilityflag descriptions, the printed headers ("ObjectOS Cloud Login" / "Logout" / "Identity"), the "Not logged in to ObjectOS Cloud" prescriptions inwhoami,package publishandcloud-config, the shared "Authentication required" message inapi-client.ts, and theos servewelcome page's link text to the cloud console. Internal identifiers are untouched:~/.objectstack/cloud.json,OS_CLOUD_API_KEY,OS_CLOUD_URL,OS_TOKEN, theos cloud …command ids.packages/cli/README.md(3 rows) andcontent/docs/deployment/cli.mdx(6 lines).README.md: the one phrase the slimmed README from PR 26148 still carried (that PR merged at 14:13Z, so this branch mergedorigin/mainand fixed it, per the dispatch order's serial constraint).ui/packages/i18n: the four cloud-connection / cloud-install strings in all ten locales (cloudConnection.bound.title, the twodialogDescPickers andsignInFirst) name "ObjectOS Cloud", the product name kept untranslated inside each locale's own sentence;zh's title read "已连接到 ObjectStack 云" and now reads "已连接到 ObjectOS Cloud". New keyauth.shell.poweredByin all ten locales (thejavalue keeps the English wordmark line, listed besidepublicForm.poweredByin the untranslated-identity allowlist with the same reason).ui/packages/app-shell: newisDefaultProductName()on the runtime-config module and the barrel: true whilebranding.productNameequals the default'ObjectOS', false once a runtime has pushed its own.ui/apps/console:AuthLayout(the shell of every unauthenticated page: login, register, forgot/reset password, verify email, setup, consent, device, invitation) renders a small "Powered by ObjectStack" link to https://objectstack.ai under the form whenisDefaultProductName()is true. The wordmark,logo.svg,manifest.json, the defaultproductName: 'ObjectOS'andadmin@objectos.aiare unchanged.scripts/sdui-manifest.sources/i18n.json: re-recorded bynode scripts/gen-sdui-manifest-node.mjs(the gate hashesui/packages/i18nsources; the manifest artefact itself is byte-identical)..changeset/26136-objectos-cloud-naming.md:patchon@objectstack/cli,@object-ui/i18n,@object-ui/app-shell,@object-ui/console.Why the sign-in page, and why "productName equals the default"
The sign-in layout already reads the server-driven product name, so it is the one surface where "is this deployment branded?" is already answered; every auth page shares it, and it is the first screen a Community user sees. The About / footer surface was not given a second copy: one place, one rule.
How
brandingreaches the layout:initRuntimeConfig()fetches/api/v1/runtime/configat boot and mergesbody.brandinginto the app-shell singleton;getProductName()reads it. The payload carries no explicit edition key, so the only reliable signal of "server-pushed branding" is thatproductNamediffers from the default. That is whatisDefaultProductName()reads, and the PR says so here as the order asked. Measured at source:objectstack-ai/cloudpushesCLOUD_PRODUCT_NAME = 'ObjectOS Cloud'(packages/app-cloud/src/product-name.ts), and a cloud-connected runtime pushes its workspace name (packages/cloud-connection/src/runtime-config-plugin.ts,productName ← branding.workspace_name), so both read as branded and get no second line. A logo or colour pushed without a name change does not count as a rebrand here (said in the predicate's doc comment).Clause-②: no
Metadata-protocol: none
How verified (worktree at the final head, see the report comment for the sha)
node packages/cli/bin/run-dev cloud login --helpand… package publish --helpprint "ObjectOS Cloud" (flag descriptions and command description), no "ObjectStack Cloud".pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2under the verify lock on the merged tree: 333 of 334 files passed, 4876 of 4877 tests; the one red,src/utils/boot-preparation-parity.test.ts, was a 5 s timeout while a gate sweep shared the box, and the file passes alone under the lock (37 of 37; it readsserve.tssource, which this PR touches in one string). The twopublished-subpath-*.pinsuites needpackages/cli/dist, built first. the newtest/cloud-product-name.test.tspins the five commands' descriptions and flag descriptions on "ObjectOS Cloud" and asserts no "ObjectStack Cloud" in any of their help strings. Theintegrationtier and the nightlycloud-login-json-ndjson.e2etier (whosenot.toContain('ObjectOS Cloud Login')pin flipped with the header) are CI's.ui:pnpm exec vitest run apps/console/src/pages/auth/__tests__/AuthLayout.powered-by.test.tsx apps/console/src/pages/auth/__tests__/LoginPage.layout-12600.test.tsx packages/app-shell/src/runtime-config.test.ts packages/app-shell/src/__tests__/product-neutral-renderer.ratchet.test.ts packages/i18n/→ 91 files / 1448 tests passed. The newAuthLayout.powered-bytest boots branding through a stubbedGET /api/v1/runtime/configinto the real singleton: default → mark with hrefhttps://objectstack.ai;productName: 'ObjectOS'plus a colour → mark;'ObjectOS Cloud'→ no mark;'Acme Studio'plus a logo → no mark.pnpm --dir ui --filter @object-ui/app-shell run type-check,… @object-ui/console run type-check,… @object-ui/i18n run type-check,pnpm --filter @objectstack/cli typecheck: all exit 0.pnpm --dir ui run check:i18n-keys(everydefaultValueequals itsenvalue) andcheck:i18n-drift(4 changedenvalues, 36 pack values followed, 1 key added) exit 0.node scripts/pm/dispatch-gates.mjs --commands) run on the final tree; the full list, each exit code and the--ranreconciliation are in the report comment.check:sdui-manifest,check:i18n,check:i18n-coverage,check:i18n-walk-parity,check:dual-build-cjs-loadsand speccheck:skill-examplespass after a full build.node scripts/check-plugin-teardown-shape.mjs --self-testis NOT MEASURED here: it pins a fixture to a commit this shallow checkout cannot reach; CI runs it on a full checkout.Acceptance notes
git grep -n "ObjectStack Cloud" -- ':!**/CHANGELOG.md'went from 123 lines (at the branch base, a335f1d) to 59 on this branch's final head. Inside the card's surface the only residue is developer-facing code comments inpackages/cli/srcand its test files (file headers such as "authenticate against the ObjectStack Cloud", "ObjectStack Cloud's control plane" in the migration helpers' comments) — left as they are because the dispatch order limitedpackages/cli/src/**to string literals and help text; a user never reads them, and the new unit test names the stale phrase on purpose. Flipping those comments is a mechanical follow-up if the seat wants the grep at zero insidepackages/cli.content/docs/deployment/cloud-connection.mdx(title and description),content/docs/deployment/index.mdx,content/docs/deployment/publish-and-preview.mdx,content/docs/protocol/objectql/schema.mdx,content/docs/protocol/kernel/metadata-service.mdx,content/docs/ui/setup-app.mdx,content/docs/kernel/services-checklist.mdx,ROADMAP.md, four package READMEs (adapters/hono,drivers/driver-memory,services/service-package,services/service-cluster-redis), and one runtime string served in HTTP 501 bodies and pinned by tests and the platform checklist:packages/spec/src/system/core-services.zod.ts"Provided by @objectstack/service-ai in ObjectStack Cloud/Enterprise". Listed in the report for the seat; not edited here.content/docs/releases/**and CHANGELOGs are history and stay.ui/AGENTS.mdandui/docs/adr/0060-product-neutral-renderer.mdsay "ObjectStack Cloud" as a product example; both are governed surfaces and are not touched.ui/scripts/check-changeset-presence.mjsstill readsui/.changesetand reports this change as undeclared, while this repository's changeset for ui packages lives in the root.changeset/(every ui PR merged today does the same); no workflow in this repository runs that script. An observation, not a card: zero pull..claude/agents/os-dev.mdrequires and the pre-push hook enforces; the dispatch order's trailer text, which names a model, was not used.Generated by Claude Code