Skip to content

feat(speak): default to Flux TTS (flux-alexis-en) instead of Aura 2 - #89

Merged
dg-coreylweathers merged 1 commit into
mainfrom
feat/speak-default-flux-tts
Jul 17, 2026
Merged

feat(speak): default to Flux TTS (flux-alexis-en) instead of Aura 2#89
dg-coreylweathers merged 1 commit into
mainfrom
feat/speak-default-flux-tts

Conversation

@GregHolmes

Copy link
Copy Markdown
Contributor

What

Changes the default dg speak model from aura-2-asteria-en to flux-alexis-en, so a bare dg speak "..." now uses Flux TTS (Speak v2, WebSocket streaming) out of the box. Aura remains fully available via -m aura-*.

Follow-on to the Speak v2 / Flux TTS implementation (#86). Asana: DX CLI task.

Why

Flux TTS is our latest, most natural TTS. Making it the default puts our best voice front-and-center in the CLI.

How it works

Routing is unchanged and purely prefix-based (model.lower().startswith("flux")): flux-* goes to Speak v2 streaming, everything else goes to Speak v1 (Aura, REST batch). Picking the voice is picking the API path -- there is no separate mode flag.

Behavior change

Because the default now takes the v2 streaming path (raw linear16 auto-wrapped in WAV), containerized formats like mp3 now require an explicit -m aura-*:

  • dg speak "hi" -o out.wav -> Flux, WAV (new default)
  • dg speak "hi" -o out.mp3 --encoding mp3 -> fails with a clear error + non-zero exit (was previously fine under the Aura default)
  • dg speak "hi" -o out.mp3 -m aura-2-asteria-en -> Aura v1 REST, mp3 (opt back in)

This is worth a line in the release notes.

Not changed

Core client speak_text() default stays aura-2-asteria-en -- it is the Aura-only v1 REST path (speak.v1.audio.generate); Flux goes through speak_text_stream().

Testing

  • Unit: 20/20 pass, incl. new test_handle_default_model_routes_to_flux (asserts no -m routes to Flux v2, not Aura v1).
  • Manual (branch dg + released SDK 7.5.0, against prod):
    • bare dg speak -> Flux streaming, plays correctly
    • -m aura-2-asteria-en -> Aura v1 REST, plays correctly
    • default + --encoding mp3 -> fails clean, exit 2, no file written

Open question

Flux TTS is currently EA with a single voice (flux-alexis-en); more land at GA (~next month). Decision needed: merge now and ship Flux-by-default against the single EA voice, or hold this until GA when the full roster is available.

Change the default `dg speak` model from aura-2-asteria-en to
flux-alexis-en, so a bare `dg speak` now uses Flux TTS (Speak v2,
WebSocket streaming) out of the box. Routing is unchanged and still
prefix-based, so Aura remains available via `-m aura-*`.

Because the default now takes the v2 streaming path (raw linear16
wrapped in WAV), containerized formats like mp3 require an explicit
`-m aura-*`. Updated --model/agent help and README examples to
reflect Flux-by-default with Aura as opt-in, and added a test
asserting no -m routes to Flux (v2) rather than Aura (v1).

The core client speak_text() default is intentionally left as
aura-2-asteria-en: it is the Aura-only v1 REST path; Flux uses
speak_text_stream().
@GregHolmes GregHolmes self-assigned this Jul 17, 2026
@GregHolmes
GregHolmes requested a review from a team July 17, 2026 12:44
@dg-coreylweathers

Copy link
Copy Markdown
Contributor

Reviewed — code and docs are correct, tests pass locally (speak 20/20, including the new default-routes-to-Flux test), routing and the Aura REST path are unchanged, and client.speak_text() correctly stays aura-2-asteria-en. Approving the content; EA-single-voice ship is a go on our side.

One thing to fix before merge, and one follow-up.

⚠️ Before merge — signal the breaking change to release-please

The change is an intentional break (bare dg speak -o x.mp3 now fails; default output is WAV/linear16 instead of MP3), but the commit/PR title is a plain feat(speak):. Release-please generates the changelog and version bump from that prefix, so as-is this ships as a patch under "Features" with the break invisible. Since we squash-merge (PR title + body → commit), please:

  • Title → feat(speak)!: default to Flux TTS (flux-alexis-en) instead of Aura 2
  • Add to the body:
    BREAKING CHANGE: bare `dg speak` now defaults to Flux TTS (Speak v2 streaming),
    emitting WAV/linear16 @ 24 kHz instead of MP3; `--container` is ignored on the
    default path. To restore the previous Aura/MP3 behavior, pass `-m aura-2-asteria-en`.
    

(No code change needed — this is purely the release signal. The spec's "add a CHANGELOG entry" step doesn't apply here since release-please auto-generates it.)

Follow-up (non-blocking)

packages/deepctl-core/src/deepctl_core/skill_generator.py:420-443 wasn't updated — the generated agent skill still opens with "…using Deepgram's Aura voices" and lists Aura first, Flux last, which contradicts the new Flux-by-default CLI. Worth reordering to lead with Flux, either here or as a fast follow.

Notes

  • Default + --encoding mp3 fails cleanly before any write (no empty/header-only file) — verified.
  • The 5 test_base.py::test_output_result_* failures pre-exist on main; unrelated to this PR.

@dg-coreylweathers dg-coreylweathers left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved. Fix the feat!: title + BREAKING CHANGE footer before merge; EA-single-voice ship is a go.

@dg-coreylweathers
dg-coreylweathers merged commit 5a0b698 into main Jul 17, 2026
39 checks passed
@dg-coreylweathers
dg-coreylweathers deleted the feat/speak-default-flux-tts branch July 17, 2026 18:28
@github-actions github-actions Bot mentioned this pull request Jul 17, 2026
GregHolmes pushed a commit that referenced this pull request Aug 17, 2026
🤖 I have created a release *beep* *boop*
---

## 📦 deepctl 0.2.27 — what's in this release

Ships the Deepgram Python SDK **7.7.0** upgrade, makes **Flux** the
default text-to-speech model, expands redaction/formatting controls for
speech-to-text, and hardens the MCP proxy against host disconnects. All
feature areas were exercised end-to-end against the live API before
cutting this release.

### ✨ Features

- **`dg speak` now defaults to Flux TTS (`flux-alexis-en`).**
Text-to-speech streams via Flux (Speak v2 WebSocket) by default instead
of Aura 2, with new Flux-only controls: `--speed` (0.85–1.15) and
`--expressivity` (−2…2, beta). Aura voices remain available via `-m
aura-2-*` (REST batch). (#89, #92)
- **`dg listen` redaction & numerals on files *and* live streams.** New
`--redact` and `--numerals`. Flux STT (v2) accepts `--redact numbers` /
`aggressive_numbers`; v1 models also accept `pci`, `ssn`, etc. and are
repeatable. (#92)
- **Flux STT streaming guardrail.** Flux STT is streaming-only — a file
or URL source now fails fast with guidance to use `--mic`, stdin (`-`),
or a v1 model (e.g. `nova-3`) for pre-recorded audio, instead of
erroring opaquely. (#92)
- **Deepgram SDK bumped to 7.7.0.** (#92)

### 🐛 Bug Fixes

- **MCP pipe-safety.** `dg mcp` now swallows broken/closed-pipe errors
during startup notifications and on the error path, so a host disconnect
exits cleanly with no Python traceback. (#88)

### 🔧 Internal

- Test isolation: the output-format global no longer leaks across the
test suite. (#93)

### ⚠️ Upgrade note

`dg speak` output now comes from Flux (`flux-alexis-en`) by default
rather than Aura 2 — expect a different default voice and raw `linear16`
(auto-wrapped to WAV) instead of Aura's MP3 default. To keep the
previous behavior, pass `-m aura-2-asteria-en` (add `--encoding mp3` for
MP3 output).

---

<sub>The machine-generated release manifest below is required by Release
Please and is left unchanged.</sub>


<details><summary>0.2.27</summary>

## [0.2.27](v0.2.26...v0.2.27)
(2026-08-17)


### Features

* SDK 7.7.0 — Flux TTS controls, Flux STT fix, listen redact/numerals
([#92](#92))
([50d96cf](50d96cf))
* **speak:** default to Flux TTS (flux-alexis-en) instead of Aura 2
([#89](#89))
([5a0b698](5a0b698))


### Bug Fixes

* **mcp:** swallow broken/closed-pipe on dg mcp startup notifications
and error path ([#88](#88))
([b24396e](b24396e))
</details>

<details><summary>deepctl-core: 0.2.15</summary>

##
[0.2.15](deepctl-core-v0.2.14...deepctl-core-v0.2.15)
(2026-08-17)


### Features

* SDK 7.7.0 — Flux TTS controls, Flux STT fix, listen redact/numerals
([#92](#92))
([50d96cf](50d96cf))
</details>

<details><summary>deepctl-telemetry: 0.0.6</summary>

##
[0.0.6](deepctl-telemetry-v0.0.5...deepctl-telemetry-v0.0.6)
(2026-08-17)


### Bug Fixes

* **mcp:** swallow broken/closed-pipe on dg mcp startup notifications
and error path ([#88](#88))
([b24396e](b24396e))
</details>

<details><summary>deepctl-cmd-login: 0.1.17</summary>

##
[0.1.17](deepctl-cmd-login-v0.1.16...deepctl-cmd-login-v0.1.17)
(2026-08-17)


### Features

* SDK 7.7.0 — Flux TTS controls, Flux STT fix, listen redact/numerals
([#92](#92))
([50d96cf](50d96cf))
</details>

<details><summary>deepctl-cmd-projects: 0.1.13</summary>

##
[0.1.13](deepctl-cmd-projects-v0.1.12...deepctl-cmd-projects-v0.1.13)
(2026-08-17)


### Features

* SDK 7.7.0 — Flux TTS controls, Flux STT fix, listen redact/numerals
([#92](#92))
([50d96cf](50d96cf))
</details>

<details><summary>deepctl-cmd-usage: 0.1.13</summary>

##
[0.1.13](deepctl-cmd-usage-v0.1.12...deepctl-cmd-usage-v0.1.13)
(2026-08-17)


### Features

* SDK 7.7.0 — Flux TTS controls, Flux STT fix, listen redact/numerals
([#92](#92))
([50d96cf](50d96cf))
</details>

<details><summary>deepctl-cmd-update: 0.2.6</summary>

##
[0.2.6](deepctl-cmd-update-v0.2.5...deepctl-cmd-update-v0.2.6)
(2026-08-17)


### Bug Fixes

* **mcp:** swallow broken/closed-pipe on dg mcp startup notifications
and error path ([#88](#88))
([b24396e](b24396e))
</details>

<details><summary>deepctl-cmd-skills: 0.0.7</summary>

##
[0.0.7](deepctl-cmd-skills-v0.0.6...deepctl-cmd-skills-v0.0.7)
(2026-08-17)


### Bug Fixes

* **mcp:** swallow broken/closed-pipe on dg mcp startup notifications
and error path ([#88](#88))
([b24396e](b24396e))
</details>

<details><summary>deepctl-cmd-speak: 0.0.4</summary>

##
[0.0.4](deepctl-cmd-speak-v0.0.3...deepctl-cmd-speak-v0.0.4)
(2026-08-17)


### Features

* SDK 7.7.0 — Flux TTS controls, Flux STT fix, listen redact/numerals
([#92](#92))
([50d96cf](50d96cf))
* **speak:** default to Flux TTS (flux-alexis-en) instead of Aura 2
([#89](#89))
([5a0b698](5a0b698))
</details>

<details><summary>deepctl-cmd-listen: 0.0.14</summary>

##
[0.0.14](deepctl-cmd-listen-v0.0.13...deepctl-cmd-listen-v0.0.14)
(2026-08-17)


### Features

* SDK 7.7.0 — Flux TTS controls, Flux STT fix, listen redact/numerals
([#92](#92))
([50d96cf](50d96cf))
</details>

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
GregHolmes added a commit that referenced this pull request Aug 18, 2026
The ALL COMMANDS section advertised seven invocations that the CLI rejects.
Anyone copying them got an error:

  dg keys create "ci-runner"          -> No such command 'keys create'
  dg projects list                    -> No such command 'projects list'
  dg members list                     -> No such command 'members list'
  dg models list --type stt           -> No such command 'models list'
  dg requests list --limit 20 -o json -> No such command 'requests list'
  dg completion install --shell zsh   -> No such command 'completion install'
  dg api GET /v1/projects             -> Got unexpected extra argument

These commands are flag-based, not subcommand-based. The page was already
internally inconsistent: its FAQ used the correct forms (dg projects --list,
dg keys --create --comment) while the cards used a subcommand style that has
never existed.

Content was also stale after the Flux TTS default (#89) and SDK 7.7.0 (#92):
the page said "Generate speech with Aura voices" with no mention of Flux, and
none of the new flags appeared anywhere.

- speak: document Flux as the default engine plus --speed and --expressivity,
  and keep an explicit Aura card so -m aura-2-* stays discoverable
- listen: add --redact/--numerals and Flux STT streaming (flux-general-en),
  noting it is streaming-only
- hero terminal: a default `dg speak` now reports flux-alexis-en, not
  aura-2-asteria-en
- add the missing commands: profiles, logout, ffprobe, debug browser,
  debug probe (27 cards -> 36)
- llms.txt / llms-full.txt: same Flux corrections, add the new flag rows, and
  fix a model name that does not exist (aura-2-en-us -> real aura-2-* ids)

Every advertised invocation in the cards was validated against the installed
CLI; the shell-composed ones were checked by hand. Build passes and the stale
forms are absent from the built output.
GregHolmes added a commit that referenced this pull request Aug 18, 2026
The ALL COMMANDS section advertised seven invocations that the CLI rejects.
Anyone copying them got an error:

  dg keys create "ci-runner"          -> No such command 'keys create'
  dg projects list                    -> No such command 'projects list'
  dg members list                     -> No such command 'members list'
  dg models list --type stt           -> No such command 'models list'
  dg requests list --limit 20 -o json -> No such command 'requests list'
  dg completion install --shell zsh   -> No such command 'completion install'
  dg api GET /v1/projects             -> Got unexpected extra argument

These commands are flag-based, not subcommand-based. The page was already
internally inconsistent: its FAQ used the correct forms (dg projects --list,
dg keys --create --comment) while the cards used a subcommand style that has
never existed.

Content was also stale after the Flux TTS default (#89) and SDK 7.7.0 (#92):
the page said "Generate speech with Aura voices" with no mention of Flux, and
none of the new flags appeared anywhere.

- speak: document Flux as the default engine plus --speed and --expressivity,
  and keep an explicit Aura card so -m aura-2-* stays discoverable
- listen: add --redact/--numerals and Flux STT streaming (flux-general-en),
  noting it is streaming-only
- hero terminal: a default `dg speak` now reports flux-alexis-en, not
  aura-2-asteria-en
- add the missing commands: profiles, logout, ffprobe, debug browser,
  debug probe (27 cards -> 36)
- llms.txt / llms-full.txt: same Flux corrections, add the new flag rows, and
  fix a model name that does not exist (aura-2-en-us -> real aura-2-* ids)

Every advertised invocation in the cards was validated against the installed
CLI; the shell-composed ones were checked by hand. Build passes and the stale
forms are absent from the built output.
GregHolmes added a commit that referenced this pull request Aug 18, 2026
…o json across account commands (#97)

Split out from #96 deliberately: that PR was a verified output-neutral
toolchain upgrade, this one changes content **and** fixes an output bug.
#95 and #96 are now merged, so this sits on current `main`.

## 1. Seven advertised commands don't work 🔴

The `ALL COMMANDS` cards used a subcommand style the CLI has never had.
Each was verified to fail:

| Page said | CLI response |
|---|---|
| `dg keys create "ci-runner"` | `No such command 'keys create'` |
| `dg projects list` | `No such command 'projects list'` |
| `dg members list` | `No such command 'members list'` |
| `dg models list --type stt` | `No such command 'models list'` |
| `dg requests list --limit 20 -o json` | `No such command 'requests
list'` |
| `dg completion install --shell zsh` | `No such command 'completion
install'` |
| `dg api GET /v1/projects` | `Got unexpected extra argument
(/v1/projects)` |

These commands are **flag-based**. The page was already internally
inconsistent — its FAQ text used the correct forms (`dg projects
--list`, `dg keys --create --comment`, `dg api /v1/projects --jq`) while
the cards used the broken style. Fixed to the verified forms.

## 2. Stale after the Flux changes (#89, #92)

The page said *"Generate speech with Aura voices"* with **zero**
mentions of Flux, even though `dg speak` now defaults to
`flux-alexis-en`. None of the new capabilities appeared anywhere
(`--speed`, `--expressivity`, `--redact`, `--numerals`,
`flux-general-en` all scored 0).

- **speak** — Flux documented as the default engine, new cards for
`--speed` / `--expressivity`, plus an explicit Aura card so `-m
aura-2-*` stays discoverable
- **listen** — new cards for `--redact` / `--numerals` and Flux STT
streaming, noting it is **streaming-only**
- **hero terminal** — a default `dg speak` now reports `flux-alexis-en`,
not `aura-2-asteria-en`

## 3. Missing commands added

`profiles`, `logout`, `ffprobe`, `debug browser`, `debug probe` had no
cards. **27 → 36 cards.**

## 4. llms.txt / llms-full.txt

These feed AI crawlers and had the same staleness, plus **a model name
that doesn't exist** (`aura-2-en-us` — confirmed rejected by the API,
rc=2). Corrected to real ids and added the new flag rows.

## 5. `-o json` now honored across list/detail commands (fixed here)

While verifying, I found `-o json` was **not honored consistently** —
several commands printed a Rich table or human text on stdout, ignoring
the flag and corrupting anything piped into `jq`. This PR fixes it
across `requests`, `read`, `models`, `projects`, `members`, `usage`, and
`billing` (+ `deepctl-core` exports `get_output_format`):

- Human tables/summaries are now gated on `get_output_format() ==
"default"`; for json/yaml/csv the framework serialises the returned
result to stdout.
- All status/progress chrome ("Fetching…", "Analyzing text…", errors)
moved to a stderr `Console`, so stdout stays clean.
- `requests --show` now returns a structured `RequestDetailResult` (the
full request detail) instead of a bare "displayed" message, so json/yaml
output is actually useful.

Verified live against the installed CLI + a real key: `dg -o json models
| jq`, `… projects --list`, `… requests --limit`, and `… read
--sentiment` all emit **pure JSON on stdout** with status text on
stderr.

## Tests

Added output-format gating tests for the three rendering shapes — table
(`requests`, `models`), list (`projects`, new test file), and inline
(`read`): each asserts that json mode writes **nothing** to the stdout
console while still returning a fully-populated result, and that default
mode still renders. Full suite green (`make check` + `uv run pytest`).

## Verification

Every card invocation was run against the installed CLI (`--help`-level
parse plus live runs for `--redact pci --numerals`,
`--speed`/`--expressivity`, and every model id including a
live-synthesis check that `aura-2-en-us` is rejected). Build passes; all
seven stale forms confirmed absent from the built output and the new
content confirmed present (including in the bundled hero-animation JS).
@GregHolmes GregHolmes mentioned this pull request Aug 18, 2026
GregHolmes added a commit that referenced this pull request Aug 18, 2026
0.2.27 was tagged on 2026-08-17 but its publish step failed on
Metadata-Version 2.5 (fixed afterwards by #94 and #95), so it never reached
PyPI. Everyone upgrading therefore goes 0.2.26 -> 0.2.28 and receives the
0.2.27 changes in this release, while the generated notes list only commits
made since the v0.2.27 tag.

The gap matters most for #89, which changed the default `dg speak` model from
Aura 2 to Flux TTS: a user whose synthesised audio changes after this upgrade
would find nothing in the 0.2.28 notes to explain it. Also records the six
packages that reach PyPI for the first time here, having been tagged in the
failed cycle.

Mirrored into the release PR body so the published release notes and the
committed changelog match.
GregHolmes added a commit that referenced this pull request Aug 19, 2026
🤖 I have created a release *beep* *boop*
---


<details><summary>0.3.0</summary>

## [0.3.0](v0.2.27...v0.3.0)
(2026-08-19)


### ⚠ BREAKING CHANGES

* `dg` now exits non-zero when a command fails: 1 for errors (including
crashes and usage errors), 2 for user interrupt, 0 on success. Every
command previously exited 0 regardless of outcome, so scripts and CI
steps that ignored the exit code will surface failures they were
silently swallowing. No command that succeeds changes its exit code.

### Bug Fixes

* correct web command examples, document Flux TTS/STT, and honor -o json
across account commands
([#97](#97))
([55984ec](55984ec))
* dependency floors that let dg update skip this release, and exit-code
+ error-stream correctness
([#102](#102))
([fd1e8a4](fd1e8a4))
* **deps:** cap mcp &lt;2 (fixes broken dg mcp), commit uv.lock, require
twine &gt;=7 ([#95](#95))
([997cd36](997cd36))
* **deps:** raise deepctl-core floor to 0.2.16 in the eight packages
that import get_status_console
([98f9e91](98f9e91))
* **deps:** raise root dependency floors to the versions this release
publishes
([c0b0023](c0b0023))
* exit 1, not 2, when a command crashes or is misused
([914e132](914e132))
* keep exit 2 when Ctrl-C interrupts a running command
([b0e80e2](b0e80e2))
* **keys:** honor -o json so stdout stays parseable (completes the
[#97](#97) sweep)
([#101](#101))
([e430a77](e430a77))
* **release:** bump pypi-publish action to v1.14.2 for Metadata-Version
2.5 ([#94](#94))
([582cd83](582cd83))
* send root error and interrupt output to stderr, not stdout
([f4b7c48](f4b7c48))
* **web:** repair broken Heap snippet, upgrade astro 6→7, clear all 20
npm alerts ([#96](#96))
([11928fe](11928fe))


### Behavior changes

Alongside the exit-code change above, upgrading to 0.3.0 changes these:

* The full exit-code contract is now enforced end to end: `0` = success,
`1` = error, `2` = user interrupt. Crashes **and usage errors** (bad
flag, unknown command, bare `dg`) exit `1`; `2` is reserved for
cancellation, so Ctrl-C during a running command and Ctrl-D at a prompt
both still exit `2`.
* Error and cancellation messages are written to **stderr** instead of
stdout. `dg -o json …` therefore keeps stdout machine-readable when a
command fails — previously a failure printed `Error: …` prose to stdout,
so a script piping stdout into `jq` parsed the error text instead of
JSON. Successful commands still write their payload to stdout.
* `-o yaml` and `-o csv` no longer drop square-bracketed text from
values. Output was passed through a renderer that read `[...]` as style
markup and deleted it, so an API key comment of `[ci] runner` was
emitted as `runner`. Long values are also no longer hard-wrapped
mid-field.
* `dg keys --delete KEY_ID` now asks for confirmation on stderr instead
of always reporting `Cancelled by user` without deleting. In a
non-interactive context it exits `1` and tells you to pass `--yes`.
* `dg keys --create --dry-run` now reports what it would create. It
previously failed with an internal `TypeError`.

### Previously unreleased

0.2.27 was tagged on 2026-08-17 but never reached PyPI — its publish
step failed with `InvalidDistribution: Invalid distribution metadata:
'2.5' is not a valid metadata version`, which
[#94](#94) and
[#95](#95) then fixed. PyPI
therefore goes straight from 0.2.26 to 0.3.0, and this release is the
first published build to include the 0.2.27 changes:

* SDK 7.7.0 — Flux TTS controls, Flux STT fix, listen redact/numerals
([#92](#92))
([50d96cf](50d96cf))
* **speak:** default to Flux TTS (`flux-alexis-en`) instead of Aura 2
([#89](#89))
([5a0b698](5a0b698)).
This changes the default model for `dg speak`, so synthesised audio
differs unless you pass an `aura-*` model explicitly.
* **mcp:** swallow broken/closed-pipe on dg mcp startup notifications
and error path ([#88](#88))
([b24396e](b24396e))

Six packages tagged in that cycle also reach PyPI for the first time
here: `deepctl-cmd-listen` 0.0.14, `deepctl-cmd-login` 0.1.17,
`deepctl-cmd-skills` 0.0.7, `deepctl-cmd-speak` 0.0.4,
`deepctl-cmd-update` 0.2.6 and `deepctl-telemetry` 0.0.6.

Because 0.2.27 never published, `dg update` on pip also had to be
repaired for this release to arrive at all: root's inter-package
dependency floors were lower than the versions being published, so pip's
default `only-if-needed` strategy left most sub-packages stale and `dg
--version` reported the new number while the fixes never landed. Floors
now match the published versions exactly.
</details>

<details><summary>deepctl-core: 0.2.16</summary>

##
[0.2.16](deepctl-core-v0.2.15...deepctl-core-v0.2.16)
(2026-08-19)


### Bug Fixes

* correct web command examples, document Flux TTS/STT, and honor -o json
across account commands
([#97](#97))
([55984ec](55984ec))
* **keys:** honor -o json so stdout stays parseable (completes the
[#97](#97) sweep)
([#101](#101))
([e430a77](e430a77))


### Behavior changes

* Commands now map their result status to a process exit code (`error` →
`1`, `cancelled` → `2`, otherwise `0`), and
`BaseCommand.exit_code_for()` exposes that mapping. Exit codes were
previously discarded, so every command exited `0`.
* `-o yaml` and `-o csv` payloads are written verbatim; the renderer no
longer interprets `[...]` as markup or wraps long values.
* New `get_status_console()` returns the shared stderr console for
status output. Commands should use it instead of declaring their own.
Packages that import it require `deepctl-core>=0.2.16`.
</details>

<details><summary>deepctl-cmd-projects: 0.2.0</summary>

##
[0.2.0](deepctl-cmd-projects-v0.1.13...deepctl-cmd-projects-v0.2.0)
(2026-08-19)


### ⚠ BREAKING CHANGES

* `dg` now exits non-zero when a command fails: 1 for errors (including
crashes and usage errors), 2 for user interrupt, 0 on success. Every
command previously exited 0 regardless of outcome, so scripts and CI
steps that ignored the exit code will surface failures they were
silently swallowing. No command that succeeds changes its exit code.

### Bug Fixes

* correct web command examples, document Flux TTS/STT, and honor -o json
across account commands
([#97](#97))
([55984ec](55984ec))
* dependency floors that let dg update skip this release, and exit-code
+ error-stream correctness
([#102](#102))
([fd1e8a4](fd1e8a4))
* **deps:** raise deepctl-core floor to 0.2.16 in the eight packages
that import get_status_console
([98f9e91](98f9e91))
* **keys:** honor -o json so stdout stays parseable (completes the
[#97](#97) sweep)
([#101](#101))
([e430a77](e430a77))
</details>

<details><summary>deepctl-cmd-usage: 0.2.0</summary>

##
[0.2.0](deepctl-cmd-usage-v0.1.13...deepctl-cmd-usage-v0.2.0)
(2026-08-19)


### ⚠ BREAKING CHANGES

* `dg` now exits non-zero when a command fails: 1 for errors (including
crashes and usage errors), 2 for user interrupt, 0 on success. Every
command previously exited 0 regardless of outcome, so scripts and CI
steps that ignored the exit code will surface failures they were
silently swallowing. No command that succeeds changes its exit code.

### Bug Fixes

* correct web command examples, document Flux TTS/STT, and honor -o json
across account commands
([#97](#97))
([55984ec](55984ec))
* dependency floors that let dg update skip this release, and exit-code
+ error-stream correctness
([#102](#102))
([fd1e8a4](fd1e8a4))
* **deps:** raise deepctl-core floor to 0.2.16 in the eight packages
that import get_status_console
([98f9e91](98f9e91))
* **keys:** honor -o json so stdout stays parseable (completes the
[#97](#97) sweep)
([#101](#101))
([e430a77](e430a77))
</details>

<details><summary>deepctl-cmd-mcp: 0.1.15</summary>

##
[0.1.15](deepctl-cmd-mcp-v0.1.14...deepctl-cmd-mcp-v0.1.15)
(2026-08-19)


### Bug Fixes

* **deps:** cap mcp &lt;2 (fixes broken dg mcp), commit uv.lock, require
twine &gt;=7 ([#95](#95))
([997cd36](997cd36))
</details>

<details><summary>deepctl-cmd-models: 0.1.0</summary>

##
[0.1.0](deepctl-cmd-models-v0.0.2...deepctl-cmd-models-v0.1.0)
(2026-08-19)


### ⚠ BREAKING CHANGES

* `dg` now exits non-zero when a command fails: 1 for errors (including
crashes and usage errors), 2 for user interrupt, 0 on success. Every
command previously exited 0 regardless of outcome, so scripts and CI
steps that ignored the exit code will surface failures they were
silently swallowing. No command that succeeds changes its exit code.

### Bug Fixes

* correct web command examples, document Flux TTS/STT, and honor -o json
across account commands
([#97](#97))
([55984ec](55984ec))
* dependency floors that let dg update skip this release, and exit-code
+ error-stream correctness
([#102](#102))
([fd1e8a4](fd1e8a4))
* **deps:** raise deepctl-core floor to 0.2.16 in the eight packages
that import get_status_console
([98f9e91](98f9e91))
* **keys:** honor -o json so stdout stays parseable (completes the
[#97](#97) sweep)
([#101](#101))
([e430a77](e430a77))
</details>

<details><summary>deepctl-cmd-keys: 0.1.0</summary>

##
[0.1.0](deepctl-cmd-keys-v0.0.3...deepctl-cmd-keys-v0.1.0)
(2026-08-19)


### ⚠ BREAKING CHANGES

* `dg` now exits non-zero when a command fails: 1 for errors (including
crashes and usage errors), 2 for user interrupt, 0 on success. Every
command previously exited 0 regardless of outcome, so scripts and CI
steps that ignored the exit code will surface failures they were
silently swallowing. No command that succeeds changes its exit code.

### Bug Fixes

* dependency floors that let dg update skip this release, and exit-code
+ error-stream correctness
([#102](#102))
([fd1e8a4](fd1e8a4))
* **deps:** raise deepctl-core floor to 0.2.16 in the eight packages
that import get_status_console
([98f9e91](98f9e91))
* **keys:** honor -o json so stdout stays parseable (completes the
[#97](#97) sweep)
([#101](#101))
([e430a77](e430a77))
</details>

<details><summary>deepctl-cmd-read: 0.1.0</summary>

##
[0.1.0](deepctl-cmd-read-v0.0.2...deepctl-cmd-read-v0.1.0)
(2026-08-19)


### ⚠ BREAKING CHANGES

* `dg` now exits non-zero when a command fails: 1 for errors (including
crashes and usage errors), 2 for user interrupt, 0 on success. Every
command previously exited 0 regardless of outcome, so scripts and CI
steps that ignored the exit code will surface failures they were
silently swallowing. No command that succeeds changes its exit code.

### Bug Fixes

* correct web command examples, document Flux TTS/STT, and honor -o json
across account commands
([#97](#97))
([55984ec](55984ec))
* dependency floors that let dg update skip this release, and exit-code
+ error-stream correctness
([#102](#102))
([fd1e8a4](fd1e8a4))
* **deps:** raise deepctl-core floor to 0.2.16 in the eight packages
that import get_status_console
([98f9e91](98f9e91))
* **keys:** honor -o json so stdout stays parseable (completes the
[#97](#97) sweep)
([#101](#101))
([e430a77](e430a77))
</details>

<details><summary>deepctl-cmd-requests: 0.1.0</summary>

##
[0.1.0](deepctl-cmd-requests-v0.0.2...deepctl-cmd-requests-v0.1.0)
(2026-08-19)


### ⚠ BREAKING CHANGES

* `dg` now exits non-zero when a command fails: 1 for errors (including
crashes and usage errors), 2 for user interrupt, 0 on success. Every
command previously exited 0 regardless of outcome, so scripts and CI
steps that ignored the exit code will surface failures they were
silently swallowing. No command that succeeds changes its exit code.

### Bug Fixes

* correct web command examples, document Flux TTS/STT, and honor -o json
across account commands
([#97](#97))
([55984ec](55984ec))
* dependency floors that let dg update skip this release, and exit-code
+ error-stream correctness
([#102](#102))
([fd1e8a4](fd1e8a4))
* **deps:** raise deepctl-core floor to 0.2.16 in the eight packages
that import get_status_console
([98f9e91](98f9e91))
* **keys:** honor -o json so stdout stays parseable (completes the
[#97](#97) sweep)
([#101](#101))
([e430a77](e430a77))
</details>

<details><summary>deepctl-cmd-billing: 0.1.0</summary>

##
[0.1.0](deepctl-cmd-billing-v0.0.2...deepctl-cmd-billing-v0.1.0)
(2026-08-19)


### ⚠ BREAKING CHANGES

* `dg` now exits non-zero when a command fails: 1 for errors (including
crashes and usage errors), 2 for user interrupt, 0 on success. Every
command previously exited 0 regardless of outcome, so scripts and CI
steps that ignored the exit code will surface failures they were
silently swallowing. No command that succeeds changes its exit code.

### Bug Fixes

* correct web command examples, document Flux TTS/STT, and honor -o json
across account commands
([#97](#97))
([55984ec](55984ec))
* dependency floors that let dg update skip this release, and exit-code
+ error-stream correctness
([#102](#102))
([fd1e8a4](fd1e8a4))
* **deps:** raise deepctl-core floor to 0.2.16 in the eight packages
that import get_status_console
([98f9e91](98f9e91))
* **keys:** honor -o json so stdout stays parseable (completes the
[#97](#97) sweep)
([#101](#101))
([e430a77](e430a77))
</details>

<details><summary>deepctl-cmd-members: 0.1.0</summary>

##
[0.1.0](deepctl-cmd-members-v0.0.3...deepctl-cmd-members-v0.1.0)
(2026-08-19)


### ⚠ BREAKING CHANGES

* `dg` now exits non-zero when a command fails: 1 for errors (including
crashes and usage errors), 2 for user interrupt, 0 on success. Every
command previously exited 0 regardless of outcome, so scripts and CI
steps that ignored the exit code will surface failures they were
silently swallowing. No command that succeeds changes its exit code.

### Bug Fixes

* correct web command examples, document Flux TTS/STT, and honor -o json
across account commands
([#97](#97))
([55984ec](55984ec))
* dependency floors that let dg update skip this release, and exit-code
+ error-stream correctness
([#102](#102))
([fd1e8a4](fd1e8a4))
* **deps:** raise deepctl-core floor to 0.2.16 in the eight packages
that import get_status_console
([98f9e91](98f9e91))
* **keys:** honor -o json so stdout stays parseable (completes the
[#97](#97) sweep)
([#101](#101))
([e430a77](e430a77))
</details>

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
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