drydock-cli 3.0.79__tar.gz → 3.0.80__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 (101) hide show
  1. {drydock_cli-3.0.79/drydock_cli.egg-info → drydock_cli-3.0.80}/PKG-INFO +1 -1
  2. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/tools/__init__.py +4 -0
  3. {drydock_cli-3.0.79 → drydock_cli-3.0.80/drydock_cli.egg-info}/PKG-INFO +1 -1
  4. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/pyproject.toml +1 -1
  5. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_viewimage.py +10 -0
  6. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/LICENSE +0 -0
  7. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/NOTICE +0 -0
  8. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/README.md +0 -0
  9. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/__init__.py +0 -0
  10. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/__main__.py +0 -0
  11. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/agent.py +0 -0
  12. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/bash_safety.py +0 -0
  13. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/builtin_skills/__init__.py +0 -0
  14. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/builtin_skills/rmf-categorize.md +0 -0
  15. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/builtin_skills/rmf-control.md +0 -0
  16. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/builtin_skills/rmf-poam.md +0 -0
  17. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/builtin_skills/rmf-review.md +0 -0
  18. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/builtin_skills/stig-assess.md +0 -0
  19. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/builtin_skills/stig-remediate.md +0 -0
  20. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/cci.py +0 -0
  21. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/cli.py +0 -0
  22. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/compaction.py +0 -0
  23. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/config.py +0 -0
  24. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/detect.py +0 -0
  25. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/extract.py +0 -0
  26. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/gittools.py +0 -0
  27. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/graphrag.py +0 -0
  28. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/guards.py +0 -0
  29. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/loop_detect.py +0 -0
  30. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/mcp.py +0 -0
  31. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/poam.py +0 -0
  32. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/providers.py +0 -0
  33. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/rmf.py +0 -0
  34. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/rmf_graph.py +0 -0
  35. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/skills.py +0 -0
  36. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/stig.py +0 -0
  37. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/tool_registry.py +0 -0
  38. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/tui/__init__.py +0 -0
  39. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/tui/app.py +0 -0
  40. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/tui/approval.py +0 -0
  41. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/tui/messages.py +0 -0
  42. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/tui/widgets.py +0 -0
  43. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/tuning.py +0 -0
  44. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock/web.py +0 -0
  45. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock_cli.egg-info/SOURCES.txt +0 -0
  46. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock_cli.egg-info/dependency_links.txt +0 -0
  47. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock_cli.egg-info/entry_points.txt +0 -0
  48. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock_cli.egg-info/requires.txt +0 -0
  49. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/drydock_cli.egg-info/top_level.txt +0 -0
  50. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/setup.cfg +0 -0
  51. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_approval.py +0 -0
  52. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_back_command.py +0 -0
  53. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_bash_output_bounding.py +0 -0
  54. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_bash_process_group.py +0 -0
  55. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_bash_safety.py +0 -0
  56. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_bash_timeout_network.py +0 -0
  57. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_cci.py +0 -0
  58. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_cli_agents.py +0 -0
  59. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_compact_command.py +0 -0
  60. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_compaction.py +0 -0
  61. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_config.py +0 -0
  62. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_config_migration.py +0 -0
  63. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_context_limit_config.py +0 -0
  64. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_detect.py +0 -0
  65. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_dispatch.py +0 -0
  66. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_e2e_connected.py +0 -0
  67. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_empty_response.py +0 -0
  68. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_extract.py +0 -0
  69. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_failure_loop.py +0 -0
  70. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_first_run_setup.py +0 -0
  71. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_gittools.py +0 -0
  72. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_graphrag.py +0 -0
  73. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_guards_and_tools.py +0 -0
  74. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_hallucinated_tools.py +0 -0
  75. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_leaked_tool_call.py +0 -0
  76. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_loop_detect.py +0 -0
  77. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_mcp.py +0 -0
  78. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_oneshot_unreachable.py +0 -0
  79. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_plan_autocontinue.py +0 -0
  80. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_poam.py +0 -0
  81. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_providers_unreachable.py +0 -0
  82. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_read_index.py +0 -0
  83. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_rmf.py +0 -0
  84. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_rmf_graph.py +0 -0
  85. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_rmf_stig_graph.py +0 -0
  86. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_runaway_repetition.py +0 -0
  87. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_server_probe.py +0 -0
  88. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_skills.py +0 -0
  89. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_stig.py +0 -0
  90. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_stop.py +0 -0
  91. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_streaming_newlines.py +0 -0
  92. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_subagent.py +0 -0
  93. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_system_prompt_help.py +0 -0
  94. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_todo.py +0 -0
  95. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_tool_arg_parsing.py +0 -0
  96. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_tools_undo.py +0 -0
  97. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_tui.py +0 -0
  98. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_tuning.py +0 -0
  99. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_vision_input.py +0 -0
  100. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/tests/test_web_tools.py +0 -0
  101. {drydock_cli-3.0.79 → drydock_cli-3.0.80}/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.79
3
+ Version: 3.0.80
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
@@ -514,6 +514,10 @@ def tool_viewimage(params: dict, config: dict) -> str:
514
514
 
515
515
  def tool_read(params: dict, config: dict) -> str:
516
516
  fp = _resolve_path(params["file_path"], config)
517
+ # Reading an image as text yields binary garbage — point at the vision tool.
518
+ if os.path.splitext(fp)[1].lower() in _IMAGE_EXTS and os.path.isfile(fp):
519
+ return (f"{params['file_path']} is an image — Read would return binary "
520
+ "garbage. Use the ViewImage tool to actually SEE it.")
517
521
  limit = params.get("limit") # None = caller didn't specify a window
518
522
  offset = params.get("offset", 0)
519
523
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 3.0.79
3
+ Version: 3.0.80
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.79"
10
+ version = "3.0.80"
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"
@@ -56,3 +56,13 @@ def test_non_viewimage_tool_with_png_path_stays_text(tmp_path):
56
56
  out = messages_to_openai([{"role": "tool", "tool_call_id": "c2",
57
57
  "name": "Grep", "content": f"found {img} in code"}], "sys")
58
58
  assert isinstance(out[-1]["content"], str) # no accidental image ballooning
59
+
60
+
61
+ def test_read_on_image_points_to_viewimage(tmp_path):
62
+ img = _png(tmp_path / "pic.png")
63
+ out = reg.execute("Read", {"file_path": img}, {"cwd": str(tmp_path)})
64
+ assert "ViewImage" in out and "image" in out.lower()
65
+ # a normal text file still reads normally
66
+ (tmp_path / "f.txt").write_text("hello\nworld\n")
67
+ txt = reg.execute("Read", {"file_path": str(tmp_path / "f.txt")}, {"cwd": str(tmp_path)})
68
+ assert "hello" in txt and "ViewImage" not in txt
File without changes
File without changes
File without changes
File without changes