deepctl 0.3.0__tar.gz → 0.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepctl
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: Official Deepgram CLI for speech recognition and audio intelligence
5
5
  Author-email: Deepgram <devrel@deepgram.com>
6
6
  Maintainer-email: Deepgram <devrel@deepgram.com>
@@ -27,25 +27,25 @@ Description-Content-Type: text/markdown
27
27
  License-File: LICENSE
28
28
  Requires-Dist: click>=8.0.0
29
29
  Requires-Dist: deepgram-sdk<8,>=7.7.0
30
- Requires-Dist: deepctl-core>=0.2.16
31
- Requires-Dist: deepctl-cmd-login>=0.1.17
30
+ Requires-Dist: deepctl-core>=0.2.18
31
+ Requires-Dist: deepctl-cmd-login>=0.1.19
32
32
  Requires-Dist: deepctl-cmd-projects>=0.2.0
33
- Requires-Dist: deepctl-cmd-transcribe>=0.1.10
34
- Requires-Dist: deepctl-cmd-usage>=0.2.0
33
+ Requires-Dist: deepctl-cmd-transcribe>=0.1.12
34
+ Requires-Dist: deepctl-cmd-usage>=0.2.1
35
35
  Requires-Dist: deepctl-cmd-mcp>=0.1.15
36
- Requires-Dist: deepctl-cmd-api>=0.0.1
37
- Requires-Dist: deepctl-cmd-debug>=0.1.10
38
- Requires-Dist: deepctl-cmd-debug-browser>=0.1.10
39
- Requires-Dist: deepctl-cmd-debug-network>=0.1.10
40
- Requires-Dist: deepctl-cmd-debug-audio>=0.1.10
41
- Requires-Dist: deepctl-cmd-debug-probe>=0.0.1
42
- Requires-Dist: deepctl-cmd-debug-toolkit>=0.0.1
43
- Requires-Dist: deepctl-cmd-ffprobe>=0.0.1
44
- Requires-Dist: deepctl-cmd-update>=0.2.6
45
- Requires-Dist: deepctl-cmd-plugin>=0.1.10
46
- Requires-Dist: deepctl-cmd-skills>=0.0.7
47
- Requires-Dist: deepctl-cmd-init>=0.0.1
48
- Requires-Dist: deepctl-cmd-models>=0.1.0
36
+ Requires-Dist: deepctl-cmd-api>=0.0.2
37
+ Requires-Dist: deepctl-cmd-debug>=0.1.13
38
+ Requires-Dist: deepctl-cmd-debug-browser>=0.1.12
39
+ Requires-Dist: deepctl-cmd-debug-network>=0.1.12
40
+ Requires-Dist: deepctl-cmd-debug-audio>=0.1.14
41
+ Requires-Dist: deepctl-cmd-debug-probe>=0.0.2
42
+ Requires-Dist: deepctl-cmd-debug-toolkit>=0.1.0
43
+ Requires-Dist: deepctl-cmd-ffprobe>=0.0.3
44
+ Requires-Dist: deepctl-cmd-update>=0.2.7
45
+ Requires-Dist: deepctl-cmd-plugin>=0.1.13
46
+ Requires-Dist: deepctl-cmd-skills>=0.0.8
47
+ Requires-Dist: deepctl-cmd-init>=0.0.4
48
+ Requires-Dist: deepctl-cmd-models>=0.1.1
49
49
  Requires-Dist: deepctl-cmd-speak>=0.0.4
50
50
  Requires-Dist: deepctl-cmd-keys>=0.1.0
51
51
  Requires-Dist: deepctl-cmd-read>=0.1.0
@@ -53,9 +53,9 @@ Requires-Dist: deepctl-cmd-listen>=0.0.14
53
53
  Requires-Dist: deepctl-cmd-requests>=0.1.0
54
54
  Requires-Dist: deepctl-cmd-billing>=0.1.0
55
55
  Requires-Dist: deepctl-cmd-members>=0.1.0
56
- Requires-Dist: deepctl-cmd-completion>=0.0.1
57
- Requires-Dist: deepctl-shared-utils>=0.1.10
58
- Requires-Dist: deepctl-telemetry>=0.0.6
56
+ Requires-Dist: deepctl-cmd-completion>=0.0.3
57
+ Requires-Dist: deepctl-shared-utils>=0.1.13
58
+ Requires-Dist: deepctl-telemetry>=0.0.7
59
59
  Requires-Dist: pydantic>=2.0.0
60
60
  Requires-Dist: rich>=13.0.0
61
61
  Requires-Dist: httpx>=0.24.0
@@ -74,6 +74,7 @@ Requires-Dist: pytest-timeout<3,>=2.3.1; extra == "dev"
74
74
  Requires-Dist: responses>=0.23.0; extra == "dev"
75
75
  Requires-Dist: ruff>=0.8.0; extra == "dev"
76
76
  Requires-Dist: mypy>=1.0.0; extra == "dev"
77
+ Requires-Dist: packaging>=23.0; extra == "dev"
77
78
  Requires-Dist: types-PyYAML>=6.0.0; extra == "dev"
78
79
  Requires-Dist: types-requests>=2.31.0; extra == "dev"
79
80
  Requires-Dist: pre-commit>=3.0.0; extra == "dev"
@@ -116,8 +117,8 @@ intelligence, and project management directly into your terminal. Aliases:
116
117
  **macOS / Linux (Homebrew):**
117
118
 
118
119
  ```bash
119
- brew tap deepgram/tap
120
- brew install deepgram
120
+ # Install and trust only the Deepgram formula.
121
+ brew install deepgram/tap/deepgram
121
122
  ```
122
123
 
123
124
  Homebrew brings in `ffmpeg` and `portaudio` automatically — `dg listen --mic`, `dg debug probe`, and raw audio piping all work without further setup. To upgrade later: `brew upgrade deepgram`.
@@ -399,8 +400,36 @@ dg keys --list -o csv
399
400
  dg usage --last-week -o yaml
400
401
  ```
401
402
 
402
- When running in a non-TTY environment (pipes, CI, or AI coding tools), the CLI
403
- automatically switches to structured JSON output with plain-text status messages.
403
+ In CI, in AI coding tools, and in any fully non-interactive environment with
404
+ no terminal attached (cron, systemd, `docker run` without `-t`), the CLI
405
+ detects the context and automatically switches to structured JSON output with
406
+ plain-text status messages. A plain pipe on its own does not trigger this —
407
+ `dg projects | jq` from an interactive shell still gets the human-readable
408
+ table, so pass `-o json` explicitly when you are piping by hand.
409
+
410
+ ### Exit codes
411
+
412
+ Since 0.3.0, `dg` exits non-zero when a command fails — branch on the exit
413
+ code, not on parsing output:
414
+
415
+ | Code | Meaning |
416
+ | --- | --- |
417
+ | `0` | Success |
418
+ | `1` | Error — a failed command, a crash, or a usage error (bad flag, unknown command) |
419
+ | `2` | Cancelled by the user (Ctrl-C, or declining a confirmation prompt) |
420
+
421
+ Note that `dg` reports `2` for an interrupt rather than the shell's
422
+ conventional `130`, so the code is the same whether the cancellation came from
423
+ Ctrl-C or from declining a prompt.
424
+
425
+ Human-readable status and error messages go to stderr, and stdout carries the
426
+ result. With an explicit structured-output mode, authentication-guard failures
427
+ and commands that return an error result write a payload with `"status":
428
+ "error"` to stdout — authentication failures, `dg ffprobe`, and `dg debug
429
+ audio` included. Usage errors and handler-raised exceptions report on stderr
430
+ and can leave stdout empty. Branch on the exit code rather than on whether
431
+ stdout parsed. If a CI step relied on `dg` always exiting `0` (every command
432
+ did, before 0.3.0), it will now fail where it previously passed silently.
404
433
 
405
434
  ### Forcing non-interactive mode
406
435
 
@@ -408,7 +437,7 @@ Three explicit ways to skip every prompt and run with defaults — useful from a
408
437
  real terminal where auto-detection wouldn't otherwise trigger:
409
438
 
410
439
  ```bash
411
- # Global flag (works at any position)
440
+ # Global flag (before any command, or after a leaf command)
412
441
  dg --non-interactive listen recording.wav
413
442
  dg listen --non-interactive recording.wav
414
443
 
@@ -445,7 +474,10 @@ dg profiles --list # List profiles
445
474
  dg profiles --switch staging # Switch profile
446
475
  ```
447
476
 
448
- Output format on any command: `--output json|yaml|table|csv`
477
+ For structured output, use `--output json|yaml|table|csv` after leaf commands
478
+ that do not define their own output option, or before any command as a global
479
+ flag: `dg --output json <command>`. `dg speak --output FILE` writes audio to
480
+ `FILE`, so use `dg --output json speak ...` for Speak's structured output.
449
481
 
450
482
  ## Telemetry
451
483
 
@@ -457,10 +489,14 @@ The CLI phones home anonymous error reports to help us catch crashes and regress
457
489
 
458
490
  ### Opt out
459
491
 
460
- Persistent (recommended):
492
+ Persistent (recommended) — add this to your `config.yaml`
493
+ (`~/.config/deepctl/config.yaml` on Linux,
494
+ `~/Library/Application Support/deepctl/config.yaml` on macOS,
495
+ `%LOCALAPPDATA%\deepgram\deepctl\config.yaml` on Windows):
461
496
 
462
- ```bash
463
- dg config set telemetry.enabled false
497
+ ```yaml
498
+ telemetry:
499
+ enabled: false
464
500
  ```
465
501
 
466
502
  One-shot (CI, scripts, single command):
@@ -33,8 +33,8 @@ intelligence, and project management directly into your terminal. Aliases:
33
33
  **macOS / Linux (Homebrew):**
34
34
 
35
35
  ```bash
36
- brew tap deepgram/tap
37
- brew install deepgram
36
+ # Install and trust only the Deepgram formula.
37
+ brew install deepgram/tap/deepgram
38
38
  ```
39
39
 
40
40
  Homebrew brings in `ffmpeg` and `portaudio` automatically — `dg listen --mic`, `dg debug probe`, and raw audio piping all work without further setup. To upgrade later: `brew upgrade deepgram`.
@@ -316,8 +316,36 @@ dg keys --list -o csv
316
316
  dg usage --last-week -o yaml
317
317
  ```
318
318
 
319
- When running in a non-TTY environment (pipes, CI, or AI coding tools), the CLI
320
- automatically switches to structured JSON output with plain-text status messages.
319
+ In CI, in AI coding tools, and in any fully non-interactive environment with
320
+ no terminal attached (cron, systemd, `docker run` without `-t`), the CLI
321
+ detects the context and automatically switches to structured JSON output with
322
+ plain-text status messages. A plain pipe on its own does not trigger this —
323
+ `dg projects | jq` from an interactive shell still gets the human-readable
324
+ table, so pass `-o json` explicitly when you are piping by hand.
325
+
326
+ ### Exit codes
327
+
328
+ Since 0.3.0, `dg` exits non-zero when a command fails — branch on the exit
329
+ code, not on parsing output:
330
+
331
+ | Code | Meaning |
332
+ | --- | --- |
333
+ | `0` | Success |
334
+ | `1` | Error — a failed command, a crash, or a usage error (bad flag, unknown command) |
335
+ | `2` | Cancelled by the user (Ctrl-C, or declining a confirmation prompt) |
336
+
337
+ Note that `dg` reports `2` for an interrupt rather than the shell's
338
+ conventional `130`, so the code is the same whether the cancellation came from
339
+ Ctrl-C or from declining a prompt.
340
+
341
+ Human-readable status and error messages go to stderr, and stdout carries the
342
+ result. With an explicit structured-output mode, authentication-guard failures
343
+ and commands that return an error result write a payload with `"status":
344
+ "error"` to stdout — authentication failures, `dg ffprobe`, and `dg debug
345
+ audio` included. Usage errors and handler-raised exceptions report on stderr
346
+ and can leave stdout empty. Branch on the exit code rather than on whether
347
+ stdout parsed. If a CI step relied on `dg` always exiting `0` (every command
348
+ did, before 0.3.0), it will now fail where it previously passed silently.
321
349
 
322
350
  ### Forcing non-interactive mode
323
351
 
@@ -325,7 +353,7 @@ Three explicit ways to skip every prompt and run with defaults — useful from a
325
353
  real terminal where auto-detection wouldn't otherwise trigger:
326
354
 
327
355
  ```bash
328
- # Global flag (works at any position)
356
+ # Global flag (before any command, or after a leaf command)
329
357
  dg --non-interactive listen recording.wav
330
358
  dg listen --non-interactive recording.wav
331
359
 
@@ -362,7 +390,10 @@ dg profiles --list # List profiles
362
390
  dg profiles --switch staging # Switch profile
363
391
  ```
364
392
 
365
- Output format on any command: `--output json|yaml|table|csv`
393
+ For structured output, use `--output json|yaml|table|csv` after leaf commands
394
+ that do not define their own output option, or before any command as a global
395
+ flag: `dg --output json <command>`. `dg speak --output FILE` writes audio to
396
+ `FILE`, so use `dg --output json speak ...` for Speak's structured output.
366
397
 
367
398
  ## Telemetry
368
399
 
@@ -374,10 +405,14 @@ The CLI phones home anonymous error reports to help us catch crashes and regress
374
405
 
375
406
  ### Opt out
376
407
 
377
- Persistent (recommended):
408
+ Persistent (recommended) — add this to your `config.yaml`
409
+ (`~/.config/deepctl/config.yaml` on Linux,
410
+ `~/Library/Application Support/deepctl/config.yaml` on macOS,
411
+ `%LOCALAPPDATA%\deepgram\deepctl\config.yaml` on Windows):
378
412
 
379
- ```bash
380
- dg config set telemetry.enabled false
413
+ ```yaml
414
+ telemetry:
415
+ enabled: false
381
416
  ```
382
417
 
383
418
  One-shot (CI, scripts, single command):
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "deepctl"
7
- version = "0.3.0" # x-release-please-version
7
+ version = "0.3.2" # x-release-please-version
8
8
  description = "Official Deepgram CLI for speech recognition and audio intelligence"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -35,25 +35,25 @@ requires-python = ">=3.10"
35
35
  dependencies = [
36
36
  "click>=8.0.0",
37
37
  "deepgram-sdk>=7.7.0,<8",
38
- "deepctl-core>=0.2.16",
39
- "deepctl-cmd-login>=0.1.17",
38
+ "deepctl-core>=0.2.18",
39
+ "deepctl-cmd-login>=0.1.19",
40
40
  "deepctl-cmd-projects>=0.2.0",
41
- "deepctl-cmd-transcribe>=0.1.10",
42
- "deepctl-cmd-usage>=0.2.0",
41
+ "deepctl-cmd-transcribe>=0.1.12",
42
+ "deepctl-cmd-usage>=0.2.1",
43
43
  "deepctl-cmd-mcp>=0.1.15",
44
- "deepctl-cmd-api>=0.0.1",
45
- "deepctl-cmd-debug>=0.1.10",
46
- "deepctl-cmd-debug-browser>=0.1.10",
47
- "deepctl-cmd-debug-network>=0.1.10",
48
- "deepctl-cmd-debug-audio>=0.1.10",
49
- "deepctl-cmd-debug-probe>=0.0.1",
50
- "deepctl-cmd-debug-toolkit>=0.0.1",
51
- "deepctl-cmd-ffprobe>=0.0.1",
52
- "deepctl-cmd-update>=0.2.6",
53
- "deepctl-cmd-plugin>=0.1.10",
54
- "deepctl-cmd-skills>=0.0.7",
55
- "deepctl-cmd-init>=0.0.1",
56
- "deepctl-cmd-models>=0.1.0",
44
+ "deepctl-cmd-api>=0.0.2",
45
+ "deepctl-cmd-debug>=0.1.13",
46
+ "deepctl-cmd-debug-browser>=0.1.12",
47
+ "deepctl-cmd-debug-network>=0.1.12",
48
+ "deepctl-cmd-debug-audio>=0.1.14",
49
+ "deepctl-cmd-debug-probe>=0.0.2",
50
+ "deepctl-cmd-debug-toolkit>=0.1.0",
51
+ "deepctl-cmd-ffprobe>=0.0.3",
52
+ "deepctl-cmd-update>=0.2.7",
53
+ "deepctl-cmd-plugin>=0.1.13",
54
+ "deepctl-cmd-skills>=0.0.8",
55
+ "deepctl-cmd-init>=0.0.4",
56
+ "deepctl-cmd-models>=0.1.1",
57
57
  "deepctl-cmd-speak>=0.0.4",
58
58
  "deepctl-cmd-keys>=0.1.0",
59
59
  "deepctl-cmd-read>=0.1.0",
@@ -61,9 +61,9 @@ dependencies = [
61
61
  "deepctl-cmd-requests>=0.1.0",
62
62
  "deepctl-cmd-billing>=0.1.0",
63
63
  "deepctl-cmd-members>=0.1.0",
64
- "deepctl-cmd-completion>=0.0.1",
65
- "deepctl-shared-utils>=0.1.10",
66
- "deepctl-telemetry>=0.0.6",
64
+ "deepctl-cmd-completion>=0.0.3",
65
+ "deepctl-shared-utils>=0.1.13",
66
+ "deepctl-telemetry>=0.0.7",
67
67
  "pydantic>=2.0.0",
68
68
  "rich>=13.0.0",
69
69
  "httpx>=0.24.0",
@@ -87,6 +87,7 @@ dev = [
87
87
  # Code Quality
88
88
  "ruff>=0.8.0",
89
89
  "mypy>=1.0.0",
90
+ "packaging>=23.0",
90
91
  # Type Stubs
91
92
  "types-PyYAML>=6.0.0",
92
93
  "types-requests>=2.31.0",
@@ -128,7 +129,13 @@ include = ["deepctl*"]
128
129
  [tool.mypy]
129
130
  python_version = "3.10"
130
131
  strict = true
131
- files = "src/,packages/*/src"
132
+ files = "src/,packages/*/src,scripts/"
133
+
134
+ [[tool.mypy.overrides]]
135
+ module = ["tomli"]
136
+ # The pre-3.11 fallback for tomllib in scripts/. It is not installed, and
137
+ # mypy checks that branch because python_version is pinned to 3.10.
138
+ ignore_missing_imports = true
132
139
 
133
140
  [[tool.mypy.overrides]]
134
141
  module = "deepctl_cmd_mcp.*"
@@ -232,6 +239,10 @@ members = ["packages/*"]
232
239
  [dependency-groups]
233
240
  testing = [
234
241
  "pytest>=7.0.0",
242
+ # scripts/check_dependency_floors.py reads pyproject files; on 3.10 it
243
+ # falls back to tomli, and tests/unit/test_dependency_floors.py drives
244
+ # the real script on every version in the CI matrix.
245
+ "tomli>=2.0; python_version < '3.11'",
235
246
  "pytest-asyncio>=0.21.0",
236
247
  "pytest-cov>=4.0.0",
237
248
  "pytest-mock>=3.10.0",
@@ -244,6 +255,9 @@ dev = [
244
255
  # Code Quality
245
256
  "ruff>=0.8.0",
246
257
  "mypy>=1.0.0",
258
+ # PEP 440 comparisons in scripts/check_dependency_floors.py. Declared
259
+ # rather than leaned on as a transitive of build/twine.
260
+ "packaging>=23.0",
247
261
  # Type Stubs
248
262
  "types-pyyaml>=6.0.12.20250516",
249
263
  "types-requests>=2.32.4.20250611",
@@ -1,7 +1,7 @@
1
1
  """deepctl - Official command-line interface for Deepgram's speech
2
2
  recognition API."""
3
3
 
4
- __version__ = "0.3.0" # x-release-please-version
4
+ __version__ = "0.3.2" # x-release-please-version
5
5
  __author__ = "Deepgram"
6
6
  __email__ = "devrel@deepgram.com"
7
7
  __license__ = "MIT"
@@ -287,6 +287,38 @@ def _telemetry_transaction() -> Iterator[None]:
287
287
  yield
288
288
 
289
289
 
290
+ def _global_option_hint(message: str) -> str | None:
291
+ """Build a placement hint when a 'No such option' names a global option.
292
+
293
+ Global options belong before the subcommand (``dg -o json models``).
294
+ When one is placed after the subcommand instead (``dg models --profile
295
+ staging``), Click reports "No such option" with no explanation, which
296
+ reads as if the option does not exist at all. This looks the failing
297
+ option up on the root group and, when it is a global one, returns a
298
+ hint showing the working placement.
299
+ """
300
+ import re
301
+
302
+ match = re.search(r"[Nn]o such option:?\s*'?(--?[A-Za-z][\w-]*)'?", message)
303
+ if not match:
304
+ return None
305
+ token = match.group(1)
306
+
307
+ for param in cli.params:
308
+ opts = list(getattr(param, "opts", [])) + list(
309
+ getattr(param, "secondary_opts", [])
310
+ )
311
+ if token in opts:
312
+ takes_value = not getattr(param, "is_flag", False)
313
+ usage = f"{token} <value>" if takes_value else token
314
+ return (
315
+ f"[yellow]Hint: '{token}' is a global option and must come "
316
+ f"before the subcommand, for example: "
317
+ f"dg {usage} <command> ...[/yellow]"
318
+ )
319
+ return None
320
+
321
+
290
322
  def _safe_console_print(message: str) -> None:
291
323
  """Print a diagnostic to stderr, tolerating a closed/broken stream.
292
324
 
@@ -401,6 +433,17 @@ def main() -> None:
401
433
  # Abort, not KeyboardInterrupt. Both are user cancellation: exit 2.
402
434
  _safe_console_print("\n[yellow]Operation cancelled by user[/yellow]")
403
435
  sys.exit(2)
436
+ except click.UsageError as e:
437
+ # Keep the published exit-code contract (1 = error), but explain the
438
+ # one failure mode that reads as a lie: a *global* option placed
439
+ # after the subcommand, where Click says "No such option" about an
440
+ # option that very much exists.
441
+ message = e.format_message()
442
+ _safe_console_print(f"[red]Error: {message}[/red]")
443
+ hint = _global_option_hint(message)
444
+ if hint:
445
+ _safe_console_print(hint)
446
+ sys.exit(1)
404
447
  except Exception as e:
405
448
  _safe_console_print(f"[red]Error: {e}[/red]")
406
449
  sys.exit(1) # 1 = error; 2 is reserved for user interrupt
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepctl
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: Official Deepgram CLI for speech recognition and audio intelligence
5
5
  Author-email: Deepgram <devrel@deepgram.com>
6
6
  Maintainer-email: Deepgram <devrel@deepgram.com>
@@ -27,25 +27,25 @@ Description-Content-Type: text/markdown
27
27
  License-File: LICENSE
28
28
  Requires-Dist: click>=8.0.0
29
29
  Requires-Dist: deepgram-sdk<8,>=7.7.0
30
- Requires-Dist: deepctl-core>=0.2.16
31
- Requires-Dist: deepctl-cmd-login>=0.1.17
30
+ Requires-Dist: deepctl-core>=0.2.18
31
+ Requires-Dist: deepctl-cmd-login>=0.1.19
32
32
  Requires-Dist: deepctl-cmd-projects>=0.2.0
33
- Requires-Dist: deepctl-cmd-transcribe>=0.1.10
34
- Requires-Dist: deepctl-cmd-usage>=0.2.0
33
+ Requires-Dist: deepctl-cmd-transcribe>=0.1.12
34
+ Requires-Dist: deepctl-cmd-usage>=0.2.1
35
35
  Requires-Dist: deepctl-cmd-mcp>=0.1.15
36
- Requires-Dist: deepctl-cmd-api>=0.0.1
37
- Requires-Dist: deepctl-cmd-debug>=0.1.10
38
- Requires-Dist: deepctl-cmd-debug-browser>=0.1.10
39
- Requires-Dist: deepctl-cmd-debug-network>=0.1.10
40
- Requires-Dist: deepctl-cmd-debug-audio>=0.1.10
41
- Requires-Dist: deepctl-cmd-debug-probe>=0.0.1
42
- Requires-Dist: deepctl-cmd-debug-toolkit>=0.0.1
43
- Requires-Dist: deepctl-cmd-ffprobe>=0.0.1
44
- Requires-Dist: deepctl-cmd-update>=0.2.6
45
- Requires-Dist: deepctl-cmd-plugin>=0.1.10
46
- Requires-Dist: deepctl-cmd-skills>=0.0.7
47
- Requires-Dist: deepctl-cmd-init>=0.0.1
48
- Requires-Dist: deepctl-cmd-models>=0.1.0
36
+ Requires-Dist: deepctl-cmd-api>=0.0.2
37
+ Requires-Dist: deepctl-cmd-debug>=0.1.13
38
+ Requires-Dist: deepctl-cmd-debug-browser>=0.1.12
39
+ Requires-Dist: deepctl-cmd-debug-network>=0.1.12
40
+ Requires-Dist: deepctl-cmd-debug-audio>=0.1.14
41
+ Requires-Dist: deepctl-cmd-debug-probe>=0.0.2
42
+ Requires-Dist: deepctl-cmd-debug-toolkit>=0.1.0
43
+ Requires-Dist: deepctl-cmd-ffprobe>=0.0.3
44
+ Requires-Dist: deepctl-cmd-update>=0.2.7
45
+ Requires-Dist: deepctl-cmd-plugin>=0.1.13
46
+ Requires-Dist: deepctl-cmd-skills>=0.0.8
47
+ Requires-Dist: deepctl-cmd-init>=0.0.4
48
+ Requires-Dist: deepctl-cmd-models>=0.1.1
49
49
  Requires-Dist: deepctl-cmd-speak>=0.0.4
50
50
  Requires-Dist: deepctl-cmd-keys>=0.1.0
51
51
  Requires-Dist: deepctl-cmd-read>=0.1.0
@@ -53,9 +53,9 @@ Requires-Dist: deepctl-cmd-listen>=0.0.14
53
53
  Requires-Dist: deepctl-cmd-requests>=0.1.0
54
54
  Requires-Dist: deepctl-cmd-billing>=0.1.0
55
55
  Requires-Dist: deepctl-cmd-members>=0.1.0
56
- Requires-Dist: deepctl-cmd-completion>=0.0.1
57
- Requires-Dist: deepctl-shared-utils>=0.1.10
58
- Requires-Dist: deepctl-telemetry>=0.0.6
56
+ Requires-Dist: deepctl-cmd-completion>=0.0.3
57
+ Requires-Dist: deepctl-shared-utils>=0.1.13
58
+ Requires-Dist: deepctl-telemetry>=0.0.7
59
59
  Requires-Dist: pydantic>=2.0.0
60
60
  Requires-Dist: rich>=13.0.0
61
61
  Requires-Dist: httpx>=0.24.0
@@ -74,6 +74,7 @@ Requires-Dist: pytest-timeout<3,>=2.3.1; extra == "dev"
74
74
  Requires-Dist: responses>=0.23.0; extra == "dev"
75
75
  Requires-Dist: ruff>=0.8.0; extra == "dev"
76
76
  Requires-Dist: mypy>=1.0.0; extra == "dev"
77
+ Requires-Dist: packaging>=23.0; extra == "dev"
77
78
  Requires-Dist: types-PyYAML>=6.0.0; extra == "dev"
78
79
  Requires-Dist: types-requests>=2.31.0; extra == "dev"
79
80
  Requires-Dist: pre-commit>=3.0.0; extra == "dev"
@@ -116,8 +117,8 @@ intelligence, and project management directly into your terminal. Aliases:
116
117
  **macOS / Linux (Homebrew):**
117
118
 
118
119
  ```bash
119
- brew tap deepgram/tap
120
- brew install deepgram
120
+ # Install and trust only the Deepgram formula.
121
+ brew install deepgram/tap/deepgram
121
122
  ```
122
123
 
123
124
  Homebrew brings in `ffmpeg` and `portaudio` automatically — `dg listen --mic`, `dg debug probe`, and raw audio piping all work without further setup. To upgrade later: `brew upgrade deepgram`.
@@ -399,8 +400,36 @@ dg keys --list -o csv
399
400
  dg usage --last-week -o yaml
400
401
  ```
401
402
 
402
- When running in a non-TTY environment (pipes, CI, or AI coding tools), the CLI
403
- automatically switches to structured JSON output with plain-text status messages.
403
+ In CI, in AI coding tools, and in any fully non-interactive environment with
404
+ no terminal attached (cron, systemd, `docker run` without `-t`), the CLI
405
+ detects the context and automatically switches to structured JSON output with
406
+ plain-text status messages. A plain pipe on its own does not trigger this —
407
+ `dg projects | jq` from an interactive shell still gets the human-readable
408
+ table, so pass `-o json` explicitly when you are piping by hand.
409
+
410
+ ### Exit codes
411
+
412
+ Since 0.3.0, `dg` exits non-zero when a command fails — branch on the exit
413
+ code, not on parsing output:
414
+
415
+ | Code | Meaning |
416
+ | --- | --- |
417
+ | `0` | Success |
418
+ | `1` | Error — a failed command, a crash, or a usage error (bad flag, unknown command) |
419
+ | `2` | Cancelled by the user (Ctrl-C, or declining a confirmation prompt) |
420
+
421
+ Note that `dg` reports `2` for an interrupt rather than the shell's
422
+ conventional `130`, so the code is the same whether the cancellation came from
423
+ Ctrl-C or from declining a prompt.
424
+
425
+ Human-readable status and error messages go to stderr, and stdout carries the
426
+ result. With an explicit structured-output mode, authentication-guard failures
427
+ and commands that return an error result write a payload with `"status":
428
+ "error"` to stdout — authentication failures, `dg ffprobe`, and `dg debug
429
+ audio` included. Usage errors and handler-raised exceptions report on stderr
430
+ and can leave stdout empty. Branch on the exit code rather than on whether
431
+ stdout parsed. If a CI step relied on `dg` always exiting `0` (every command
432
+ did, before 0.3.0), it will now fail where it previously passed silently.
404
433
 
405
434
  ### Forcing non-interactive mode
406
435
 
@@ -408,7 +437,7 @@ Three explicit ways to skip every prompt and run with defaults — useful from a
408
437
  real terminal where auto-detection wouldn't otherwise trigger:
409
438
 
410
439
  ```bash
411
- # Global flag (works at any position)
440
+ # Global flag (before any command, or after a leaf command)
412
441
  dg --non-interactive listen recording.wav
413
442
  dg listen --non-interactive recording.wav
414
443
 
@@ -445,7 +474,10 @@ dg profiles --list # List profiles
445
474
  dg profiles --switch staging # Switch profile
446
475
  ```
447
476
 
448
- Output format on any command: `--output json|yaml|table|csv`
477
+ For structured output, use `--output json|yaml|table|csv` after leaf commands
478
+ that do not define their own output option, or before any command as a global
479
+ flag: `dg --output json <command>`. `dg speak --output FILE` writes audio to
480
+ `FILE`, so use `dg --output json speak ...` for Speak's structured output.
449
481
 
450
482
  ## Telemetry
451
483
 
@@ -457,10 +489,14 @@ The CLI phones home anonymous error reports to help us catch crashes and regress
457
489
 
458
490
  ### Opt out
459
491
 
460
- Persistent (recommended):
492
+ Persistent (recommended) — add this to your `config.yaml`
493
+ (`~/.config/deepctl/config.yaml` on Linux,
494
+ `~/Library/Application Support/deepctl/config.yaml` on macOS,
495
+ `%LOCALAPPDATA%\deepgram\deepctl\config.yaml` on Windows):
461
496
 
462
- ```bash
463
- dg config set telemetry.enabled false
497
+ ```yaml
498
+ telemetry:
499
+ enabled: false
464
500
  ```
465
501
 
466
502
  One-shot (CI, scripts, single command):
@@ -1,24 +1,24 @@
1
1
  click>=8.0.0
2
2
  deepgram-sdk<8,>=7.7.0
3
- deepctl-core>=0.2.16
4
- deepctl-cmd-login>=0.1.17
3
+ deepctl-core>=0.2.18
4
+ deepctl-cmd-login>=0.1.19
5
5
  deepctl-cmd-projects>=0.2.0
6
- deepctl-cmd-transcribe>=0.1.10
7
- deepctl-cmd-usage>=0.2.0
6
+ deepctl-cmd-transcribe>=0.1.12
7
+ deepctl-cmd-usage>=0.2.1
8
8
  deepctl-cmd-mcp>=0.1.15
9
- deepctl-cmd-api>=0.0.1
10
- deepctl-cmd-debug>=0.1.10
11
- deepctl-cmd-debug-browser>=0.1.10
12
- deepctl-cmd-debug-network>=0.1.10
13
- deepctl-cmd-debug-audio>=0.1.10
14
- deepctl-cmd-debug-probe>=0.0.1
15
- deepctl-cmd-debug-toolkit>=0.0.1
16
- deepctl-cmd-ffprobe>=0.0.1
17
- deepctl-cmd-update>=0.2.6
18
- deepctl-cmd-plugin>=0.1.10
19
- deepctl-cmd-skills>=0.0.7
20
- deepctl-cmd-init>=0.0.1
21
- deepctl-cmd-models>=0.1.0
9
+ deepctl-cmd-api>=0.0.2
10
+ deepctl-cmd-debug>=0.1.13
11
+ deepctl-cmd-debug-browser>=0.1.12
12
+ deepctl-cmd-debug-network>=0.1.12
13
+ deepctl-cmd-debug-audio>=0.1.14
14
+ deepctl-cmd-debug-probe>=0.0.2
15
+ deepctl-cmd-debug-toolkit>=0.1.0
16
+ deepctl-cmd-ffprobe>=0.0.3
17
+ deepctl-cmd-update>=0.2.7
18
+ deepctl-cmd-plugin>=0.1.13
19
+ deepctl-cmd-skills>=0.0.8
20
+ deepctl-cmd-init>=0.0.4
21
+ deepctl-cmd-models>=0.1.1
22
22
  deepctl-cmd-speak>=0.0.4
23
23
  deepctl-cmd-keys>=0.1.0
24
24
  deepctl-cmd-read>=0.1.0
@@ -26,9 +26,9 @@ deepctl-cmd-listen>=0.0.14
26
26
  deepctl-cmd-requests>=0.1.0
27
27
  deepctl-cmd-billing>=0.1.0
28
28
  deepctl-cmd-members>=0.1.0
29
- deepctl-cmd-completion>=0.0.1
30
- deepctl-shared-utils>=0.1.10
31
- deepctl-telemetry>=0.0.6
29
+ deepctl-cmd-completion>=0.0.3
30
+ deepctl-shared-utils>=0.1.13
31
+ deepctl-telemetry>=0.0.7
32
32
  pydantic>=2.0.0
33
33
  rich>=13.0.0
34
34
  httpx>=0.24.0
@@ -48,6 +48,7 @@ pytest-timeout<3,>=2.3.1
48
48
  responses>=0.23.0
49
49
  ruff>=0.8.0
50
50
  mypy>=1.0.0
51
+ packaging>=23.0
51
52
  types-PyYAML>=6.0.0
52
53
  types-requests>=2.31.0
53
54
  pre-commit>=3.0.0
File without changes
File without changes