drydock-cli 2.7.9__tar.gz → 2.7.15__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 (664) hide show
  1. drydock_cli-2.7.15/.auto_release.lock +1 -0
  2. drydock_cli-2.7.15/.claude/scheduled_tasks.lock +1 -0
  3. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/PKG-INFO +1 -1
  4. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/admiral/detectors_proposed.py +9 -2
  5. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/agent_loop.py +14 -5
  6. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/llm/format.py +26 -0
  7. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/bash.py +54 -8
  8. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/read_file.py +36 -3
  9. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/search_replace.py +83 -31
  10. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/write_file.py +17 -0
  11. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/pyproject.toml +1 -1
  12. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/resume.md +11 -1
  13. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/auto_release.sh +26 -6
  14. drydock_cli-2.7.15/scripts/autonomous_review.sh +97 -0
  15. drydock_cli-2.7.15/scripts/autonomous_review_prompt.md +101 -0
  16. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/llm_balancer.py +5 -1
  17. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/stress_babysitter.sh +1 -1
  18. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_admiral_proposed.py +19 -0
  19. drydock_cli-2.7.15/tests/test_read_file_not_found_listing.py +70 -0
  20. drydock_cli-2.7.15/tests/test_truncated_arg_path_hint.py +94 -0
  21. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/tools/test_bash.py +42 -10
  22. drydock_cli-2.7.15/tests/tools/test_read_file_directory.py +65 -0
  23. drydock_cli-2.7.15/tests/tools/test_search_replace_no_op_loop_breaker.py +139 -0
  24. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/tools/test_search_replace_refused_loop_breaker.py +34 -33
  25. drydock_cli-2.7.15/tests/tools/test_write_file_dedup_missing_imports.py +103 -0
  26. drydock_cli-2.7.15/trip_log.md +217 -0
  27. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/uv.lock +1 -1
  28. drydock_cli-2.7.9/.auto_release.lock +0 -1
  29. drydock_cli-2.7.9/.claude/scheduled_tasks.lock +0 -1
  30. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/.github/CODEOWNERS +0 -0
  31. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  32. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  33. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  34. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/.github/workflows/build-and-upload.yml +0 -0
  35. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/.github/workflows/ci.yml +0 -0
  36. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/.github/workflows/issue-labeler.yml +0 -0
  37. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/.github/workflows/release.yml +0 -0
  38. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/.gitignore +0 -0
  39. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/.pre-commit-config.yaml +0 -0
  40. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/.python-version +0 -0
  41. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/.typos.toml +0 -0
  42. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/.vscode/extensions.json +0 -0
  43. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/.vscode/launch.json +0 -0
  44. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/.vscode/settings.json +0 -0
  45. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/AGENTS.md +0 -0
  46. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/Admiral.md +0 -0
  47. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/BASELINE_412.md +0 -0
  48. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/CHANGELOG.md +0 -0
  49. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/CLAUDE.md +0 -0
  50. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/CONTRIBUTING.md +0 -0
  51. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/DEPLOYMENT.md +0 -0
  52. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/Drydock_rebrand.md +0 -0
  53. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/LICENSE +0 -0
  54. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/MODEL_SHORTCOMINGS.md +0 -0
  55. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/NOTICE +0 -0
  56. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/OVERNIGHT_PROGRESS.md +0 -0
  57. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  58. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/PRD.md +0 -0
  59. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/README.md +0 -0
  60. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/action.yml +0 -0
  61. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/baseline_history/README.md +0 -0
  62. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/baseline_history/results1.tsv +0 -0
  63. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/baseline_history/results13.tsv +0 -0
  64. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/baseline_history/results14.tsv +0 -0
  65. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/baseline_history/results15.tsv +0 -0
  66. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/baseline_history/results16.tsv +0 -0
  67. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/baseline_history/results17.tsv +0 -0
  68. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/baseline_history/results18.tsv +0 -0
  69. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/baseline_history/results19.tsv +0 -0
  70. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/baseline_history/results2.tsv +0 -0
  71. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/baseline_history/results20.tsv +0 -0
  72. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/baseline_history/results3.tsv +0 -0
  73. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/baseline_history/results4.tsv +0 -0
  74. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/baseline_history/results5.tsv +0 -0
  75. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/baseline_history/results6.tsv +0 -0
  76. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/baseline_history/results7.tsv +0 -0
  77. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/baseline_history/results8.tsv +0 -0
  78. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/baseline_history/results9.tsv +0 -0
  79. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/baseline_history/results_evolved_v1.tsv +0 -0
  80. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/distribution/zed/LICENSE +0 -0
  81. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/distribution/zed/extension.toml +0 -0
  82. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/distribution/zed/icons/mistral_vibe.svg +0 -0
  83. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/docs/README.md +0 -0
  84. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/docs/acp-setup.md +0 -0
  85. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/docs/proxy-setup.md +0 -0
  86. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/__init__.py +0 -0
  87. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/acp/__init__.py +0 -0
  88. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/acp/acp_agent_loop.py +0 -0
  89. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/acp/acp_logger.py +0 -0
  90. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/acp/entrypoint.py +0 -0
  91. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/acp/tools/__init__.py +0 -0
  92. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/acp/tools/base.py +0 -0
  93. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/acp/tools/builtins/bash.py +0 -0
  94. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/acp/tools/builtins/read_file.py +0 -0
  95. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/acp/tools/builtins/search_replace.py +0 -0
  96. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/acp/tools/builtins/todo.py +0 -0
  97. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/acp/tools/builtins/write_file.py +0 -0
  98. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/acp/tools/session_update.py +0 -0
  99. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/acp/utils.py +0 -0
  100. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/admiral/__init__.py +0 -0
  101. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/admiral/detectors.py +0 -0
  102. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/admiral/history.py +0 -0
  103. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/admiral/interventions.py +0 -0
  104. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/admiral/llm_analyzer.py +0 -0
  105. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/admiral/metrics.py +0 -0
  106. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/admiral/opus_escalator.py +0 -0
  107. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/admiral/persistence.py +0 -0
  108. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/admiral/policy.py +0 -0
  109. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/admiral/proposer.py +0 -0
  110. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/admiral/stager.py +0 -0
  111. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/admiral/task_classifier.py +0 -0
  112. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/admiral/tuning.py +0 -0
  113. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/admiral/validator.py +0 -0
  114. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/admiral/worker.py +0 -0
  115. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/__init__.py +0 -0
  116. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/autocompletion/__init__.py +0 -0
  117. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/autocompletion/base.py +0 -0
  118. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/autocompletion/path_completion.py +0 -0
  119. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/autocompletion/slash_command.py +0 -0
  120. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/cli.py +0 -0
  121. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/clipboard.py +0 -0
  122. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/commands.py +0 -0
  123. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/entrypoint.py +0 -0
  124. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/history_manager.py +0 -0
  125. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  126. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  127. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  128. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/terminal_setup.py +0 -0
  129. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/__init__.py +0 -0
  130. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  131. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/app.py +0 -0
  132. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/app.tcss +0 -0
  133. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/external_editor.py +0 -0
  134. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  135. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  136. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  137. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  138. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  139. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  140. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  141. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  142. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  143. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  144. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  145. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  146. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  147. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  148. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  149. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  150. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  151. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  152. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  153. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  154. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  155. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  156. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  157. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  158. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  159. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  160. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  161. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  162. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  163. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  164. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  165. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  166. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  167. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  168. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  169. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  170. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  171. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/windowing/history.py +0 -0
  172. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  173. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/textual_ui/windowing/state.py +0 -0
  174. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/update_notifier/__init__.py +0 -0
  175. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  176. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  177. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  178. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  179. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  180. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/update_notifier/update.py +0 -0
  181. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/cli/update_notifier/whats_new.py +0 -0
  182. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/__init__.py +0 -0
  183. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/agents/__init__.py +0 -0
  184. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/agents/manager.py +0 -0
  185. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/agents/models.py +0 -0
  186. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/auth/__init__.py +0 -0
  187. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/auth/crypto.py +0 -0
  188. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/auth/github.py +0 -0
  189. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/autocompletion/__init__.py +0 -0
  190. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/autocompletion/completers.py +0 -0
  191. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  192. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  193. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  194. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  195. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  196. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/autocompletion/fuzzy.py +0 -0
  197. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/autocompletion/path_prompt.py +0 -0
  198. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  199. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/build_orchestrator.py +0 -0
  200. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/checkpoint.py +0 -0
  201. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/config/__init__.py +0 -0
  202. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/config/_settings.py +0 -0
  203. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/config/doctor.py +0 -0
  204. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/config/harness_files/__init__.py +0 -0
  205. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  206. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/config/harness_files/_paths.py +0 -0
  207. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/consultant.py +0 -0
  208. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/drydock_states.py +0 -0
  209. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/hooks.py +0 -0
  210. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/llm/__init__.py +0 -0
  211. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/llm/backend/anthropic.py +0 -0
  212. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/llm/backend/base.py +0 -0
  213. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/llm/backend/factory.py +0 -0
  214. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/llm/backend/generic.py +0 -0
  215. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/llm/backend/mistral.py +0 -0
  216. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  217. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/llm/backend/vertex.py +0 -0
  218. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/llm/exceptions.py +0 -0
  219. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/llm/message_utils.py +0 -0
  220. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/llm/types.py +0 -0
  221. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/logger.py +0 -0
  222. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/middleware.py +0 -0
  223. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/output_formatters.py +0 -0
  224. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/paths/__init__.py +0 -0
  225. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/paths/_drydock_home.py +0 -0
  226. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/paths/_local_config_walk.py +0 -0
  227. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/paths/conventions.py +0 -0
  228. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/plan_session.py +0 -0
  229. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/plugins.py +0 -0
  230. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/programmatic.py +0 -0
  231. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/prompts/__init__.py +0 -0
  232. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/prompts/builder.md +0 -0
  233. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/prompts/cli.md +0 -0
  234. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/prompts/compact.md +0 -0
  235. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/prompts/dangerous_directory.md +0 -0
  236. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/prompts/diagnostic.md +0 -0
  237. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/prompts/explore.md +0 -0
  238. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/prompts/gemma4.md +0 -0
  239. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/prompts/planner.md +0 -0
  240. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/prompts/project_context.md +0 -0
  241. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/prompts/tests.md +0 -0
  242. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/proxy_setup.py +0 -0
  243. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/session/agent_memory.py +0 -0
  244. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/session/checkpoints.py +0 -0
  245. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/session/session_loader.py +0 -0
  246. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/session/session_logger.py +0 -0
  247. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/session/session_migration.py +0 -0
  248. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/session/state_file.py +0 -0
  249. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/session_checker.py +0 -0
  250. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/skills/__init__.py +0 -0
  251. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/skills/manager.py +0 -0
  252. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/skills/models.py +0 -0
  253. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/skills/parser.py +0 -0
  254. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/slug.py +0 -0
  255. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/system_prompt.py +0 -0
  256. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/telemetry/__init__.py +0 -0
  257. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/telemetry/send.py +0 -0
  258. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/teleport/errors.py +0 -0
  259. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/teleport/git.py +0 -0
  260. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/teleport/nuage.py +0 -0
  261. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/teleport/teleport.py +0 -0
  262. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/teleport/types.py +0 -0
  263. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/base.py +0 -0
  264. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/_task_manager.py +0 -0
  265. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  266. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/cron.py +0 -0
  267. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  268. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/glob_tool.py +0 -0
  269. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/grep.py +0 -0
  270. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  271. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/lsp.py +0 -0
  272. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  273. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  274. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/powershell.py +0 -0
  275. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  276. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  277. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  278. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  279. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  280. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  281. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  282. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  283. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  284. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  285. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  286. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  287. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  288. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  289. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/task.md +0 -0
  290. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  291. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  292. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  293. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  294. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  295. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  296. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  297. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/task.py +0 -0
  298. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/todo.py +0 -0
  299. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/tool_search.py +0 -0
  300. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/webfetch.py +0 -0
  301. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/websearch.py +0 -0
  302. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/builtins/worktree.py +0 -0
  303. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/injection_guard.py +0 -0
  304. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/manager.py +0 -0
  305. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/mcp/__init__.py +0 -0
  306. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/mcp/registry.py +0 -0
  307. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/mcp/tools.py +0 -0
  308. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/mcp_sampling.py +0 -0
  309. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/ui.py +0 -0
  310. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/tools/utils.py +0 -0
  311. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/trusted_folders.py +0 -0
  312. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/types.py +0 -0
  313. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/core/utils.py +0 -0
  314. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/setup/onboarding/__init__.py +0 -0
  315. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/setup/onboarding/base.py +0 -0
  316. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/setup/onboarding/onboarding.tcss +0 -0
  317. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/setup/onboarding/screens/__init__.py +0 -0
  318. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/setup/onboarding/screens/api_key.py +0 -0
  319. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/setup/onboarding/screens/choice.py +0 -0
  320. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/setup/onboarding/screens/local_model.py +0 -0
  321. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/setup/onboarding/screens/welcome.py +0 -0
  322. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  323. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  324. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/__init__.py +0 -0
  325. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/api-design/SKILL.md +0 -0
  326. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/audit-tests/SKILL.md +0 -0
  327. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/batch/SKILL.md +0 -0
  328. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/commit-code/SKILL.md +0 -0
  329. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/context-summary/SKILL.md +0 -0
  330. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/create-presentation/SKILL.md +0 -0
  331. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/deep-research/SKILL.md +0 -0
  332. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/deploy/SKILL.md +0 -0
  333. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/diff-review/SKILL.md +0 -0
  334. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/doc-gen/SKILL.md +0 -0
  335. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/explain-code/SKILL.md +0 -0
  336. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/explore-code/SKILL.md +0 -0
  337. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/fix-issue/SKILL.md +0 -0
  338. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/git-ops/SKILL.md +0 -0
  339. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/init-project/SKILL.md +0 -0
  340. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/investigate/SKILL.md +0 -0
  341. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/loop/SKILL.md +0 -0
  342. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/migrate/SKILL.md +0 -0
  343. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/perf-analyze/SKILL.md +0 -0
  344. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/plan-impl/SKILL.md +0 -0
  345. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/pr-review/SKILL.md +0 -0
  346. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/refactor/SKILL.md +0 -0
  347. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/regex-help/SKILL.md +0 -0
  348. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/review/SKILL.md +0 -0
  349. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/security-review/SKILL.md +0 -0
  350. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/ship/SKILL.md +0 -0
  351. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/simplify/SKILL.md +0 -0
  352. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/strong-tests/SKILL.md +0 -0
  353. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/skills/test-verify/SKILL.md +0 -0
  354. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock/whats_new.md +0 -0
  355. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock-acp.spec +0 -0
  356. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/drydock_terms.md +0 -0
  357. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/flake.lock +0 -0
  358. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/flake.nix +0 -0
  359. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/nohup.out +0 -0
  360. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/research/README.md +0 -0
  361. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/research/config_base.toml +0 -0
  362. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/research/config_best.toml +0 -0
  363. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/research/domain_spec.md +0 -0
  364. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/research/experimenter.py +0 -0
  365. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/research/kernel.py +0 -0
  366. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/research/mini_prd.md +0 -0
  367. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/research/mini_prompts.txt +0 -0
  368. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/research/proposer.py +0 -0
  369. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/research/results.tsv +0 -0
  370. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/README.md +0 -0
  371. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/admiral_probe.py +0 -0
  372. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/audit_sampler.py +0 -0
  373. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/auto_generate_tests.py +0 -0
  374. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/auto_test_loop.sh +0 -0
  375. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/backup.sh +0 -0
  376. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/bump_version.py +0 -0
  377. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/comprehensive_loop.py +0 -0
  378. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/deploy_to_github.sh +0 -0
  379. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/discover_cli_tools.sh +0 -0
  380. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/evolve_tests.py +0 -0
  381. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/gen_2000_prompts.py +0 -0
  382. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/install.sh +0 -0
  383. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/mega_loop.py +0 -0
  384. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/meta_ralph_loop.py +0 -0
  385. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/monitor_swebench.sh +0 -0
  386. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/monitor_test_battery.sh +0 -0
  387. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/notify_release.py +0 -0
  388. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/oss_task_harness.py +0 -0
  389. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/overnight_agents_test.sh +0 -0
  390. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/poll_issues.sh +0 -0
  391. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/port_task.py +0 -0
  392. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/prepare_release.py +0 -0
  393. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/publish_to_pypi.sh +0 -0
  394. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/ralph_loop.py +0 -0
  395. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/research_babysitter.sh +0 -0
  396. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/session_loop_audit.py +0 -0
  397. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/shakedown.py +0 -0
  398. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/shakedown_interactive.py +0 -0
  399. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/shakedown_regression.sh +0 -0
  400. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/shakedown_suite.sh +0 -0
  401. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/shakedown_variance.sh +0 -0
  402. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/stress_prompts_50.txt +0 -0
  403. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/stress_prompts_realuser.txt +0 -0
  404. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/stress_prompts_tool_agent.txt +0 -0
  405. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  406. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/stress_shakedown.py +0 -0
  407. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/stress_telegram_status.py +0 -0
  408. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/stress_watcher.py +0 -0
  409. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/telegram_bot.py +0 -0
  410. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/test_bank.sh +0 -0
  411. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/test_full.sh +0 -0
  412. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/test_smoke.sh +0 -0
  413. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/test_tui_path.py +0 -0
  414. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/tui_test.py +0 -0
  415. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/scripts/vllm_failover.sh +0 -0
  416. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/test/project/dummy +0 -0
  417. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/__init__.py +0 -0
  418. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/conftest.py +0 -0
  419. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/test_acp.py +0 -0
  420. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/test_agent_thought.py +0 -0
  421. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/test_bash.py +0 -0
  422. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/test_compact_session_updates.py +0 -0
  423. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/test_content.py +0 -0
  424. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/test_initialize.py +0 -0
  425. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/test_list_sessions.py +0 -0
  426. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/test_load_session.py +0 -0
  427. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/test_multi_session.py +0 -0
  428. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/test_new_session.py +0 -0
  429. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/test_proxy_setup_acp.py +0 -0
  430. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/test_read_file.py +0 -0
  431. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/test_search_replace.py +0 -0
  432. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/test_set_config_option.py +0 -0
  433. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/test_set_mode.py +0 -0
  434. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/test_set_model.py +0 -0
  435. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/test_tool_call_session_update.py +0 -0
  436. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/test_utils.py +0 -0
  437. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/acp/test_write_file.py +0 -0
  438. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/autocompletion/test_file_indexer.py +0 -0
  439. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/autocompletion/test_fuzzy.py +0 -0
  440. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  441. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  442. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/autocompletion/test_path_completion_controller.py +0 -0
  443. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  444. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/autocompletion/test_slash_command_controller.py +0 -0
  445. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  446. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/backend/__init__.py +0 -0
  447. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/backend/data/__init__.py +0 -0
  448. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/backend/data/fireworks.py +0 -0
  449. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/backend/data/mistral.py +0 -0
  450. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/backend/test_anthropic_adapter.py +0 -0
  451. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/backend/test_backend.py +0 -0
  452. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  453. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/backend/test_reasoning_adapter.py +0 -0
  454. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  455. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  456. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  457. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  458. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/cli/test_bell_notifications.py +0 -0
  459. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/cli/test_braille_renderer.py +0 -0
  460. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/cli/test_clipboard.py +0 -0
  461. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/cli/test_commands.py +0 -0
  462. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/cli/test_copy_shortcuts.py +0 -0
  463. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/cli/test_external_editor.py +0 -0
  464. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/cli/test_no_markup_static.py +0 -0
  465. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/cli/test_question_app.py +0 -0
  466. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/cli/test_spinner.py +0 -0
  467. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/cli/test_switching_mode.py +0 -0
  468. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  469. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  470. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/cli/test_ui_session_resume.py +0 -0
  471. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/cli/test_ui_skill_dispatch.py +0 -0
  472. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/cli/textual_ui/__init__.py +0 -0
  473. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/cli/textual_ui/test_session_picker.py +0 -0
  474. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/conftest.py +0 -0
  475. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/core/test_agents.py +0 -0
  476. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/core/test_auth_crypto.py +0 -0
  477. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/core/test_auth_github.py +0 -0
  478. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/core/test_config_load_dotenv.py +0 -0
  479. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/core/test_config_paths.py +0 -0
  480. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/core/test_config_resolution.py +0 -0
  481. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/core/test_file_logging.py +0 -0
  482. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/core/test_plan_session.py +0 -0
  483. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/core/test_proxy_setup.py +0 -0
  484. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/core/test_slug.py +0 -0
  485. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/core/test_telemetry_send.py +0 -0
  486. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/core/test_teleport_git.py +0 -0
  487. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/core/test_teleport_nuage.py +0 -0
  488. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/core/test_teleport_service.py +0 -0
  489. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/core/test_trusted_folders.py +0 -0
  490. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/core/test_utils.py +0 -0
  491. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/e2e/common.py +0 -0
  492. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/e2e/conftest.py +0 -0
  493. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/e2e/mock_server.py +0 -0
  494. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  495. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/e2e/test_cli_tui_streaming.py +0 -0
  496. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  497. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/fixtures/doc_qa_system_prd.md +0 -0
  498. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/mock/__init__.py +0 -0
  499. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/mock/mock_backend_factory.py +0 -0
  500. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/mock/mock_entrypoint.py +0 -0
  501. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/mock/utils.py +0 -0
  502. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/onboarding/test_run_onboarding.py +0 -0
  503. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/onboarding/test_ui_onboarding.py +0 -0
  504. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/session/test_session_loader.py +0 -0
  505. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/session/test_session_logger.py +0 -0
  506. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/session/test_session_migration.py +0 -0
  507. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/skills/conftest.py +0 -0
  508. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/skills/test_manager.py +0 -0
  509. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/skills/test_models.py +0 -0
  510. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/skills/test_parser.py +0 -0
  511. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  512. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  513. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  514. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  515. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  516. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  517. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  518. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  519. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  520. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  521. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  522. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  523. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  524. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  525. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  526. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  527. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  528. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  529. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  530. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  531. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  532. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  533. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  534. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  535. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  536. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  537. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  538. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  539. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  540. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  541. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  542. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  543. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  544. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  545. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  546. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  547. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  548. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  549. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  550. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  551. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  552. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  553. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  554. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  555. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  556. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  557. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  558. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  559. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  560. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  561. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  562. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  563. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  564. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  565. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  566. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  567. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  568. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  569. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  570. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  571. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/base_snapshot_test_app.py +0 -0
  572. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/conftest.py +0 -0
  573. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/snap_compare.py +0 -0
  574. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  575. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  576. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  577. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  578. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  579. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  580. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  581. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  582. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  583. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  584. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  585. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  586. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  587. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  588. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/stubs/fake_backend.py +0 -0
  589. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/stubs/fake_client.py +0 -0
  590. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/stubs/fake_tool.py +0 -0
  591. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_admiral.py +0 -0
  592. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_admiral_phase3.py +0 -0
  593. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_agent_auto_compact.py +0 -0
  594. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_agent_backend.py +0 -0
  595. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_agent_observer_streaming.py +0 -0
  596. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_agent_stats.py +0 -0
  597. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_agent_tasks.py +0 -0
  598. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_agent_tool_call.py +0 -0
  599. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_agents.py +0 -0
  600. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_bank_build.py +0 -0
  601. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_bank_debug.py +0 -0
  602. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_bank_multiagent.py +0 -0
  603. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_bank_prd.py +0 -0
  604. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_bank_prd_extended.py +0 -0
  605. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_bank_tools.py +0 -0
  606. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_bank_update.py +0 -0
  607. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_build_projects.py +0 -0
  608. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_checkpoint.py +0 -0
  609. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_cli_programmatic_preload.py +0 -0
  610. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_current_bugs.py +0 -0
  611. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_drydock_regression.py +0 -0
  612. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_drydock_tasks.py +0 -0
  613. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  614. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_full_regression.py +0 -0
  615. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_history_manager.py +0 -0
  616. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_integration.py +0 -0
  617. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_issue_fixes.py +0 -0
  618. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_loop_detection.py +0 -0
  619. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_message_id.py +0 -0
  620. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_message_merging.py +0 -0
  621. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_middleware.py +0 -0
  622. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_multi_agent.py +0 -0
  623. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_real_failures.py +0 -0
  624. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_real_issues.py +0 -0
  625. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_real_workflow.py +0 -0
  626. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_reasoning_content.py +0 -0
  627. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_smoke.py +0 -0
  628. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_system_prompt.py +0 -0
  629. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_tagged_text.py +0 -0
  630. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_tool_args.py +0 -0
  631. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_truncate_args_valid_json.py +0 -0
  632. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_ui_external_editor.py +0 -0
  633. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_ui_input_history.py +0 -0
  634. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_user_issues.py +0 -0
  635. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_wall_of_text_rescue.py +0 -0
  636. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/test_workloads.py +0 -0
  637. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/testbank_helpers.py +0 -0
  638. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/tools/test_ask_user_question.py +0 -0
  639. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/tools/test_exit_plan_mode.py +0 -0
  640. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/tools/test_grep.py +0 -0
  641. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/tools/test_invoke_context.py +0 -0
  642. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  643. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/tools/test_manager_get_tool_config.py +0 -0
  644. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/tools/test_mcp.py +0 -0
  645. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/tools/test_mcp_sampling.py +0 -0
  646. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/tools/test_search_replace_append_fallback.py +0 -0
  647. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/tools/test_task.py +0 -0
  648. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/tools/test_ui_bash_execution.py +0 -0
  649. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/tools/test_webfetch.py +0 -0
  650. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/tools/test_websearch.py +0 -0
  651. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  652. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  653. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/update_notifier/test_do_update.py +0 -0
  654. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  655. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/update_notifier/test_github_update_gateway.py +0 -0
  656. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  657. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/update_notifier/test_ui_update_notification.py +0 -0
  658. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/update_notifier/test_update_use_case.py +0 -0
  659. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/tests/update_notifier/test_whats_new.py +0 -0
  660. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/worked_examples/README.md +0 -0
  661. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/worked_examples/cli_subcommand_dispatch.py +0 -0
  662. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/worked_examples/lookup.json +0 -0
  663. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/worked_examples/sql_parser.py +0 -0
  664. {drydock_cli-2.7.9 → drydock_cli-2.7.15}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 166653
@@ -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.9
3
+ Version: 2.7.15
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(
@@ -404,13 +404,27 @@ 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 not stdout and not stderr:
416
+ annotation += " (no output)"
417
+ if returncode == 1:
418
+ annotation += (
419
+ " — for grep/find, exit code 1 means no matches found"
420
+ )
421
+ annotated_stdout = (stdout + "\n" + annotation).strip() if stdout else annotation
422
+ return BashResult(
423
+ command=command,
424
+ stdout=annotated_stdout,
425
+ stderr=stderr,
426
+ returncode=returncode,
427
+ )
414
428
 
415
429
  return BashResult(
416
430
  command=command, stdout=stdout, stderr=stderr, returncode=returncode
@@ -445,7 +459,39 @@ class Bash(
445
459
  )
446
460
  except TimeoutError:
447
461
  await _kill_process_tree(proc)
448
- raise self._build_timeout_error(args.command, timeout)
462
+ # ADVISORY ONLY — never raise ToolError on timeout; raising
463
+ # causes the model to retry the exact same command (loop).
464
+ # Track repeat timeouts per command and escalate the hint.
465
+ # See feedback_no_tool_errors_for_loop_detection.md.
466
+ timeout_state = self.state.__dict__.setdefault(
467
+ "_bash_timeout_history", {}
468
+ )
469
+ count = timeout_state.get(args.command, 0) + 1
470
+ timeout_state[args.command] = count
471
+ if count == 1:
472
+ hint = (
473
+ "The command was killed. If it starts a server or "
474
+ "long-running process, background it with `command &` "
475
+ "instead of running it in the foreground."
476
+ )
477
+ else:
478
+ hint = (
479
+ f"[TIMEOUT #{count}] You have timed out {count}x on "
480
+ f"this exact command. Running it again will produce the "
481
+ f"same result. STOP retrying. Background servers with "
482
+ f"`&`, check existing listeners with `ss -tlnp`, or fix "
483
+ f"the underlying cause before re-running."
484
+ )
485
+ yield BashResult(
486
+ command=args.command,
487
+ stdout=(
488
+ f"Command timed out after {timeout}s: {args.command!r}\n"
489
+ f"{hint}"
490
+ ),
491
+ stderr="",
492
+ returncode=124,
493
+ )
494
+ return
449
495
 
450
496
  encoding = _get_subprocess_encoding()
451
497
  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.9"
3
+ version = "2.7.15"
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"
@@ -25,7 +25,17 @@
25
25
  - `feedback_local_proposer_only.md` — proposer must default to local vLLM,
26
26
  never silently phone home
27
27
 
28
- ## Where things stand (snapshot at 2026-04-25 ~20:30 UTC)
28
+ ## Where things stand (snapshot at 2026-04-27 ~02:10 UTC)
29
+
30
+ **USER IS ON A TRIP 2026-04-26 → 2026-05-01.**
31
+ The autonomous review loop (`/data3/drydock/scripts/autonomous_review.sh`)
32
+ runs every 30 min via cron and continues this work without human input.
33
+ Pause via `touch /data3/drydock/.pause_autonomous_loop`.
34
+ Disable via `crontab -l | grep -v autonomous_review | crontab -`.
35
+ Trip log: `/data3/drydock/trip_log.md`.
36
+ Autonomous run log: `/data3/drydock/logs/autonomous_review.log`.
37
+
38
+
29
39
 
30
40
  ### Wins this session
31
41
  | What | Result |
@@ -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
@@ -0,0 +1,97 @@
1
+ #!/bin/bash
2
+ # autonomous_review.sh — cron-launched Claude Code wrapper that continues the
3
+ # drydock improvement loop while the user is on a trip.
4
+ #
5
+ # Designed to be called from cron:
6
+ # */30 * * * * /data3/drydock/scripts/autonomous_review.sh
7
+ #
8
+ # Behavior:
9
+ # - Pause sentinel: /data3/drydock/.pause_autonomous_loop → exit silently
10
+ # - flock prevents overlapping runs (if previous claude is still working)
11
+ # - Hard timeout via `timeout` command (15 min cap)
12
+ # - Per-run cost cap via --max-budget-usd
13
+ # - All output appended to /data3/drydock/logs/autonomous_review.log
14
+ # - Trip log at /data3/drydock/trip_log.md is the human-readable summary
15
+
16
+ set -u
17
+
18
+ DRYDOCK=/data3/drydock
19
+ PAUSE_FILE="$DRYDOCK/.pause_autonomous_loop"
20
+ LOG_DIR="$DRYDOCK/logs"
21
+ RUN_LOG="$LOG_DIR/autonomous_review.log"
22
+ TRIP_LOG="$DRYDOCK/trip_log.md"
23
+ LOCK_FILE=/tmp/autonomous_review.lock
24
+ PROMPT_FILE="$DRYDOCK/scripts/autonomous_review_prompt.md"
25
+ NOW=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
26
+
27
+ mkdir -p "$LOG_DIR"
28
+
29
+ # --- Pause check ---
30
+ if [ -f "$PAUSE_FILE" ]; then
31
+ echo "$NOW PAUSED via $PAUSE_FILE — exiting" >> "$RUN_LOG"
32
+ exit 0
33
+ fi
34
+
35
+ # --- Lock to prevent overlapping runs ---
36
+ exec 9> "$LOCK_FILE"
37
+ if ! flock -n 9; then
38
+ echo "$NOW SKIP — previous run still active" >> "$RUN_LOG"
39
+ exit 0
40
+ fi
41
+
42
+ # --- Pre-flight: ensure drydock directory exists and is git-clean enough ---
43
+ cd "$DRYDOCK" || { echo "$NOW FATAL — cannot cd $DRYDOCK" >> "$RUN_LOG"; exit 1; }
44
+
45
+ # --- Build the prompt argument ---
46
+ if [ ! -f "$PROMPT_FILE" ]; then
47
+ echo "$NOW FATAL — prompt file missing: $PROMPT_FILE" >> "$RUN_LOG"
48
+ exit 1
49
+ fi
50
+
51
+ # --- Run claude with safety rails ---
52
+ # - timeout 15m: hard kill if Claude runs too long
53
+ # - --print: non-interactive, exits when done
54
+ # - --dangerously-skip-permissions: required for cron (no human to approve)
55
+ # - --max-budget-usd 0.50: cost cap per run
56
+ # - --model sonnet: faster + cheaper than opus, plenty for status review + small fixes
57
+ # - --effort medium: balance of quality vs speed
58
+ # - --no-session-persistence: don't pollute session history
59
+ # - --output-format text: human-readable for the run log
60
+ # - --add-dir: explicit allow for the drydock tree
61
+
62
+ echo "" >> "$RUN_LOG"
63
+ echo "================ $NOW START ================" >> "$RUN_LOG"
64
+
65
+ PROMPT_TEXT=$(cat "$PROMPT_FILE")
66
+
67
+ PATH=/home/bobef/.local/bin:/home/bobef/miniconda3/bin:$PATH
68
+ export PATH
69
+
70
+ timeout --signal=TERM --kill-after=30s 15m \
71
+ claude \
72
+ --print \
73
+ --dangerously-skip-permissions \
74
+ --max-budget-usd 1.00 \
75
+ --model sonnet \
76
+ --effort medium \
77
+ --no-session-persistence \
78
+ --output-format text \
79
+ --add-dir "$DRYDOCK" \
80
+ --append-system-prompt "You are a cron-launched assistant. Be concise. Follow the rules in the user's prompt strictly. Default to writing a status line in trip_log.md rather than making speculative changes." \
81
+ "$PROMPT_TEXT" \
82
+ >> "$RUN_LOG" 2>&1
83
+
84
+ EXIT_CODE=$?
85
+ END_NOW=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
86
+ echo "" >> "$RUN_LOG"
87
+ echo "================ $END_NOW END exit=$EXIT_CODE ================" >> "$RUN_LOG"
88
+
89
+ # --- Telegram notify on bad exit (timeout, crash) ---
90
+ NOTIFY="$DRYDOCK/scripts/notify_release.py"
91
+ if [ "$EXIT_CODE" != "0" ] && [ -f "$NOTIFY" ]; then
92
+ /home/bobef/miniconda3/bin/python3 "$NOTIFY" status \
93
+ "[autonomous_review] non-zero exit: $EXIT_CODE at $END_NOW (timeout=124, oom=137)" \
94
+ >/dev/null 2>&1 || true
95
+ fi
96
+
97
+ exit 0