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.
Files changed (140) hide show
  1. {drydock_cli-3.0.128/drydock_cli.egg-info → drydock_cli-3.0.129}/PKG-INFO +1 -1
  2. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/agent.py +2 -0
  3. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/tui/app.py +4 -1
  4. {drydock_cli-3.0.128 → drydock_cli-3.0.129/drydock_cli.egg-info}/PKG-INFO +1 -1
  5. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/pyproject.toml +1 -1
  6. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_task_state.py +22 -0
  7. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/LICENSE +0 -0
  8. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/NOTICE +0 -0
  9. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/README.md +0 -0
  10. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/__init__.py +0 -0
  11. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/__main__.py +0 -0
  12. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/advisor.py +0 -0
  13. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/bash_safety.py +0 -0
  14. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/__init__.py +0 -0
  15. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/ml-data.md +0 -0
  16. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/ml-debug.md +0 -0
  17. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/ml-finetune.md +0 -0
  18. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/ml-metrics.md +0 -0
  19. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/ml-rl.md +0 -0
  20. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/ml-train.md +0 -0
  21. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/rmf-categorize.md +0 -0
  22. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/rmf-control.md +0 -0
  23. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/rmf-poam.md +0 -0
  24. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/rmf-review.md +0 -0
  25. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/stig-assess.md +0 -0
  26. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/builtin_skills/stig-remediate.md +0 -0
  27. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/cci.py +0 -0
  28. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/cli.py +0 -0
  29. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/compaction.py +0 -0
  30. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/config.py +0 -0
  31. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/detect.py +0 -0
  32. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/events.py +0 -0
  33. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/extract.py +0 -0
  34. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/gittools.py +0 -0
  35. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/graphrag.py +0 -0
  36. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/guards.py +0 -0
  37. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/loop_detect.py +0 -0
  38. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/mcp.py +0 -0
  39. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/poam.py +0 -0
  40. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/providers.py +0 -0
  41. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/recipes.py +0 -0
  42. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/rmf.py +0 -0
  43. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/rmf_graph.py +0 -0
  44. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/skills.py +0 -0
  45. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/stig.py +0 -0
  46. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/suggest.py +0 -0
  47. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/task_state.py +0 -0
  48. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/tool_registry.py +0 -0
  49. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/tools/__init__.py +0 -0
  50. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/tui/__init__.py +0 -0
  51. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/tui/approval.py +0 -0
  52. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/tui/messages.py +0 -0
  53. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/tui/widgets.py +0 -0
  54. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/tuning.py +0 -0
  55. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/verification.py +0 -0
  56. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock/web.py +0 -0
  57. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock_cli.egg-info/SOURCES.txt +0 -0
  58. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock_cli.egg-info/dependency_links.txt +0 -0
  59. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock_cli.egg-info/entry_points.txt +0 -0
  60. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock_cli.egg-info/requires.txt +0 -0
  61. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/drydock_cli.egg-info/top_level.txt +0 -0
  62. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/setup.cfg +0 -0
  63. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_advisor.py +0 -0
  64. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_approval.py +0 -0
  65. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_back_command.py +0 -0
  66. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_background.py +0 -0
  67. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_binary_output.py +0 -0
  68. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_crossplatform.py +0 -0
  69. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_output_bounding.py +0 -0
  70. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_process_group.py +0 -0
  71. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_safety.py +0 -0
  72. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_sanitize.py +0 -0
  73. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_shell.py +0 -0
  74. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_stdin.py +0 -0
  75. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_stop_partial.py +0 -0
  76. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_timeout_network.py +0 -0
  77. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_bash_timeout_param.py +0 -0
  78. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_cci.py +0 -0
  79. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_cli_agents.py +0 -0
  80. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_compact_command.py +0 -0
  81. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_compaction.py +0 -0
  82. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_config.py +0 -0
  83. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_config_migration.py +0 -0
  84. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_context_limit_config.py +0 -0
  85. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_detect.py +0 -0
  86. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_dispatch.py +0 -0
  87. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_e2e_connected.py +0 -0
  88. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_edit_replace_all.py +0 -0
  89. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_empty_response.py +0 -0
  90. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_events.py +0 -0
  91. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_extract.py +0 -0
  92. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_failure_loop.py +0 -0
  93. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_first_run_setup.py +0 -0
  94. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_gittools.py +0 -0
  95. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_glob_edit_edges.py +0 -0
  96. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_graphify_example.py +0 -0
  97. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_graphrag.py +0 -0
  98. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_graphrag_quoted_path.py +0 -0
  99. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_grep_and_read_robust.py +0 -0
  100. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_guards_and_tools.py +0 -0
  101. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_hallucinated_tools.py +0 -0
  102. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_leaked_tool_call.py +0 -0
  103. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_loop_detect.py +0 -0
  104. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_mcp.py +0 -0
  105. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_oneshot_unreachable.py +0 -0
  106. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_overthink_interrupt.py +0 -0
  107. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_plan_autocontinue.py +0 -0
  108. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_poam.py +0 -0
  109. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_providers_unreachable.py +0 -0
  110. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_read_index.py +0 -0
  111. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_recipes.py +0 -0
  112. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_repetition_interrupt.py +0 -0
  113. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_rmf.py +0 -0
  114. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_rmf_graph.py +0 -0
  115. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_rmf_stig_graph.py +0 -0
  116. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_runaway_repetition.py +0 -0
  117. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_screenshot.py +0 -0
  118. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_server_probe.py +0 -0
  119. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_skills.py +0 -0
  120. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_stall_retry.py +0 -0
  121. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_stig.py +0 -0
  122. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_stop.py +0 -0
  123. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_streaming_newlines.py +0 -0
  124. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_subagent.py +0 -0
  125. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_suggest.py +0 -0
  126. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_system_prompt_help.py +0 -0
  127. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_todo.py +0 -0
  128. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_tool_arg_coercion.py +0 -0
  129. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_tool_arg_coercion_more.py +0 -0
  130. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_tool_arg_parsing.py +0 -0
  131. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_tools_undo.py +0 -0
  132. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_tui.py +0 -0
  133. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_tuning.py +0 -0
  134. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_verification_gate.py +0 -0
  135. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_viewimage.py +0 -0
  136. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_vision_input.py +0 -0
  137. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_web_tools.py +0 -0
  138. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_windows_shell.py +0 -0
  139. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_write_content_coerce.py +0 -0
  140. {drydock_cli-3.0.128 → drydock_cli-3.0.129}/tests/test_xccdf.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 3.0.128
3
+ Version: 3.0.129
4
4
  Summary: Drydock — a local, provider-agnostic terminal coding agent for local LLMs
5
5
  Author: Frank Bobe III
6
6
  License-Expression: Apache-2.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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 3.0.128
3
+ Version: 3.0.129
4
4
  Summary: Drydock — a local, provider-agnostic terminal coding agent for local LLMs
5
5
  Author: Frank Bobe III
6
6
  License-Expression: Apache-2.0
@@ -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.128"
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