Skip to content

chore: promote cli 5.9.0 - #246

Merged
riglar merged 8 commits into
productionfrom
promote/cli-5.9.0
Oct 22, 2026
Merged

riglar merged 8 commits into
productionfrom
promote/cli-5.9.0

Conversation

@riglar

@riglar riglar commented Oct 22, 2026

Copy link
Copy Markdown
Contributor

Promotes dev to production. Once merged, release-please opens the 5.9.0 Release PR. Merging that PR publishes to npm latest and uploads the binaries.

⚠️ Don't merge until the API is live on prod

#245 fetches the Supabase key from GET /cli-config. That endpoint reaches prod via devicecloud-dev/dcd#1759. Merge and deploy that first, then check it:

curl -i https://api.devicecloud.dev/cli-config

It should return 200 with the anon/publishable key, not 503. If this CLI ships first, dcd login refresh, realtime and uploads will fail.

What ships

Merge

Use a merge commit (production rule). Afterwards, back-merge production into dev, as #236 did.

🤖 Generated with Claude Code

riglar and others added 8 commits October 16, 2026 17:51
* feat: add --json output to every command

Every command and live subcommand now takes --json. With it, stdout
carries exactly one JSON object on success and on failure.

- index.ts prints thrown errors as { status: 'FAILED', error } when
  --json is in argv, and skips the help screen on usage errors.
- New --json on whoami, logout, switch-org, login, upgrade, artifacts
  and all live subcommands. login and switch-org draw prompts and the
  login URL on stderr.
- ReportDownloadService returns a result per download so artifacts
  --json can report failures; it exits 1 if every download failed.
- live hierarchy --json --output prints { status, path } instead of a
  plain-text line.
- Adds jsonFlag, logger.json, logger.fail and wantsJson; existing JSON
  call sites use logger.json with unchanged output.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(live): report the session name when --wait fails under --json

Under --json the 'Live session started' block is dropped, so a waitForReady
timeout or polling error left a billed session with no name to stop it by.
Catch the error and print { status: 'FAILED', error, session_name, platform,
ready: false, consoleUrl } before exiting with the original exit code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* ReleaseAs: 5.8.0

* Release-As: 5.8.0

* Release-As: 5.8.0

* chore(production): release 5.8.0

---------

Co-authored-by: finalerock44 <ethan@devicecloud.dev>
Co-authored-by: finalerock44 <77282157+finalerock44@users.noreply.github.com>
Co-authored-by: dcd-release-please[bot] <296541543+dcd-release-please[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Bumps [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn) from 77.0.0 to 78.0.0.
- [Release notes](https://github.com/sindresorhus/eslint-plugin-unicorn/releases)
- [Commits](sindresorhus/eslint-plugin-unicorn@v77.0.0...v78.0.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-unicorn
  dependency-version: 78.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
#238)

Bumps the minor-and-patch group with 5 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [@supabase/supabase-js](https://github.com/supabase/supabase-js/tree/HEAD/packages/core/supabase-js) | `2.117.3` | `2.118.0` |
| [js-yaml](https://github.com/nodeca/js-yaml) | `5.4.3` | `5.5.0` |
| [zod](https://github.com/colinhacks/zod) | `4.6.5` | `4.6.7` |
| [eslint](https://github.com/eslint/eslint) | `10.12.0` | `10.13.0` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.71.1` | `8.71.2` |



Updates `@supabase/supabase-js` from 2.117.3 to 2.118.0
- [Release notes](https://github.com/supabase/supabase-js/releases)
- [Changelog](https://github.com/supabase/supabase-js/blob/master/packages/core/supabase-js/CHANGELOG.md)
- [Commits](https://github.com/supabase/supabase-js/commits/v2.118.0/packages/core/supabase-js)

Updates `js-yaml` from 5.4.3 to 5.5.0
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](nodeca/js-yaml@5.4.3...5.5.0)

Updates `zod` from 4.6.5 to 4.6.7
- [Release notes](https://github.com/colinhacks/zod/releases)
- [Commits](colinhacks/zod@v4.6.5...v4.6.7)

Updates `eslint` from 10.12.0 to 10.13.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](eslint/eslint@v10.12.0...v10.13.0)

Updates `typescript-eslint` from 8.71.1 to 8.71.2
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.71.2/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@supabase/supabase-js"
  dependency-version: 2.118.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: eslint
  dependency-version: 10.13.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: js-yaml
  dependency-version: 5.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: minor-and-patch
- dependency-name: typescript-eslint
  dependency-version: 8.71.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
- dependency-name: zod
  dependency-version: 4.6.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: minor-and-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* feat(login): reuse the last org and add --org

dcd login no longer hangs where nobody can answer a prompt, such as a
script, CI, or a shell an agent runs.

- The org picker starts on the org from the last login, so Enter keeps it.
- Without a TTY, the last login's org is used and one line says so. With
  no last org, or one that is gone, login fails with an error that names
  --org and lists the available orgs.
- --org <name|id> picks the org without the picker, and fails if the user
  isn't a member.
- Without a TTY, the "already logged in" confirm takes its default and
  signs in again. The old session stays until the new login succeeds.
- The last org only counts when the last login was to the same API,
  because org ids differ between environments.
- A bare dcd switch-org without a TTY now fails with the org names instead
  of hanging the same way.

Closes #241

* chore(deps): bump hono override to 4.13.11 to clear audit

pnpm audit flagged GHSA-5r4p-p66f-jhc7 (moderate) on hono >=4.12.4
<4.13.11, which comes in through @modelcontextprotocol/sdk. In those
versions serveStatic decodes the request path twice. The advisory was
published on 2026-10-20, after dev's last green run, so the
lint-and-test audit step now fails on every branch. Dependabot opened an
alert but no fix PR, because the exact-pin override holds hono at
4.13.7.

4.13.11 is the lowest patched version, as with the earlier pins. The
audit passes apart from the advisory that was already ignored. Lint,
typecheck, unit tests and build pass, and dcd-mcp answers initialize
and tools/list over stdio with all five tools.
…it in (#245)

Every release so far compiled the Supabase anon key in, so the key could
not be rotated without breaking pinned CLI versions (dcd#1112). The CLI
now fetches its publishable key from the API's public GET /cli-config,
once per process, so a rotation is an env change on the API.

- The key is kept in memory only. A stale on-disk copy would make a
  session refresh fail with a 4xx, which drops the user's login.
- A failed key fetch during refresh is a retryable error, never a
  definitive one, so the stored session survives.
- Supabase URLs stay pinned (prod uses the cloud.devicecloud.dev custom
  domain); only the key comes from the API.
- Raw Storage/Auth requests send an sb_publishable_ key as `apikey`
  only, and a legacy JWT key as a Bearer too.
- Realtime keeps a synchronous subscribe() and connects once the key
  arrives; until then the backstop poll covers it.
- The anon keys stay in the gitleaks allowlist, relabelled: they remain
  in history, which CI scans in full.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
@claude

claude Bot commented Oct 22, 2026

Copy link
Copy Markdown

Code review

Found 1 issue:

  1. The promotion has no Release-As: 5.9.0 pin commit. CLAUDE.md says: "Every promotion must carry a Release-As: pin … It must be an ordinary commit, not the merge commit … Do not skip it on the grounds that the conventional commits since the last stable already imply the right bump." This branch's commits contain no Release-As: 5.9.0. The only Release-As lines are 5.8.0 ones carried in the chore: merge production into dev after 5.8.0 #236 back-merge's body. The promotion-pin check is failing on this PR. Without the pin, release-please takes the newest reachable -beta tag as its base, which is what happened with 5.6.0 and produced a release 5.6.0-beta.1 PR. Fix it on promote/cli-5.9.0 before merging:
    git commit --allow-empty -m "chore: pin the 5.9.0 promotion" -m "Release-As: 5.9.0"
    

    dcd-cli/CLAUDE.md

    Lines 80 to 90 in b31435d

    ### Every promotion must carry a `Release-As:` pin
    Put the stable version on its own commit in the promotion branch:
    ```
    git commit --allow-empty -m "chore: pin the X.Y.Z promotion" -m "Release-As: X.Y.Z"
    ```
    It must be an ordinary commit, not the merge commit — release-please's commit splitting is unreliable on merges. The `promotion-pin` check in `cli-ci.yml` enforces this.

No bugs found in the src/ changes (#223 --json, #243 --org/last-org reuse, #245 Supabase key fetch).

🤖 Generated with Claude Code

@riglar
riglar merged commit 6ab6d43 into production Oct 22, 2026
6 of 7 checks passed
@riglar
riglar deleted the promote/cli-5.9.0 branch October 22, 2026 07:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants