drydock-cli 2.7.10__tar.gz → 2.7.16__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 (666) hide show
  1. drydock_cli-2.7.16/.auto_release.lock +1 -0
  2. drydock_cli-2.7.16/.claude/scheduled_tasks.lock +1 -0
  3. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/PKG-INFO +1 -1
  4. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/admiral/detectors_proposed.py +9 -2
  5. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/agent_loop.py +14 -5
  6. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/llm/format.py +41 -1
  7. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/bash.py +65 -8
  8. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/read_file.py +36 -3
  9. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/search_replace.py +83 -31
  10. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/write_file.py +17 -0
  11. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/pyproject.toml +1 -1
  12. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/auto_release.sh +26 -6
  13. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/stress_babysitter.sh +2 -2
  14. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_admiral_proposed.py +19 -0
  15. drydock_cli-2.7.16/tests/test_read_file_not_found_listing.py +70 -0
  16. drydock_cli-2.7.16/tests/test_truncated_arg_path_hint.py +94 -0
  17. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/tools/test_bash.py +42 -10
  18. drydock_cli-2.7.16/tests/tools/test_read_file_directory.py +65 -0
  19. drydock_cli-2.7.16/tests/tools/test_search_replace_no_op_loop_breaker.py +139 -0
  20. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/tools/test_search_replace_refused_loop_breaker.py +34 -33
  21. drydock_cli-2.7.16/tests/tools/test_write_file_dedup_missing_imports.py +103 -0
  22. drydock_cli-2.7.16/tests/tools/test_write_file_missing_path_hint.py +78 -0
  23. drydock_cli-2.7.16/trip_log.md +323 -0
  24. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/uv.lock +1 -1
  25. drydock_cli-2.7.10/.auto_release.lock +0 -1
  26. drydock_cli-2.7.10/.claude/scheduled_tasks.lock +0 -1
  27. drydock_cli-2.7.10/trip_log.md +0 -75
  28. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/.github/CODEOWNERS +0 -0
  29. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  30. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  31. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  32. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/.github/workflows/build-and-upload.yml +0 -0
  33. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/.github/workflows/ci.yml +0 -0
  34. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/.github/workflows/issue-labeler.yml +0 -0
  35. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/.github/workflows/release.yml +0 -0
  36. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/.gitignore +0 -0
  37. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/.pre-commit-config.yaml +0 -0
  38. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/.python-version +0 -0
  39. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/.typos.toml +0 -0
  40. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/.vscode/extensions.json +0 -0
  41. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/.vscode/launch.json +0 -0
  42. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/.vscode/settings.json +0 -0
  43. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/AGENTS.md +0 -0
  44. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/Admiral.md +0 -0
  45. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/BASELINE_412.md +0 -0
  46. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/CHANGELOG.md +0 -0
  47. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/CLAUDE.md +0 -0
  48. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/CONTRIBUTING.md +0 -0
  49. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/DEPLOYMENT.md +0 -0
  50. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/Drydock_rebrand.md +0 -0
  51. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/LICENSE +0 -0
  52. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/MODEL_SHORTCOMINGS.md +0 -0
  53. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/NOTICE +0 -0
  54. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/OVERNIGHT_PROGRESS.md +0 -0
  55. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  56. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/PRD.md +0 -0
  57. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/README.md +0 -0
  58. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/action.yml +0 -0
  59. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/baseline_history/README.md +0 -0
  60. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/baseline_history/results1.tsv +0 -0
  61. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/baseline_history/results13.tsv +0 -0
  62. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/baseline_history/results14.tsv +0 -0
  63. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/baseline_history/results15.tsv +0 -0
  64. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/baseline_history/results16.tsv +0 -0
  65. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/baseline_history/results17.tsv +0 -0
  66. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/baseline_history/results18.tsv +0 -0
  67. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/baseline_history/results19.tsv +0 -0
  68. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/baseline_history/results2.tsv +0 -0
  69. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/baseline_history/results20.tsv +0 -0
  70. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/baseline_history/results3.tsv +0 -0
  71. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/baseline_history/results4.tsv +0 -0
  72. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/baseline_history/results5.tsv +0 -0
  73. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/baseline_history/results6.tsv +0 -0
  74. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/baseline_history/results7.tsv +0 -0
  75. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/baseline_history/results8.tsv +0 -0
  76. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/baseline_history/results9.tsv +0 -0
  77. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/baseline_history/results_evolved_v1.tsv +0 -0
  78. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/distribution/zed/LICENSE +0 -0
  79. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/distribution/zed/extension.toml +0 -0
  80. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/distribution/zed/icons/mistral_vibe.svg +0 -0
  81. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/docs/README.md +0 -0
  82. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/docs/acp-setup.md +0 -0
  83. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/docs/proxy-setup.md +0 -0
  84. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/__init__.py +0 -0
  85. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/acp/__init__.py +0 -0
  86. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/acp/acp_agent_loop.py +0 -0
  87. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/acp/acp_logger.py +0 -0
  88. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/acp/entrypoint.py +0 -0
  89. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/acp/tools/__init__.py +0 -0
  90. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/acp/tools/base.py +0 -0
  91. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/acp/tools/builtins/bash.py +0 -0
  92. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/acp/tools/builtins/read_file.py +0 -0
  93. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/acp/tools/builtins/search_replace.py +0 -0
  94. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/acp/tools/builtins/todo.py +0 -0
  95. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/acp/tools/builtins/write_file.py +0 -0
  96. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/acp/tools/session_update.py +0 -0
  97. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/acp/utils.py +0 -0
  98. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/admiral/__init__.py +0 -0
  99. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/admiral/detectors.py +0 -0
  100. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/admiral/history.py +0 -0
  101. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/admiral/interventions.py +0 -0
  102. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/admiral/llm_analyzer.py +0 -0
  103. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/admiral/metrics.py +0 -0
  104. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/admiral/opus_escalator.py +0 -0
  105. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/admiral/persistence.py +0 -0
  106. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/admiral/policy.py +0 -0
  107. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/admiral/proposer.py +0 -0
  108. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/admiral/stager.py +0 -0
  109. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/admiral/task_classifier.py +0 -0
  110. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/admiral/tuning.py +0 -0
  111. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/admiral/validator.py +0 -0
  112. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/admiral/worker.py +0 -0
  113. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/__init__.py +0 -0
  114. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/autocompletion/__init__.py +0 -0
  115. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/autocompletion/base.py +0 -0
  116. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/autocompletion/path_completion.py +0 -0
  117. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/autocompletion/slash_command.py +0 -0
  118. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/cli.py +0 -0
  119. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/clipboard.py +0 -0
  120. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/commands.py +0 -0
  121. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/entrypoint.py +0 -0
  122. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/history_manager.py +0 -0
  123. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  124. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  125. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  126. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/terminal_setup.py +0 -0
  127. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/__init__.py +0 -0
  128. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  129. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/app.py +0 -0
  130. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/app.tcss +0 -0
  131. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/external_editor.py +0 -0
  132. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  133. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  134. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  135. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  136. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  137. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  138. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  139. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  140. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  141. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  142. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  143. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  144. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  145. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  146. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  147. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  148. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  149. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  150. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  151. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  152. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  153. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  154. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  155. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  156. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  157. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  158. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  159. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  160. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  161. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  162. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  163. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  164. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  165. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  166. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  167. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  168. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  169. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/windowing/history.py +0 -0
  170. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  171. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/textual_ui/windowing/state.py +0 -0
  172. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/update_notifier/__init__.py +0 -0
  173. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  174. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  175. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  176. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  177. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  178. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/update_notifier/update.py +0 -0
  179. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/cli/update_notifier/whats_new.py +0 -0
  180. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/__init__.py +0 -0
  181. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/agents/__init__.py +0 -0
  182. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/agents/manager.py +0 -0
  183. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/agents/models.py +0 -0
  184. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/auth/__init__.py +0 -0
  185. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/auth/crypto.py +0 -0
  186. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/auth/github.py +0 -0
  187. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/autocompletion/__init__.py +0 -0
  188. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/autocompletion/completers.py +0 -0
  189. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  190. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  191. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  192. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  193. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  194. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/autocompletion/fuzzy.py +0 -0
  195. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/autocompletion/path_prompt.py +0 -0
  196. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  197. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/build_orchestrator.py +0 -0
  198. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/checkpoint.py +0 -0
  199. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/config/__init__.py +0 -0
  200. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/config/_settings.py +0 -0
  201. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/config/doctor.py +0 -0
  202. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/config/harness_files/__init__.py +0 -0
  203. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  204. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/config/harness_files/_paths.py +0 -0
  205. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/consultant.py +0 -0
  206. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/drydock_states.py +0 -0
  207. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/hooks.py +0 -0
  208. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/llm/__init__.py +0 -0
  209. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/llm/backend/anthropic.py +0 -0
  210. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/llm/backend/base.py +0 -0
  211. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/llm/backend/factory.py +0 -0
  212. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/llm/backend/generic.py +0 -0
  213. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/llm/backend/mistral.py +0 -0
  214. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  215. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/llm/backend/vertex.py +0 -0
  216. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/llm/exceptions.py +0 -0
  217. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/llm/message_utils.py +0 -0
  218. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/llm/types.py +0 -0
  219. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/logger.py +0 -0
  220. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/middleware.py +0 -0
  221. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/output_formatters.py +0 -0
  222. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/paths/__init__.py +0 -0
  223. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/paths/_drydock_home.py +0 -0
  224. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/paths/_local_config_walk.py +0 -0
  225. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/paths/conventions.py +0 -0
  226. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/plan_session.py +0 -0
  227. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/plugins.py +0 -0
  228. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/programmatic.py +0 -0
  229. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/prompts/__init__.py +0 -0
  230. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/prompts/builder.md +0 -0
  231. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/prompts/cli.md +0 -0
  232. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/prompts/compact.md +0 -0
  233. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/prompts/dangerous_directory.md +0 -0
  234. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/prompts/diagnostic.md +0 -0
  235. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/prompts/explore.md +0 -0
  236. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/prompts/gemma4.md +0 -0
  237. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/prompts/planner.md +0 -0
  238. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/prompts/project_context.md +0 -0
  239. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/prompts/tests.md +0 -0
  240. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/proxy_setup.py +0 -0
  241. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/session/agent_memory.py +0 -0
  242. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/session/checkpoints.py +0 -0
  243. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/session/session_loader.py +0 -0
  244. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/session/session_logger.py +0 -0
  245. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/session/session_migration.py +0 -0
  246. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/session/state_file.py +0 -0
  247. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/session_checker.py +0 -0
  248. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/skills/__init__.py +0 -0
  249. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/skills/manager.py +0 -0
  250. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/skills/models.py +0 -0
  251. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/skills/parser.py +0 -0
  252. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/slug.py +0 -0
  253. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/system_prompt.py +0 -0
  254. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/telemetry/__init__.py +0 -0
  255. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/telemetry/send.py +0 -0
  256. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/teleport/errors.py +0 -0
  257. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/teleport/git.py +0 -0
  258. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/teleport/nuage.py +0 -0
  259. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/teleport/teleport.py +0 -0
  260. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/teleport/types.py +0 -0
  261. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/base.py +0 -0
  262. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/_task_manager.py +0 -0
  263. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  264. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/cron.py +0 -0
  265. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  266. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/glob_tool.py +0 -0
  267. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/grep.py +0 -0
  268. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  269. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/lsp.py +0 -0
  270. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  271. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  272. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/powershell.py +0 -0
  273. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  274. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  275. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  276. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  277. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  278. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  279. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  280. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  281. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  282. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  283. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  284. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  285. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  286. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  287. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/task.md +0 -0
  288. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  289. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  290. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  291. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  292. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  293. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  294. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  295. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/task.py +0 -0
  296. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/todo.py +0 -0
  297. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/tool_search.py +0 -0
  298. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/webfetch.py +0 -0
  299. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/websearch.py +0 -0
  300. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/builtins/worktree.py +0 -0
  301. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/injection_guard.py +0 -0
  302. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/manager.py +0 -0
  303. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/mcp/__init__.py +0 -0
  304. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/mcp/registry.py +0 -0
  305. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/mcp/tools.py +0 -0
  306. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/mcp_sampling.py +0 -0
  307. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/ui.py +0 -0
  308. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/tools/utils.py +0 -0
  309. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/trusted_folders.py +0 -0
  310. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/types.py +0 -0
  311. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/core/utils.py +0 -0
  312. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/setup/onboarding/__init__.py +0 -0
  313. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/setup/onboarding/base.py +0 -0
  314. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/setup/onboarding/onboarding.tcss +0 -0
  315. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/setup/onboarding/screens/__init__.py +0 -0
  316. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/setup/onboarding/screens/api_key.py +0 -0
  317. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/setup/onboarding/screens/choice.py +0 -0
  318. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/setup/onboarding/screens/local_model.py +0 -0
  319. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/setup/onboarding/screens/welcome.py +0 -0
  320. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  321. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  322. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/__init__.py +0 -0
  323. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/api-design/SKILL.md +0 -0
  324. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/audit-tests/SKILL.md +0 -0
  325. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/batch/SKILL.md +0 -0
  326. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/commit-code/SKILL.md +0 -0
  327. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/context-summary/SKILL.md +0 -0
  328. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/create-presentation/SKILL.md +0 -0
  329. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/deep-research/SKILL.md +0 -0
  330. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/deploy/SKILL.md +0 -0
  331. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/diff-review/SKILL.md +0 -0
  332. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/doc-gen/SKILL.md +0 -0
  333. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/explain-code/SKILL.md +0 -0
  334. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/explore-code/SKILL.md +0 -0
  335. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/fix-issue/SKILL.md +0 -0
  336. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/git-ops/SKILL.md +0 -0
  337. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/init-project/SKILL.md +0 -0
  338. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/investigate/SKILL.md +0 -0
  339. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/loop/SKILL.md +0 -0
  340. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/migrate/SKILL.md +0 -0
  341. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/perf-analyze/SKILL.md +0 -0
  342. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/plan-impl/SKILL.md +0 -0
  343. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/pr-review/SKILL.md +0 -0
  344. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/refactor/SKILL.md +0 -0
  345. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/regex-help/SKILL.md +0 -0
  346. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/review/SKILL.md +0 -0
  347. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/security-review/SKILL.md +0 -0
  348. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/ship/SKILL.md +0 -0
  349. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/simplify/SKILL.md +0 -0
  350. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/strong-tests/SKILL.md +0 -0
  351. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/skills/test-verify/SKILL.md +0 -0
  352. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock/whats_new.md +0 -0
  353. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock-acp.spec +0 -0
  354. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/drydock_terms.md +0 -0
  355. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/flake.lock +0 -0
  356. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/flake.nix +0 -0
  357. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/nohup.out +0 -0
  358. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/research/README.md +0 -0
  359. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/research/config_base.toml +0 -0
  360. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/research/config_best.toml +0 -0
  361. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/research/domain_spec.md +0 -0
  362. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/research/experimenter.py +0 -0
  363. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/research/kernel.py +0 -0
  364. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/research/mini_prd.md +0 -0
  365. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/research/mini_prompts.txt +0 -0
  366. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/research/proposer.py +0 -0
  367. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/research/results.tsv +0 -0
  368. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/resume.md +0 -0
  369. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/README.md +0 -0
  370. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/admiral_probe.py +0 -0
  371. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/audit_sampler.py +0 -0
  372. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/auto_generate_tests.py +0 -0
  373. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/auto_test_loop.sh +0 -0
  374. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/autonomous_review.sh +0 -0
  375. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/autonomous_review_prompt.md +0 -0
  376. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/backup.sh +0 -0
  377. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/bump_version.py +0 -0
  378. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/comprehensive_loop.py +0 -0
  379. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/deploy_to_github.sh +0 -0
  380. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/discover_cli_tools.sh +0 -0
  381. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/evolve_tests.py +0 -0
  382. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/gen_2000_prompts.py +0 -0
  383. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/install.sh +0 -0
  384. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/llm_balancer.py +0 -0
  385. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/mega_loop.py +0 -0
  386. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/meta_ralph_loop.py +0 -0
  387. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/monitor_swebench.sh +0 -0
  388. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/monitor_test_battery.sh +0 -0
  389. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/notify_release.py +0 -0
  390. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/oss_task_harness.py +0 -0
  391. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/overnight_agents_test.sh +0 -0
  392. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/poll_issues.sh +0 -0
  393. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/port_task.py +0 -0
  394. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/prepare_release.py +0 -0
  395. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/publish_to_pypi.sh +0 -0
  396. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/ralph_loop.py +0 -0
  397. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/research_babysitter.sh +0 -0
  398. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/session_loop_audit.py +0 -0
  399. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/shakedown.py +0 -0
  400. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/shakedown_interactive.py +0 -0
  401. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/shakedown_regression.sh +0 -0
  402. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/shakedown_suite.sh +0 -0
  403. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/shakedown_variance.sh +0 -0
  404. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/stress_prompts_50.txt +0 -0
  405. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/stress_prompts_realuser.txt +0 -0
  406. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/stress_prompts_tool_agent.txt +0 -0
  407. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  408. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/stress_shakedown.py +0 -0
  409. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/stress_telegram_status.py +0 -0
  410. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/stress_watcher.py +0 -0
  411. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/telegram_bot.py +0 -0
  412. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/test_bank.sh +0 -0
  413. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/test_full.sh +0 -0
  414. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/test_smoke.sh +0 -0
  415. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/test_tui_path.py +0 -0
  416. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/tui_test.py +0 -0
  417. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/scripts/vllm_failover.sh +0 -0
  418. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/test/project/dummy +0 -0
  419. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/__init__.py +0 -0
  420. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/conftest.py +0 -0
  421. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/test_acp.py +0 -0
  422. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/test_agent_thought.py +0 -0
  423. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/test_bash.py +0 -0
  424. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/test_compact_session_updates.py +0 -0
  425. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/test_content.py +0 -0
  426. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/test_initialize.py +0 -0
  427. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/test_list_sessions.py +0 -0
  428. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/test_load_session.py +0 -0
  429. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/test_multi_session.py +0 -0
  430. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/test_new_session.py +0 -0
  431. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/test_proxy_setup_acp.py +0 -0
  432. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/test_read_file.py +0 -0
  433. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/test_search_replace.py +0 -0
  434. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/test_set_config_option.py +0 -0
  435. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/test_set_mode.py +0 -0
  436. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/test_set_model.py +0 -0
  437. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/test_tool_call_session_update.py +0 -0
  438. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/test_utils.py +0 -0
  439. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/acp/test_write_file.py +0 -0
  440. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/autocompletion/test_file_indexer.py +0 -0
  441. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/autocompletion/test_fuzzy.py +0 -0
  442. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  443. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  444. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/autocompletion/test_path_completion_controller.py +0 -0
  445. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  446. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/autocompletion/test_slash_command_controller.py +0 -0
  447. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  448. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/backend/__init__.py +0 -0
  449. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/backend/data/__init__.py +0 -0
  450. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/backend/data/fireworks.py +0 -0
  451. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/backend/data/mistral.py +0 -0
  452. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/backend/test_anthropic_adapter.py +0 -0
  453. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/backend/test_backend.py +0 -0
  454. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  455. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/backend/test_reasoning_adapter.py +0 -0
  456. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  457. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  458. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  459. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  460. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/cli/test_bell_notifications.py +0 -0
  461. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/cli/test_braille_renderer.py +0 -0
  462. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/cli/test_clipboard.py +0 -0
  463. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/cli/test_commands.py +0 -0
  464. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/cli/test_copy_shortcuts.py +0 -0
  465. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/cli/test_external_editor.py +0 -0
  466. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/cli/test_no_markup_static.py +0 -0
  467. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/cli/test_question_app.py +0 -0
  468. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/cli/test_spinner.py +0 -0
  469. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/cli/test_switching_mode.py +0 -0
  470. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  471. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  472. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/cli/test_ui_session_resume.py +0 -0
  473. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/cli/test_ui_skill_dispatch.py +0 -0
  474. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/cli/textual_ui/__init__.py +0 -0
  475. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/cli/textual_ui/test_session_picker.py +0 -0
  476. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/conftest.py +0 -0
  477. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/core/test_agents.py +0 -0
  478. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/core/test_auth_crypto.py +0 -0
  479. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/core/test_auth_github.py +0 -0
  480. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/core/test_config_load_dotenv.py +0 -0
  481. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/core/test_config_paths.py +0 -0
  482. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/core/test_config_resolution.py +0 -0
  483. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/core/test_file_logging.py +0 -0
  484. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/core/test_plan_session.py +0 -0
  485. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/core/test_proxy_setup.py +0 -0
  486. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/core/test_slug.py +0 -0
  487. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/core/test_telemetry_send.py +0 -0
  488. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/core/test_teleport_git.py +0 -0
  489. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/core/test_teleport_nuage.py +0 -0
  490. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/core/test_teleport_service.py +0 -0
  491. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/core/test_trusted_folders.py +0 -0
  492. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/core/test_utils.py +0 -0
  493. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/e2e/common.py +0 -0
  494. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/e2e/conftest.py +0 -0
  495. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/e2e/mock_server.py +0 -0
  496. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  497. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/e2e/test_cli_tui_streaming.py +0 -0
  498. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  499. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/fixtures/doc_qa_system_prd.md +0 -0
  500. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/mock/__init__.py +0 -0
  501. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/mock/mock_backend_factory.py +0 -0
  502. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/mock/mock_entrypoint.py +0 -0
  503. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/mock/utils.py +0 -0
  504. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/onboarding/test_run_onboarding.py +0 -0
  505. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/onboarding/test_ui_onboarding.py +0 -0
  506. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/session/test_session_loader.py +0 -0
  507. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/session/test_session_logger.py +0 -0
  508. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/session/test_session_migration.py +0 -0
  509. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/skills/conftest.py +0 -0
  510. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/skills/test_manager.py +0 -0
  511. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/skills/test_models.py +0 -0
  512. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/skills/test_parser.py +0 -0
  513. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  514. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  515. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  516. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  517. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  518. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  519. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  520. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  521. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  522. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  523. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  524. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  525. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  526. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  527. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  528. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  529. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  530. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  531. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  532. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  533. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  534. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  535. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  536. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  537. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  538. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  539. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  540. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  541. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  542. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  543. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  544. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  545. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  546. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  547. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  548. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  549. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  550. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  551. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  552. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  553. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  554. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  555. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  556. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  557. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  558. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  559. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  560. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  561. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  562. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  563. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  564. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  565. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  566. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  567. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  568. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  569. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  570. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  571. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  572. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  573. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/base_snapshot_test_app.py +0 -0
  574. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/conftest.py +0 -0
  575. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/snap_compare.py +0 -0
  576. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  577. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  578. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  579. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  580. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  581. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  582. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  583. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  584. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  585. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  586. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  587. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  588. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  589. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  590. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/stubs/fake_backend.py +0 -0
  591. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/stubs/fake_client.py +0 -0
  592. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/stubs/fake_tool.py +0 -0
  593. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_admiral.py +0 -0
  594. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_admiral_phase3.py +0 -0
  595. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_agent_auto_compact.py +0 -0
  596. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_agent_backend.py +0 -0
  597. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_agent_observer_streaming.py +0 -0
  598. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_agent_stats.py +0 -0
  599. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_agent_tasks.py +0 -0
  600. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_agent_tool_call.py +0 -0
  601. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_agents.py +0 -0
  602. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_bank_build.py +0 -0
  603. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_bank_debug.py +0 -0
  604. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_bank_multiagent.py +0 -0
  605. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_bank_prd.py +0 -0
  606. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_bank_prd_extended.py +0 -0
  607. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_bank_tools.py +0 -0
  608. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_bank_update.py +0 -0
  609. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_build_projects.py +0 -0
  610. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_checkpoint.py +0 -0
  611. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_cli_programmatic_preload.py +0 -0
  612. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_current_bugs.py +0 -0
  613. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_drydock_regression.py +0 -0
  614. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_drydock_tasks.py +0 -0
  615. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  616. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_full_regression.py +0 -0
  617. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_history_manager.py +0 -0
  618. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_integration.py +0 -0
  619. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_issue_fixes.py +0 -0
  620. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_loop_detection.py +0 -0
  621. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_message_id.py +0 -0
  622. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_message_merging.py +0 -0
  623. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_middleware.py +0 -0
  624. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_multi_agent.py +0 -0
  625. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_real_failures.py +0 -0
  626. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_real_issues.py +0 -0
  627. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_real_workflow.py +0 -0
  628. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_reasoning_content.py +0 -0
  629. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_smoke.py +0 -0
  630. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_system_prompt.py +0 -0
  631. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_tagged_text.py +0 -0
  632. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_tool_args.py +0 -0
  633. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_truncate_args_valid_json.py +0 -0
  634. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_ui_external_editor.py +0 -0
  635. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_ui_input_history.py +0 -0
  636. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_user_issues.py +0 -0
  637. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_wall_of_text_rescue.py +0 -0
  638. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/test_workloads.py +0 -0
  639. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/testbank_helpers.py +0 -0
  640. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/tools/test_ask_user_question.py +0 -0
  641. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/tools/test_exit_plan_mode.py +0 -0
  642. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/tools/test_grep.py +0 -0
  643. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/tools/test_invoke_context.py +0 -0
  644. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  645. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/tools/test_manager_get_tool_config.py +0 -0
  646. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/tools/test_mcp.py +0 -0
  647. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/tools/test_mcp_sampling.py +0 -0
  648. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/tools/test_search_replace_append_fallback.py +0 -0
  649. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/tools/test_task.py +0 -0
  650. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/tools/test_ui_bash_execution.py +0 -0
  651. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/tools/test_webfetch.py +0 -0
  652. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/tools/test_websearch.py +0 -0
  653. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  654. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  655. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/update_notifier/test_do_update.py +0 -0
  656. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  657. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/update_notifier/test_github_update_gateway.py +0 -0
  658. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  659. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/update_notifier/test_ui_update_notification.py +0 -0
  660. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/update_notifier/test_update_use_case.py +0 -0
  661. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/tests/update_notifier/test_whats_new.py +0 -0
  662. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/worked_examples/README.md +0 -0
  663. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/worked_examples/cli_subcommand_dispatch.py +0 -0
  664. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/worked_examples/lookup.json +0 -0
  665. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/worked_examples/sql_parser.py +0 -0
  666. {drydock_cli-2.7.10 → drydock_cli-2.7.16}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 238585
@@ -0,0 +1 @@
1
+ {"sessionId":"facd51cc-fa47-4911-afc8-14485ae9caf3","pid":711220,"acquiredAt":1775966390914}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.7.10
3
+ Version: 2.7.16
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
@@ -43,11 +43,18 @@ def _tool_result_errored(m: LLMMessage) -> bool:
43
43
  """Heuristic: does this tool-role message look like a failure?
44
44
 
45
45
  Conservative — we only want high-precision firing on actual errors.
46
- Scanned the first 800 chars of the result content.
46
+ Scanned the first 200 chars of the result content (tightened from 800
47
+ to avoid false positives when matched file content contains words like
48
+ "error" or "failed" — grep results starting with "matches:" are always
49
+ successful).
47
50
  """
48
51
  if m.role is not Role.tool:
49
52
  return False
50
- content = str(getattr(m, "content", "") or "")[:800].lower()
53
+ raw = str(getattr(m, "content", "") or "")
54
+ # Successful grep results start with "matches:" — never treat as error.
55
+ if raw.lstrip().startswith("matches:"):
56
+ return False
57
+ content = raw[:200].lower()
51
58
  return any(marker in content for marker in _TOOL_ERROR_MARKERS)
52
59
 
53
60
 
@@ -1703,10 +1703,10 @@ class AgentLoop:
1703
1703
  Runs every turn but is a no-op when nothing exceeds the caps.
1704
1704
  Truncation is in-place and idempotent.
1705
1705
  """
1706
- KEEP_RECENT = 6 # last N tool messages stay full
1707
- SOFT_CAP_BYTES = 800 # tool result longer than this gets shrunk
1708
- HEAD_BYTES = 400 # bytes kept from the head
1709
- TAIL_BYTES = 100 # bytes kept from the tail
1706
+ KEEP_RECENT = 4 # last N tool messages stay full
1707
+ SOFT_CAP_BYTES = 500 # tool result longer than this gets shrunk
1708
+ HEAD_BYTES = 200 # bytes kept from the head
1709
+ TAIL_BYTES = 60 # bytes kept from the tail
1710
1710
 
1711
1711
  if len(self.messages) < KEEP_RECENT + 4:
1712
1712
  return
@@ -2334,7 +2334,16 @@ class AgentLoop:
2334
2334
  if replace_last_tool:
2335
2335
  msg.content = f"[SYSTEM: {text}]"
2336
2336
  else:
2337
- msg.content = (msg.content or "") + f"\n\n[SYSTEM: {text}]"
2337
+ content = msg.content or ""
2338
+ # Cap at 2 accumulated system notes per message; replace the
2339
+ # last one when the limit is exceeded so repeated admiral
2340
+ # interventions don't unboundedly bloat the context.
2341
+ _SYS_PREFIX = "\n\n[SYSTEM: "
2342
+ if content.count(_SYS_PREFIX) >= 2:
2343
+ last_idx = content.rfind(_SYS_PREFIX)
2344
+ msg.content = content[:last_idx] + _SYS_PREFIX + text + "]"
2345
+ else:
2346
+ msg.content = content + _SYS_PREFIX + text + "]"
2338
2347
  return
2339
2348
 
2340
2349
  # Second try: append to last user message
@@ -367,6 +367,32 @@ class APIToolFormatHandler:
367
367
  continue
368
368
 
369
369
  args_model, _ = tool_class._get_tool_args_results()
370
+
371
+ # Detect when model copied truncated-history args (our truncation
372
+ # code replaces large tool-call args with {_truncated, _original_bytes,
373
+ # path}). Return a clear advisory instead of a pydantic traceback so
374
+ # the model re-does the call with real arguments rather than retrying
375
+ # the truncated form.
376
+ if (isinstance(parsed_call.raw_args, dict)
377
+ and parsed_call.raw_args.get("_truncated")):
378
+ path_hint = (parsed_call.raw_args.get("path")
379
+ or parsed_call.raw_args.get("file_path")
380
+ or "")
381
+ hint = f" Re-read `{path_hint}` with read_file first." if path_hint else ""
382
+ failed_calls.append(
383
+ FailedToolCall(
384
+ tool_name=parsed_call.tool_name,
385
+ call_id=parsed_call.call_id,
386
+ error=(
387
+ f"{parsed_call.tool_name}: your call used a "
388
+ f"truncated history entry as a template (it contained "
389
+ f"'_truncated'/'_original_bytes' instead of real "
390
+ f"arguments).{hint} Provide the full required arguments."
391
+ ),
392
+ )
393
+ )
394
+ continue
395
+
370
396
  try:
371
397
  validated_args = args_model.model_validate(parsed_call.raw_args)
372
398
  resolved_calls.append(
@@ -378,11 +404,25 @@ class APIToolFormatHandler:
378
404
  )
379
405
  )
380
406
  except ValidationError as e:
407
+ error_str = str(e)
408
+ if (
409
+ parsed_call.tool_name == "write_file"
410
+ and "path" in error_str
411
+ and "Field required" in error_str
412
+ ):
413
+ error_msg = (
414
+ "write_file: missing required `path` parameter. "
415
+ "You must pass BOTH `path` AND `content` as separate arguments. "
416
+ 'Fix: write_file(path="your/file.py", content="..."). '
417
+ "Do NOT omit `path`."
418
+ )
419
+ else:
420
+ error_msg = f"Invalid arguments: {e}"
381
421
  failed_calls.append(
382
422
  FailedToolCall(
383
423
  tool_name=parsed_call.tool_name,
384
424
  call_id=parsed_call.call_id,
385
- error=f"Invalid arguments: {e}",
425
+ error=error_msg,
386
426
  )
387
427
  )
388
428
 
@@ -404,13 +404,38 @@ class Bash(
404
404
  self, *, command: str, stdout: str, stderr: str, returncode: int
405
405
  ) -> BashResult:
406
406
  if returncode != 0:
407
- error_msg = f"Command failed: {command!r}\n"
408
- error_msg += f"Return code: {returncode}"
409
- if stderr:
410
- error_msg += f"\nStderr: {stderr}"
411
- if stdout:
412
- error_msg += f"\nStdout: {stdout}"
413
- raise ToolError(error_msg.strip())
407
+ # ADVISORY ONLY never raise ToolError for non-zero exit codes.
408
+ # Raising blocks the model: it gets <tool_error> with no useful
409
+ # output, doesn't know if exit 1 means "no matches" (grep) or a
410
+ # real failure, and retries identically. Same pattern as the
411
+ # timeout handler above. Include a clear exit-code annotation so
412
+ # the model can reason about what happened.
413
+ # See feedback_no_tool_errors_for_loop_detection.md.
414
+ annotation = f"[Exit code {returncode}]"
415
+ if returncode < 0:
416
+ # Negative returncode means killed by a Unix signal.
417
+ try:
418
+ sig_name = signal.Signals(-returncode).name
419
+ except ValueError:
420
+ sig_name = f"signal {-returncode}"
421
+ annotation += (
422
+ f" — process killed by {sig_name}."
423
+ " If this command starts a server or long-running process,"
424
+ " background it with `command &` and verify ports with `ss -tlnp`."
425
+ )
426
+ elif not stdout and not stderr:
427
+ annotation += " (no output)"
428
+ if returncode == 1:
429
+ annotation += (
430
+ " — for grep/find, exit code 1 means no matches found"
431
+ )
432
+ annotated_stdout = (stdout + "\n" + annotation).strip() if stdout else annotation
433
+ return BashResult(
434
+ command=command,
435
+ stdout=annotated_stdout,
436
+ stderr=stderr,
437
+ returncode=returncode,
438
+ )
414
439
 
415
440
  return BashResult(
416
441
  command=command, stdout=stdout, stderr=stderr, returncode=returncode
@@ -445,7 +470,39 @@ class Bash(
445
470
  )
446
471
  except TimeoutError:
447
472
  await _kill_process_tree(proc)
448
- raise self._build_timeout_error(args.command, timeout)
473
+ # ADVISORY ONLY — never raise ToolError on timeout; raising
474
+ # causes the model to retry the exact same command (loop).
475
+ # Track repeat timeouts per command and escalate the hint.
476
+ # See feedback_no_tool_errors_for_loop_detection.md.
477
+ timeout_state = self.state.__dict__.setdefault(
478
+ "_bash_timeout_history", {}
479
+ )
480
+ count = timeout_state.get(args.command, 0) + 1
481
+ timeout_state[args.command] = count
482
+ if count == 1:
483
+ hint = (
484
+ "The command was killed. If it starts a server or "
485
+ "long-running process, background it with `command &` "
486
+ "instead of running it in the foreground."
487
+ )
488
+ else:
489
+ hint = (
490
+ f"[TIMEOUT #{count}] You have timed out {count}x on "
491
+ f"this exact command. Running it again will produce the "
492
+ f"same result. STOP retrying. Background servers with "
493
+ f"`&`, check existing listeners with `ss -tlnp`, or fix "
494
+ f"the underlying cause before re-running."
495
+ )
496
+ yield BashResult(
497
+ command=args.command,
498
+ stdout=(
499
+ f"Command timed out after {timeout}s: {args.command!r}\n"
500
+ f"{hint}"
501
+ ),
502
+ stderr="",
503
+ returncode=124,
504
+ )
505
+ return
449
506
 
450
507
  encoding = _get_subprocess_encoding()
451
508
  stdout = (
@@ -237,12 +237,45 @@ class ReadFile(
237
237
  f"Security error: Cannot read path '{file_path}' outside of the project directory '{Path.cwd()}'."
238
238
  )
239
239
  except FileNotFoundError:
240
- raise ToolError(f"File not found at: {file_path}")
240
+ raise ToolError(self._not_found_msg(file_path))
241
241
 
242
242
  if not resolved_path.exists():
243
- raise ToolError(f"File not found at: {file_path}")
243
+ raise ToolError(self._not_found_msg(file_path))
244
244
  if resolved_path.is_dir():
245
- raise ToolError(f"Path is a directory, not a file: {file_path}")
245
+ raise ToolError(self._is_dir_msg(file_path, resolved_path))
246
+
247
+ @staticmethod
248
+ def _not_found_msg(file_path: Path) -> str:
249
+ """Return 'File not found' error with parent directory listing for context."""
250
+ parent = file_path.parent if file_path.parent != file_path else Path(".")
251
+ try:
252
+ entries = sorted(p.name for p in parent.iterdir())
253
+ if entries:
254
+ listing = "\n".join(f" {e}" for e in entries[:30])
255
+ suffix = f"\n ... ({len(entries) - 30} more)" if len(entries) > 30 else ""
256
+ return (
257
+ f"File not found at: {file_path}\n"
258
+ f"Contents of {parent}/:\n{listing}{suffix}"
259
+ )
260
+ except (PermissionError, OSError):
261
+ pass
262
+ return f"File not found at: {file_path}"
263
+
264
+ @staticmethod
265
+ def _is_dir_msg(file_path: Path, resolved_path: Path) -> str:
266
+ """Return 'is a directory' error with directory listing so model can pick a file."""
267
+ try:
268
+ entries = sorted(p.name for p in resolved_path.iterdir())
269
+ if entries:
270
+ listing = "\n".join(f" {e}" for e in entries[:30])
271
+ suffix = f"\n ... ({len(entries) - 30} more)" if len(entries) > 30 else ""
272
+ return (
273
+ f"Path is a directory, not a file: {file_path}\n"
274
+ f"Contents of {file_path}/:\n{listing}{suffix}"
275
+ )
276
+ except (PermissionError, OSError):
277
+ pass
278
+ return f"Path is a directory, not a file: {file_path}"
246
279
 
247
280
  @classmethod
248
281
  def format_call_display(cls, args: ReadFileArgs) -> ToolCallDisplay:
@@ -97,6 +97,12 @@ class SearchReplace(
97
97
  @classmethod
98
98
  def get_result_display(cls, event: ToolResultEvent) -> ToolResultDisplay:
99
99
  if isinstance(event.result, SearchReplaceResult):
100
+ if event.result.blocks_applied == 0:
101
+ return ToolResultDisplay(
102
+ success=False,
103
+ message=event.result.content[:120].split("\n")[0],
104
+ warnings=event.result.warnings,
105
+ )
100
106
  return ToolResultDisplay(
101
107
  success=True,
102
108
  message=f"Applied {event.result.blocks_applied} block{'' if event.result.blocks_applied == 1 else 's'}",
@@ -218,30 +224,42 @@ class SearchReplace(
218
224
  f"\n-----FILE TAIL (last 800 chars)-----\n{tail}\n"
219
225
  if tail else ""
220
226
  )
221
- raise ToolError(
222
- f"{base_msg}\n\n[LOOP-BREAKER: this is the "
223
- f"#{refused_entry['count']} consecutive REFUSED on "
224
- f"{target.name}. Stop sending the same raw content. "
225
- f"Actual file content (first 1500 chars of "
226
- f"{existing_size} bytes):\n"
227
- f"-----FILE HEAD-----\n{head}\n-----FILE END HEAD-----"
228
- f"{tail_block}\n"
229
- f"Choose ONE: (a) call write_file with overwrite=True "
230
- f"to replace the whole file with your raw content, OR "
231
- f"(b) send a proper SEARCH/REPLACE block anchored on "
232
- f"text from the file head/tail above.]"
227
+ yield SearchReplaceResult(
228
+ file=str(target),
229
+ blocks_applied=0,
230
+ lines_changed=0,
231
+ content=(
232
+ f"{base_msg}\n\n[LOOP-BREAKER: this is the "
233
+ f"#{refused_entry['count']} consecutive REFUSED on "
234
+ f"{target.name}. Stop sending the same raw content. "
235
+ f"Actual file content (first 1500 chars of "
236
+ f"{existing_size} bytes):\n"
237
+ f"-----FILE HEAD-----\n{head}\n-----FILE END HEAD-----"
238
+ f"{tail_block}\n"
239
+ f"Choose ONE: (a) call write_file with overwrite=True "
240
+ f"to replace the whole file with your raw content, OR "
241
+ f"(b) send a proper SEARCH/REPLACE block anchored on "
242
+ f"text from the file head/tail above.]"
243
+ ),
233
244
  )
234
- raise ToolError(
235
- f"{base_msg} To add new code, use a SEARCH/REPLACE "
236
- f"block anchored on the last line of the file:\n"
237
- f"<<<<<<< SEARCH\n"
238
- f"[the file's actual final line, copied exactly]\n"
239
- f"=======\n"
240
- f"[the same final line]\n\n"
241
- f"[your new code]\n"
242
- f">>>>>>> REPLACE\n"
243
- f"If you intended a full rewrite, use write_file instead."
245
+ return
246
+ yield SearchReplaceResult(
247
+ file=str(target),
248
+ blocks_applied=0,
249
+ lines_changed=0,
250
+ content=(
251
+ f"{base_msg} To add new code, use a SEARCH/REPLACE "
252
+ f"block anchored on the last line of the file:\n"
253
+ f"<<<<<<< SEARCH\n"
254
+ f"[the file's actual final line, copied exactly]\n"
255
+ f"=======\n"
256
+ f"[the same final line]\n\n"
257
+ f"[your new code]\n"
258
+ f">>>>>>> REPLACE\n"
259
+ f"If you intended a full rewrite, use write_file instead."
260
+ ),
244
261
  )
262
+ return
245
263
  _log.getLogger(__name__).info(
246
264
  "search_replace: no blocks — overwriting %s", target,
247
265
  )
@@ -380,21 +398,46 @@ class SearchReplace(
380
398
  except Exception:
381
399
  pass
382
400
 
383
- raise ToolError(error_message)
384
- else:
385
- # Success reset the fail counter for this file
386
- state = self.state.__dict__.setdefault("_sr_fail_history", {})
387
- state.pop(str(file_path), None)
388
- refused_state = self.state.__dict__.setdefault(
389
- "_sr_refused_raw_history", {}
401
+ # Return advisory result instead of raising ToolError.
402
+ # Hard ToolError blocks cause their own retry loops on longer tasks
403
+ # (model panics and re-calls the same failing search_replace). The
404
+ # advisory result delivers the same guidance message + file head
405
+ # without triggering the panic-retry pattern.
406
+ yield SearchReplaceResult(
407
+ file=str(file_path),
408
+ blocks_applied=0,
409
+ lines_changed=0,
410
+ content=error_message,
390
411
  )
391
- refused_state.pop(str(file_path), None)
412
+ return
413
+ # Success → reset the fail counter for this file
414
+ state = self.state.__dict__.setdefault("_sr_fail_history", {})
415
+ state.pop(str(file_path), None)
416
+ refused_state = self.state.__dict__.setdefault(
417
+ "_sr_refused_raw_history", {}
418
+ )
419
+ refused_state.pop(str(file_path), None)
392
420
 
393
421
  modified_content = block_result.content
394
422
 
395
423
  # Calculate line changes
396
424
  if modified_content == original_content:
397
425
  lines_changed = 0
426
+ # The SEARCH text was found and the REPLACE was identical — nothing
427
+ # actually changed. Tell the model clearly so it doesn't retry.
428
+ yield SearchReplaceResult(
429
+ file=str(file_path),
430
+ blocks_applied=block_result.applied,
431
+ lines_changed=0,
432
+ warnings=block_result.warnings,
433
+ content=(
434
+ f"{file_path.name}: ALREADY CORRECT — the search text was found "
435
+ f"but the replacement is identical to the current content. "
436
+ f"No change was written. The file already has the desired state. "
437
+ f"Move on to the next task."
438
+ ),
439
+ )
440
+ return
398
441
  else:
399
442
  original_lines = len(original_content.splitlines())
400
443
  new_lines = len(modified_content.splitlines())
@@ -511,7 +554,16 @@ class SearchReplace(
511
554
  )
512
555
 
513
556
  if not content:
514
- raise ToolError("Empty content provided")
557
+ raise ToolError(
558
+ "Empty content provided. You must include SEARCH/REPLACE blocks.\n"
559
+ "Format:\n"
560
+ "<<<<<<< SEARCH\n"
561
+ "exact text to find\n"
562
+ "=======\n"
563
+ "replacement text\n"
564
+ ">>>>>>> REPLACE\n"
565
+ "If you want to create a new file instead, use write_file."
566
+ )
515
567
 
516
568
  project_root = Path.cwd()
517
569
  file_path = Path(file_path_str).expanduser()
@@ -483,6 +483,23 @@ class WriteFile(
483
483
  f"from your plan, or run `bash` with `python3 -m "
484
484
  f"{file_path.parent.name} --help` to verify."
485
485
  )
486
+ # Also surface missing imports so the model knows
487
+ # which file to write next instead of re-looping.
488
+ if file_path.suffix == ".py":
489
+ try:
490
+ import ast as _ast
491
+ _tree = _ast.parse(args.content)
492
+ missing = _check_missing_sibling_imports(
493
+ _tree, file_path
494
+ )
495
+ if missing:
496
+ body += (
497
+ f" This file imports modules that don't "
498
+ f"exist yet: {sorted(missing)}. "
499
+ f"Write those files next."
500
+ )
501
+ except Exception:
502
+ pass
486
503
  except Exception:
487
504
  body += "Move to the NEXT file in your plan."
488
505
  else:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.7.10"
3
+ version = "2.7.16"
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"
@@ -85,8 +85,16 @@ rm -rf dist/
85
85
  $PYTHON -m build 2>/dev/null
86
86
 
87
87
  # Publish to PyPI
88
+ # PYTHONNOUSERSITE=1 avoids a jaraco.functools circular-import that occurs
89
+ # when ~/.local/lib/python3.12/site-packages/setuptools conflicts with the
90
+ # miniconda3 vendored copy; set +e so a twine failure doesn't kill the
91
+ # script before the local-wheel fallback can run.
88
92
  PYPI_TOKEN=$(cat ~/.config/drydock/pypi_token)
89
- $PYTHON -m twine upload dist/drydock_cli-${NEW_VERSION}* -u __token__ -p "$PYPI_TOKEN" 2>/dev/null
93
+ set +e
94
+ TWINE_OUT=$(PYTHONNOUSERSITE=1 $PYTHON -m twine upload dist/drydock_cli-${NEW_VERSION}* -u __token__ -p "$PYPI_TOKEN" 2>&1)
95
+ TWINE_EXIT=$?
96
+ set -e
97
+ echo "[$(date)] twine exit=$TWINE_EXIT: $TWINE_OUT" >> "$DRYDOCK/logs/auto_release.log"
90
98
 
91
99
  # Deploy to GitHub — NOT silent. If the token is invalid this should scream.
92
100
  TMPDIR=$(mktemp -d)
@@ -126,11 +134,23 @@ else
126
134
  fi
127
135
  cd "$DRYDOCK"
128
136
 
129
- # Install on user's env (retry PyPI propagation)
130
- for i in 1 2 3; do
131
- sleep 60
132
- /home/bobef/miniforge3/envs/drydock/bin/pip install --force-reinstall --no-deps --no-cache-dir "drydock-cli==$NEW_VERSION" 2>/dev/null && break
133
- done
137
+ # Install on user's env try PyPI first, fall back to local wheel
138
+ INSTALLED=0
139
+ if [ $TWINE_EXIT -eq 0 ]; then
140
+ for i in 1 2 3; do
141
+ sleep 60
142
+ /home/bobef/miniforge3/envs/drydock/bin/pip install --force-reinstall --no-deps --no-cache-dir "drydock-cli==$NEW_VERSION" 2>/dev/null && INSTALLED=1 && break
143
+ done
144
+ fi
145
+ if [ $INSTALLED -eq 0 ]; then
146
+ # PyPI upload failed or propagation timed out — install from local wheel
147
+ LOCAL_WHEEL="$DRYDOCK/dist/drydock_cli-${NEW_VERSION}-py3-none-any.whl"
148
+ if [ -f "$LOCAL_WHEEL" ]; then
149
+ /home/bobef/miniforge3/envs/drydock/bin/pip install --force-reinstall --no-deps "$LOCAL_WHEEL" 2>/dev/null \
150
+ && echo "[$(date)] Installed v$NEW_VERSION from local wheel (PyPI upload failed)" >> "$DRYDOCK/logs/auto_release.log" \
151
+ || echo "[$(date)] ERROR: local wheel install also failed for v$NEW_VERSION" >> "$DRYDOCK/logs/auto_release.log"
152
+ fi
153
+ fi
134
154
 
135
155
  # Tag
136
156
  git tag "v$NEW_VERSION" 2>/dev/null || true
@@ -28,8 +28,8 @@ PID_FILE=/tmp/stress_pid.txt
28
28
  # /tmp/stress_2000_*.log. Avoids the stale-log bug where babysitter reported
29
29
  # COMPLETE for hours while the real harness kept processing (2026-04-25).
30
30
  # Falls back to the prior hardcoded path if no match exists yet.
31
- STRESS_LOG=/tmp/stress_2000_v10_restart_1777237201.log
32
- STRESS_LOG=/tmp/stress_2000_v10_restart_1777237201.log
31
+ STRESS_LOG=$(ls -t /tmp/stress_2000_*.log 2>/dev/null | head -1)
32
+ STRESS_LOG=${STRESS_LOG:-/tmp/stress_2000_v10_restart_1777237201.log}
33
33
  NOTIFY=/data3/drydock/scripts/notify_release.py
34
34
  PY_CONDA=/home/bobef/miniconda3/bin/python3
35
35
  PY_DRYDOCK=/home/bobef/miniforge3/envs/drydock/bin/python3
@@ -119,6 +119,25 @@ def test_retry_after_error_does_not_fire_when_previous_succeeded() -> None:
119
119
  assert detect_retry_after_error(msgs) is None
120
120
 
121
121
 
122
+ def test_retry_after_error_does_not_fire_on_grep_matches_with_error_word() -> None:
123
+ # grep returns a successful match whose content contains the word "error"
124
+ # (e.g. matched a line with "error handling"). This must NOT be treated
125
+ # as an errored result — false positive was observed in stress runs where
126
+ # tool_agent_memory.json lines contained "content": "error ...".
127
+ grep_args = '{"pattern": "def .*read.*\\\\(.*\\\\)"}'
128
+ grep_result = (
129
+ 'matches: ./.tool_agent_memory/default.json:20: "content": '
130
+ '"error handling for missing keys"'
131
+ )
132
+ msgs = [
133
+ _user("go"),
134
+ _tool("grep", grep_args),
135
+ _tool_result("grep", grep_result),
136
+ _tool("grep", grep_args),
137
+ ]
138
+ assert detect_retry_after_error(msgs) is None
139
+
140
+
122
141
  # --- run_proposed_detectors ---------------------------------------------
123
142
 
124
143
 
@@ -0,0 +1,70 @@
1
+ """Regression test: read_file includes parent directory listing on file-not-found.
2
+
3
+ Admiral logs showed 'retry_after_error:read_file' firing when the model retries
4
+ a missing-file path instead of checking what files actually exist nearby.
5
+ Fix: _not_found_msg() lists the parent directory so the model sees valid
6
+ neighbours and picks the right one without needing the admiral to intervene.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import asyncio
11
+ from pathlib import Path
12
+
13
+ import pytest
14
+
15
+ from drydock.core.tools.base import BaseToolState, ToolError
16
+ from drydock.core.tools.builtins.read_file import ReadFile, ReadFileArgs, ReadFileToolConfig
17
+
18
+
19
+ def _make_tool(tmp_path: Path) -> ReadFile:
20
+ config = ReadFileToolConfig()
21
+ state = BaseToolState()
22
+ return ReadFile(config=config, state=state)
23
+
24
+
25
+ def test_not_found_includes_parent_listing(tmp_path: Path) -> None:
26
+ """Error message includes sibling files when path does not exist."""
27
+ (tmp_path / "server.py").write_text("# server")
28
+ (tmp_path / "cli.py").write_text("# cli")
29
+ missing = tmp_path / "nonexistent.py"
30
+
31
+ tool = _make_tool(tmp_path)
32
+ msg = tool._not_found_msg(missing)
33
+
34
+ assert "File not found" in msg
35
+ assert "server.py" in msg
36
+ assert "cli.py" in msg
37
+
38
+
39
+ def test_not_found_empty_dir(tmp_path: Path) -> None:
40
+ """Empty parent directory: still returns a 'File not found' message."""
41
+ missing = tmp_path / "ghost.py"
42
+ tool = _make_tool(tmp_path)
43
+ msg = tool._not_found_msg(missing)
44
+ assert "File not found" in msg
45
+
46
+
47
+ def test_not_found_truncates_long_listing(tmp_path: Path) -> None:
48
+ """Listings longer than 30 entries are truncated with a '... (N more)' suffix."""
49
+ for i in range(35):
50
+ (tmp_path / f"file_{i:02d}.py").write_text("")
51
+ missing = tmp_path / "missing.py"
52
+
53
+ tool = _make_tool(tmp_path)
54
+ msg = tool._not_found_msg(missing)
55
+
56
+ assert "more)" in msg
57
+
58
+
59
+ def test_validate_path_raises_with_listing(tmp_path: Path, monkeypatch) -> None:
60
+ """_validate_path raises ToolError whose message includes directory listing."""
61
+ (tmp_path / "sibling.py").write_text("x=1")
62
+ missing = tmp_path / "nope.py"
63
+
64
+ tool = _make_tool(tmp_path)
65
+ monkeypatch.chdir(tmp_path)
66
+
67
+ with pytest.raises(ToolError) as exc_info:
68
+ tool._validate_path(missing)
69
+
70
+ assert "sibling.py" in str(exc_info.value)