drydock-cli 3.0.128__tar.gz → 3.0.129__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.128/drydock_cli.egg-info → drydock_cli-3.0.129}/PKG-INFO +1 -1
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/agent.py +2 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/tui/app.py +4 -1
- {drydock_cli-3.0.128 → drydock_cli-3.0.129/drydock_cli.egg-info}/PKG-INFO +1 -1
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/pyproject.toml +1 -1
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_task_state.py +22 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/LICENSE +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/NOTICE +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/README.md +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/__init__.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/__main__.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/advisor.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/bash_safety.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/__init__.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/ml-data.md +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/ml-debug.md +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/ml-finetune.md +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/ml-metrics.md +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/ml-rl.md +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/ml-train.md +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/rmf-categorize.md +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/rmf-control.md +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/rmf-poam.md +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/rmf-review.md +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/stig-assess.md +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/stig-remediate.md +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/cci.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/cli.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/compaction.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/config.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/detect.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/events.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/extract.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/gittools.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/graphrag.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/guards.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/loop_detect.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/mcp.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/poam.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/providers.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/recipes.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/rmf.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/rmf_graph.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/skills.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/stig.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/suggest.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/task_state.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/tool_registry.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/tools/__init__.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/tui/__init__.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/tui/approval.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/tui/messages.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/tui/widgets.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/tuning.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/verification.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/web.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock_cli.egg-info/SOURCES.txt +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock_cli.egg-info/dependency_links.txt +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock_cli.egg-info/entry_points.txt +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock_cli.egg-info/requires.txt +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock_cli.egg-info/top_level.txt +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/setup.cfg +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_advisor.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_approval.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_back_command.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_background.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_binary_output.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_crossplatform.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_output_bounding.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_process_group.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_safety.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_sanitize.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_shell.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_stdin.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_stop_partial.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_timeout_network.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_timeout_param.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_cci.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_cli_agents.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_compact_command.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_compaction.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_config.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_config_migration.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_context_limit_config.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_detect.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_dispatch.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_e2e_connected.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_edit_replace_all.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_empty_response.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_events.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_extract.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_failure_loop.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_first_run_setup.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_gittools.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_glob_edit_edges.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_graphify_example.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_graphrag.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_graphrag_quoted_path.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_grep_and_read_robust.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_guards_and_tools.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_hallucinated_tools.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_leaked_tool_call.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_loop_detect.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_mcp.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_oneshot_unreachable.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_overthink_interrupt.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_plan_autocontinue.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_poam.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_providers_unreachable.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_read_index.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_recipes.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_repetition_interrupt.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_rmf.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_rmf_graph.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_rmf_stig_graph.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_runaway_repetition.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_screenshot.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_server_probe.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_skills.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_stall_retry.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_stig.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_stop.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_streaming_newlines.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_subagent.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_suggest.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_system_prompt_help.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_todo.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_tool_arg_coercion.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_tool_arg_coercion_more.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_tool_arg_parsing.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_tools_undo.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_tui.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_tuning.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_verification_gate.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_viewimage.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_vision_input.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_web_tools.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_windows_shell.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_write_content_coerce.py +0 -0
- {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_xccdf.py +0 -0
|
@@ -389,6 +389,8 @@ def run(
|
|
|
389
389
|
for tc in assistant_turn.tool_calls:
|
|
390
390
|
tool_call_count += 1
|
|
391
391
|
if tc["name"] in ("Edit", "Write"):
|
|
392
|
+
if not session_has_edited and state.task.phase in ("understand", "discover", "plan"):
|
|
393
|
+
state.task.phase = "implement" # first change → building
|
|
392
394
|
session_has_edited = True
|
|
393
395
|
|
|
394
396
|
# STOP pressed: don't run the remaining tools, but still record a
|
|
@@ -362,8 +362,11 @@ class DrydockApp(App):
|
|
|
362
362
|
flag = "⚓ working" if self._busy else "⚓ ready"
|
|
363
363
|
# Busy → show the interrupt keys; idle → the quit hint.
|
|
364
364
|
keys = "Esc/Ctrl+C stop" if self._busy else "Ctrl+C×2 quit"
|
|
365
|
+
# Show the task phase once it's past the default (understand).
|
|
366
|
+
ph = getattr(self.state, "task", None)
|
|
367
|
+
phase = f" · {ph.phase}" if (ph and ph.is_set() and ph.phase != "understand") else ""
|
|
365
368
|
return (
|
|
366
|
-
f"{flag} · {model} · {keys} · PgUp/PgDn scroll · "
|
|
369
|
+
f"{flag} · {model}{phase} · {keys} · PgUp/PgDn scroll · "
|
|
367
370
|
f"Ctrl+O details · {ctx}"
|
|
368
371
|
)
|
|
369
372
|
|
|
@@ -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.129"
|
|
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"
|
|
@@ -67,3 +67,25 @@ def test_disabled_when_task_anchor_false():
|
|
|
67
67
|
cfg = {"model": "gemma4", "max_tokens": 8192, "context_limit": 65536, "task_anchor": False}
|
|
68
68
|
sysp, _ = _run_capture(cfg, "Do the thing.\n1. a criterion")
|
|
69
69
|
assert "TASK" not in sysp
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def test_phase_transitions_understand_implement_complete():
|
|
73
|
+
from drydock.providers import AssistantTurn
|
|
74
|
+
cfg = {"model": "gemma4", "max_tokens": 8192, "context_limit": 65536}
|
|
75
|
+
turns = [
|
|
76
|
+
AssistantTurn("", [{"id": "1", "name": "Write",
|
|
77
|
+
"input": {"file_path": "/tmp/dd_ph.txt", "content": "x"}}], 5, 5),
|
|
78
|
+
AssistantTurn("", [{"id": "2", "name": "Bash", "input": {"command": "python -c 'print(1)'"}}], 5, 5),
|
|
79
|
+
AssistantTurn("done, verified", [], 5, 5),
|
|
80
|
+
]
|
|
81
|
+
i = {"n": 0}
|
|
82
|
+
def fake(model, system, messages, tool_schemas, config):
|
|
83
|
+
t = turns[min(i["n"], len(turns) - 1)]; i["n"] += 1; yield t
|
|
84
|
+
st = agent.AgentState()
|
|
85
|
+
assert st.task.phase == "understand"
|
|
86
|
+
orig = agent.stream; agent.stream = fake
|
|
87
|
+
try:
|
|
88
|
+
list(agent.run("Fix it and verify.\n1. tests pass", st, cfg, "SYS"))
|
|
89
|
+
finally:
|
|
90
|
+
agent.stream = orig
|
|
91
|
+
assert st.task.phase == "complete" # understand -> implement -> verify -> complete
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|