Repository navigation
Commit f00cbe3
fix(cli,i18n,console): the hosted product reads "ObjectOS Cloud" everywhere; the Community Console carries a "Powered by ObjectStack" mark (#26215)
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 publish` and `os plugin
publish` descriptions, the `--url` / `--server` / `--token` /
`--visibility` flag descriptions, the printed headers ("ObjectOS Cloud
Login" / "Logout" / "Identity"), the "Not logged in to ObjectOS Cloud"
prescriptions in `whoami`, `package publish` and `cloud-config`, the
shared "Authentication required" message in `api-client.ts`, and the `os
serve` welcome page's link text to the cloud console. Internal
identifiers are untouched: `~/.objectstack/cloud.json`,
`OS_CLOUD_API_KEY`, `OS_CLOUD_URL`, `OS_TOKEN`, the `os cloud …` command
ids.
- **`packages/cli/README.md`** (3 rows) and
**`content/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 merged `origin/main`
and 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 two
`dialogDescPicker`s and `signInFirst`) 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
key `auth.shell.poweredBy` in all ten locales (the `ja` value keeps the
English wordmark line, listed beside `publicForm.poweredBy` in the
untranslated-identity allowlist with the same reason).
- **`ui/packages/app-shell`**: new `isDefaultProductName()` on the
runtime-config module and the barrel: true while `branding.productName`
equals 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 when
`isDefaultProductName()` is true. The wordmark, `logo.svg`,
`manifest.json`, the default `productName: 'ObjectOS'` and
`admin@objectos.ai` are unchanged.
- **`scripts/sdui-manifest.sources/i18n.json`**: re-recorded by `node
scripts/gen-sdui-manifest-node.mjs` (the gate hashes `ui/packages/i18n`
sources; the manifest artefact itself is byte-identical).
- Changeset `.changeset/26136-objectos-cloud-naming.md`: `patch` on
`@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 `branding` reaches the layout: `initRuntimeConfig()` fetches
`/api/v1/runtime/config` at boot and merges `body.branding` into the
app-shell singleton; `getProductName()` reads it. The payload carries no
explicit edition key, so the only reliable signal of "server-pushed
branding" is that `productName` differs from the default. That is what
`isDefaultProductName()` reads, and the PR says so here as the order
asked. Measured at source: `objectstack-ai/cloud` pushes
`CLOUD_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 --help` and `… package
publish --help` print "ObjectOS Cloud" (flag descriptions and command
description), no "ObjectStack Cloud".
- `pnpm --filter @objectstack/cli exec vitest run --project unit
--maxWorkers=2` under 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 reads `serve.ts` source, which this PR touches in one string).
The two `published-subpath-*.pin` suites need `packages/cli/dist`, built
first. the new `test/cloud-product-name.test.ts` pins the five commands'
descriptions and flag descriptions on "ObjectOS Cloud" and asserts no
"ObjectStack Cloud" in any of their help strings. The `integration` tier
and the nightly `cloud-login-json-ndjson.e2e` tier (whose
`not.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 new
`AuthLayout.powered-by` test boots branding through a stubbed `GET
/api/v1/runtime/config` into the real singleton: default → mark with
href `https://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` (every `defaultValue` equals its `en` value) and
`check:i18n-drift` (4 changed `en` values, 36 pack values followed, 1
key added) exit 0.
- Derived gate subset (`node scripts/pm/dispatch-gates.mjs --commands`)
run on the final tree; the full list, each exit code and the `--ran`
reconciliation are in the report comment. `check:sdui-manifest`,
`check:i18n`, `check:i18n-coverage`, `check:i18n-walk-parity`,
`check:dual-build-cjs-loads` and spec `check:skill-examples` pass after
a full build. `node scripts/check-plugin-teardown-shape.mjs --self-test`
is 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 in `packages/cli/src` and 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 limited `packages/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 inside
`packages/cli`.
- The same phrase survives outside the card's surface, user-facing in
places: `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.md` and `ui/docs/adr/0060-product-neutral-renderer.md` say
"ObjectStack Cloud" as a product example; both are governed surfaces and
are not touched.
- `ui/scripts/check-changeset-presence.mjs` still reads `ui/.changeset`
and 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.
- The commit trailer pair is the model-free pair
`.claude/agents/os-dev.md` requires and the pre-push hook enforces; the
dispatch order's trailer text, which names a model, was not used.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01FMuBZmssbfQkVrKRtxNvng)_
---------
Co-authored-by: os-zhuang <sam@objectstack.ai>
Co-authored-by: Claude <noreply@anthropic.com>1 parent 1f40201 commit f00cbe3
31 files changed
Lines changed: 327 additions & 71 deletions
File tree
- .changeset
- content/docs/deployment
- packages/cli
- src
- commands
- cloud
- package
- plugin
- utils
- test
- scripts/sdui-manifest.sources
- ui
- apps/console/src/pages/auth
- __tests__
- packages
- app-shell/src
- i18n/src
- __tests__
- locales
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
254 | 254 | | |
255 | 255 | | |
256 | 256 | | |
257 | | - | |
| 257 | + | |
258 | 258 | | |
259 | 259 | | |
260 | 260 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2626 | 2626 | | |
2627 | 2627 | | |
2628 | 2628 | | |
2629 | | - | |
| 2629 | + | |
2630 | 2630 | | |
2631 | 2631 | | |
2632 | 2632 | | |
| |||
2727 | 2727 | | |
2728 | 2728 | | |
2729 | 2729 | | |
2730 | | - | |
| 2730 | + | |
2731 | 2731 | | |
2732 | 2732 | | |
2733 | 2733 | | |
| |||
2823 | 2823 | | |
2824 | 2824 | | |
2825 | 2825 | | |
2826 | | - | |
| 2826 | + | |
2827 | 2827 | | |
2828 | 2828 | | |
2829 | 2829 | | |
2830 | 2830 | | |
2831 | | - | |
| 2831 | + | |
2832 | 2832 | | |
2833 | 2833 | | |
2834 | 2834 | | |
| |||
2882 | 2882 | | |
2883 | 2883 | | |
2884 | 2884 | | |
2885 | | - | |
| 2885 | + | |
2886 | 2886 | | |
2887 | 2887 | | |
2888 | 2888 | | |
| |||
3018 | 3018 | | |
3019 | 3019 | | |
3020 | 3020 | | |
3021 | | - | |
| 3021 | + | |
3022 | 3022 | | |
3023 | 3023 | | |
3024 | 3024 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
80 | 80 | | |
81 | 81 | | |
82 | 82 | | |
83 | | - | |
| 83 | + | |
84 | 84 | | |
85 | 85 | | |
86 | 86 | | |
87 | 87 | | |
88 | 88 | | |
89 | | - | |
| 89 | + | |
90 | 90 | | |
91 | 91 | | |
92 | 92 | | |
| |||
146 | 146 | | |
147 | 147 | | |
148 | 148 | | |
149 | | - | |
| 149 | + | |
150 | 150 | | |
151 | 151 | | |
152 | 152 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
139 | 139 | | |
140 | 140 | | |
141 | 141 | | |
142 | | - | |
| 142 | + | |
143 | 143 | | |
144 | 144 | | |
145 | 145 | | |
| |||
151 | 151 | | |
152 | 152 | | |
153 | 153 | | |
154 | | - | |
| 154 | + | |
155 | 155 | | |
156 | 156 | | |
157 | 157 | | |
| |||
198 | 198 | | |
199 | 199 | | |
200 | 200 | | |
201 | | - | |
| 201 | + | |
202 | 202 | | |
203 | 203 | | |
204 | 204 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
15 | | - | |
| 15 | + | |
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| |||
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
27 | | - | |
| 27 | + | |
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
| 14 | + | |
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| |||
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
31 | | - | |
| 31 | + | |
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
| |||
56 | 56 | | |
57 | 57 | | |
58 | 58 | | |
59 | | - | |
| 59 | + | |
60 | 60 | | |
61 | 61 | | |
62 | 62 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
298 | 298 | | |
299 | 299 | | |
300 | 300 | | |
301 | | - | |
| 301 | + | |
302 | 302 | | |
303 | 303 | | |
304 | 304 | | |
305 | 305 | | |
306 | 306 | | |
307 | | - | |
| 307 | + | |
308 | 308 | | |
309 | 309 | | |
310 | 310 | | |
| |||
337 | 337 | | |
338 | 338 | | |
339 | 339 | | |
340 | | - | |
| 340 | + | |
341 | 341 | | |
342 | 342 | | |
343 | 343 | | |
| |||
517 | 517 | | |
518 | 518 | | |
519 | 519 | | |
520 | | - | |
| 520 | + | |
521 | 521 | | |
522 | 522 | | |
523 | 523 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
44 | 44 | | |
45 | 45 | | |
46 | 46 | | |
47 | | - | |
| 47 | + | |
48 | 48 | | |
49 | 49 | | |
50 | 50 | | |
| |||
72 | 72 | | |
73 | 73 | | |
74 | 74 | | |
75 | | - | |
| 75 | + | |
76 | 76 | | |
77 | 77 | | |
78 | 78 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6271 | 6271 | | |
6272 | 6272 | | |
6273 | 6273 | | |
6274 | | - | |
| 6274 | + | |
6275 | 6275 | | |
6276 | 6276 | | |
6277 | 6277 | | |
| |||
0 commit comments