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