drydock-cli 3.0.121__tar.gz → 3.0.122__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.
- {drydock_cli-3.0.121/drydock_cli.egg-info → drydock_cli-3.0.122}/PKG-INFO +1 -1
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/tui/app.py +12 -1
- {drydock_cli-3.0.121 → drydock_cli-3.0.122/drydock_cli.egg-info}/PKG-INFO +1 -1
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/pyproject.toml +1 -1
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_screenshot.py +1 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_suggest.py +10 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/LICENSE +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/NOTICE +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/README.md +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/__init__.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/__main__.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/advisor.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/agent.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/bash_safety.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/builtin_skills/__init__.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/builtin_skills/ml-data.md +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/builtin_skills/ml-debug.md +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/builtin_skills/ml-finetune.md +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/builtin_skills/ml-metrics.md +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/builtin_skills/ml-rl.md +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/builtin_skills/ml-train.md +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/builtin_skills/rmf-categorize.md +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/builtin_skills/rmf-control.md +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/builtin_skills/rmf-poam.md +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/builtin_skills/rmf-review.md +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/builtin_skills/stig-assess.md +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/builtin_skills/stig-remediate.md +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/cci.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/cli.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/compaction.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/config.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/detect.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/extract.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/gittools.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/graphrag.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/guards.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/loop_detect.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/mcp.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/poam.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/providers.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/recipes.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/rmf.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/rmf_graph.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/skills.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/stig.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/suggest.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/tool_registry.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/tools/__init__.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/tui/__init__.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/tui/approval.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/tui/messages.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/tui/widgets.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/tuning.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock/web.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock_cli.egg-info/SOURCES.txt +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock_cli.egg-info/dependency_links.txt +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock_cli.egg-info/entry_points.txt +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock_cli.egg-info/requires.txt +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/drydock_cli.egg-info/top_level.txt +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/setup.cfg +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_advisor.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_approval.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_back_command.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_bash_background.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_bash_binary_output.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_bash_crossplatform.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_bash_output_bounding.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_bash_process_group.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_bash_safety.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_bash_sanitize.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_bash_shell.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_bash_stdin.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_bash_stop_partial.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_bash_timeout_network.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_bash_timeout_param.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_cci.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_cli_agents.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_compact_command.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_compaction.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_config.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_config_migration.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_context_limit_config.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_detect.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_dispatch.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_e2e_connected.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_edit_replace_all.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_empty_response.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_extract.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_failure_loop.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_first_run_setup.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_gittools.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_glob_edit_edges.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_graphify_example.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_graphrag.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_graphrag_quoted_path.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_grep_and_read_robust.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_guards_and_tools.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_hallucinated_tools.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_leaked_tool_call.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_loop_detect.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_mcp.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_oneshot_unreachable.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_overthink_interrupt.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_plan_autocontinue.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_poam.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_providers_unreachable.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_read_index.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_recipes.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_repetition_interrupt.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_rmf.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_rmf_graph.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_rmf_stig_graph.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_runaway_repetition.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_server_probe.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_skills.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_stall_retry.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_stig.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_stop.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_streaming_newlines.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_subagent.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_system_prompt_help.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_todo.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_tool_arg_coercion.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_tool_arg_coercion_more.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_tool_arg_parsing.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_tools_undo.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_tui.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_tuning.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_viewimage.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_vision_input.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_web_tools.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_windows_shell.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_write_content_coerce.py +0 -0
- {drydock_cli-3.0.121 → drydock_cli-3.0.122}/tests/test_xccdf.py +0 -0
|
@@ -84,6 +84,17 @@ def _fmt_tokens(n: int) -> str:
|
|
|
84
84
|
return f"{n / 1000:.1f}k" if n >= 1000 else str(n)
|
|
85
85
|
|
|
86
86
|
|
|
87
|
+
def is_slash_command(text: str) -> bool:
|
|
88
|
+
"""True only for a real ``/command``, NOT a message that merely starts with a
|
|
89
|
+
path — e.g. ``/app/env.py defines ...`` or ``/report.tex``. A command name is a
|
|
90
|
+
single leading token of word chars (no path separators, no dots); anything with
|
|
91
|
+
``/``, ``\\`` or ``.`` in that first token is treated as a normal agent message."""
|
|
92
|
+
if not text.startswith("/"):
|
|
93
|
+
return False
|
|
94
|
+
head = text[1:].split(maxsplit=1)[0] if len(text) > 1 else ""
|
|
95
|
+
return bool(head) and not any(c in head for c in "/\\.")
|
|
96
|
+
|
|
97
|
+
|
|
87
98
|
class DrydockApp(App):
|
|
88
99
|
CSS = """
|
|
89
100
|
Screen { background: #0b1f2a; }
|
|
@@ -425,7 +436,7 @@ class DrydockApp(App):
|
|
|
425
436
|
prompt.clear()
|
|
426
437
|
if not text:
|
|
427
438
|
return
|
|
428
|
-
if text
|
|
439
|
+
if is_slash_command(text):
|
|
429
440
|
self._handle_slash(text) # meta commands stay out of history
|
|
430
441
|
return
|
|
431
442
|
prompt.cmd_history.add(text)
|
|
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
|
|
|
7
7
|
# PyPI distribution name is drydock-cli (the established install name, continued
|
|
8
8
|
# from the retired v2 fork); the import package + CLI command stay `drydock`.
|
|
9
9
|
name = "drydock-cli"
|
|
10
|
-
version = "3.0.
|
|
10
|
+
version = "3.0.122"
|
|
11
11
|
description = "Drydock — a local, provider-agnostic terminal coding agent for local LLMs"
|
|
12
12
|
readme = "README.md"
|
|
13
13
|
requires-python = ">=3.11"
|
|
@@ -21,6 +21,7 @@ def test_registered_and_available_to_gemma():
|
|
|
21
21
|
def test_graceful_when_no_grabber(monkeypatch):
|
|
22
22
|
monkeypatch.setattr(tools, "_IS_WINDOWS", False)
|
|
23
23
|
monkeypatch.setattr("sys.platform", "linux")
|
|
24
|
+
monkeypatch.setenv("DISPLAY", ":0") # a display exists, but no grabber is installed
|
|
24
25
|
monkeypatch.setattr("shutil.which", lambda _n: None) # no grabbers installed
|
|
25
26
|
out = tools.tool_screenshot({}, {"cwd": os.getcwd()})
|
|
26
27
|
assert out.startswith("Error") and "screenshot tool" in out
|
|
@@ -18,3 +18,13 @@ def test_priority_and_cases():
|
|
|
18
18
|
def test_error_beats_plan_and_writes():
|
|
19
19
|
assert s(ctx_pct=10, wrote_files=True, ran_bash=True, had_error=True,
|
|
20
20
|
in_git=True, plan_remaining=True) == "fix the error above"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def test_is_slash_command_distinguishes_paths():
|
|
24
|
+
from drydock.tui.app import is_slash_command as c
|
|
25
|
+
assert c("/help") and c("/ml-train foo") and c("/ask!") and c("/compact")
|
|
26
|
+
# file paths / messages starting with a path are NOT commands
|
|
27
|
+
assert not c("/app/env.py defines a gridworld")
|
|
28
|
+
assert not c("/report.tex")
|
|
29
|
+
assert not c("/data/file.h5 holds predictions")
|
|
30
|
+
assert not c("Train a model") and not c("/")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|