drydock-cli 2.8.21__tar.gz → 2.8.23__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 (770) hide show
  1. drydock_cli-2.8.23/.auto_release.lock +1 -0
  2. drydock_cli-2.8.23/.github/ISSUE_TEMPLATE/bug-report.yml +118 -0
  3. drydock_cli-2.8.23/.github/ISSUE_TEMPLATE/config.yml +8 -0
  4. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/PKG-INFO +87 -3
  5. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/README.md +86 -0
  6. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/gemma4.md +12 -0
  7. drydock_cli-2.8.23/drydock/core/tools/builtins/count_tool.py +218 -0
  8. drydock_cli-2.8.23/drydock/core/tools/builtins/math_tool.py +248 -0
  9. drydock_cli-2.8.23/drydock/core/tools/builtins/memory_tool.py +356 -0
  10. drydock_cli-2.8.23/drydock/core/tools/builtins/verify_tool.py +320 -0
  11. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/pyproject.toml +5 -3
  12. drydock_cli-2.8.23/scripts/bench_inference.py +79 -0
  13. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/deploy_to_github.sh +1 -1
  14. drydock_cli-2.8.23/tests/test_count_tool.py +187 -0
  15. drydock_cli-2.8.23/tests/test_math_tool.py +231 -0
  16. drydock_cli-2.8.23/tests/test_memory_tool.py +235 -0
  17. drydock_cli-2.8.23/tests/test_verify_tool.py +206 -0
  18. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/trip_log.md +81 -0
  19. drydock_cli-2.8.21/.auto_release.lock +0 -1
  20. drydock_cli-2.8.21/.github/ISSUE_TEMPLATE/bug-report.yml +0 -58
  21. drydock_cli-2.8.21/.github/ISSUE_TEMPLATE/config.yml +0 -11
  22. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.github/CODEOWNERS +0 -0
  23. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  24. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.github/workflows/build-and-upload.yml +0 -0
  25. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.github/workflows/ci.yml +0 -0
  26. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.github/workflows/issue-labeler.yml +0 -0
  27. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.github/workflows/release.yml +0 -0
  28. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.gitignore +0 -0
  29. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.pre-commit-config.yaml +0 -0
  30. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.python-version +0 -0
  31. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.typos.toml +0 -0
  32. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.vscode/extensions.json +0 -0
  33. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.vscode/launch.json +0 -0
  34. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.vscode/settings.json +0 -0
  35. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/AGENTS.md +0 -0
  36. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/Admiral.md +0 -0
  37. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/CHANGELOG.md +0 -0
  38. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/CLAUDE.md +0 -0
  39. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/CONTRIBUTING.md +0 -0
  40. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/DEEP_NOIR_PRD.md +0 -0
  41. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/DEPLOYMENT.md +0 -0
  42. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/HLE_PRD.md +0 -0
  43. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/JETSON_BENCH.md +0 -0
  44. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/LICENSE +0 -0
  45. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/MODEL_SHORTCOMINGS.md +0 -0
  46. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/NOTICE +0 -0
  47. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/SOVEREIGN_PRD.md +0 -0
  48. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/TRIAGE_v1.md +0 -0
  49. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/action.yml +0 -0
  50. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/README.md +0 -0
  51. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results1.tsv +0 -0
  52. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results13.tsv +0 -0
  53. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results14.tsv +0 -0
  54. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results15.tsv +0 -0
  55. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results16.tsv +0 -0
  56. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results17.tsv +0 -0
  57. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results18.tsv +0 -0
  58. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results19.tsv +0 -0
  59. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results2.tsv +0 -0
  60. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results20.tsv +0 -0
  61. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results3.tsv +0 -0
  62. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results4.tsv +0 -0
  63. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results5.tsv +0 -0
  64. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results6.tsv +0 -0
  65. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results7.tsv +0 -0
  66. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results8.tsv +0 -0
  67. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results9.tsv +0 -0
  68. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results_evolved_v1.tsv +0 -0
  69. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/distribution/zed/LICENSE +0 -0
  70. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/distribution/zed/extension.toml +0 -0
  71. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/distribution/zed/icons/mistral_vibe.svg +0 -0
  72. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/README.md +0 -0
  73. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/acp-setup.md +0 -0
  74. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/archive/BASELINE_412.md +0 -0
  75. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/archive/Drydock_rebrand.md +0 -0
  76. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/archive/OVERNIGHT_PROGRESS.md +0 -0
  77. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/archive/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  78. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/archive/PERF_SWEEP_PLAN.md +0 -0
  79. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/archive/PRD.md +0 -0
  80. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/archive/drydock_terms.md +0 -0
  81. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/archive/resume.md +0 -0
  82. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/proxy-setup.md +0 -0
  83. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/__init__.py +0 -0
  84. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/__main__.py +0 -0
  85. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/__init__.py +0 -0
  86. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/acp_agent_loop.py +0 -0
  87. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/acp_logger.py +0 -0
  88. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/entrypoint.py +0 -0
  89. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/tools/__init__.py +0 -0
  90. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/tools/base.py +0 -0
  91. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/tools/builtins/bash.py +0 -0
  92. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/tools/builtins/read_file.py +0 -0
  93. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/tools/builtins/search_replace.py +0 -0
  94. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/tools/builtins/todo.py +0 -0
  95. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/tools/builtins/write_file.py +0 -0
  96. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/tools/session_update.py +0 -0
  97. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/utils.py +0 -0
  98. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/__init__.py +0 -0
  99. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/detectors.py +0 -0
  100. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/detectors_proposed.py +0 -0
  101. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/history.py +0 -0
  102. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/interventions.py +0 -0
  103. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/llm_analyzer.py +0 -0
  104. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/metrics.py +0 -0
  105. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/opus_escalator.py +0 -0
  106. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/persistence.py +0 -0
  107. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/policy.py +0 -0
  108. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/proposer.py +0 -0
  109. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/stager.py +0 -0
  110. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/task_classifier.py +0 -0
  111. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/tuning.py +0 -0
  112. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/validator.py +0 -0
  113. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/worker.py +0 -0
  114. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/__init__.py +0 -0
  115. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/autocompletion/__init__.py +0 -0
  116. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/autocompletion/base.py +0 -0
  117. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/autocompletion/path_completion.py +0 -0
  118. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/autocompletion/slash_command.py +0 -0
  119. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/cli.py +0 -0
  120. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/clipboard.py +0 -0
  121. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/commands.py +0 -0
  122. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/entrypoint.py +0 -0
  123. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/fix_windows_path.py +0 -0
  124. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/history_manager.py +0 -0
  125. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  126. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  127. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  128. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/terminal_setup.py +0 -0
  129. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/__init__.py +0 -0
  130. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  131. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/app.py +0 -0
  132. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/app.tcss +0 -0
  133. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/external_editor.py +0 -0
  134. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  135. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  136. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  137. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  138. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  139. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  140. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  141. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  142. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  143. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  144. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  145. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  146. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  147. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  148. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  149. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  150. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  151. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  152. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  153. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  154. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  155. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  156. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  157. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  158. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  159. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  160. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  161. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  162. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  163. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  164. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  165. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  166. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  167. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  168. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  169. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  170. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  171. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/windowing/history.py +0 -0
  172. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  173. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/windowing/state.py +0 -0
  174. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/update_notifier/__init__.py +0 -0
  175. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  176. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  177. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  178. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  179. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  180. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/update_notifier/update.py +0 -0
  181. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/update_notifier/whats_new.py +0 -0
  182. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/__init__.py +0 -0
  183. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/agent_loop.py +0 -0
  184. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/agents/__init__.py +0 -0
  185. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/agents/manager.py +0 -0
  186. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/agents/models.py +0 -0
  187. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/auth/__init__.py +0 -0
  188. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/auth/crypto.py +0 -0
  189. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/auth/github.py +0 -0
  190. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/__init__.py +0 -0
  191. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/completers.py +0 -0
  192. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  193. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  194. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  195. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  196. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  197. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/fuzzy.py +0 -0
  198. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/path_prompt.py +0 -0
  199. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  200. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/build_orchestrator.py +0 -0
  201. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/checkpoint.py +0 -0
  202. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/classifier/__init__.py +0 -0
  203. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/classifier/__main__.py +0 -0
  204. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/classifier/classifier.py +0 -0
  205. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/classifier/dispatcher.py +0 -0
  206. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/classifier/rules.py +0 -0
  207. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/classifier/signal.py +0 -0
  208. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/config/__init__.py +0 -0
  209. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/config/_dotenv.py +0 -0
  210. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/config/_settings.py +0 -0
  211. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/config/doctor.py +0 -0
  212. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/config/harness_files/__init__.py +0 -0
  213. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  214. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/config/harness_files/_paths.py +0 -0
  215. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/config/local_detect.py +0 -0
  216. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/config/migrate.py +0 -0
  217. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/consultant.py +0 -0
  218. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/context_recovery.py +0 -0
  219. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/drydock_states.py +0 -0
  220. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/hooks.py +0 -0
  221. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/__init__.py +0 -0
  222. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/backend/anthropic.py +0 -0
  223. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/backend/base.py +0 -0
  224. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/backend/factory.py +0 -0
  225. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/backend/generic.py +0 -0
  226. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/backend/mistral.py +0 -0
  227. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  228. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/backend/vertex.py +0 -0
  229. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/exceptions.py +0 -0
  230. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/format.py +0 -0
  231. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/message_utils.py +0 -0
  232. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/types.py +0 -0
  233. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/logger.py +0 -0
  234. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/middleware.py +0 -0
  235. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/output_formatters.py +0 -0
  236. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/paths/__init__.py +0 -0
  237. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/paths/_drydock_home.py +0 -0
  238. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/paths/_local_config_walk.py +0 -0
  239. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/paths/conventions.py +0 -0
  240. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/plan_session.py +0 -0
  241. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/plugins.py +0 -0
  242. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/programmatic.py +0 -0
  243. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/__init__.py +0 -0
  244. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/builder.md +0 -0
  245. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/cli.md +0 -0
  246. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/compact.md +0 -0
  247. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/dangerous_directory.md +0 -0
  248. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/diagnostic.md +0 -0
  249. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/explore.md +0 -0
  250. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/planner.md +0 -0
  251. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/project_context.md +0 -0
  252. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/tests.md +0 -0
  253. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/proxy_setup.py +0 -0
  254. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/session/agent_memory.py +0 -0
  255. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/session/checkpoints.py +0 -0
  256. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/session/session_loader.py +0 -0
  257. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/session/session_logger.py +0 -0
  258. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/session/session_migration.py +0 -0
  259. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/session/state_file.py +0 -0
  260. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/session_checker.py +0 -0
  261. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/skills/__init__.py +0 -0
  262. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/skills/manager.py +0 -0
  263. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/skills/models.py +0 -0
  264. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/skills/parser.py +0 -0
  265. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/slug.py +0 -0
  266. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/steering_hook.py +0 -0
  267. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/system_prompt.py +0 -0
  268. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/telemetry/__init__.py +0 -0
  269. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/telemetry/send.py +0 -0
  270. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/teleport/errors.py +0 -0
  271. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/teleport/git.py +0 -0
  272. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/teleport/nuage.py +0 -0
  273. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/teleport/teleport.py +0 -0
  274. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/teleport/types.py +0 -0
  275. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/base.py +0 -0
  276. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/_task_manager.py +0 -0
  277. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  278. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/bash.py +0 -0
  279. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/cron.py +0 -0
  280. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  281. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/glob_tool.py +0 -0
  282. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/grep.py +0 -0
  283. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  284. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/lsp.py +0 -0
  285. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  286. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  287. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/powershell.py +0 -0
  288. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  289. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  290. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  291. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  292. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  293. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  294. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  295. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  296. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  297. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  298. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  299. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  300. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
  301. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  302. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  303. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/task.md +0 -0
  304. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  305. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  306. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  307. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  308. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  309. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  310. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  311. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/read_file.py +0 -0
  312. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/retrieve.py +0 -0
  313. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/search_replace.py +0 -0
  314. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/task.py +0 -0
  315. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/todo.py +0 -0
  316. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/tool_search.py +0 -0
  317. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/webfetch.py +0 -0
  318. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/websearch.py +0 -0
  319. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/worktree.py +0 -0
  320. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/write_file.py +0 -0
  321. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/injection_guard.py +0 -0
  322. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/manager.py +0 -0
  323. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/mcp/__init__.py +0 -0
  324. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/mcp/registry.py +0 -0
  325. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/mcp/tools.py +0 -0
  326. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/mcp_sampling.py +0 -0
  327. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/ui.py +0 -0
  328. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/utils.py +0 -0
  329. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/trusted_folders.py +0 -0
  330. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/types.py +0 -0
  331. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/utils.py +0 -0
  332. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/curiosity/__init__.py +0 -0
  333. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/curiosity/__main__.py +0 -0
  334. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/curiosity/gap_detector.py +0 -0
  335. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/curiosity/item.py +0 -0
  336. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/curiosity/queue.py +0 -0
  337. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/curiosity/surprise.py +0 -0
  338. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/graphrag/__init__.py +0 -0
  339. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/graphrag/__main__.py +0 -0
  340. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/graphrag/code_indexer.py +0 -0
  341. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/graphrag/retriever.py +0 -0
  342. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/graphrag/storage.py +0 -0
  343. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/graphrag/text_indexer.py +0 -0
  344. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/onboarding/__init__.py +0 -0
  345. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/onboarding/base.py +0 -0
  346. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/onboarding/onboarding.tcss +0 -0
  347. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/onboarding/screens/__init__.py +0 -0
  348. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/onboarding/screens/api_key.py +0 -0
  349. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/onboarding/screens/choice.py +0 -0
  350. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/onboarding/screens/local_model.py +0 -0
  351. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/onboarding/screens/welcome.py +0 -0
  352. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  353. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  354. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/__init__.py +0 -0
  355. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/api-design/SKILL.md +0 -0
  356. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/audit-tests/SKILL.md +0 -0
  357. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/batch/SKILL.md +0 -0
  358. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/commit-code/SKILL.md +0 -0
  359. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/context-summary/SKILL.md +0 -0
  360. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/create-presentation/SKILL.md +0 -0
  361. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/deep-research/SKILL.md +0 -0
  362. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/deploy/SKILL.md +0 -0
  363. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/diff-review/SKILL.md +0 -0
  364. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/doc-gen/SKILL.md +0 -0
  365. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/explain-code/SKILL.md +0 -0
  366. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/explore-code/SKILL.md +0 -0
  367. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/fix-issue/SKILL.md +0 -0
  368. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/git-ops/SKILL.md +0 -0
  369. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/init-project/SKILL.md +0 -0
  370. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/investigate/SKILL.md +0 -0
  371. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/loop/SKILL.md +0 -0
  372. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/migrate/SKILL.md +0 -0
  373. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/perf-analyze/SKILL.md +0 -0
  374. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/plan-impl/SKILL.md +0 -0
  375. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/pr-review/SKILL.md +0 -0
  376. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/refactor/SKILL.md +0 -0
  377. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/regex-help/SKILL.md +0 -0
  378. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/review/SKILL.md +0 -0
  379. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/security-review/SKILL.md +0 -0
  380. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/ship/SKILL.md +0 -0
  381. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/simplify/SKILL.md +0 -0
  382. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/strong-tests/SKILL.md +0 -0
  383. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/test-verify/SKILL.md +0 -0
  384. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/__init__.py +0 -0
  385. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/__main__.py +0 -0
  386. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/applier.py +0 -0
  387. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/config.py +0 -0
  388. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/registry.py +0 -0
  389. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/sandbox.py +0 -0
  390. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/sidecar/__init__.py +0 -0
  391. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/sidecar/header_parser.py +0 -0
  392. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/sidecar/hooks.py +0 -0
  393. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/sidecar/loader.py +0 -0
  394. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/sidecar/server.py +0 -0
  395. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/train/__init__.py +0 -0
  396. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/train/capture.py +0 -0
  397. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/train/compute_vector.py +0 -0
  398. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/train/extract_pairs.py +0 -0
  399. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/vectors.py +0 -0
  400. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/whats_new.md +0 -0
  401. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock-acp.spec +0 -0
  402. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/flake.lock +0 -0
  403. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/flake.nix +0 -0
  404. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/outlook_draft_assistant.tar.gz +0 -0
  405. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/README.md +0 -0
  406. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/config_base.toml +0 -0
  407. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/config_best.toml +0 -0
  408. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/domain_spec.md +0 -0
  409. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/experimenter.py +0 -0
  410. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/kernel.py +0 -0
  411. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/mini_prd.md +0 -0
  412. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/mini_prompts.txt +0 -0
  413. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/proposer.py +0 -0
  414. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/results.tsv +0 -0
  415. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/README.md +0 -0
  416. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/admiral_probe.py +0 -0
  417. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/archive/auto_test_loop.sh +0 -0
  418. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/archive/monitor_test_battery.sh +0 -0
  419. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/archive/overnight_agents_test.sh +0 -0
  420. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/archive/test_bank.sh +0 -0
  421. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/archive/test_full.sh +0 -0
  422. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/archive/test_smoke.sh +0 -0
  423. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/archive/tui_test.py +0 -0
  424. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/audit_sampler.py +0 -0
  425. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/auto_generate_tests.py +0 -0
  426. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/auto_release.sh +0 -0
  427. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/autonomous_review.sh +0 -0
  428. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/autonomous_review_prompt.md +0 -0
  429. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/backfill_hle_curiosity.py +0 -0
  430. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/backup.sh +0 -0
  431. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/bump_version.py +0 -0
  432. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/classify_pulse.sh +0 -0
  433. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/consume_retrieval_queue.py +0 -0
  434. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/curiosity_idle_cycle.sh +0 -0
  435. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/fetch_arxiv_abstracts.py +0 -0
  436. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/gen_2000_prompts.py +0 -0
  437. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/hle_eval.py +0 -0
  438. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/hle_eval_seed.jsonl +0 -0
  439. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/llm_balancer.py +0 -0
  440. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/notify_release.py +0 -0
  441. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/perf_baseline_when_idle.sh +0 -0
  442. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/perf_sweep.py +0 -0
  443. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/poll_issues.sh +0 -0
  444. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/publish_to_pypi.sh +0 -0
  445. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/queue_top.py +0 -0
  446. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/ralph_loop.py +0 -0
  447. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/research_babysitter.sh +0 -0
  448. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/shakedown.py +0 -0
  449. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/shakedown_interactive.py +0 -0
  450. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/shakedown_suite.sh +0 -0
  451. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/shakedown_variance.sh +0 -0
  452. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/start_steering_sidecar.sh +0 -0
  453. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/stress_babysitter.sh +0 -0
  454. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/stress_prompts_50.txt +0 -0
  455. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/stress_prompts_realuser.txt +0 -0
  456. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/stress_prompts_tool_agent.txt +0 -0
  457. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  458. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/stress_shakedown.py +0 -0
  459. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/stress_telegram_status.py +0 -0
  460. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/stress_watcher.py +0 -0
  461. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/telegram_bot.py +0 -0
  462. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/vllm_failover.sh +0 -0
  463. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/__init__.py +0 -0
  464. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/conftest.py +0 -0
  465. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_acp.py +0 -0
  466. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_agent_thought.py +0 -0
  467. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_bash.py +0 -0
  468. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_compact_session_updates.py +0 -0
  469. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_content.py +0 -0
  470. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_initialize.py +0 -0
  471. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_list_sessions.py +0 -0
  472. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_load_session.py +0 -0
  473. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_multi_session.py +0 -0
  474. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_new_session.py +0 -0
  475. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_proxy_setup_acp.py +0 -0
  476. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_read_file.py +0 -0
  477. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_search_replace.py +0 -0
  478. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_set_config_option.py +0 -0
  479. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_set_mode.py +0 -0
  480. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_set_model.py +0 -0
  481. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_tool_call_session_update.py +0 -0
  482. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_utils.py +0 -0
  483. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_write_file.py +0 -0
  484. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/autocompletion/test_file_indexer.py +0 -0
  485. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/autocompletion/test_fuzzy.py +0 -0
  486. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  487. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  488. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/autocompletion/test_path_completion_controller.py +0 -0
  489. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  490. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/autocompletion/test_slash_command_controller.py +0 -0
  491. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  492. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/backend/__init__.py +0 -0
  493. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/backend/data/__init__.py +0 -0
  494. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/backend/data/fireworks.py +0 -0
  495. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/backend/data/mistral.py +0 -0
  496. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/backend/test_anthropic_adapter.py +0 -0
  497. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/backend/test_backend.py +0 -0
  498. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  499. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/backend/test_reasoning_adapter.py +0 -0
  500. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  501. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  502. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  503. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  504. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_bell_notifications.py +0 -0
  505. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_braille_renderer.py +0 -0
  506. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_clipboard.py +0 -0
  507. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_commands.py +0 -0
  508. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_copy_shortcuts.py +0 -0
  509. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_external_editor.py +0 -0
  510. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_no_markup_static.py +0 -0
  511. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_question_app.py +0 -0
  512. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_spinner.py +0 -0
  513. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_switching_mode.py +0 -0
  514. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  515. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  516. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_ui_session_resume.py +0 -0
  517. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_ui_skill_dispatch.py +0 -0
  518. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/textual_ui/__init__.py +0 -0
  519. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/textual_ui/test_session_picker.py +0 -0
  520. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/conftest.py +0 -0
  521. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_agents.py +0 -0
  522. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_auth_crypto.py +0 -0
  523. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_auth_github.py +0 -0
  524. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  525. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  526. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_config_load_dotenv.py +0 -0
  527. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_config_paths.py +0 -0
  528. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_config_resolution.py +0 -0
  529. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_file_logging.py +0 -0
  530. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_plan_session.py +0 -0
  531. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_proxy_setup.py +0 -0
  532. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_slug.py +0 -0
  533. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_telemetry_send.py +0 -0
  534. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_teleport_git.py +0 -0
  535. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_teleport_nuage.py +0 -0
  536. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_teleport_service.py +0 -0
  537. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_trusted_folders.py +0 -0
  538. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_utils.py +0 -0
  539. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/e2e/common.py +0 -0
  540. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/e2e/conftest.py +0 -0
  541. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/e2e/mock_server.py +0 -0
  542. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  543. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/e2e/test_cli_tui_streaming.py +0 -0
  544. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  545. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/fixtures/doc_qa_system_prd.md +0 -0
  546. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/mock/__init__.py +0 -0
  547. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/mock/mock_backend_factory.py +0 -0
  548. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/mock/mock_entrypoint.py +0 -0
  549. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/mock/utils.py +0 -0
  550. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/onboarding/test_run_onboarding.py +0 -0
  551. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/onboarding/test_ui_onboarding.py +0 -0
  552. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/session/test_session_loader.py +0 -0
  553. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/session/test_session_logger.py +0 -0
  554. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/session/test_session_migration.py +0 -0
  555. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/skills/conftest.py +0 -0
  556. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/skills/test_manager.py +0 -0
  557. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/skills/test_models.py +0 -0
  558. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/skills/test_parser.py +0 -0
  559. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  560. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  561. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  562. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  563. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  564. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  565. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  566. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  567. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  568. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  569. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  570. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  571. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  572. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  573. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  574. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  575. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  576. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  577. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  578. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  579. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  580. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  581. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  582. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  583. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  584. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  585. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  586. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  587. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  588. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  589. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  590. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  591. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  592. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  593. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  594. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  595. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  596. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  597. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  598. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  599. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  600. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  601. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  602. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  603. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  604. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  605. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  606. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  607. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  608. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  609. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  610. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  611. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  612. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  613. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  614. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  615. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  616. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  617. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  618. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  619. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/base_snapshot_test_app.py +0 -0
  620. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/conftest.py +0 -0
  621. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/snap_compare.py +0 -0
  622. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  623. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  624. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  625. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  626. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  627. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  628. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  629. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  630. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  631. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  632. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  633. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  634. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  635. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  636. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/stubs/fake_backend.py +0 -0
  637. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/stubs/fake_client.py +0 -0
  638. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/stubs/fake_tool.py +0 -0
  639. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_admiral.py +0 -0
  640. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
  641. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_admiral_intervention_outcome.py +0 -0
  642. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_admiral_phase3.py +0 -0
  643. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_admiral_proposed.py +0 -0
  644. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_admiral_session_id.py +0 -0
  645. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_admiral_struggle_dedup.py +0 -0
  646. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_agent_auto_compact.py +0 -0
  647. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_agent_backend.py +0 -0
  648. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_agent_observer_streaming.py +0 -0
  649. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_agent_stats.py +0 -0
  650. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_agent_tasks.py +0 -0
  651. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_agent_tool_call.py +0 -0
  652. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_agents.py +0 -0
  653. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_bank_build.py +0 -0
  654. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_bank_debug.py +0 -0
  655. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_bank_multiagent.py +0 -0
  656. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_bank_prd.py +0 -0
  657. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_bank_prd_extended.py +0 -0
  658. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_bank_tools.py +0 -0
  659. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_bank_update.py +0 -0
  660. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_build_projects.py +0 -0
  661. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_checkpoint.py +0 -0
  662. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_classifier.py +0 -0
  663. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_cli_programmatic_preload.py +0 -0
  664. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_config_migration.py +0 -0
  665. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_context_recovery.py +0 -0
  666. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_curiosity.py +0 -0
  667. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_current_bugs.py +0 -0
  668. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_dispatcher.py +0 -0
  669. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_drydock_regression.py +0 -0
  670. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_drydock_tasks.py +0 -0
  671. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  672. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_full_regression.py +0 -0
  673. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_graphrag.py +0 -0
  674. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_graphrag_worked_examples.py +0 -0
  675. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_hallucinated_tool_suppression.py +0 -0
  676. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_history_manager.py +0 -0
  677. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_hle_typing.py +0 -0
  678. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_integration.py +0 -0
  679. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_issue_fixes.py +0 -0
  680. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_local_detect.py +0 -0
  681. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_loop_detection.py +0 -0
  682. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_mcp_settings.py +0 -0
  683. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_message_id.py +0 -0
  684. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_message_merging.py +0 -0
  685. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_middleware.py +0 -0
  686. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_multi_agent.py +0 -0
  687. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_read_file_not_found_listing.py +0 -0
  688. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_real_failures.py +0 -0
  689. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_real_issues.py +0 -0
  690. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_real_workflow.py +0 -0
  691. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_reasoning_content.py +0 -0
  692. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_retrieval_consumer.py +0 -0
  693. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_retrieve_tool.py +0 -0
  694. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_search_replace_args_not_truncated.py +0 -0
  695. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_smoke.py +0 -0
  696. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_steering.py +0 -0
  697. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_steering_capture.py +0 -0
  698. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_steering_compute_vector.py +0 -0
  699. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_steering_extract_pairs.py +0 -0
  700. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_steering_hook.py +0 -0
  701. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_steering_sidecar_hooks.py +0 -0
  702. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_system_prompt.py +0 -0
  703. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_tagged_text.py +0 -0
  704. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_task_complete_nudge.py +0 -0
  705. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_tool_args.py +0 -0
  706. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_truncate_args_valid_json.py +0 -0
  707. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_truncated_arg_path_hint.py +0 -0
  708. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_truncated_search_replace_escalation.py +0 -0
  709. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_truncated_write_escalation.py +0 -0
  710. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_ui_external_editor.py +0 -0
  711. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_ui_input_history.py +0 -0
  712. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_user_issues.py +0 -0
  713. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_wall_of_text_rescue.py +0 -0
  714. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_workloads.py +0 -0
  715. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_write_file_missing_path.py +0 -0
  716. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/testbank_helpers.py +0 -0
  717. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_ask_user_question.py +0 -0
  718. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash.py +0 -0
  719. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash_binary_grep_hint.py +0 -0
  720. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash_consec_empty_search.py +0 -0
  721. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
  722. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
  723. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash_error_loop_breaker.py +0 -0
  724. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
  725. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
  726. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
  727. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
  728. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_exit_plan_mode.py +0 -0
  729. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_grep.py +0 -0
  730. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
  731. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_invoke_context.py +0 -0
  732. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  733. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_manager_get_tool_config.py +0 -0
  734. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_mcp.py +0 -0
  735. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_mcp_sampling.py +0 -0
  736. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
  737. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  738. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_read_file_directory.py +0 -0
  739. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_read_file_limit_truncation.py +0 -0
  740. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_append_fallback.py +0 -0
  741. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_dir_path.py +0 -0
  742. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_empty_content.py +0 -0
  743. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_file_not_found.py +0 -0
  744. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
  745. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_hard_stop.py +0 -0
  746. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_malformed_block.py +0 -0
  747. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  748. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_placeholder.py +0 -0
  749. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  750. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_task.py +0 -0
  751. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_ui_bash_execution.py +0 -0
  752. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_webfetch.py +0 -0
  753. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_websearch.py +0 -0
  754. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  755. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  756. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  757. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  758. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/update_notifier/test_do_update.py +0 -0
  759. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  760. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/update_notifier/test_github_update_gateway.py +0 -0
  761. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  762. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/update_notifier/test_ui_update_notification.py +0 -0
  763. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/update_notifier/test_update_use_case.py +0 -0
  764. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/update_notifier/test_whats_new.py +0 -0
  765. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/uv.lock +0 -0
  766. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/worked_examples/README.md +0 -0
  767. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/worked_examples/cli_subcommand_dispatch.py +0 -0
  768. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/worked_examples/lookup.json +0 -0
  769. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/worked_examples/sql_parser.py +0 -0
  770. {drydock_cli-2.8.21 → drydock_cli-2.8.23}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 1014651
@@ -0,0 +1,118 @@
1
+ name: Bug Report
2
+ description: Tell us about a defect in DryDock
3
+ title: "bug: "
4
+ labels: ["bug"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: >
9
+ Thanks for filing a detailed bug. Fill out every section so the
10
+ autonomous improvement loop can reproduce, classify, and ship a fix
11
+ on the next 6-hour release tick.
12
+
13
+ - type: checkboxes
14
+ id: prechecks
15
+ attributes:
16
+ label: Pre-flight
17
+ description: Quick sanity checks before filing.
18
+ options:
19
+ - label: I'm on the latest released version (`pip install -U drydock-cli`)
20
+ required: true
21
+ - label: I searched existing open + closed issues for this symptom
22
+ required: true
23
+
24
+ - type: dropdown
25
+ id: component
26
+ attributes:
27
+ label: Component
28
+ description: Which part of DryDock is affected?
29
+ options:
30
+ - CLI / TUI
31
+ - ACP (Agent Client Protocol)
32
+ - MCP (Model Context Protocol integration)
33
+ - GraphRAG / retrieve tool
34
+ - Curiosity Layer
35
+ - Auto-release / cron / autonomous loop
36
+ - Install / packaging
37
+ - Other
38
+ validations:
39
+ required: true
40
+
41
+ - type: input
42
+ id: version
43
+ attributes:
44
+ label: DryDock version
45
+ description: Output of `drydock --version`.
46
+ placeholder: "drydock 2.8.21"
47
+ validations:
48
+ required: true
49
+
50
+ - type: input
51
+ id: model
52
+ attributes:
53
+ label: Model + provider
54
+ description: >
55
+ DryDock's behavior is highly model-dependent. Tell us the active
56
+ model name and the runtime serving it (vLLM, llama.cpp, Ollama,
57
+ LM Studio, OpenAI-compatible endpoint, etc.).
58
+ placeholder: "gemma4 (vLLM Docker on localhost:8000)"
59
+ validations:
60
+ required: true
61
+
62
+ - type: input
63
+ id: env
64
+ attributes:
65
+ label: OS + Python + install method
66
+ description: Operating system, Python version, and how DryDock was installed.
67
+ placeholder: "Ubuntu 22.04, Python 3.12, pip install drydock-cli"
68
+ validations:
69
+ required: true
70
+
71
+ - type: textarea
72
+ id: summary
73
+ attributes:
74
+ label: Summary
75
+ description: One or two sentences. What went wrong, in user terms.
76
+ validations:
77
+ required: true
78
+
79
+ - type: textarea
80
+ id: repro
81
+ attributes:
82
+ label: Reproduction steps
83
+ description: >
84
+ Exact commands, prompts, or actions that trigger the bug. Include
85
+ the slash command / tool / agent if relevant. Redact secrets.
86
+ placeholder: |
87
+ 1. Run `drydock`
88
+ 2. Type `/mcp add stdio foo npx -y @modelcontextprotocol/server-foo`
89
+ 3. Type `list_mcp_resources` ...
90
+ 4. See error
91
+ validations:
92
+ required: true
93
+
94
+ - type: textarea
95
+ id: expected
96
+ attributes:
97
+ label: Expected vs actual
98
+ description: What you expected to happen vs what actually happened.
99
+ validations:
100
+ required: true
101
+
102
+ - type: textarea
103
+ id: logs
104
+ attributes:
105
+ label: Logs / traceback / screenshots
106
+ description: >
107
+ Paste the relevant traceback, error message, JSON snippet, or
108
+ console output. For TUI rendering bugs, screenshots help most.
109
+ Session logs live at `~/.drydock/logs/` and `~/.vibe/logs/session/`.
110
+ render: shell
111
+
112
+ - type: textarea
113
+ id: context
114
+ attributes:
115
+ label: Anything else?
116
+ description: >
117
+ Workarounds you tried, related issues, anything you noticed about
118
+ when it does/doesn't reproduce. Optional.
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Feature request or idea
4
+ url: https://github.com/fbobe321/drydock/issues/new?labels=enhancement&template=
5
+ about: Open an enhancement issue describing the feature you'd like to see
6
+ - name: Read the docs
7
+ url: https://github.com/fbobe321/drydock#readme
8
+ about: README + per-feature setup guides (MCP, Curiosity Layer, GraphRAG, etc.)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.8.21
3
+ Version: 2.8.23
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
@@ -36,13 +36,11 @@ Requires-Dist: markdownify>=1.2.2
36
36
  Requires-Dist: mcp>=1.14.0
37
37
  Requires-Dist: mistralai==1.12.4
38
38
  Requires-Dist: packaging>=24.1
39
- Requires-Dist: pexpect>=4.9.0
40
39
  Requires-Dist: pydantic-settings>=2.12.0
41
40
  Requires-Dist: pydantic>=2.12.4
42
41
  Requires-Dist: pypdf>=4.0.0
43
42
  Requires-Dist: pyperclip>=1.11.0
44
43
  Requires-Dist: pyyaml>=6.0.0
45
- Requires-Dist: requests>=2.20.0
46
44
  Requires-Dist: rich>=14.0.0
47
45
  Requires-Dist: textual-speedups>=0.2.1
48
46
  Requires-Dist: textual>=7.4.0
@@ -378,6 +376,92 @@ DryDock discovers skills from:
378
376
  3. Global `~/.drydock/skills/`
379
377
  4. Bundled skills (shipped with the package)
380
378
 
379
+ ### Built-in tools beyond the basics
380
+
381
+ In addition to the standard `read_file` / `write_file` / `search_replace` / `bash` / `grep` / `glob` / `task` / `retrieve` set, DryDock ships four direct built-ins designed to plug well-known transformer weaknesses:
382
+
383
+ - **`math`** — exact arithmetic via stdlib (math, statistics, Fraction, Decimal). Sandboxed Python expression. Fixes factorials, large multiplies, primes, statistics, exact fractions.
384
+ - **`count`** — exact substring/regex/lines/words/chars/bytes count over a string OR a file. Fixes "how many X are in this text" estimation errors.
385
+ - **`memory`** — persistent cross-session key/value notes at `~/.drydock/agent_memory/notes.jsonl`. Save, recall (TF-IDF ranked), list keys, forget. Bridges the long-term memory gap.
386
+ - **`verify`** — runs a shell command (or checks a file) and matches the output against an expectation (contains/not_contains/regex/equals/exit_code/file_exists/file_contains). Operationalizes the "Loop until verified" core principle.
387
+
388
+ All four are direct built-ins, NOT MCP servers — per Babich's "MCP is Dead" (Apr 2026), MCP servers burn ~20K tokens of context per call which is a real cost on a 131K-context local model. Direct built-ins use a strict Pydantic schema, single subprocess-free path, and tighter security.
389
+
390
+ ### Math Tool
391
+
392
+ DryDock ships with a `math` tool the model calls instead of doing arithmetic in its head. It's a direct built-in (NOT an MCP server — see [MCP is Dead](https://medium.com/) for why direct tools beat MCP for small bandwidth-limited models like Gemma 4). One argument, sandboxed Python expression, exact results.
393
+
394
+ ```
395
+ math(expression="math.factorial(20)") # 2432902008176640000 — exact
396
+ math(expression="math.comb(50, 5)") # 2118760
397
+ math(expression="math.gcd(48, 18)") # 6
398
+ math(expression="statistics.stdev([2,4,4,4,5,5,7,9])")
399
+ math(expression="Fraction(1,3) + Fraction(1,6)") # exact 1/2
400
+ math(expression="Decimal('0.1') + Decimal('0.2')") # exact 0.3
401
+ math(expression="round(math.pi, 12)")
402
+ math(expression="sum(range(1, 101))") # 5050
403
+ ```
404
+
405
+ Available names: arithmetic operators (`+ - * / // % **`), comparisons, `and / or / not`, `abs / round / min / max / sum / len / pow / divmod / range / int / float / bool`, the `math` and `statistics` modules, `Fraction`, `Decimal`. Constants: `pi`, `e`, `tau`, `inf`, `nan`. **No imports, no `open()`, no file/network access**, no attribute access outside the whitelist.
406
+
407
+ Always auto-approved (read-only, side-effect free). Errors return a structured `{ok: false, error: "..."}` instead of raising.
408
+
409
+ ### Custom Tools
410
+
411
+ Add your own built-in tools by dropping a file into one of these locations:
412
+
413
+ - **Project-local:** any path listed in `config.toml`'s `tool_paths` array
414
+ - **Global:** `~/.drydock/tools/`
415
+ - **Bundled:** `drydock/core/tools/builtins/` (forks only)
416
+
417
+ Each file should subclass `BaseTool[ArgsModel, ResultModel, ConfigModel, StateModel]` with a Pydantic args model + result model + an async `run()` generator. Auto-discovery picks up every non-underscore-prefixed `.py` in those directories. The class name auto-converts to a snake_case tool name (`MyTool` → `my_tool`).
418
+
419
+ Minimum viable tool:
420
+
421
+ ```python
422
+ # ~/.drydock/tools/word_count.py
423
+ from collections.abc import AsyncGenerator
424
+ from typing import ClassVar, final
425
+ from pydantic import BaseModel, Field
426
+ from drydock.core.tools.base import (
427
+ BaseTool, BaseToolConfig, BaseToolState, InvokeContext, ToolPermission,
428
+ )
429
+ from drydock.core.tools.ui import ToolCallDisplay, ToolResultDisplay, ToolUIData
430
+ from drydock.core.types import ToolStreamEvent
431
+
432
+ class WordCountArgs(BaseModel):
433
+ text: str = Field(description="Text to count words in")
434
+
435
+ class WordCountResult(BaseModel):
436
+ count: int
437
+
438
+ class WordCountConfig(BaseToolConfig):
439
+ permission: ToolPermission = ToolPermission.ALWAYS
440
+
441
+ class WordCount(
442
+ BaseTool[WordCountArgs, WordCountResult, WordCountConfig, BaseToolState],
443
+ ToolUIData[WordCountArgs, WordCountResult],
444
+ ):
445
+ description: ClassVar[str] = "Count words in a string."
446
+
447
+ @classmethod
448
+ def format_call_display(cls, args): return ToolCallDisplay(summary=f"count: {args.text[:30]}")
449
+ @classmethod
450
+ def get_result_display(cls, event): return ToolResultDisplay(success=True, message=f"{event.result.count} words")
451
+ @classmethod
452
+ def get_status_text(cls): return "Counting"
453
+ def resolve_permission(self, args): return ToolPermission.ALWAYS
454
+
455
+ @final
456
+ async def run(self, args: WordCountArgs, ctx: InvokeContext | None = None
457
+ ) -> AsyncGenerator[ToolStreamEvent | WordCountResult, None]:
458
+ yield WordCountResult(count=len(args.text.split()))
459
+ ```
460
+
461
+ Restart drydock; the model now sees `word_count` in its tool list.
462
+
463
+ For tools that should run as separate processes or that you want to share with other AI clients (Claude Code, Cursor, etc.), use the [MCP integration](#mcp-servers) instead — but be aware MCP burns substantial context per call (~20K tokens for tool-rich servers like Figma's), so a direct built-in is almost always the better choice for performance-sensitive local-model setups.
464
+
381
465
  ### MCP Servers
382
466
 
383
467
  DryDock can connect to any Model Context Protocol server. Tools from a server `foo` show up as `foo__<tool_name>` in the agent's tool list. Two ways to add one:
@@ -323,6 +323,92 @@ DryDock discovers skills from:
323
323
  3. Global `~/.drydock/skills/`
324
324
  4. Bundled skills (shipped with the package)
325
325
 
326
+ ### Built-in tools beyond the basics
327
+
328
+ In addition to the standard `read_file` / `write_file` / `search_replace` / `bash` / `grep` / `glob` / `task` / `retrieve` set, DryDock ships four direct built-ins designed to plug well-known transformer weaknesses:
329
+
330
+ - **`math`** — exact arithmetic via stdlib (math, statistics, Fraction, Decimal). Sandboxed Python expression. Fixes factorials, large multiplies, primes, statistics, exact fractions.
331
+ - **`count`** — exact substring/regex/lines/words/chars/bytes count over a string OR a file. Fixes "how many X are in this text" estimation errors.
332
+ - **`memory`** — persistent cross-session key/value notes at `~/.drydock/agent_memory/notes.jsonl`. Save, recall (TF-IDF ranked), list keys, forget. Bridges the long-term memory gap.
333
+ - **`verify`** — runs a shell command (or checks a file) and matches the output against an expectation (contains/not_contains/regex/equals/exit_code/file_exists/file_contains). Operationalizes the "Loop until verified" core principle.
334
+
335
+ All four are direct built-ins, NOT MCP servers — per Babich's "MCP is Dead" (Apr 2026), MCP servers burn ~20K tokens of context per call which is a real cost on a 131K-context local model. Direct built-ins use a strict Pydantic schema, single subprocess-free path, and tighter security.
336
+
337
+ ### Math Tool
338
+
339
+ DryDock ships with a `math` tool the model calls instead of doing arithmetic in its head. It's a direct built-in (NOT an MCP server — see [MCP is Dead](https://medium.com/) for why direct tools beat MCP for small bandwidth-limited models like Gemma 4). One argument, sandboxed Python expression, exact results.
340
+
341
+ ```
342
+ math(expression="math.factorial(20)") # 2432902008176640000 — exact
343
+ math(expression="math.comb(50, 5)") # 2118760
344
+ math(expression="math.gcd(48, 18)") # 6
345
+ math(expression="statistics.stdev([2,4,4,4,5,5,7,9])")
346
+ math(expression="Fraction(1,3) + Fraction(1,6)") # exact 1/2
347
+ math(expression="Decimal('0.1') + Decimal('0.2')") # exact 0.3
348
+ math(expression="round(math.pi, 12)")
349
+ math(expression="sum(range(1, 101))") # 5050
350
+ ```
351
+
352
+ Available names: arithmetic operators (`+ - * / // % **`), comparisons, `and / or / not`, `abs / round / min / max / sum / len / pow / divmod / range / int / float / bool`, the `math` and `statistics` modules, `Fraction`, `Decimal`. Constants: `pi`, `e`, `tau`, `inf`, `nan`. **No imports, no `open()`, no file/network access**, no attribute access outside the whitelist.
353
+
354
+ Always auto-approved (read-only, side-effect free). Errors return a structured `{ok: false, error: "..."}` instead of raising.
355
+
356
+ ### Custom Tools
357
+
358
+ Add your own built-in tools by dropping a file into one of these locations:
359
+
360
+ - **Project-local:** any path listed in `config.toml`'s `tool_paths` array
361
+ - **Global:** `~/.drydock/tools/`
362
+ - **Bundled:** `drydock/core/tools/builtins/` (forks only)
363
+
364
+ Each file should subclass `BaseTool[ArgsModel, ResultModel, ConfigModel, StateModel]` with a Pydantic args model + result model + an async `run()` generator. Auto-discovery picks up every non-underscore-prefixed `.py` in those directories. The class name auto-converts to a snake_case tool name (`MyTool` → `my_tool`).
365
+
366
+ Minimum viable tool:
367
+
368
+ ```python
369
+ # ~/.drydock/tools/word_count.py
370
+ from collections.abc import AsyncGenerator
371
+ from typing import ClassVar, final
372
+ from pydantic import BaseModel, Field
373
+ from drydock.core.tools.base import (
374
+ BaseTool, BaseToolConfig, BaseToolState, InvokeContext, ToolPermission,
375
+ )
376
+ from drydock.core.tools.ui import ToolCallDisplay, ToolResultDisplay, ToolUIData
377
+ from drydock.core.types import ToolStreamEvent
378
+
379
+ class WordCountArgs(BaseModel):
380
+ text: str = Field(description="Text to count words in")
381
+
382
+ class WordCountResult(BaseModel):
383
+ count: int
384
+
385
+ class WordCountConfig(BaseToolConfig):
386
+ permission: ToolPermission = ToolPermission.ALWAYS
387
+
388
+ class WordCount(
389
+ BaseTool[WordCountArgs, WordCountResult, WordCountConfig, BaseToolState],
390
+ ToolUIData[WordCountArgs, WordCountResult],
391
+ ):
392
+ description: ClassVar[str] = "Count words in a string."
393
+
394
+ @classmethod
395
+ def format_call_display(cls, args): return ToolCallDisplay(summary=f"count: {args.text[:30]}")
396
+ @classmethod
397
+ def get_result_display(cls, event): return ToolResultDisplay(success=True, message=f"{event.result.count} words")
398
+ @classmethod
399
+ def get_status_text(cls): return "Counting"
400
+ def resolve_permission(self, args): return ToolPermission.ALWAYS
401
+
402
+ @final
403
+ async def run(self, args: WordCountArgs, ctx: InvokeContext | None = None
404
+ ) -> AsyncGenerator[ToolStreamEvent | WordCountResult, None]:
405
+ yield WordCountResult(count=len(args.text.split()))
406
+ ```
407
+
408
+ Restart drydock; the model now sees `word_count` in its tool list.
409
+
410
+ For tools that should run as separate processes or that you want to share with other AI clients (Claude Code, Cursor, etc.), use the [MCP integration](#mcp-servers) instead — but be aware MCP burns substantial context per call (~20K tokens for tool-rich servers like Figma's), so a direct built-in is almost always the better choice for performance-sensitive local-model setups.
411
+
326
412
  ### MCP Servers
327
413
 
328
414
  DryDock can connect to any Model Context Protocol server. Tools from a server `foo` show up as `foo__<tool_name>` in the agent's tool list. Two ways to add one:
@@ -79,6 +79,18 @@ Workflow for fixing bugs:
79
79
  3. Fix with search_replace
80
80
  4. Verify the fix
81
81
 
82
+ CORE PRINCIPLES (the four lines that win):
83
+ 1. Don't assume. Don't hide confusion. Surface tradeoffs.
84
+ 2. Minimum code that solves the problem. Nothing speculative.
85
+ 3. Touch only what you must. Clean up only your own mess.
86
+ 4. Define success criteria. Loop until verified.
87
+
88
+ USE THE math TOOL for any non-trivial arithmetic. Gemma 4 gets factorials,
89
+ large multiplies, prime tests, and floating-point edge cases wrong from
90
+ prior alone. The math tool is sandboxed Python (`math.factorial(20)`,
91
+ `math.comb(50,5)`, `Fraction(1,3)+Fraction(1,6)`, `statistics.mean([...])`)
92
+ and returns exact results. Use it. Don't compute in your head.
93
+
82
94
  Rules:
83
95
  - Create files immediately. Do not plan or discuss — write code.
84
96
  - Use absolute imports for Python packages
@@ -0,0 +1,218 @@
1
+ """Count tool — exact substring / regex / line / token counts.
2
+
3
+ The companion to the math tool: transformers can't count reliably (they
4
+ estimate token positions and overshoot/undershoot on "how many X are in
5
+ this text"). This tool fixes it by deferring to deterministic stdlib code.
6
+
7
+ Use INSTEAD of estimating "how many" anything. The model just calls and
8
+ gets the exact number.
9
+
10
+ Modes:
11
+ - substring — case-sensitive substring count (default)
12
+ - substring_ci — case-insensitive substring count
13
+ - regex — regex match count (uses re.findall)
14
+ - lines — number of lines (newline-separated)
15
+ - words — whitespace-separated word count
16
+ - chars — total character count
17
+ - bytes — UTF-8 byte length
18
+
19
+ Source can be:
20
+ - `text` arg directly
21
+ - `path` arg pointing at a file (read up to 10 MB)
22
+
23
+ Examples:
24
+
25
+ count(pattern="r", text="strawberry") # 3
26
+ count(pattern="def ", path="/data3/drydock/drydock/core/agent_loop.py", mode="substring")
27
+ count(pattern="^class\\s", path="...", mode="regex")
28
+ count(mode="lines", path="...")
29
+ count(mode="words", text="hello world hello") # 3
30
+ """
31
+ from __future__ import annotations
32
+
33
+ import re
34
+ from collections.abc import AsyncGenerator
35
+ from pathlib import Path
36
+ from typing import TYPE_CHECKING, ClassVar, Literal, final
37
+
38
+ from pydantic import BaseModel, Field
39
+
40
+ from drydock.core.tools.base import (
41
+ BaseTool,
42
+ BaseToolConfig,
43
+ BaseToolState,
44
+ InvokeContext,
45
+ ToolPermission,
46
+ )
47
+ from drydock.core.tools.ui import ToolCallDisplay, ToolResultDisplay, ToolUIData
48
+ from drydock.core.types import ToolStreamEvent
49
+
50
+ if TYPE_CHECKING:
51
+ from drydock.core.types import ToolResultEvent
52
+
53
+
54
+ _MAX_FILE_BYTES = 10 * 1024 * 1024 # 10 MB
55
+
56
+ CountMode = Literal[
57
+ "substring", "substring_ci", "regex", "lines", "words", "chars", "bytes",
58
+ ]
59
+
60
+
61
+ class CountArgs(BaseModel):
62
+ mode: CountMode = Field(
63
+ default="substring",
64
+ description=(
65
+ "How to count. `substring` = case-sensitive substring (needs "
66
+ "`pattern`). `substring_ci` = case-insensitive. `regex` = "
67
+ "Python re.findall (needs `pattern`). `lines` / `words` / "
68
+ "`chars` / `bytes` = pattern-free."
69
+ ),
70
+ )
71
+ pattern: str = Field(
72
+ default="",
73
+ description=(
74
+ "Required for substring / substring_ci / regex. Ignored otherwise."
75
+ ),
76
+ )
77
+ text: str = Field(
78
+ default="",
79
+ description=(
80
+ "Inline text to count in. Provide either `text` OR `path`, not both."
81
+ ),
82
+ )
83
+ path: str = Field(
84
+ default="",
85
+ description=(
86
+ "Path to a file to count in. Capped at 10 MB. Use either `text` "
87
+ "OR `path`."
88
+ ),
89
+ )
90
+
91
+
92
+ class CountResult(BaseModel):
93
+ ok: bool
94
+ count: int = 0
95
+ mode: str = ""
96
+ source: str = "" # "text" or the file path
97
+ error: str = ""
98
+
99
+
100
+ class CountConfig(BaseToolConfig):
101
+ permission: ToolPermission = ToolPermission.ALWAYS
102
+
103
+
104
+ def _resolve_text(args: CountArgs) -> tuple[str, str]:
105
+ """Returns (text, source_label). Raises ValueError on bad input.
106
+
107
+ Empty text + empty path is treated as the empty string source — valid
108
+ for pattern-free modes like `lines` (returns 0). Substring / regex
109
+ modes still error out via `_do_count` if the pattern is empty.
110
+ """
111
+ if args.text and args.path:
112
+ raise ValueError("provide either `text` or `path`, not both")
113
+ if args.path:
114
+ p = Path(args.path).expanduser()
115
+ if not p.is_file():
116
+ raise ValueError(f"file not found: {p}")
117
+ size = p.stat().st_size
118
+ if size > _MAX_FILE_BYTES:
119
+ raise ValueError(
120
+ f"file too large ({size} bytes > {_MAX_FILE_BYTES})"
121
+ )
122
+ return p.read_text(errors="replace"), str(p)
123
+ return args.text, "text"
124
+
125
+
126
+ def _do_count(text: str, args: CountArgs) -> int:
127
+ if args.mode == "substring":
128
+ if not args.pattern:
129
+ raise ValueError("substring mode requires `pattern`")
130
+ return text.count(args.pattern)
131
+ if args.mode == "substring_ci":
132
+ if not args.pattern:
133
+ raise ValueError("substring_ci mode requires `pattern`")
134
+ return text.lower().count(args.pattern.lower())
135
+ if args.mode == "regex":
136
+ if not args.pattern:
137
+ raise ValueError("regex mode requires `pattern`")
138
+ try:
139
+ return len(re.findall(args.pattern, text))
140
+ except re.error as e:
141
+ raise ValueError(f"invalid regex: {e}") from e
142
+ if args.mode == "lines":
143
+ # If text ends without a newline, it still counts as one line.
144
+ if not text:
145
+ return 0
146
+ return text.count("\n") + (0 if text.endswith("\n") else 1)
147
+ if args.mode == "words":
148
+ return len(text.split())
149
+ if args.mode == "chars":
150
+ return len(text)
151
+ if args.mode == "bytes":
152
+ return len(text.encode("utf-8"))
153
+ raise ValueError(f"unknown mode: {args.mode}")
154
+
155
+
156
+ class Count(
157
+ BaseTool[CountArgs, CountResult, CountConfig, BaseToolState],
158
+ ToolUIData[CountArgs, CountResult],
159
+ ):
160
+ description: ClassVar[str] = (
161
+ "Exact count of substrings, regex matches, lines, words, chars, "
162
+ "or bytes in a string OR file. Use INSTEAD of estimating 'how "
163
+ "many X are in this text' — transformers count poorly. Modes: "
164
+ "substring (default), substring_ci, regex, lines, words, chars, "
165
+ "bytes. Source: pass `text=...` OR `path=...` (file capped at "
166
+ "10 MB). Examples: count(pattern='r', text='strawberry') -> 3; "
167
+ "count(pattern='^def ', path='foo.py', mode='regex'); "
168
+ "count(mode='lines', path='foo.txt')."
169
+ )
170
+
171
+ @classmethod
172
+ def format_call_display(cls, args: CountArgs) -> ToolCallDisplay:
173
+ if args.path:
174
+ target = args.path.split("/")[-1] if "/" in args.path else args.path
175
+ target = f"file:{target}"
176
+ else:
177
+ preview = args.text[:30].replace("\n", " ")
178
+ target = f'text:"{preview}..."' if len(args.text) > 30 else f'text:"{preview}"'
179
+ if args.mode in ("substring", "substring_ci", "regex") and args.pattern:
180
+ return ToolCallDisplay(summary=f"count {args.mode} {args.pattern!r} in {target}")
181
+ return ToolCallDisplay(summary=f"count {args.mode} in {target}")
182
+
183
+ @classmethod
184
+ def get_result_display(cls, event: "ToolResultEvent") -> ToolResultDisplay:
185
+ if isinstance(event.result, CountResult):
186
+ if not event.result.ok:
187
+ return ToolResultDisplay(
188
+ success=False, message=f"count: {event.result.error[:80]}"
189
+ )
190
+ return ToolResultDisplay(
191
+ success=True,
192
+ message=f"= {event.result.count} ({event.result.mode})",
193
+ )
194
+ return ToolResultDisplay(success=True, message="count complete")
195
+
196
+ @classmethod
197
+ def get_status_text(cls) -> str:
198
+ return "Counting"
199
+
200
+ def resolve_permission(self, args: CountArgs) -> ToolPermission | None:
201
+ return ToolPermission.ALWAYS
202
+
203
+ @final
204
+ async def run(
205
+ self, args: CountArgs, ctx: InvokeContext | None = None
206
+ ) -> AsyncGenerator[ToolStreamEvent | CountResult, None]:
207
+ try:
208
+ text, source = _resolve_text(args)
209
+ n = _do_count(text, args)
210
+ except ValueError as e:
211
+ yield CountResult(ok=False, error=str(e), mode=args.mode)
212
+ return
213
+ except OSError as e:
214
+ yield CountResult(
215
+ ok=False, error=f"OSError: {e}", mode=args.mode
216
+ )
217
+ return
218
+ yield CountResult(ok=True, count=n, mode=args.mode, source=source)