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.
- {deepctl-0.3.0/src/deepctl.egg-info → deepctl-0.3.2}/PKG-INFO +66 -30
- {deepctl-0.3.0 → deepctl-0.3.2}/README.md +44 -9
- {deepctl-0.3.0 → deepctl-0.3.2}/pyproject.toml +36 -22
- {deepctl-0.3.0 → deepctl-0.3.2}/src/deepctl/__init__.py +1 -1
- {deepctl-0.3.0 → deepctl-0.3.2}/src/deepctl/main.py +43 -0
- {deepctl-0.3.0 → deepctl-0.3.2/src/deepctl.egg-info}/PKG-INFO +66 -30
- {deepctl-0.3.0 → deepctl-0.3.2}/src/deepctl.egg-info/requires.txt +21 -20
- {deepctl-0.3.0 → deepctl-0.3.2}/LICENSE +0 -0
- {deepctl-0.3.0 → deepctl-0.3.2}/setup.cfg +0 -0
- {deepctl-0.3.0 → deepctl-0.3.2}/src/deepctl.egg-info/SOURCES.txt +0 -0
- {deepctl-0.3.0 → deepctl-0.3.2}/src/deepctl.egg-info/dependency_links.txt +0 -0
- {deepctl-0.3.0 → deepctl-0.3.2}/src/deepctl.egg-info/entry_points.txt +0 -0
- {deepctl-0.3.0 → deepctl-0.3.2}/src/deepctl.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepctl
|
|
3
|
-
Version: 0.3.
|
|
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.
|
|
31
|
-
Requires-Dist: deepctl-cmd-login>=0.1.
|
|
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.
|
|
34
|
-
Requires-Dist: deepctl-cmd-usage>=0.2.
|
|
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.
|
|
37
|
-
Requires-Dist: deepctl-cmd-debug>=0.1.
|
|
38
|
-
Requires-Dist: deepctl-cmd-debug-browser>=0.1.
|
|
39
|
-
Requires-Dist: deepctl-cmd-debug-network>=0.1.
|
|
40
|
-
Requires-Dist: deepctl-cmd-debug-audio>=0.1.
|
|
41
|
-
Requires-Dist: deepctl-cmd-debug-probe>=0.0.
|
|
42
|
-
Requires-Dist: deepctl-cmd-debug-toolkit>=0.0
|
|
43
|
-
Requires-Dist: deepctl-cmd-ffprobe>=0.0.
|
|
44
|
-
Requires-Dist: deepctl-cmd-update>=0.2.
|
|
45
|
-
Requires-Dist: deepctl-cmd-plugin>=0.1.
|
|
46
|
-
Requires-Dist: deepctl-cmd-skills>=0.0.
|
|
47
|
-
Requires-Dist: deepctl-cmd-init>=0.0.
|
|
48
|
-
Requires-Dist: deepctl-cmd-models>=0.1.
|
|
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.
|
|
57
|
-
Requires-Dist: deepctl-shared-utils>=0.1.
|
|
58
|
-
Requires-Dist: deepctl-telemetry>=0.0.
|
|
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
|
-
|
|
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
|
-
|
|
403
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
```
|
|
463
|
-
|
|
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
|
-
|
|
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
|
-
|
|
320
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
```
|
|
380
|
-
|
|
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.
|
|
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.
|
|
39
|
-
"deepctl-cmd-login>=0.1.
|
|
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.
|
|
42
|
-
"deepctl-cmd-usage>=0.2.
|
|
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.
|
|
45
|
-
"deepctl-cmd-debug>=0.1.
|
|
46
|
-
"deepctl-cmd-debug-browser>=0.1.
|
|
47
|
-
"deepctl-cmd-debug-network>=0.1.
|
|
48
|
-
"deepctl-cmd-debug-audio>=0.1.
|
|
49
|
-
"deepctl-cmd-debug-probe>=0.0.
|
|
50
|
-
"deepctl-cmd-debug-toolkit>=0.0
|
|
51
|
-
"deepctl-cmd-ffprobe>=0.0.
|
|
52
|
-
"deepctl-cmd-update>=0.2.
|
|
53
|
-
"deepctl-cmd-plugin>=0.1.
|
|
54
|
-
"deepctl-cmd-skills>=0.0.
|
|
55
|
-
"deepctl-cmd-init>=0.0.
|
|
56
|
-
"deepctl-cmd-models>=0.1.
|
|
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.
|
|
65
|
-
"deepctl-shared-utils>=0.1.
|
|
66
|
-
"deepctl-telemetry>=0.0.
|
|
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.
|
|
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.
|
|
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.
|
|
31
|
-
Requires-Dist: deepctl-cmd-login>=0.1.
|
|
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.
|
|
34
|
-
Requires-Dist: deepctl-cmd-usage>=0.2.
|
|
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.
|
|
37
|
-
Requires-Dist: deepctl-cmd-debug>=0.1.
|
|
38
|
-
Requires-Dist: deepctl-cmd-debug-browser>=0.1.
|
|
39
|
-
Requires-Dist: deepctl-cmd-debug-network>=0.1.
|
|
40
|
-
Requires-Dist: deepctl-cmd-debug-audio>=0.1.
|
|
41
|
-
Requires-Dist: deepctl-cmd-debug-probe>=0.0.
|
|
42
|
-
Requires-Dist: deepctl-cmd-debug-toolkit>=0.0
|
|
43
|
-
Requires-Dist: deepctl-cmd-ffprobe>=0.0.
|
|
44
|
-
Requires-Dist: deepctl-cmd-update>=0.2.
|
|
45
|
-
Requires-Dist: deepctl-cmd-plugin>=0.1.
|
|
46
|
-
Requires-Dist: deepctl-cmd-skills>=0.0.
|
|
47
|
-
Requires-Dist: deepctl-cmd-init>=0.0.
|
|
48
|
-
Requires-Dist: deepctl-cmd-models>=0.1.
|
|
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.
|
|
57
|
-
Requires-Dist: deepctl-shared-utils>=0.1.
|
|
58
|
-
Requires-Dist: deepctl-telemetry>=0.0.
|
|
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
|
-
|
|
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
|
-
|
|
403
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
```
|
|
463
|
-
|
|
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.
|
|
4
|
-
deepctl-cmd-login>=0.1.
|
|
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.
|
|
7
|
-
deepctl-cmd-usage>=0.2.
|
|
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.
|
|
10
|
-
deepctl-cmd-debug>=0.1.
|
|
11
|
-
deepctl-cmd-debug-browser>=0.1.
|
|
12
|
-
deepctl-cmd-debug-network>=0.1.
|
|
13
|
-
deepctl-cmd-debug-audio>=0.1.
|
|
14
|
-
deepctl-cmd-debug-probe>=0.0.
|
|
15
|
-
deepctl-cmd-debug-toolkit>=0.0
|
|
16
|
-
deepctl-cmd-ffprobe>=0.0.
|
|
17
|
-
deepctl-cmd-update>=0.2.
|
|
18
|
-
deepctl-cmd-plugin>=0.1.
|
|
19
|
-
deepctl-cmd-skills>=0.0.
|
|
20
|
-
deepctl-cmd-init>=0.0.
|
|
21
|
-
deepctl-cmd-models>=0.1.
|
|
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.
|
|
30
|
-
deepctl-shared-utils>=0.1.
|
|
31
|
-
deepctl-telemetry>=0.0.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|