drydock-cli 2.7.30__tar.gz → 2.7.31__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 (689) hide show
  1. drydock_cli-2.7.31/.auto_release.lock +1 -0
  2. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/PKG-INFO +1 -1
  3. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/format.py +3 -0
  4. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/grep.py +10 -0
  5. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/search_replace.py +17 -1
  6. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/pyproject.toml +1 -1
  7. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_hallucinated_tool_suppression.py +3 -0
  8. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_grep.py +33 -0
  9. drydock_cli-2.7.31/tests/tools/test_search_replace_first_failure_hint.py +132 -0
  10. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/trip_log.md +96 -0
  11. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/uv.lock +1 -1
  12. drydock_cli-2.7.30/.auto_release.lock +0 -1
  13. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.claude/scheduled_tasks.lock +0 -0
  14. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.github/CODEOWNERS +0 -0
  15. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  16. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  17. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  18. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.github/workflows/build-and-upload.yml +0 -0
  19. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.github/workflows/ci.yml +0 -0
  20. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.github/workflows/issue-labeler.yml +0 -0
  21. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.github/workflows/release.yml +0 -0
  22. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.gitignore +0 -0
  23. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.pre-commit-config.yaml +0 -0
  24. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.python-version +0 -0
  25. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.typos.toml +0 -0
  26. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.vscode/extensions.json +0 -0
  27. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.vscode/launch.json +0 -0
  28. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.vscode/settings.json +0 -0
  29. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/AGENTS.md +0 -0
  30. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/Admiral.md +0 -0
  31. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/BASELINE_412.md +0 -0
  32. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/CHANGELOG.md +0 -0
  33. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/CLAUDE.md +0 -0
  34. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/CONTRIBUTING.md +0 -0
  35. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/DEPLOYMENT.md +0 -0
  36. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/Drydock_rebrand.md +0 -0
  37. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/LICENSE +0 -0
  38. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/MODEL_SHORTCOMINGS.md +0 -0
  39. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/NOTICE +0 -0
  40. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/OVERNIGHT_PROGRESS.md +0 -0
  41. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  42. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/PERF_SWEEP_PLAN.md +0 -0
  43. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/PRD.md +0 -0
  44. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/README.md +0 -0
  45. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/SOVEREIGN_PRD.md +0 -0
  46. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/TRIAGE_v1.md +0 -0
  47. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/action.yml +0 -0
  48. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/README.md +0 -0
  49. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results1.tsv +0 -0
  50. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results13.tsv +0 -0
  51. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results14.tsv +0 -0
  52. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results15.tsv +0 -0
  53. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results16.tsv +0 -0
  54. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results17.tsv +0 -0
  55. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results18.tsv +0 -0
  56. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results19.tsv +0 -0
  57. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results2.tsv +0 -0
  58. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results20.tsv +0 -0
  59. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results3.tsv +0 -0
  60. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results4.tsv +0 -0
  61. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results5.tsv +0 -0
  62. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results6.tsv +0 -0
  63. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results7.tsv +0 -0
  64. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results8.tsv +0 -0
  65. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results9.tsv +0 -0
  66. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results_evolved_v1.tsv +0 -0
  67. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/distribution/zed/LICENSE +0 -0
  68. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/distribution/zed/extension.toml +0 -0
  69. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/distribution/zed/icons/mistral_vibe.svg +0 -0
  70. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/docs/README.md +0 -0
  71. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/docs/acp-setup.md +0 -0
  72. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/docs/proxy-setup.md +0 -0
  73. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/__init__.py +0 -0
  74. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/__init__.py +0 -0
  75. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/acp_agent_loop.py +0 -0
  76. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/acp_logger.py +0 -0
  77. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/entrypoint.py +0 -0
  78. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/tools/__init__.py +0 -0
  79. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/tools/base.py +0 -0
  80. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/tools/builtins/bash.py +0 -0
  81. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/tools/builtins/read_file.py +0 -0
  82. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/tools/builtins/search_replace.py +0 -0
  83. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/tools/builtins/todo.py +0 -0
  84. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/tools/builtins/write_file.py +0 -0
  85. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/tools/session_update.py +0 -0
  86. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/utils.py +0 -0
  87. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/__init__.py +0 -0
  88. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/detectors.py +0 -0
  89. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/detectors_proposed.py +0 -0
  90. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/history.py +0 -0
  91. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/interventions.py +0 -0
  92. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/llm_analyzer.py +0 -0
  93. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/metrics.py +0 -0
  94. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/opus_escalator.py +0 -0
  95. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/persistence.py +0 -0
  96. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/policy.py +0 -0
  97. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/proposer.py +0 -0
  98. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/stager.py +0 -0
  99. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/task_classifier.py +0 -0
  100. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/tuning.py +0 -0
  101. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/validator.py +0 -0
  102. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/worker.py +0 -0
  103. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/__init__.py +0 -0
  104. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/autocompletion/__init__.py +0 -0
  105. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/autocompletion/base.py +0 -0
  106. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/autocompletion/path_completion.py +0 -0
  107. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/autocompletion/slash_command.py +0 -0
  108. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/cli.py +0 -0
  109. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/clipboard.py +0 -0
  110. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/commands.py +0 -0
  111. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/entrypoint.py +0 -0
  112. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/history_manager.py +0 -0
  113. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  114. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  115. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  116. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/terminal_setup.py +0 -0
  117. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/__init__.py +0 -0
  118. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  119. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/app.py +0 -0
  120. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/app.tcss +0 -0
  121. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/external_editor.py +0 -0
  122. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  123. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  124. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  125. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  126. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  127. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  128. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  129. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  130. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  131. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  132. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  133. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  134. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  135. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  136. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  137. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  138. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  139. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  140. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  141. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  142. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  143. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  144. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  145. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  146. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  147. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  148. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  149. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  150. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  151. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  152. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  153. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  154. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  155. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  156. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  157. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  158. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  159. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/windowing/history.py +0 -0
  160. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  161. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/windowing/state.py +0 -0
  162. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/update_notifier/__init__.py +0 -0
  163. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  164. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  165. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  166. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  167. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  168. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/update_notifier/update.py +0 -0
  169. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/update_notifier/whats_new.py +0 -0
  170. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/__init__.py +0 -0
  171. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/agent_loop.py +0 -0
  172. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/agents/__init__.py +0 -0
  173. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/agents/manager.py +0 -0
  174. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/agents/models.py +0 -0
  175. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/auth/__init__.py +0 -0
  176. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/auth/crypto.py +0 -0
  177. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/auth/github.py +0 -0
  178. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/__init__.py +0 -0
  179. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/completers.py +0 -0
  180. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  181. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  182. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  183. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  184. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  185. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/fuzzy.py +0 -0
  186. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/path_prompt.py +0 -0
  187. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  188. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/build_orchestrator.py +0 -0
  189. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/checkpoint.py +0 -0
  190. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/config/__init__.py +0 -0
  191. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/config/_settings.py +0 -0
  192. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/config/doctor.py +0 -0
  193. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/config/harness_files/__init__.py +0 -0
  194. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  195. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/config/harness_files/_paths.py +0 -0
  196. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/consultant.py +0 -0
  197. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/drydock_states.py +0 -0
  198. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/hooks.py +0 -0
  199. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/__init__.py +0 -0
  200. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/backend/anthropic.py +0 -0
  201. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/backend/base.py +0 -0
  202. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/backend/factory.py +0 -0
  203. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/backend/generic.py +0 -0
  204. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/backend/mistral.py +0 -0
  205. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  206. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/backend/vertex.py +0 -0
  207. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/exceptions.py +0 -0
  208. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/message_utils.py +0 -0
  209. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/types.py +0 -0
  210. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/logger.py +0 -0
  211. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/middleware.py +0 -0
  212. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/output_formatters.py +0 -0
  213. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/paths/__init__.py +0 -0
  214. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/paths/_drydock_home.py +0 -0
  215. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/paths/_local_config_walk.py +0 -0
  216. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/paths/conventions.py +0 -0
  217. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/plan_session.py +0 -0
  218. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/plugins.py +0 -0
  219. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/programmatic.py +0 -0
  220. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/__init__.py +0 -0
  221. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/builder.md +0 -0
  222. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/cli.md +0 -0
  223. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/compact.md +0 -0
  224. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/dangerous_directory.md +0 -0
  225. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/diagnostic.md +0 -0
  226. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/explore.md +0 -0
  227. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/gemma4.md +0 -0
  228. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/planner.md +0 -0
  229. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/project_context.md +0 -0
  230. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/tests.md +0 -0
  231. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/proxy_setup.py +0 -0
  232. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/session/agent_memory.py +0 -0
  233. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/session/checkpoints.py +0 -0
  234. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/session/session_loader.py +0 -0
  235. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/session/session_logger.py +0 -0
  236. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/session/session_migration.py +0 -0
  237. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/session/state_file.py +0 -0
  238. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/session_checker.py +0 -0
  239. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/skills/__init__.py +0 -0
  240. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/skills/manager.py +0 -0
  241. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/skills/models.py +0 -0
  242. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/skills/parser.py +0 -0
  243. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/slug.py +0 -0
  244. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/system_prompt.py +0 -0
  245. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/telemetry/__init__.py +0 -0
  246. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/telemetry/send.py +0 -0
  247. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/teleport/errors.py +0 -0
  248. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/teleport/git.py +0 -0
  249. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/teleport/nuage.py +0 -0
  250. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/teleport/teleport.py +0 -0
  251. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/teleport/types.py +0 -0
  252. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/base.py +0 -0
  253. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/_task_manager.py +0 -0
  254. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  255. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/bash.py +0 -0
  256. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/cron.py +0 -0
  257. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  258. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/glob_tool.py +0 -0
  259. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  260. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/lsp.py +0 -0
  261. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  262. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  263. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/powershell.py +0 -0
  264. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  265. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  266. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  267. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  268. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  269. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  270. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  271. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  272. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  273. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  274. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  275. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  276. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  277. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  278. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/task.md +0 -0
  279. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  280. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  281. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  282. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  283. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  284. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  285. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  286. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/read_file.py +0 -0
  287. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/task.py +0 -0
  288. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/todo.py +0 -0
  289. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/tool_search.py +0 -0
  290. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/webfetch.py +0 -0
  291. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/websearch.py +0 -0
  292. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/worktree.py +0 -0
  293. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/write_file.py +0 -0
  294. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/injection_guard.py +0 -0
  295. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/manager.py +0 -0
  296. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/mcp/__init__.py +0 -0
  297. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/mcp/registry.py +0 -0
  298. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/mcp/tools.py +0 -0
  299. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/mcp_sampling.py +0 -0
  300. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/ui.py +0 -0
  301. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/utils.py +0 -0
  302. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/trusted_folders.py +0 -0
  303. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/types.py +0 -0
  304. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/utils.py +0 -0
  305. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/onboarding/__init__.py +0 -0
  306. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/onboarding/base.py +0 -0
  307. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/onboarding/onboarding.tcss +0 -0
  308. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/onboarding/screens/__init__.py +0 -0
  309. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/onboarding/screens/api_key.py +0 -0
  310. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/onboarding/screens/choice.py +0 -0
  311. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/onboarding/screens/local_model.py +0 -0
  312. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/onboarding/screens/welcome.py +0 -0
  313. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  314. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  315. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/__init__.py +0 -0
  316. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/api-design/SKILL.md +0 -0
  317. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/audit-tests/SKILL.md +0 -0
  318. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/batch/SKILL.md +0 -0
  319. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/commit-code/SKILL.md +0 -0
  320. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/context-summary/SKILL.md +0 -0
  321. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/create-presentation/SKILL.md +0 -0
  322. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/deep-research/SKILL.md +0 -0
  323. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/deploy/SKILL.md +0 -0
  324. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/diff-review/SKILL.md +0 -0
  325. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/doc-gen/SKILL.md +0 -0
  326. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/explain-code/SKILL.md +0 -0
  327. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/explore-code/SKILL.md +0 -0
  328. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/fix-issue/SKILL.md +0 -0
  329. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/git-ops/SKILL.md +0 -0
  330. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/init-project/SKILL.md +0 -0
  331. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/investigate/SKILL.md +0 -0
  332. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/loop/SKILL.md +0 -0
  333. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/migrate/SKILL.md +0 -0
  334. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/perf-analyze/SKILL.md +0 -0
  335. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/plan-impl/SKILL.md +0 -0
  336. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/pr-review/SKILL.md +0 -0
  337. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/refactor/SKILL.md +0 -0
  338. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/regex-help/SKILL.md +0 -0
  339. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/review/SKILL.md +0 -0
  340. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/security-review/SKILL.md +0 -0
  341. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/ship/SKILL.md +0 -0
  342. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/simplify/SKILL.md +0 -0
  343. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/strong-tests/SKILL.md +0 -0
  344. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/test-verify/SKILL.md +0 -0
  345. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/whats_new.md +0 -0
  346. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock-acp.spec +0 -0
  347. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock_terms.md +0 -0
  348. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/flake.lock +0 -0
  349. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/flake.nix +0 -0
  350. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/nohup.out +0 -0
  351. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/perf_results/baseline_1777672181.json +0 -0
  352. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/perf_results/baseline_1777672218.json +0 -0
  353. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/perf_results/baseline_1777672322.json +0 -0
  354. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/README.md +0 -0
  355. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/config_base.toml +0 -0
  356. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/config_best.toml +0 -0
  357. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/domain_spec.md +0 -0
  358. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/experimenter.py +0 -0
  359. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/kernel.py +0 -0
  360. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/mini_prd.md +0 -0
  361. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/mini_prompts.txt +0 -0
  362. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/proposer.py +0 -0
  363. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/results.tsv +0 -0
  364. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/resume.md +0 -0
  365. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/README.md +0 -0
  366. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/admiral_probe.py +0 -0
  367. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/audit_sampler.py +0 -0
  368. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/auto_generate_tests.py +0 -0
  369. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/auto_release.sh +0 -0
  370. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/auto_test_loop.sh +0 -0
  371. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/autonomous_review.sh +0 -0
  372. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/autonomous_review_prompt.md +0 -0
  373. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/backup.sh +0 -0
  374. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/bump_version.py +0 -0
  375. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/comprehensive_loop.py +0 -0
  376. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/deploy_to_github.sh +0 -0
  377. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/discover_cli_tools.sh +0 -0
  378. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/evolve_tests.py +0 -0
  379. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/gen_2000_prompts.py +0 -0
  380. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/install.sh +0 -0
  381. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/llm_balancer.py +0 -0
  382. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/mega_loop.py +0 -0
  383. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/meta_ralph_loop.py +0 -0
  384. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/monitor_swebench.sh +0 -0
  385. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/monitor_test_battery.sh +0 -0
  386. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/notify_release.py +0 -0
  387. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/oss_task_harness.py +0 -0
  388. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/overnight_agents_test.sh +0 -0
  389. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/perf_baseline_when_idle.sh +0 -0
  390. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/perf_sweep.py +0 -0
  391. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/poll_issues.sh +0 -0
  392. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/port_task.py +0 -0
  393. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/prepare_release.py +0 -0
  394. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/publish_to_pypi.sh +0 -0
  395. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/ralph_loop.py +0 -0
  396. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/research_babysitter.sh +0 -0
  397. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/session_loop_audit.py +0 -0
  398. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/shakedown.py +0 -0
  399. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/shakedown_interactive.py +0 -0
  400. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/shakedown_regression.sh +0 -0
  401. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/shakedown_suite.sh +0 -0
  402. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/shakedown_variance.sh +0 -0
  403. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/stress_babysitter.sh +0 -0
  404. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/stress_prompts_50.txt +0 -0
  405. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/stress_prompts_realuser.txt +0 -0
  406. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/stress_prompts_tool_agent.txt +0 -0
  407. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  408. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/stress_shakedown.py +0 -0
  409. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/stress_telegram_status.py +0 -0
  410. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/stress_watcher.py +0 -0
  411. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/telegram_bot.py +0 -0
  412. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/test_bank.sh +0 -0
  413. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/test_full.sh +0 -0
  414. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/test_smoke.sh +0 -0
  415. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/test_tui_path.py +0 -0
  416. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/tui_test.py +0 -0
  417. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/vllm_failover.sh +0 -0
  418. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/test/project/dummy +0 -0
  419. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/__init__.py +0 -0
  420. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/conftest.py +0 -0
  421. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_acp.py +0 -0
  422. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_agent_thought.py +0 -0
  423. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_bash.py +0 -0
  424. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_compact_session_updates.py +0 -0
  425. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_content.py +0 -0
  426. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_initialize.py +0 -0
  427. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_list_sessions.py +0 -0
  428. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_load_session.py +0 -0
  429. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_multi_session.py +0 -0
  430. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_new_session.py +0 -0
  431. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_proxy_setup_acp.py +0 -0
  432. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_read_file.py +0 -0
  433. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_search_replace.py +0 -0
  434. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_set_config_option.py +0 -0
  435. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_set_mode.py +0 -0
  436. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_set_model.py +0 -0
  437. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_tool_call_session_update.py +0 -0
  438. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_utils.py +0 -0
  439. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_write_file.py +0 -0
  440. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/autocompletion/test_file_indexer.py +0 -0
  441. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/autocompletion/test_fuzzy.py +0 -0
  442. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  443. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  444. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/autocompletion/test_path_completion_controller.py +0 -0
  445. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  446. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/autocompletion/test_slash_command_controller.py +0 -0
  447. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  448. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/backend/__init__.py +0 -0
  449. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/backend/data/__init__.py +0 -0
  450. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/backend/data/fireworks.py +0 -0
  451. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/backend/data/mistral.py +0 -0
  452. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/backend/test_anthropic_adapter.py +0 -0
  453. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/backend/test_backend.py +0 -0
  454. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  455. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/backend/test_reasoning_adapter.py +0 -0
  456. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  457. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  458. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  459. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  460. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_bell_notifications.py +0 -0
  461. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_braille_renderer.py +0 -0
  462. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_clipboard.py +0 -0
  463. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_commands.py +0 -0
  464. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_copy_shortcuts.py +0 -0
  465. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_external_editor.py +0 -0
  466. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_no_markup_static.py +0 -0
  467. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_question_app.py +0 -0
  468. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_spinner.py +0 -0
  469. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_switching_mode.py +0 -0
  470. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  471. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  472. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_ui_session_resume.py +0 -0
  473. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_ui_skill_dispatch.py +0 -0
  474. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/textual_ui/__init__.py +0 -0
  475. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/textual_ui/test_session_picker.py +0 -0
  476. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/conftest.py +0 -0
  477. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_agents.py +0 -0
  478. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_auth_crypto.py +0 -0
  479. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_auth_github.py +0 -0
  480. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  481. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  482. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_config_load_dotenv.py +0 -0
  483. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_config_paths.py +0 -0
  484. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_config_resolution.py +0 -0
  485. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_file_logging.py +0 -0
  486. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_plan_session.py +0 -0
  487. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_proxy_setup.py +0 -0
  488. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_slug.py +0 -0
  489. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_telemetry_send.py +0 -0
  490. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_teleport_git.py +0 -0
  491. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_teleport_nuage.py +0 -0
  492. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_teleport_service.py +0 -0
  493. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_trusted_folders.py +0 -0
  494. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_utils.py +0 -0
  495. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/e2e/common.py +0 -0
  496. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/e2e/conftest.py +0 -0
  497. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/e2e/mock_server.py +0 -0
  498. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  499. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/e2e/test_cli_tui_streaming.py +0 -0
  500. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  501. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/fixtures/doc_qa_system_prd.md +0 -0
  502. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/mock/__init__.py +0 -0
  503. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/mock/mock_backend_factory.py +0 -0
  504. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/mock/mock_entrypoint.py +0 -0
  505. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/mock/utils.py +0 -0
  506. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/onboarding/test_run_onboarding.py +0 -0
  507. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/onboarding/test_ui_onboarding.py +0 -0
  508. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/session/test_session_loader.py +0 -0
  509. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/session/test_session_logger.py +0 -0
  510. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/session/test_session_migration.py +0 -0
  511. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/skills/conftest.py +0 -0
  512. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/skills/test_manager.py +0 -0
  513. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/skills/test_models.py +0 -0
  514. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/skills/test_parser.py +0 -0
  515. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  516. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  517. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  518. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  519. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  520. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  521. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  522. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  523. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  524. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  525. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  526. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  527. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  528. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  529. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  530. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  531. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  532. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  533. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  534. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  535. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  536. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  537. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  538. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  539. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  540. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  541. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  542. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  543. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  544. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  545. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  546. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  547. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  548. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  549. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  550. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  551. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  552. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  553. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  554. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  555. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  556. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  557. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  558. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  559. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  560. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  561. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  562. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  563. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  564. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  565. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  566. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  567. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  568. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  569. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  570. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  571. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  572. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  573. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  574. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  575. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/base_snapshot_test_app.py +0 -0
  576. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/conftest.py +0 -0
  577. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/snap_compare.py +0 -0
  578. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  579. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  580. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  581. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  582. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  583. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  584. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  585. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  586. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  587. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  588. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  589. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  590. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  591. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  592. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/stubs/fake_backend.py +0 -0
  593. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/stubs/fake_client.py +0 -0
  594. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/stubs/fake_tool.py +0 -0
  595. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_admiral.py +0 -0
  596. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_admiral_phase3.py +0 -0
  597. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_admiral_proposed.py +0 -0
  598. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_admiral_struggle_dedup.py +0 -0
  599. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_agent_auto_compact.py +0 -0
  600. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_agent_backend.py +0 -0
  601. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_agent_observer_streaming.py +0 -0
  602. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_agent_stats.py +0 -0
  603. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_agent_tasks.py +0 -0
  604. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_agent_tool_call.py +0 -0
  605. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_agents.py +0 -0
  606. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_bank_build.py +0 -0
  607. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_bank_debug.py +0 -0
  608. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_bank_multiagent.py +0 -0
  609. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_bank_prd.py +0 -0
  610. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_bank_prd_extended.py +0 -0
  611. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_bank_tools.py +0 -0
  612. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_bank_update.py +0 -0
  613. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_build_projects.py +0 -0
  614. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_checkpoint.py +0 -0
  615. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_cli_programmatic_preload.py +0 -0
  616. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_current_bugs.py +0 -0
  617. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_drydock_regression.py +0 -0
  618. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_drydock_tasks.py +0 -0
  619. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  620. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_full_regression.py +0 -0
  621. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_history_manager.py +0 -0
  622. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_integration.py +0 -0
  623. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_issue_fixes.py +0 -0
  624. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_loop_detection.py +0 -0
  625. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_message_id.py +0 -0
  626. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_message_merging.py +0 -0
  627. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_middleware.py +0 -0
  628. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_multi_agent.py +0 -0
  629. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_read_file_not_found_listing.py +0 -0
  630. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_real_failures.py +0 -0
  631. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_real_issues.py +0 -0
  632. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_real_workflow.py +0 -0
  633. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_reasoning_content.py +0 -0
  634. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_search_replace_args_not_truncated.py +0 -0
  635. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_smoke.py +0 -0
  636. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_system_prompt.py +0 -0
  637. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_tagged_text.py +0 -0
  638. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_task_complete_nudge.py +0 -0
  639. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_tool_args.py +0 -0
  640. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_truncate_args_valid_json.py +0 -0
  641. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_truncated_arg_path_hint.py +0 -0
  642. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_truncated_search_replace_escalation.py +0 -0
  643. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_truncated_write_escalation.py +0 -0
  644. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_ui_external_editor.py +0 -0
  645. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_ui_input_history.py +0 -0
  646. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_user_issues.py +0 -0
  647. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_wall_of_text_rescue.py +0 -0
  648. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_workloads.py +0 -0
  649. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_write_file_missing_path.py +0 -0
  650. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/testbank_helpers.py +0 -0
  651. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_ask_user_question.py +0 -0
  652. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_bash.py +0 -0
  653. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_exit_plan_mode.py +0 -0
  654. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_invoke_context.py +0 -0
  655. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  656. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_manager_get_tool_config.py +0 -0
  657. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_mcp.py +0 -0
  658. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_mcp_sampling.py +0 -0
  659. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
  660. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  661. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_read_file_directory.py +0 -0
  662. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_read_file_limit_truncation.py +0 -0
  663. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_search_replace_append_fallback.py +0 -0
  664. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_search_replace_dir_path.py +0 -0
  665. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_search_replace_empty_content.py +0 -0
  666. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_search_replace_hard_stop.py +0 -0
  667. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_search_replace_malformed_block.py +0 -0
  668. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  669. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  670. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_task.py +0 -0
  671. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_ui_bash_execution.py +0 -0
  672. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_webfetch.py +0 -0
  673. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_websearch.py +0 -0
  674. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  675. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  676. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  677. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  678. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/update_notifier/test_do_update.py +0 -0
  679. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  680. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/update_notifier/test_github_update_gateway.py +0 -0
  681. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  682. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/update_notifier/test_ui_update_notification.py +0 -0
  683. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/update_notifier/test_update_use_case.py +0 -0
  684. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/update_notifier/test_whats_new.py +0 -0
  685. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/worked_examples/README.md +0 -0
  686. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/worked_examples/cli_subcommand_dispatch.py +0 -0
  687. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/worked_examples/lookup.json +0 -0
  688. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/worked_examples/sql_parser.py +0 -0
  689. {drydock_cli-2.7.30 → drydock_cli-2.7.31}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 2183712
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.7.30
3
+ Version: 2.7.31
4
4
  Summary: Local-first CLI coding agent — tested with Gemma 4 26B via vLLM
5
5
  Project-URL: Homepage, https://github.com/fbobe321/drydock
6
6
  Project-URL: Repository, https://github.com/fbobe321/drydock
@@ -353,6 +353,9 @@ class APIToolFormatHandler:
353
353
  # mini_db fresh build (called ralph_repo_index 5 times).
354
354
  "ralph_repo_index", "repo_index", "index_repo",
355
355
  "list_mcp_resources", "list_resources", "search_resources",
356
+ # Observed in stress run 2026-05-02: model hallucinates ralph_file_summary
357
+ # after receiving tool results, causing empty_after_tool stalls.
358
+ "ralph_file_summary", "file_summary", "repo_summary",
356
359
  }
357
360
 
358
361
  suppressed_failures = []
@@ -4,6 +4,7 @@ import asyncio
4
4
  from collections.abc import AsyncGenerator
5
5
  from enum import StrEnum, auto
6
6
  from pathlib import Path
7
+ import re as _re
7
8
  import shutil
8
9
  from typing import TYPE_CHECKING, ClassVar
9
10
 
@@ -131,6 +132,15 @@ class Grep(
131
132
  if not args.pattern.strip():
132
133
  raise ToolError("Empty search pattern provided.")
133
134
 
135
+ try:
136
+ _re.compile(args.pattern)
137
+ except _re.error as regex_err:
138
+ escaped = _re.escape(args.pattern)
139
+ raise ToolError(
140
+ f"Invalid regex pattern: {regex_err}\n"
141
+ f"To search for this as literal text, use pattern={escaped!r}"
142
+ ) from None
143
+
134
144
  path_obj = Path(args.path).expanduser()
135
145
  if not path_obj.is_absolute():
136
146
  path_obj = Path.cwd() / path_obj
@@ -503,7 +503,23 @@ class SearchReplace(
503
503
  entry = state.get(fail_key, {"count": 0})
504
504
  entry["count"] += 1
505
505
  state[fail_key] = entry
506
- if entry["count"] >= 2:
506
+ if entry["count"] == 1:
507
+ # First failure: embed file head so model sees actual content
508
+ # without waiting for a second retry cycle. Reduces
509
+ # retry_after_error:search_replace events significantly.
510
+ try:
511
+ head = original_content[:1500]
512
+ line_count = original_content.count("\n")
513
+ error_message += (
514
+ f"\n\n[HINT: search text not found in {file_path.name}. "
515
+ f"File may have changed. Current file head "
516
+ f"({line_count} lines total):\n"
517
+ f"-----FILE HEAD-----\n{head}\n-----FILE HEAD END-----\n"
518
+ f"Adjust your SEARCH text to match the actual content above.]"
519
+ )
520
+ except Exception:
521
+ pass
522
+ elif entry["count"] >= 2:
507
523
  try:
508
524
  line_count = original_content.count("\n")
509
525
  count = entry["count"]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.7.30"
3
+ version = "2.7.31"
4
4
  description = "Local-first CLI coding agent — tested with Gemma 4 26B via vLLM"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -42,6 +42,9 @@ HALLUCINATED_TOOLS = [
42
42
  "list_mcp_resources",
43
43
  "list_resources",
44
44
  "search_resources",
45
+ "ralph_file_summary",
46
+ "file_summary",
47
+ "repo_summary",
45
48
  ]
46
49
 
47
50
 
@@ -109,6 +109,39 @@ async def test_fails_with_nonexistent_path(grep):
109
109
  assert "Path does not exist" in str(err.value)
110
110
 
111
111
 
112
+ @pytest.mark.asyncio
113
+ async def test_invalid_regex_unmatched_paren_raises_with_hint(grep, tmp_path):
114
+ # Pattern with unescaped ( triggers POSIX ERE error — model must get escaped form
115
+ (tmp_path / "test.py").write_text("def run(self):\n pass\n")
116
+ with pytest.raises(ToolError) as err:
117
+ await collect_result(grep.run(GrepArgs(pattern="def run(self,")))
118
+
119
+ msg = str(err.value)
120
+ assert "Invalid regex" in msg
121
+ assert "literal text" in msg
122
+ # Escaped suggestion must contain escaped paren so model can retry without loop
123
+ assert r"\(" in msg
124
+
125
+
126
+ @pytest.mark.asyncio
127
+ async def test_invalid_regex_unclosed_bracket_raises_with_hint(grep, tmp_path):
128
+ (tmp_path / "test.py").write_text("items = [1, 2]\n")
129
+ with pytest.raises(ToolError) as err:
130
+ await collect_result(grep.run(GrepArgs(pattern="[abc")))
131
+
132
+ msg = str(err.value)
133
+ assert "Invalid regex" in msg
134
+ assert "literal text" in msg
135
+
136
+
137
+ @pytest.mark.asyncio
138
+ async def test_valid_escaped_regex_does_not_raise(grep, tmp_path):
139
+ (tmp_path / "test.py").write_text("def run(self):\n pass\n")
140
+ # Properly escaped pattern must work without error
141
+ result = await collect_result(grep.run(GrepArgs(pattern=r"def run\(self\)")))
142
+ assert result.match_count >= 1
143
+
144
+
112
145
  @pytest.mark.asyncio
113
146
  async def test_searches_in_specific_path(grep, tmp_path):
114
147
  subdir = tmp_path / "subdir"
@@ -0,0 +1,132 @@
1
+ """Regression test: search_replace embeds file head on first failure.
2
+
3
+ Admiral logs (2026-05-02) showed retry_after_error:search_replace events
4
+ where the model retried a failed search_replace without re-reading the file.
5
+ The file head was only embedded starting at count=2, so the model had no
6
+ context on the first failure and would blindly retry the same text.
7
+
8
+ Fix: embed a FILE HEAD hint on the first failure (count=1) so the model
9
+ can immediately see the actual file content and adjust its search text
10
+ without needing a second retry cycle.
11
+ """
12
+ from __future__ import annotations
13
+
14
+ import asyncio
15
+ from pathlib import Path
16
+
17
+ import pytest
18
+
19
+ from drydock.core.tools.base import BaseToolState, InvokeContext
20
+ from drydock.core.tools.builtins.search_replace import (
21
+ SearchReplace,
22
+ SearchReplaceArgs,
23
+ SearchReplaceConfig,
24
+ SearchReplaceResult,
25
+ )
26
+
27
+
28
+ @pytest.fixture
29
+ def tool():
30
+ return SearchReplace(SearchReplaceConfig(), BaseToolState())
31
+
32
+
33
+ @pytest.fixture
34
+ def ctx() -> InvokeContext:
35
+ # read_file_state=None bypasses Read-before-Write guard so tests can focus
36
+ # on the "search text not found" hint behavior specifically.
37
+ return InvokeContext(tool_call_id="tc_hint_1", read_file_state=None)
38
+
39
+
40
+ async def _run(tool, ctx, tmp_path, file_content, search_text, replace_text="NEW"):
41
+ f = tmp_path / "target.py"
42
+ f.write_text(file_content)
43
+ args = SearchReplaceArgs(
44
+ file_path=str(f),
45
+ content=f"<<<<<<< SEARCH\n{search_text}\n=======\n{replace_text}\n>>>>>>> REPLACE",
46
+ )
47
+ last = None
48
+ async for event in tool.run(args, ctx):
49
+ last = event
50
+ return last
51
+
52
+
53
+ def test_first_failure_embeds_file_head(tool, ctx, tmp_path):
54
+ """On first search_replace failure, result includes file content hint."""
55
+ content = "def foo():\n pass\n\ndef bar():\n return 42\n"
56
+ result = asyncio.run(_run(tool, ctx, tmp_path, content, search_text="def nonexistent_func():"))
57
+ assert isinstance(result, SearchReplaceResult)
58
+ assert result.blocks_applied == 0
59
+ assert "FILE HEAD" in result.content or "HINT" in result.content
60
+ assert "def foo():" in result.content
61
+
62
+
63
+ def test_first_failure_hint_not_hard_stop(tool, ctx, tmp_path):
64
+ """First failure uses soft HINT language, not HARD-STOP prohibition."""
65
+ content = "x = 1\ny = 2\n"
66
+ result = asyncio.run(_run(tool, ctx, tmp_path, content, search_text="z = 99"))
67
+ assert isinstance(result, SearchReplaceResult)
68
+ assert "HARD-STOP" not in result.content
69
+ assert "HINT" in result.content or "FILE HEAD" in result.content
70
+
71
+
72
+ def test_second_failure_escalates(tool, ctx, tmp_path):
73
+ """Second consecutive failure escalates to LOOP-BREAKER (existing behavior)."""
74
+ content = "alpha = 1\nbeta = 2\n"
75
+ f = tmp_path / "target.py"
76
+ f.write_text(content)
77
+ args = SearchReplaceArgs(
78
+ file_path=str(f),
79
+ content="<<<<<<< SEARCH\ngamma = 3\n=======\ndelta = 4\n>>>>>>> REPLACE",
80
+ )
81
+
82
+ async def run_twice():
83
+ async for _ in tool.run(args, ctx):
84
+ pass
85
+ last = None
86
+ async for event in tool.run(args, ctx):
87
+ last = event
88
+ return last
89
+
90
+ result = asyncio.run(run_twice())
91
+ assert isinstance(result, SearchReplaceResult)
92
+ assert "LOOP-BREAKER" in result.content or "consecutive" in result.content
93
+
94
+
95
+ def test_success_resets_fail_counter(tool, ctx, tmp_path):
96
+ """After a successful edit, the fail counter resets for that file."""
97
+ content = "def hello():\n pass\n"
98
+ f = tmp_path / "target.py"
99
+ f.write_text(content)
100
+
101
+ async def run_scenario():
102
+ # Fail once
103
+ fail_args = SearchReplaceArgs(
104
+ file_path=str(f),
105
+ content="<<<<<<< SEARCH\nno_such_function():\n=======\nreplaced\n>>>>>>> REPLACE",
106
+ )
107
+ async for _ in tool.run(fail_args, ctx):
108
+ pass
109
+
110
+ # Succeed
111
+ ok_args = SearchReplaceArgs(
112
+ file_path=str(f),
113
+ content="<<<<<<< SEARCH\ndef hello():\n=======\ndef goodbye():\n>>>>>>> REPLACE",
114
+ )
115
+ ok_result = None
116
+ async for event in tool.run(ok_args, ctx):
117
+ ok_result = event
118
+ assert ok_result.blocks_applied == 1
119
+
120
+ # Fail again — should be count=1 (reset), not count=2
121
+ fail2_args = SearchReplaceArgs(
122
+ file_path=str(f),
123
+ content="<<<<<<< SEARCH\nstill_no_such_function():\n=======\nreplaced\n>>>>>>> REPLACE",
124
+ )
125
+ fail2_result = None
126
+ async for event in tool.run(fail2_args, ctx):
127
+ fail2_result = event
128
+ return fail2_result
129
+
130
+ result = asyncio.run(run_scenario())
131
+ assert "HINT" in result.content or "FILE HEAD" in result.content
132
+ assert "LOOP-BREAKER" not in result.content
@@ -717,3 +717,99 @@ restarted, cron self-match bug fixed in this same session).
717
717
  - Admiral last 2h: loop:bash ×8, struggle:none ×8, loop:search_replace ×4, struggle:write_file ×3, retry_after_error:search_replace ×3, retry_after_error:grep ×2, empty_after_tool:ralph_repo_index ×2 — all known model-behavior patterns; hallucinated ralph_repo_index is suppressed with system note per existing code; skip count stable at 121 (not growing since 03:00 UTC)
718
718
  - Latest release: v2.7.29; 2 unreleased commits (df5e0f5 read_file dedup cache, 96fa517 bash truncation notice) pending auto-ship as v2.7.30 at 06:00 UTC
719
719
  - Action this tick: no action — all services healthy, harness 83% complete, no new actionable drydock bugs found; stress should complete within ~3 hours at current rate (~18 prompts/hour in Perf: block)
720
+
721
+ ## 2026-05-02 05:03 UTC tick
722
+ - Stress: 1398/1658 (84%) — PID 675181 alive 1d 13h 55m (RSS 1043 MB); active in Perf: block (coalesce-parallel-reads/warm-cache/evict-LRU); ~260 prompts remaining, ~4 hours at current rate
723
+ - Write rate: 32% last 100 prompts — expected for Perf: text-advice block; model explains caching strategies rather than writing files
724
+ - vLLM 400s: 0 — clean; vLLM gemma4 container healthy; llm_balancer PID 713929 on :8001 healthy and forwarding correctly
725
+ - GH issues: 0 open
726
+ - Latest release: v2.7.30 (auto-shipped at 06:00 UTC earlier today, 2 commits: read_file per-slot dedup cache + bash truncation notice)
727
+ - Admiral last 500 entries: struggle:none ×82, struggle:write_file ×38, struggle:search_replace ×27, loop:bash ×14 — all expected for Perf: block; retry_after_error:read_file only ×1 (not actionable)
728
+ - Action this tick: no action — all services healthy, harness 84% complete, no new actionable drydock bugs found
729
+
730
+ ## 2026-05-02 05:30 UTC tick
731
+ - Stress: 1415/1658 (PID 675181, run 1 day 14h); progressing through "Perf:" block
732
+ - Write rate: 26% (last 89 prompts) — expected low; "Perf: cache/lazy-load/memoize" prompts are advisory, model rarely writes files
733
+ - Admiral last 30 min: retry_after_error:grep (Unmatched paren) fired 3 times since midnight; loop:grep fired twice — known pattern where model sends "def run(self," without escaping
734
+ - vLLM 400s: 0
735
+ - GH issues: 0 open
736
+ - Latest release: v2.7.30
737
+ - Action this tick: committed fix(grep) b79325f — _validate_args now runs re.compile() on pattern before subprocess invocation; on invalid regex raises ToolError with Python re.error message + re.escape() literal suggestion so model can immediately retry with correct pattern instead of looping. 3 regression tests added. Auto-release will ship v2.7.31 at next 0/6/12/18 UTC tick.
738
+
739
+ ## 2026-05-02 06:01 UTC tick
740
+ - Stress: 1430/1658 on log stress_2000_v10_restart_1777561483 (PID 675181, running 1d 14h); the 680/1658 reading from earlier was from a stale log; harness babysitter relaunched and is near completion
741
+ - Write rate: 24% last 100 prompts — mostly "Perf:" and "API:" prompts that legitimately generate 0 writes (model answers without coding); not a regression
742
+ - Admiral last 30 min: loop:bash x2, loop:grep x1, empty_after_tool:ralph_repo_index x2, struggle:search_replace x2 — all known model-behavior patterns; no new failure types
743
+ - vLLM 400s: 0
744
+ - GH issues: 0 open
745
+ - Latest release: v2.7.30; grep fix (b79325f) awaiting v2.7.31 at 06:00 CDT auto_release
746
+ - Action this tick: no action — healthy; stress nearing completion, grep fix pending shipment
747
+
748
+ ## 2026-05-02 06:32 UTC tick
749
+ - Stress: 1441/1658 (87%) — PID 675181 alive 1d 15h; active log stress_2000_v10_restart_1777561483 (last write 1 min ago); "Perf:" + "API:" block; ~217 prompts remain
750
+ - Write rate: 23% last 89 prompts — expected for Perf: advisory block (model explains caching strategies, rarely writes files)
751
+ - vLLM 400s: 0 — gemma4 container up 8 days; llm_balancer PID 713929 on :8001 healthy
752
+ - GH issues: 0 open
753
+ - Latest release: v2.7.30; grep validation fix (b79325f) unreleased, awaiting v2.7.31 at next auto_release (12:00 UTC)
754
+ - Admiral last 30 min: loop:bash x4 (model looping concurrent.futures benchmark), retry_after_error:grep x2 (unmatched paren — fixed by b79325f not yet shipped), loop:grep x2 — all known model-behavior patterns
755
+ - Action this tick: no action — all services healthy, stress 87% complete, grep fix pending shipment
756
+
757
+ ## 2026-05-02 07:02 UTC tick
758
+ - Stress: 1447/1658 (87%) — PID 675181 alive 1d 15h; active log stress_2000_v10_restart_1777561483; 162 SKIPs (TUI slow during Perf/API block), 329 retries
759
+ - Write rate: 22% last 89 prompts — expected low; "Perf: cache/memoize/lazy-load/batch-writes" prompts are advisory-only, model explains without writing files
760
+ - vLLM 400s: 0; llm_balancer PID 713929 on :8001 healthy; gemma4 container up 8+ days
761
+ - GH issues: 0 open
762
+ - Latest release: v2.7.30; grep validation fix (b79325f) unreleased, pending v2.7.31 at 12:00 UTC auto_release
763
+ - Admiral last 30 min: loop:bash x6 (model stuck on concurrent.futures benchmark, same command every ~50s 06:28–06:33 UTC) — model-behavior, not a drydock bug; retry_after_error:grep x3 (unescaped paren — will be resolved by b79325f post-shipment)
764
+ - Action this tick: no action — all services healthy, stress 87% complete, no new actionable drydock bugs
765
+
766
+ ## 2026-05-02 07:32 UTC tick
767
+ - Stress: 1466/1658 (88%) — PID 675181 alive; active log stress_2000_v10_restart_1777561483; in "Perf:" + "API:" block; ~192 prompts remaining
768
+ - Write rate: 20% last 89 prompts — expected for Perf:/API: advisory block (model explains strategies without writing files)
769
+ - vLLM 400s: 0 — gemma4 container healthy; llm_balancer PID 713929 on :8001 healthy
770
+ - GH issues: 0 open
771
+ - Latest release: v2.7.30; grep validation fix (b79325f) + search_replace first-failure hint (516d0c6) both unreleased, will auto-ship as v2.7.31 at next 0/6/12/18 UTC tick
772
+ - Action this tick: committed fix(search_replace) 516d0c6 — file head now embedded on first search-not-found failure (count=1) so model can immediately see actual content and adjust, instead of blindly retrying; previously file head was only shown at count=2. 4 regression tests added. Also fixed test file to use correct SearchReplaceArgs (file_path/content fields) and async tool.run() API — the test was written with wrong constructor args (file/diff, InvokeContext(cwd=)) that never matched the actual codebase.
773
+
774
+ ## 2026-05-02 08:30 UTC tick
775
+ - Stress: 1473/1658 (88.8%), PID 675181 healthy (1d 17h elapsed, resumed from step 679)
776
+ - Write rate: 21% last 90 prompts — expected for "Integrate: X" advisory block (Slack/Discord/Datadog/etc., model explains integration without writing files)
777
+ - Admiral last 30 min: 0 fires (no new admiral patterns observed)
778
+ - vLLM 400s: 0 — gemma4 container healthy; llm_balancer PID 713929 on :8001 healthy
779
+ - GH issues: 0 open
780
+ - Action this tick: no fix committed — 08:00 UTC tick already committed 516d0c6 and b79325f; system healthy; skip rate ~17% (134/781) is stable, caused by TUI log hitting 1.24GB slowing PTY tail checks, expected to self-resolve as run finishes in ~2h
781
+
782
+ ## 2026-05-02 09:02 UTC tick
783
+ - Stress: 1482/1658 (89.4%) — PID 675181 alive (1d 17h elapsed); active log stress_2000_v10_restart_1777561483; 139 SKIPs total, 52 TUI recycles
784
+ - Write rate: 23% last 90 prompts — expected for "Integrate: X" advisory block (Slack/Datadog/Vercel/OCI/etc., model explains integrations without writing files)
785
+ - vLLM 400s: 0 — gemma4 container healthy; llm_balancer PID 713929 on :8001 healthy (1d 14h uptime)
786
+ - GH issues: 0 open
787
+ - Admiral last 30 min: skip-cluster alerts (10-13 skips/34 prompts), tui-recycle-requested x5 between 08:08-09:00 UTC — all caused by large TUI log (1.28GB) slowing PTY detection; model-behavior patterns (loop:bash, retry_after_error:search_replace) but no new drydock bug class
788
+ - Latest release: v2.7.30; two unreleased fixes pending (b79325f grep validation + 516d0c6 search_replace first-failure hint) — will auto-ship as v2.7.31 at 11:00 UTC
789
+ - Action this tick: no fix committed — skip cluster is harness/log-size issue not drydock bug; all services healthy; ~176 prompts remaining (~10h at current pace)
790
+
791
+ ## 2026-05-02 09:32 UTC tick
792
+ - Stress: 1498/1658 (90.3%) — PID 675181 alive (1d 18h elapsed, resumed from step 679); 139 SKIPs, 52 TUI recycles; ~160 prompts remaining
793
+ - Write rate: 30% last 100 prompts (18% overall) — expected: "Integrate: X" block (Slack/Datadog/Opsgenie/Honeycomb/PagerDuty, model explains integrations without writing files)
794
+ - vLLM 400s: 0 — gemma4 container healthy; llm_balancer PID 713929 on :8001 healthy
795
+ - GH issues: 0 open
796
+ - Admiral last 30 min: skip-cluster alerts (9-13 skips/34 prompts) + tui-recycle-requested x5; empty_after_tool:ralph_file_summary observed — model hallucinating non-existent summary tool causing stalls
797
+ - Action this tick: committed fix(hallucinated-tools) bf9f0e2 — added ralph_file_summary, file_summary, repo_summary to _IGNORE_TOOLS so they get suppressed with redirect instead of visible FailedToolCall error; 15 regression tests pass; will ship as v2.7.31 at 12:00 UTC auto_release
798
+
799
+ ## 2026-05-02 10:02 UTC tick
800
+ - Stress: 1508/1658 (91.0%) — PID 675181 alive (1d 18h elapsed, resumed from step 679); active log stress_2000_v10_restart_1777561483; ~178 SKIPs (21%), consistent with prior ticks
801
+ - Write rate: 34% last 100 prompts — expected variation in "Integrate: X" block (Docker/OCI/Singularity/CI/monitoring prompts; model explains integration strategy without writing files)
802
+ - vLLM 400s: 0 — gemma4 container up 8 days; llm_balancer PID 713929 on :8001 healthy; no JSONDecodeErrors last 30 min
803
+ - GH issues: 0 open
804
+ - Admiral last 30 min: no banner=True, raw_md=0 — no write loops or raw-markdown dumps; skip cluster continuing from prior ticks (TUI log ~1.31GB, PTY tail slow)
805
+ - Unreleased commits since v2.7.30: 3 (bf9f0e2 ralph_file_summary suppression, 516d0c6 search_replace first-failure hint, b79325f grep validation) — will auto-ship as v2.7.31 at 12:00 UTC
806
+ - Action this tick: no fix committed — no new drydock bug class observed; all services healthy; ~150 prompts remaining, run likely completes before 18:00 UTC
807
+
808
+ ## 2026-05-02 10:31 UTC tick
809
+ - Stress: 1528/1658 (92% complete); harness PID 675181 alive, running since 1d19h; 130 prompts remain, likely finishes this hour
810
+ - Write rate: 35% last 100 (lower than 74% peak; "Integrate: X" prompts in this range yield 0 writes — expected model behavior, not a regression)
811
+ - Skip rate: 143/1528 = 9.4% (stable, within prior range; all "TUI did not accept after 3 retries")
812
+ - vLLM 400s: 0 — gemma4 container healthy; balancer PID 713929 on :8001 unchanged
813
+ - GH issues: 0 open
814
+ - Unreleased commits since v2.7.30: 3 (bf9f0e2 hallucinated-tools, 516d0c6 search_replace hint, b79325f grep validation) — auto-ships as v2.7.31 at 12:00 UTC
815
+ - Action this tick: no fix committed — no new drydock bug class observed; all services healthy; run close to completion
@@ -326,7 +326,7 @@ wheels = [
326
326
 
327
327
  [[package]]
328
328
  name = "drydock-cli"
329
- version = "2.7.29"
329
+ version = "2.7.30"
330
330
  source = { editable = "." }
331
331
  dependencies = [
332
332
  { name = "agent-client-protocol" },
@@ -1 +0,0 @@
1
- 2123904
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