deepctl-cmd-plugin 0.1.12__tar.gz → 0.1.14__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_cmd_plugin-0.1.12 → deepctl_cmd_plugin-0.1.14}/.gitignore +5 -1
- deepctl_cmd_plugin-0.1.14/CHANGELOG.md +50 -0
- {deepctl_cmd_plugin-0.1.12 → deepctl_cmd_plugin-0.1.14}/PKG-INFO +3 -3
- {deepctl_cmd_plugin-0.1.12 → deepctl_cmd_plugin-0.1.14}/pyproject.toml +2 -2
- {deepctl_cmd_plugin-0.1.12 → deepctl_cmd_plugin-0.1.14}/src/deepctl_cmd_plugin/command.py +38 -35
- deepctl_cmd_plugin-0.1.14/tests/unit/test_plugin_command.py +1151 -0
- deepctl_cmd_plugin-0.1.14/tests/unit/test_plugin_legacy_v03.py +94 -0
- deepctl_cmd_plugin-0.1.12/CHANGELOG.md +0 -26
- deepctl_cmd_plugin-0.1.12/tests/unit/test_plugin_command.py +0 -560
- {deepctl_cmd_plugin-0.1.12 → deepctl_cmd_plugin-0.1.14}/README.md +0 -0
- {deepctl_cmd_plugin-0.1.12 → deepctl_cmd_plugin-0.1.14}/src/deepctl_cmd_plugin/__init__.py +0 -0
- {deepctl_cmd_plugin-0.1.12 → deepctl_cmd_plugin-0.1.14}/src/deepctl_cmd_plugin/models.py +0 -0
- {deepctl_cmd_plugin-0.1.12 → deepctl_cmd_plugin-0.1.14}/src/deepctl_cmd_plugin/strategies.py +0 -0
- {deepctl_cmd_plugin-0.1.12 → deepctl_cmd_plugin-0.1.14}/tests/__init__.py +0 -0
- {deepctl_cmd_plugin-0.1.12 → deepctl_cmd_plugin-0.1.14}/tests/unit/__init__.py +0 -0
- {deepctl_cmd_plugin-0.1.12 → deepctl_cmd_plugin-0.1.14}/tests/unit/test_strategies.py +0 -0
|
@@ -129,7 +129,8 @@ dmypy.json
|
|
|
129
129
|
|
|
130
130
|
# uv
|
|
131
131
|
.uv_cache/
|
|
132
|
-
uv.lock
|
|
132
|
+
# uv.lock IS committed: it pins the dev/CI environment so every run tests
|
|
133
|
+
# the same versions and dependency drift arrives as a reviewable PR.
|
|
133
134
|
|
|
134
135
|
# IDEs
|
|
135
136
|
.vscode/
|
|
@@ -138,6 +139,9 @@ uv.lock
|
|
|
138
139
|
*.swo
|
|
139
140
|
*~
|
|
140
141
|
|
|
142
|
+
# Claude Code local state (worktrees, session files)
|
|
143
|
+
.claude/
|
|
144
|
+
|
|
141
145
|
# OS
|
|
142
146
|
.DS_Store
|
|
143
147
|
.DS_Store?
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [0.1.14](https://github.com/deepgram/cli/compare/deepctl-cmd-plugin-v0.1.13...deepctl-cmd-plugin-v0.1.14) (2026-10-09)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **skills:** prove and remove deepctl 0.3.x skill files after the new folders land ([f65e0e2](https://github.com/deepgram/cli/commit/f65e0e22868b3d8f7ac4e81d9163045aca3383ec))
|
|
9
|
+
* **skills:** remove the deepctl 0.3.x skill files deepctl can prove it wrote ([#130](https://github.com/deepgram/cli/issues/130)) ([8be5172](https://github.com/deepgram/cli/commit/8be5172fc8d101dbcb60f5b1fb7b36e5f4cfbcff))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
* **skills:** install skills from login and plugin through the shared installer ([1d34a22](https://github.com/deepgram/cli/commit/1d34a22c6b6c6ee2d87b3ee83657e7c28998a8fd))
|
|
15
|
+
* **skills:** keep a newer skills ref and a removed tool when a refresh overlaps ([#126](https://github.com/deepgram/cli/issues/126)) ([3c9d1cf](https://github.com/deepgram/cli/commit/3c9d1cf3121a649a67b74ca9992cafdb0f2159ac))
|
|
16
|
+
* **skills:** login and plugin install skills through the shared installer ([#125](https://github.com/deepgram/cli/issues/125)) ([3675f7a](https://github.com/deepgram/cli/commit/3675f7a21a34f59a6d1ab5c1c463149fec66d0e3))
|
|
17
|
+
* **skills:** re-check records in dg skills update and the plugin refresh ([b0b1595](https://github.com/deepgram/cli/commit/b0b15959214085e818a551f1c37cfb1645001c6a))
|
|
18
|
+
|
|
19
|
+
## [0.1.13](https://github.com/deepgram/cli/compare/deepctl-cmd-plugin-v0.1.12...deepctl-cmd-plugin-v0.1.13) (2026-09-23)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
### Bug Fixes
|
|
23
|
+
|
|
24
|
+
* **plugin:** return exit code 2, rather than success, when plugin removal is cancelled ([0dcfd2c](https://github.com/deepgram/cli/commit/0dcfd2c0d68a6095f4f6651e51ba6995f2b430d3))
|
|
25
|
+
* **plugin:** write the plugin-removal confirmation prompt to stderr so JSON output stays parseable ([0497ac1](https://github.com/deepgram/cli/commit/0497ac1892333c09d2a482f0b10ccd59d1f1dba2))
|
|
26
|
+
|
|
27
|
+
## [0.1.12](https://github.com/deepgram/cli/compare/deepctl-cmd-plugin-v0.1.11...deepctl-cmd-plugin-v0.1.12) (2026-05-09)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
### Features
|
|
31
|
+
|
|
32
|
+
* **telemetry:** full Sentry observability + per-command usage tags ([#75](https://github.com/deepgram/cli/issues/75)) ([0fe43d2](https://github.com/deepgram/cli/commit/0fe43d2e00c58d8101ef2bd4b5aaf4437db9f0cf))
|
|
33
|
+
|
|
34
|
+
## [0.1.11](https://github.com/deepgram/cli/compare/deepctl-cmd-plugin-v0.1.10...deepctl-cmd-plugin-v0.1.11) (2026-03-09)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
### Features
|
|
38
|
+
|
|
39
|
+
* Add plugin search command with hardcoded registry ([bd533cb](https://github.com/deepgram/cli/commit/bd533cb4b90b531fc522c4b2fd9a582d05d7861a))
|
|
40
|
+
* Add universal plugin support for all installation methods ([6c6d3c3](https://github.com/deepgram/cli/commit/6c6d3c3f87a3451c9474e8a1bcde6bd0148d4acc))
|
|
41
|
+
* **mcp:** fix auth, switch to streamable-http, and improve READMEs ([8e76d60](https://github.com/deepgram/cli/commit/8e76d6096ec319b5f0c85d57b299a7f05a60b5a8))
|
|
42
|
+
* **plugin:** add install-aware plugin system with venv bridge and strategy pattern ([7dd849b](https://github.com/deepgram/cli/commit/7dd849b6d5cc66fc6a9d54d665aad8909830b5ef))
|
|
43
|
+
* **skills:** add `deepctl skills` command and agent-native CLI metadata ([5654d40](https://github.com/deepgram/cli/commit/5654d40d3a6c2caf790a9de37c17ad60c150e8d3))
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
### Bug Fixes
|
|
47
|
+
|
|
48
|
+
* Remove duplicate entries in plugin list ([11a3fe3](https://github.com/deepgram/cli/commit/11a3fe340e320df46c3d6ed872f469205b32163f))
|
|
49
|
+
* resolve all ruff and mypy linting issues ([83eaa7a](https://github.com/deepgram/cli/commit/83eaa7a54093eae72e9f6f08ec021980abc2a9fd))
|
|
50
|
+
* **tooling:** resolve all ruff, mypy, and Makefile issues ([3500379](https://github.com/deepgram/cli/commit/35003791a94ce74b40292dad091e5139299a620e))
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: deepctl-cmd-plugin
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.14
|
|
4
4
|
Summary: Plugin management command for deepctl
|
|
5
5
|
Author-email: Deepgram DevRel <devrel@deepgram.com>
|
|
6
6
|
Requires-Python: >=3.10
|
|
7
|
-
Requires-Dist: deepctl-core>=0.
|
|
7
|
+
Requires-Dist: deepctl-core>=0.2.19
|
|
8
8
|
Requires-Dist: packaging>=21.0
|
|
9
9
|
Requires-Dist: toml>=0.10.2
|
|
10
10
|
Description-Content-Type: text/markdown
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
name = "deepctl-cmd-plugin"
|
|
3
3
|
description = "Plugin management command for deepctl"
|
|
4
4
|
readme = "README.md"
|
|
5
|
-
version = "0.1.
|
|
5
|
+
version = "0.1.14" # x-release-please-version
|
|
6
6
|
requires-python = ">=3.10"
|
|
7
7
|
authors = [{ name = "Deepgram DevRel", email = "devrel@deepgram.com" }]
|
|
8
8
|
dependencies = [
|
|
9
|
-
"deepctl-core>=0.
|
|
9
|
+
"deepctl-core>=0.2.19",
|
|
10
10
|
"packaging>=21.0",
|
|
11
11
|
"toml>=0.10.2",
|
|
12
12
|
]
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
import importlib.metadata
|
|
6
5
|
import json
|
|
7
6
|
import subprocess
|
|
8
7
|
import sys
|
|
@@ -29,6 +28,7 @@ from deepctl_core.plugin_env import (
|
|
|
29
28
|
save_plugin_state,
|
|
30
29
|
)
|
|
31
30
|
from rich.console import Console
|
|
31
|
+
from rich.markup import escape
|
|
32
32
|
from rich.table import Table
|
|
33
33
|
|
|
34
34
|
from .models import (
|
|
@@ -474,8 +474,17 @@ class PluginCommand(BaseGroupCommand):
|
|
|
474
474
|
package = kwargs["package"]
|
|
475
475
|
yes = kwargs.get("yes", False)
|
|
476
476
|
|
|
477
|
-
|
|
478
|
-
|
|
477
|
+
# err=True: the prompt is interaction, not output. Keeping it off
|
|
478
|
+
# stdout is what lets `dg plugin remove ... -o json` stay parseable,
|
|
479
|
+
# and matches the sibling prompt in deepctl-cmd-keys.
|
|
480
|
+
if not yes and not click.confirm(
|
|
481
|
+
f"Are you sure you want to remove {package}?", err=True
|
|
482
|
+
):
|
|
483
|
+
# Abort rather than return: this is a group subcommand, so there is
|
|
484
|
+
# no result for BaseCommand.EXIT_CODES to map, and a bare return
|
|
485
|
+
# exits 0 -- indistinguishable from a successful removal. main.py
|
|
486
|
+
# turns Abort into the documented exit 2 for user cancellation.
|
|
487
|
+
raise click.Abort()
|
|
479
488
|
|
|
480
489
|
result = self.remove_plugin(config, auth_manager, client, package)
|
|
481
490
|
|
|
@@ -1162,37 +1171,31 @@ except:
|
|
|
1162
1171
|
return "varies"
|
|
1163
1172
|
|
|
1164
1173
|
def _maybe_update_skills(self) -> None:
|
|
1165
|
-
"""
|
|
1166
|
-
try:
|
|
1167
|
-
from deepctl_core.skill_generator import (
|
|
1168
|
-
_commands_hash,
|
|
1169
|
-
collect_command_metadata,
|
|
1170
|
-
get_all_generators,
|
|
1171
|
-
get_skills_state,
|
|
1172
|
-
save_skills_state,
|
|
1173
|
-
)
|
|
1174
|
-
|
|
1175
|
-
state = get_skills_state()
|
|
1176
|
-
if not state.get("installed_skills") or not state.get("auto_update", True):
|
|
1177
|
-
return
|
|
1174
|
+
"""Refresh the recorded skills the way 'dg skills update' does (B3).
|
|
1178
1175
|
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
for cli_name, info in state["installed_skills"].items():
|
|
1184
|
-
gen = generators.get(cli_name)
|
|
1185
|
-
if gen:
|
|
1186
|
-
paths = gen.install(commands, version)
|
|
1187
|
-
info.update(
|
|
1188
|
-
{
|
|
1189
|
-
"paths": [str(p) for p in paths],
|
|
1190
|
-
"version": version,
|
|
1191
|
-
"commands_hash": _commands_hash(commands),
|
|
1192
|
-
}
|
|
1193
|
-
)
|
|
1176
|
+
Never changes the plugin command's exit code; a failure prints a
|
|
1177
|
+
warning on stderr.
|
|
1178
|
+
"""
|
|
1179
|
+
from deepctl_core import skill_generator as sg
|
|
1194
1180
|
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1181
|
+
try:
|
|
1182
|
+
state = sg.get_skills_state()
|
|
1183
|
+
names = {*state.get("skill_folders", {}), *state["installed_skills"]}
|
|
1184
|
+
if not state.get("auto_update", True):
|
|
1185
|
+
return
|
|
1186
|
+
plan = [
|
|
1187
|
+
(g, sg._ref_for(g.cli_name, state))
|
|
1188
|
+
for g in sg.get_all_generators()
|
|
1189
|
+
if g.cli_name in names and g.skills_root() is not None
|
|
1190
|
+
]
|
|
1191
|
+
if not plan: # None recorded, or hint-only only: records untouched.
|
|
1192
|
+
return
|
|
1193
|
+
for _gen, _paths, leftover in sg.install_for(plan, since=state):
|
|
1194
|
+
if leftover:
|
|
1195
|
+
print_warning(escape(sg._msg("E12", staging=leftover)), stderr=True)
|
|
1196
|
+
except Exception as exc: # Non-fatal: the plugin operation succeeded.
|
|
1197
|
+
sg.warn_install_failure(
|
|
1198
|
+
"AI assistant skills were not updated",
|
|
1199
|
+
exc,
|
|
1200
|
+
"run 'dg skills update' to try again",
|
|
1201
|
+
)
|