drydock-cli 2.8.20__tar.gz → 2.8.22__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 (763) hide show
  1. drydock_cli-2.8.22/.auto_release.lock +1 -0
  2. drydock_cli-2.8.22/.github/ISSUE_TEMPLATE/bug-report.yml +118 -0
  3. drydock_cli-2.8.22/.github/ISSUE_TEMPLATE/config.yml +8 -0
  4. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/PKG-INFO +76 -1
  5. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/README.md +75 -0
  6. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/prompts/gemma4.md +12 -0
  7. drydock_cli-2.8.22/drydock/core/tools/builtins/math_tool.py +248 -0
  8. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/mcp_resources.py +4 -4
  9. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/pyproject.toml +1 -1
  10. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/deploy_to_github.sh +1 -1
  11. drydock_cli-2.8.22/tests/test_math_tool.py +231 -0
  12. drydock_cli-2.8.22/tests/test_mcp_settings.py +18 -0
  13. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/trip_log.md +183 -0
  14. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/uv.lock +1 -1
  15. drydock_cli-2.8.20/.auto_release.lock +0 -1
  16. drydock_cli-2.8.20/.github/ISSUE_TEMPLATE/bug-report.yml +0 -58
  17. drydock_cli-2.8.20/.github/ISSUE_TEMPLATE/config.yml +0 -11
  18. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/.github/CODEOWNERS +0 -0
  19. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  20. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/.github/workflows/build-and-upload.yml +0 -0
  21. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/.github/workflows/ci.yml +0 -0
  22. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/.github/workflows/issue-labeler.yml +0 -0
  23. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/.github/workflows/release.yml +0 -0
  24. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/.gitignore +0 -0
  25. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/.pre-commit-config.yaml +0 -0
  26. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/.python-version +0 -0
  27. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/.typos.toml +0 -0
  28. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/.vscode/extensions.json +0 -0
  29. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/.vscode/launch.json +0 -0
  30. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/.vscode/settings.json +0 -0
  31. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/AGENTS.md +0 -0
  32. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/Admiral.md +0 -0
  33. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/CHANGELOG.md +0 -0
  34. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/CLAUDE.md +0 -0
  35. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/CONTRIBUTING.md +0 -0
  36. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/DEEP_NOIR_PRD.md +0 -0
  37. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/DEPLOYMENT.md +0 -0
  38. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/HLE_PRD.md +0 -0
  39. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/JETSON_BENCH.md +0 -0
  40. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/LICENSE +0 -0
  41. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/MODEL_SHORTCOMINGS.md +0 -0
  42. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/NOTICE +0 -0
  43. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/SOVEREIGN_PRD.md +0 -0
  44. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/TRIAGE_v1.md +0 -0
  45. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/action.yml +0 -0
  46. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/baseline_history/README.md +0 -0
  47. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/baseline_history/results1.tsv +0 -0
  48. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/baseline_history/results13.tsv +0 -0
  49. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/baseline_history/results14.tsv +0 -0
  50. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/baseline_history/results15.tsv +0 -0
  51. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/baseline_history/results16.tsv +0 -0
  52. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/baseline_history/results17.tsv +0 -0
  53. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/baseline_history/results18.tsv +0 -0
  54. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/baseline_history/results19.tsv +0 -0
  55. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/baseline_history/results2.tsv +0 -0
  56. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/baseline_history/results20.tsv +0 -0
  57. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/baseline_history/results3.tsv +0 -0
  58. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/baseline_history/results4.tsv +0 -0
  59. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/baseline_history/results5.tsv +0 -0
  60. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/baseline_history/results6.tsv +0 -0
  61. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/baseline_history/results7.tsv +0 -0
  62. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/baseline_history/results8.tsv +0 -0
  63. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/baseline_history/results9.tsv +0 -0
  64. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/baseline_history/results_evolved_v1.tsv +0 -0
  65. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/distribution/zed/LICENSE +0 -0
  66. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/distribution/zed/extension.toml +0 -0
  67. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/distribution/zed/icons/mistral_vibe.svg +0 -0
  68. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/docs/README.md +0 -0
  69. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/docs/acp-setup.md +0 -0
  70. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/docs/archive/BASELINE_412.md +0 -0
  71. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/docs/archive/Drydock_rebrand.md +0 -0
  72. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/docs/archive/OVERNIGHT_PROGRESS.md +0 -0
  73. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/docs/archive/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  74. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/docs/archive/PERF_SWEEP_PLAN.md +0 -0
  75. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/docs/archive/PRD.md +0 -0
  76. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/docs/archive/drydock_terms.md +0 -0
  77. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/docs/archive/resume.md +0 -0
  78. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/docs/proxy-setup.md +0 -0
  79. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/__init__.py +0 -0
  80. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/__main__.py +0 -0
  81. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/acp/__init__.py +0 -0
  82. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/acp/acp_agent_loop.py +0 -0
  83. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/acp/acp_logger.py +0 -0
  84. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/acp/entrypoint.py +0 -0
  85. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/acp/tools/__init__.py +0 -0
  86. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/acp/tools/base.py +0 -0
  87. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/acp/tools/builtins/bash.py +0 -0
  88. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/acp/tools/builtins/read_file.py +0 -0
  89. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/acp/tools/builtins/search_replace.py +0 -0
  90. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/acp/tools/builtins/todo.py +0 -0
  91. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/acp/tools/builtins/write_file.py +0 -0
  92. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/acp/tools/session_update.py +0 -0
  93. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/acp/utils.py +0 -0
  94. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/admiral/__init__.py +0 -0
  95. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/admiral/detectors.py +0 -0
  96. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/admiral/detectors_proposed.py +0 -0
  97. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/admiral/history.py +0 -0
  98. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/admiral/interventions.py +0 -0
  99. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/admiral/llm_analyzer.py +0 -0
  100. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/admiral/metrics.py +0 -0
  101. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/admiral/opus_escalator.py +0 -0
  102. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/admiral/persistence.py +0 -0
  103. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/admiral/policy.py +0 -0
  104. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/admiral/proposer.py +0 -0
  105. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/admiral/stager.py +0 -0
  106. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/admiral/task_classifier.py +0 -0
  107. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/admiral/tuning.py +0 -0
  108. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/admiral/validator.py +0 -0
  109. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/admiral/worker.py +0 -0
  110. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/__init__.py +0 -0
  111. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/autocompletion/__init__.py +0 -0
  112. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/autocompletion/base.py +0 -0
  113. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/autocompletion/path_completion.py +0 -0
  114. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/autocompletion/slash_command.py +0 -0
  115. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/cli.py +0 -0
  116. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/clipboard.py +0 -0
  117. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/commands.py +0 -0
  118. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/entrypoint.py +0 -0
  119. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/fix_windows_path.py +0 -0
  120. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/history_manager.py +0 -0
  121. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  122. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  123. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  124. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/terminal_setup.py +0 -0
  125. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/__init__.py +0 -0
  126. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  127. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/app.py +0 -0
  128. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/app.tcss +0 -0
  129. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/external_editor.py +0 -0
  130. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  131. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  132. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  133. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  134. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  135. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  136. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  137. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  138. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  139. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  140. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  141. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  142. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  143. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  144. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  145. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  146. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  147. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  148. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  149. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  150. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  151. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  152. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  153. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  154. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  155. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  156. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  157. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  158. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  159. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  160. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  161. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  162. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  163. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  164. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  165. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  166. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  167. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/windowing/history.py +0 -0
  168. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  169. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/textual_ui/windowing/state.py +0 -0
  170. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/update_notifier/__init__.py +0 -0
  171. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  172. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  173. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  174. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  175. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  176. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/update_notifier/update.py +0 -0
  177. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/cli/update_notifier/whats_new.py +0 -0
  178. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/__init__.py +0 -0
  179. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/agent_loop.py +0 -0
  180. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/agents/__init__.py +0 -0
  181. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/agents/manager.py +0 -0
  182. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/agents/models.py +0 -0
  183. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/auth/__init__.py +0 -0
  184. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/auth/crypto.py +0 -0
  185. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/auth/github.py +0 -0
  186. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/autocompletion/__init__.py +0 -0
  187. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/autocompletion/completers.py +0 -0
  188. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  189. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  190. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  191. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  192. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  193. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/autocompletion/fuzzy.py +0 -0
  194. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/autocompletion/path_prompt.py +0 -0
  195. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  196. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/build_orchestrator.py +0 -0
  197. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/checkpoint.py +0 -0
  198. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/classifier/__init__.py +0 -0
  199. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/classifier/__main__.py +0 -0
  200. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/classifier/classifier.py +0 -0
  201. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/classifier/dispatcher.py +0 -0
  202. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/classifier/rules.py +0 -0
  203. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/classifier/signal.py +0 -0
  204. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/config/__init__.py +0 -0
  205. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/config/_dotenv.py +0 -0
  206. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/config/_settings.py +0 -0
  207. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/config/doctor.py +0 -0
  208. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/config/harness_files/__init__.py +0 -0
  209. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  210. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/config/harness_files/_paths.py +0 -0
  211. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/config/local_detect.py +0 -0
  212. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/config/migrate.py +0 -0
  213. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/consultant.py +0 -0
  214. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/context_recovery.py +0 -0
  215. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/drydock_states.py +0 -0
  216. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/hooks.py +0 -0
  217. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/llm/__init__.py +0 -0
  218. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/llm/backend/anthropic.py +0 -0
  219. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/llm/backend/base.py +0 -0
  220. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/llm/backend/factory.py +0 -0
  221. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/llm/backend/generic.py +0 -0
  222. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/llm/backend/mistral.py +0 -0
  223. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  224. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/llm/backend/vertex.py +0 -0
  225. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/llm/exceptions.py +0 -0
  226. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/llm/format.py +0 -0
  227. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/llm/message_utils.py +0 -0
  228. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/llm/types.py +0 -0
  229. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/logger.py +0 -0
  230. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/middleware.py +0 -0
  231. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/output_formatters.py +0 -0
  232. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/paths/__init__.py +0 -0
  233. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/paths/_drydock_home.py +0 -0
  234. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/paths/_local_config_walk.py +0 -0
  235. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/paths/conventions.py +0 -0
  236. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/plan_session.py +0 -0
  237. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/plugins.py +0 -0
  238. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/programmatic.py +0 -0
  239. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/prompts/__init__.py +0 -0
  240. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/prompts/builder.md +0 -0
  241. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/prompts/cli.md +0 -0
  242. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/prompts/compact.md +0 -0
  243. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/prompts/dangerous_directory.md +0 -0
  244. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/prompts/diagnostic.md +0 -0
  245. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/prompts/explore.md +0 -0
  246. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/prompts/planner.md +0 -0
  247. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/prompts/project_context.md +0 -0
  248. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/prompts/tests.md +0 -0
  249. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/proxy_setup.py +0 -0
  250. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/session/agent_memory.py +0 -0
  251. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/session/checkpoints.py +0 -0
  252. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/session/session_loader.py +0 -0
  253. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/session/session_logger.py +0 -0
  254. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/session/session_migration.py +0 -0
  255. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/session/state_file.py +0 -0
  256. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/session_checker.py +0 -0
  257. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/skills/__init__.py +0 -0
  258. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/skills/manager.py +0 -0
  259. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/skills/models.py +0 -0
  260. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/skills/parser.py +0 -0
  261. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/slug.py +0 -0
  262. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/steering_hook.py +0 -0
  263. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/system_prompt.py +0 -0
  264. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/telemetry/__init__.py +0 -0
  265. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/telemetry/send.py +0 -0
  266. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/teleport/errors.py +0 -0
  267. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/teleport/git.py +0 -0
  268. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/teleport/nuage.py +0 -0
  269. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/teleport/teleport.py +0 -0
  270. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/teleport/types.py +0 -0
  271. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/base.py +0 -0
  272. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/_task_manager.py +0 -0
  273. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  274. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/bash.py +0 -0
  275. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/cron.py +0 -0
  276. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  277. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/glob_tool.py +0 -0
  278. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/grep.py +0 -0
  279. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  280. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/lsp.py +0 -0
  281. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  282. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/powershell.py +0 -0
  283. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  284. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  285. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  286. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  287. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  288. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  289. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  290. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  291. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  292. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  293. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  294. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  295. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
  296. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  297. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  298. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/task.md +0 -0
  299. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  300. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  301. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  302. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  303. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  304. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  305. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  306. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/read_file.py +0 -0
  307. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/retrieve.py +0 -0
  308. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/search_replace.py +0 -0
  309. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/task.py +0 -0
  310. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/todo.py +0 -0
  311. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/tool_search.py +0 -0
  312. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/webfetch.py +0 -0
  313. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/websearch.py +0 -0
  314. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/worktree.py +0 -0
  315. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/builtins/write_file.py +0 -0
  316. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/injection_guard.py +0 -0
  317. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/manager.py +0 -0
  318. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/mcp/__init__.py +0 -0
  319. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/mcp/registry.py +0 -0
  320. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/mcp/tools.py +0 -0
  321. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/mcp_sampling.py +0 -0
  322. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/ui.py +0 -0
  323. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/tools/utils.py +0 -0
  324. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/trusted_folders.py +0 -0
  325. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/types.py +0 -0
  326. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/core/utils.py +0 -0
  327. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/curiosity/__init__.py +0 -0
  328. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/curiosity/__main__.py +0 -0
  329. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/curiosity/gap_detector.py +0 -0
  330. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/curiosity/item.py +0 -0
  331. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/curiosity/queue.py +0 -0
  332. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/curiosity/surprise.py +0 -0
  333. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/graphrag/__init__.py +0 -0
  334. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/graphrag/__main__.py +0 -0
  335. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/graphrag/code_indexer.py +0 -0
  336. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/graphrag/retriever.py +0 -0
  337. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/graphrag/storage.py +0 -0
  338. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/graphrag/text_indexer.py +0 -0
  339. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/setup/onboarding/__init__.py +0 -0
  340. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/setup/onboarding/base.py +0 -0
  341. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/setup/onboarding/onboarding.tcss +0 -0
  342. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/setup/onboarding/screens/__init__.py +0 -0
  343. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/setup/onboarding/screens/api_key.py +0 -0
  344. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/setup/onboarding/screens/choice.py +0 -0
  345. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/setup/onboarding/screens/local_model.py +0 -0
  346. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/setup/onboarding/screens/welcome.py +0 -0
  347. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  348. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  349. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/__init__.py +0 -0
  350. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/api-design/SKILL.md +0 -0
  351. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/audit-tests/SKILL.md +0 -0
  352. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/batch/SKILL.md +0 -0
  353. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/commit-code/SKILL.md +0 -0
  354. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/context-summary/SKILL.md +0 -0
  355. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/create-presentation/SKILL.md +0 -0
  356. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/deep-research/SKILL.md +0 -0
  357. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/deploy/SKILL.md +0 -0
  358. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/diff-review/SKILL.md +0 -0
  359. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/doc-gen/SKILL.md +0 -0
  360. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/explain-code/SKILL.md +0 -0
  361. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/explore-code/SKILL.md +0 -0
  362. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/fix-issue/SKILL.md +0 -0
  363. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/git-ops/SKILL.md +0 -0
  364. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/init-project/SKILL.md +0 -0
  365. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/investigate/SKILL.md +0 -0
  366. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/loop/SKILL.md +0 -0
  367. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/migrate/SKILL.md +0 -0
  368. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/perf-analyze/SKILL.md +0 -0
  369. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/plan-impl/SKILL.md +0 -0
  370. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/pr-review/SKILL.md +0 -0
  371. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/refactor/SKILL.md +0 -0
  372. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/regex-help/SKILL.md +0 -0
  373. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/review/SKILL.md +0 -0
  374. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/security-review/SKILL.md +0 -0
  375. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/ship/SKILL.md +0 -0
  376. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/simplify/SKILL.md +0 -0
  377. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/strong-tests/SKILL.md +0 -0
  378. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/skills/test-verify/SKILL.md +0 -0
  379. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/steering/__init__.py +0 -0
  380. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/steering/__main__.py +0 -0
  381. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/steering/applier.py +0 -0
  382. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/steering/config.py +0 -0
  383. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/steering/registry.py +0 -0
  384. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/steering/sandbox.py +0 -0
  385. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/steering/sidecar/__init__.py +0 -0
  386. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/steering/sidecar/header_parser.py +0 -0
  387. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/steering/sidecar/hooks.py +0 -0
  388. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/steering/sidecar/loader.py +0 -0
  389. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/steering/sidecar/server.py +0 -0
  390. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/steering/train/__init__.py +0 -0
  391. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/steering/train/capture.py +0 -0
  392. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/steering/train/compute_vector.py +0 -0
  393. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/steering/train/extract_pairs.py +0 -0
  394. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/steering/vectors.py +0 -0
  395. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock/whats_new.md +0 -0
  396. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/drydock-acp.spec +0 -0
  397. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/flake.lock +0 -0
  398. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/flake.nix +0 -0
  399. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/outlook_draft_assistant.tar.gz +0 -0
  400. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/research/README.md +0 -0
  401. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/research/config_base.toml +0 -0
  402. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/research/config_best.toml +0 -0
  403. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/research/domain_spec.md +0 -0
  404. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/research/experimenter.py +0 -0
  405. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/research/kernel.py +0 -0
  406. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/research/mini_prd.md +0 -0
  407. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/research/mini_prompts.txt +0 -0
  408. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/research/proposer.py +0 -0
  409. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/research/results.tsv +0 -0
  410. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/README.md +0 -0
  411. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/admiral_probe.py +0 -0
  412. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/archive/auto_test_loop.sh +0 -0
  413. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/archive/monitor_test_battery.sh +0 -0
  414. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/archive/overnight_agents_test.sh +0 -0
  415. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/archive/test_bank.sh +0 -0
  416. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/archive/test_full.sh +0 -0
  417. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/archive/test_smoke.sh +0 -0
  418. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/archive/tui_test.py +0 -0
  419. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/audit_sampler.py +0 -0
  420. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/auto_generate_tests.py +0 -0
  421. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/auto_release.sh +0 -0
  422. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/autonomous_review.sh +0 -0
  423. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/autonomous_review_prompt.md +0 -0
  424. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/backfill_hle_curiosity.py +0 -0
  425. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/backup.sh +0 -0
  426. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/bump_version.py +0 -0
  427. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/classify_pulse.sh +0 -0
  428. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/consume_retrieval_queue.py +0 -0
  429. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/curiosity_idle_cycle.sh +0 -0
  430. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/fetch_arxiv_abstracts.py +0 -0
  431. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/gen_2000_prompts.py +0 -0
  432. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/hle_eval.py +0 -0
  433. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/hle_eval_seed.jsonl +0 -0
  434. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/llm_balancer.py +0 -0
  435. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/notify_release.py +0 -0
  436. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/perf_baseline_when_idle.sh +0 -0
  437. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/perf_sweep.py +0 -0
  438. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/poll_issues.sh +0 -0
  439. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/publish_to_pypi.sh +0 -0
  440. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/queue_top.py +0 -0
  441. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/ralph_loop.py +0 -0
  442. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/research_babysitter.sh +0 -0
  443. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/shakedown.py +0 -0
  444. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/shakedown_interactive.py +0 -0
  445. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/shakedown_suite.sh +0 -0
  446. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/shakedown_variance.sh +0 -0
  447. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/start_steering_sidecar.sh +0 -0
  448. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/stress_babysitter.sh +0 -0
  449. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/stress_prompts_50.txt +0 -0
  450. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/stress_prompts_realuser.txt +0 -0
  451. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/stress_prompts_tool_agent.txt +0 -0
  452. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  453. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/stress_shakedown.py +0 -0
  454. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/stress_telegram_status.py +0 -0
  455. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/stress_watcher.py +0 -0
  456. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/telegram_bot.py +0 -0
  457. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/scripts/vllm_failover.sh +0 -0
  458. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/__init__.py +0 -0
  459. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/conftest.py +0 -0
  460. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/test_acp.py +0 -0
  461. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/test_agent_thought.py +0 -0
  462. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/test_bash.py +0 -0
  463. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/test_compact_session_updates.py +0 -0
  464. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/test_content.py +0 -0
  465. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/test_initialize.py +0 -0
  466. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/test_list_sessions.py +0 -0
  467. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/test_load_session.py +0 -0
  468. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/test_multi_session.py +0 -0
  469. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/test_new_session.py +0 -0
  470. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/test_proxy_setup_acp.py +0 -0
  471. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/test_read_file.py +0 -0
  472. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/test_search_replace.py +0 -0
  473. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/test_set_config_option.py +0 -0
  474. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/test_set_mode.py +0 -0
  475. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/test_set_model.py +0 -0
  476. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/test_tool_call_session_update.py +0 -0
  477. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/test_utils.py +0 -0
  478. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/acp/test_write_file.py +0 -0
  479. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/autocompletion/test_file_indexer.py +0 -0
  480. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/autocompletion/test_fuzzy.py +0 -0
  481. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  482. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  483. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/autocompletion/test_path_completion_controller.py +0 -0
  484. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  485. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/autocompletion/test_slash_command_controller.py +0 -0
  486. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  487. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/backend/__init__.py +0 -0
  488. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/backend/data/__init__.py +0 -0
  489. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/backend/data/fireworks.py +0 -0
  490. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/backend/data/mistral.py +0 -0
  491. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/backend/test_anthropic_adapter.py +0 -0
  492. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/backend/test_backend.py +0 -0
  493. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  494. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/backend/test_reasoning_adapter.py +0 -0
  495. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  496. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  497. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  498. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  499. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/cli/test_bell_notifications.py +0 -0
  500. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/cli/test_braille_renderer.py +0 -0
  501. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/cli/test_clipboard.py +0 -0
  502. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/cli/test_commands.py +0 -0
  503. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/cli/test_copy_shortcuts.py +0 -0
  504. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/cli/test_external_editor.py +0 -0
  505. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/cli/test_no_markup_static.py +0 -0
  506. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/cli/test_question_app.py +0 -0
  507. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/cli/test_spinner.py +0 -0
  508. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/cli/test_switching_mode.py +0 -0
  509. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  510. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  511. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/cli/test_ui_session_resume.py +0 -0
  512. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/cli/test_ui_skill_dispatch.py +0 -0
  513. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/cli/textual_ui/__init__.py +0 -0
  514. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/cli/textual_ui/test_session_picker.py +0 -0
  515. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/conftest.py +0 -0
  516. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/core/test_agents.py +0 -0
  517. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/core/test_auth_crypto.py +0 -0
  518. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/core/test_auth_github.py +0 -0
  519. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  520. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  521. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/core/test_config_load_dotenv.py +0 -0
  522. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/core/test_config_paths.py +0 -0
  523. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/core/test_config_resolution.py +0 -0
  524. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/core/test_file_logging.py +0 -0
  525. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/core/test_plan_session.py +0 -0
  526. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/core/test_proxy_setup.py +0 -0
  527. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/core/test_slug.py +0 -0
  528. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/core/test_telemetry_send.py +0 -0
  529. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/core/test_teleport_git.py +0 -0
  530. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/core/test_teleport_nuage.py +0 -0
  531. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/core/test_teleport_service.py +0 -0
  532. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/core/test_trusted_folders.py +0 -0
  533. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/core/test_utils.py +0 -0
  534. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/e2e/common.py +0 -0
  535. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/e2e/conftest.py +0 -0
  536. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/e2e/mock_server.py +0 -0
  537. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  538. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/e2e/test_cli_tui_streaming.py +0 -0
  539. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  540. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/fixtures/doc_qa_system_prd.md +0 -0
  541. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/mock/__init__.py +0 -0
  542. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/mock/mock_backend_factory.py +0 -0
  543. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/mock/mock_entrypoint.py +0 -0
  544. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/mock/utils.py +0 -0
  545. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/onboarding/test_run_onboarding.py +0 -0
  546. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/onboarding/test_ui_onboarding.py +0 -0
  547. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/session/test_session_loader.py +0 -0
  548. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/session/test_session_logger.py +0 -0
  549. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/session/test_session_migration.py +0 -0
  550. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/skills/conftest.py +0 -0
  551. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/skills/test_manager.py +0 -0
  552. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/skills/test_models.py +0 -0
  553. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/skills/test_parser.py +0 -0
  554. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  555. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  556. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  557. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  558. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  559. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  560. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  561. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  562. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  563. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  564. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  565. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  566. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  567. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  568. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  569. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  570. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  571. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  572. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  573. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  574. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  575. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  576. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  577. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  578. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  579. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  580. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  581. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  582. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  583. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  584. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  585. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  586. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  587. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  588. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  589. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  590. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  591. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  592. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  593. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  594. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  595. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  596. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  597. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  598. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  599. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  600. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  601. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  602. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  603. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  604. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  605. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  606. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  607. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  608. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  609. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  610. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  611. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  612. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  613. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  614. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/base_snapshot_test_app.py +0 -0
  615. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/conftest.py +0 -0
  616. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/snap_compare.py +0 -0
  617. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  618. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  619. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  620. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  621. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  622. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  623. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  624. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  625. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  626. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  627. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  628. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  629. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  630. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  631. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/stubs/fake_backend.py +0 -0
  632. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/stubs/fake_client.py +0 -0
  633. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/stubs/fake_tool.py +0 -0
  634. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_admiral.py +0 -0
  635. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
  636. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_admiral_intervention_outcome.py +0 -0
  637. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_admiral_phase3.py +0 -0
  638. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_admiral_proposed.py +0 -0
  639. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_admiral_session_id.py +0 -0
  640. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_admiral_struggle_dedup.py +0 -0
  641. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_agent_auto_compact.py +0 -0
  642. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_agent_backend.py +0 -0
  643. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_agent_observer_streaming.py +0 -0
  644. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_agent_stats.py +0 -0
  645. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_agent_tasks.py +0 -0
  646. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_agent_tool_call.py +0 -0
  647. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_agents.py +0 -0
  648. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_bank_build.py +0 -0
  649. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_bank_debug.py +0 -0
  650. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_bank_multiagent.py +0 -0
  651. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_bank_prd.py +0 -0
  652. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_bank_prd_extended.py +0 -0
  653. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_bank_tools.py +0 -0
  654. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_bank_update.py +0 -0
  655. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_build_projects.py +0 -0
  656. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_checkpoint.py +0 -0
  657. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_classifier.py +0 -0
  658. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_cli_programmatic_preload.py +0 -0
  659. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_config_migration.py +0 -0
  660. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_context_recovery.py +0 -0
  661. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_curiosity.py +0 -0
  662. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_current_bugs.py +0 -0
  663. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_dispatcher.py +0 -0
  664. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_drydock_regression.py +0 -0
  665. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_drydock_tasks.py +0 -0
  666. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  667. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_full_regression.py +0 -0
  668. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_graphrag.py +0 -0
  669. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_graphrag_worked_examples.py +0 -0
  670. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_hallucinated_tool_suppression.py +0 -0
  671. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_history_manager.py +0 -0
  672. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_hle_typing.py +0 -0
  673. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_integration.py +0 -0
  674. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_issue_fixes.py +0 -0
  675. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_local_detect.py +0 -0
  676. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_loop_detection.py +0 -0
  677. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_message_id.py +0 -0
  678. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_message_merging.py +0 -0
  679. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_middleware.py +0 -0
  680. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_multi_agent.py +0 -0
  681. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_read_file_not_found_listing.py +0 -0
  682. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_real_failures.py +0 -0
  683. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_real_issues.py +0 -0
  684. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_real_workflow.py +0 -0
  685. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_reasoning_content.py +0 -0
  686. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_retrieval_consumer.py +0 -0
  687. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_retrieve_tool.py +0 -0
  688. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_search_replace_args_not_truncated.py +0 -0
  689. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_smoke.py +0 -0
  690. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_steering.py +0 -0
  691. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_steering_capture.py +0 -0
  692. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_steering_compute_vector.py +0 -0
  693. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_steering_extract_pairs.py +0 -0
  694. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_steering_hook.py +0 -0
  695. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_steering_sidecar_hooks.py +0 -0
  696. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_system_prompt.py +0 -0
  697. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_tagged_text.py +0 -0
  698. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_task_complete_nudge.py +0 -0
  699. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_tool_args.py +0 -0
  700. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_truncate_args_valid_json.py +0 -0
  701. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_truncated_arg_path_hint.py +0 -0
  702. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_truncated_search_replace_escalation.py +0 -0
  703. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_truncated_write_escalation.py +0 -0
  704. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_ui_external_editor.py +0 -0
  705. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_ui_input_history.py +0 -0
  706. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_user_issues.py +0 -0
  707. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_wall_of_text_rescue.py +0 -0
  708. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_workloads.py +0 -0
  709. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/test_write_file_missing_path.py +0 -0
  710. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/testbank_helpers.py +0 -0
  711. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_ask_user_question.py +0 -0
  712. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_bash.py +0 -0
  713. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_bash_binary_grep_hint.py +0 -0
  714. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_bash_consec_empty_search.py +0 -0
  715. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
  716. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
  717. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_bash_error_loop_breaker.py +0 -0
  718. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
  719. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
  720. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
  721. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
  722. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_exit_plan_mode.py +0 -0
  723. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_grep.py +0 -0
  724. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
  725. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_invoke_context.py +0 -0
  726. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  727. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_manager_get_tool_config.py +0 -0
  728. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_mcp.py +0 -0
  729. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_mcp_sampling.py +0 -0
  730. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
  731. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  732. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_read_file_directory.py +0 -0
  733. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_read_file_limit_truncation.py +0 -0
  734. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_search_replace_append_fallback.py +0 -0
  735. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_search_replace_dir_path.py +0 -0
  736. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_search_replace_empty_content.py +0 -0
  737. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_search_replace_file_not_found.py +0 -0
  738. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
  739. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_search_replace_hard_stop.py +0 -0
  740. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_search_replace_malformed_block.py +0 -0
  741. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  742. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_search_replace_placeholder.py +0 -0
  743. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  744. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_task.py +0 -0
  745. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_ui_bash_execution.py +0 -0
  746. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_webfetch.py +0 -0
  747. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_websearch.py +0 -0
  748. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  749. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  750. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  751. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  752. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/update_notifier/test_do_update.py +0 -0
  753. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  754. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/update_notifier/test_github_update_gateway.py +0 -0
  755. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  756. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/update_notifier/test_ui_update_notification.py +0 -0
  757. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/update_notifier/test_update_use_case.py +0 -0
  758. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/tests/update_notifier/test_whats_new.py +0 -0
  759. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/worked_examples/README.md +0 -0
  760. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/worked_examples/cli_subcommand_dispatch.py +0 -0
  761. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/worked_examples/lookup.json +0 -0
  762. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/worked_examples/sql_parser.py +0 -0
  763. {drydock_cli-2.8.20 → drydock_cli-2.8.22}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 996304
@@ -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.20
3
+ Version: 2.8.22
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
@@ -378,6 +378,81 @@ DryDock discovers skills from:
378
378
  3. Global `~/.drydock/skills/`
379
379
  4. Bundled skills (shipped with the package)
380
380
 
381
+ ### Math Tool
382
+
383
+ 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.
384
+
385
+ ```
386
+ math(expression="math.factorial(20)") # 2432902008176640000 — exact
387
+ math(expression="math.comb(50, 5)") # 2118760
388
+ math(expression="math.gcd(48, 18)") # 6
389
+ math(expression="statistics.stdev([2,4,4,4,5,5,7,9])")
390
+ math(expression="Fraction(1,3) + Fraction(1,6)") # exact 1/2
391
+ math(expression="Decimal('0.1') + Decimal('0.2')") # exact 0.3
392
+ math(expression="round(math.pi, 12)")
393
+ math(expression="sum(range(1, 101))") # 5050
394
+ ```
395
+
396
+ 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.
397
+
398
+ Always auto-approved (read-only, side-effect free). Errors return a structured `{ok: false, error: "..."}` instead of raising.
399
+
400
+ ### Custom Tools
401
+
402
+ Add your own built-in tools by dropping a file into one of these locations:
403
+
404
+ - **Project-local:** any path listed in `config.toml`'s `tool_paths` array
405
+ - **Global:** `~/.drydock/tools/`
406
+ - **Bundled:** `drydock/core/tools/builtins/` (forks only)
407
+
408
+ 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`).
409
+
410
+ Minimum viable tool:
411
+
412
+ ```python
413
+ # ~/.drydock/tools/word_count.py
414
+ from collections.abc import AsyncGenerator
415
+ from typing import ClassVar, final
416
+ from pydantic import BaseModel, Field
417
+ from drydock.core.tools.base import (
418
+ BaseTool, BaseToolConfig, BaseToolState, InvokeContext, ToolPermission,
419
+ )
420
+ from drydock.core.tools.ui import ToolCallDisplay, ToolResultDisplay, ToolUIData
421
+ from drydock.core.types import ToolStreamEvent
422
+
423
+ class WordCountArgs(BaseModel):
424
+ text: str = Field(description="Text to count words in")
425
+
426
+ class WordCountResult(BaseModel):
427
+ count: int
428
+
429
+ class WordCountConfig(BaseToolConfig):
430
+ permission: ToolPermission = ToolPermission.ALWAYS
431
+
432
+ class WordCount(
433
+ BaseTool[WordCountArgs, WordCountResult, WordCountConfig, BaseToolState],
434
+ ToolUIData[WordCountArgs, WordCountResult],
435
+ ):
436
+ description: ClassVar[str] = "Count words in a string."
437
+
438
+ @classmethod
439
+ def format_call_display(cls, args): return ToolCallDisplay(summary=f"count: {args.text[:30]}")
440
+ @classmethod
441
+ def get_result_display(cls, event): return ToolResultDisplay(success=True, message=f"{event.result.count} words")
442
+ @classmethod
443
+ def get_status_text(cls): return "Counting"
444
+ def resolve_permission(self, args): return ToolPermission.ALWAYS
445
+
446
+ @final
447
+ async def run(self, args: WordCountArgs, ctx: InvokeContext | None = None
448
+ ) -> AsyncGenerator[ToolStreamEvent | WordCountResult, None]:
449
+ yield WordCountResult(count=len(args.text.split()))
450
+ ```
451
+
452
+ Restart drydock; the model now sees `word_count` in its tool list.
453
+
454
+ 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.
455
+
381
456
  ### MCP Servers
382
457
 
383
458
  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,81 @@ DryDock discovers skills from:
323
323
  3. Global `~/.drydock/skills/`
324
324
  4. Bundled skills (shipped with the package)
325
325
 
326
+ ### Math Tool
327
+
328
+ 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.
329
+
330
+ ```
331
+ math(expression="math.factorial(20)") # 2432902008176640000 — exact
332
+ math(expression="math.comb(50, 5)") # 2118760
333
+ math(expression="math.gcd(48, 18)") # 6
334
+ math(expression="statistics.stdev([2,4,4,4,5,5,7,9])")
335
+ math(expression="Fraction(1,3) + Fraction(1,6)") # exact 1/2
336
+ math(expression="Decimal('0.1') + Decimal('0.2')") # exact 0.3
337
+ math(expression="round(math.pi, 12)")
338
+ math(expression="sum(range(1, 101))") # 5050
339
+ ```
340
+
341
+ 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.
342
+
343
+ Always auto-approved (read-only, side-effect free). Errors return a structured `{ok: false, error: "..."}` instead of raising.
344
+
345
+ ### Custom Tools
346
+
347
+ Add your own built-in tools by dropping a file into one of these locations:
348
+
349
+ - **Project-local:** any path listed in `config.toml`'s `tool_paths` array
350
+ - **Global:** `~/.drydock/tools/`
351
+ - **Bundled:** `drydock/core/tools/builtins/` (forks only)
352
+
353
+ 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`).
354
+
355
+ Minimum viable tool:
356
+
357
+ ```python
358
+ # ~/.drydock/tools/word_count.py
359
+ from collections.abc import AsyncGenerator
360
+ from typing import ClassVar, final
361
+ from pydantic import BaseModel, Field
362
+ from drydock.core.tools.base import (
363
+ BaseTool, BaseToolConfig, BaseToolState, InvokeContext, ToolPermission,
364
+ )
365
+ from drydock.core.tools.ui import ToolCallDisplay, ToolResultDisplay, ToolUIData
366
+ from drydock.core.types import ToolStreamEvent
367
+
368
+ class WordCountArgs(BaseModel):
369
+ text: str = Field(description="Text to count words in")
370
+
371
+ class WordCountResult(BaseModel):
372
+ count: int
373
+
374
+ class WordCountConfig(BaseToolConfig):
375
+ permission: ToolPermission = ToolPermission.ALWAYS
376
+
377
+ class WordCount(
378
+ BaseTool[WordCountArgs, WordCountResult, WordCountConfig, BaseToolState],
379
+ ToolUIData[WordCountArgs, WordCountResult],
380
+ ):
381
+ description: ClassVar[str] = "Count words in a string."
382
+
383
+ @classmethod
384
+ def format_call_display(cls, args): return ToolCallDisplay(summary=f"count: {args.text[:30]}")
385
+ @classmethod
386
+ def get_result_display(cls, event): return ToolResultDisplay(success=True, message=f"{event.result.count} words")
387
+ @classmethod
388
+ def get_status_text(cls): return "Counting"
389
+ def resolve_permission(self, args): return ToolPermission.ALWAYS
390
+
391
+ @final
392
+ async def run(self, args: WordCountArgs, ctx: InvokeContext | None = None
393
+ ) -> AsyncGenerator[ToolStreamEvent | WordCountResult, None]:
394
+ yield WordCountResult(count=len(args.text.split()))
395
+ ```
396
+
397
+ Restart drydock; the model now sees `word_count` in its tool list.
398
+
399
+ 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.
400
+
326
401
  ### MCP Servers
327
402
 
328
403
  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,248 @@
1
+ """Math tool — exact arithmetic, statistics, and number theory via the
2
+ Python stdlib, exposed as a single direct built-in (NOT an MCP server).
3
+
4
+ Why a built-in instead of MCP:
5
+
6
+ - MCP servers add a protocol layer + subprocess and burn ~20K context tokens
7
+ every call (Babich, "MCP is Dead", Apr 2026). For a small bandwidth-limited
8
+ local model like Gemma 4 (131K context) that's a real cost.
9
+ - A direct built-in has tight, schema-enforced inputs (Pydantic), zero IPC,
10
+ and cannot be hijacked by injected instructions the way a tool-rich MCP
11
+ server can.
12
+ - The operations the model actually wants — factorial, prime test,
13
+ statistics, exact fractions, large multiplies — are all stdlib and
14
+ compose cleanly into a single safe expression evaluator.
15
+
16
+ The interface is deliberately ONE input: a Python-style expression evaluated
17
+ in a sandbox (math.*, statistics.*, Fraction, Decimal, basic operators,
18
+ no imports, no attribute access outside the whitelist). This keeps the tool
19
+ list small (one entry, not twenty) and lets the model express any computation
20
+ it might want without us having to enumerate every operation.
21
+
22
+ Examples the model can call:
23
+
24
+ math(expression="2 + 3 * 4")
25
+ math(expression="math.factorial(20)")
26
+ math(expression="math.comb(50, 5)")
27
+ math(expression="math.gcd(48, 18)")
28
+ math(expression="statistics.mean([1, 2, 3, 4, 5])")
29
+ math(expression="statistics.stdev([2, 4, 4, 4, 5, 5, 7, 9])")
30
+ math(expression="Fraction(1, 3) + Fraction(1, 6)")
31
+ math(expression="round(math.pi, 8)")
32
+ math(expression="sum(range(1, 101))") # 5050
33
+
34
+ Read-only, side-effect free, always auto-approved.
35
+ """
36
+ from __future__ import annotations
37
+
38
+ import ast
39
+ import math
40
+ import statistics
41
+ from collections.abc import AsyncGenerator
42
+ from decimal import Decimal, getcontext
43
+ from fractions import Fraction
44
+ from typing import TYPE_CHECKING, Any, ClassVar, final
45
+
46
+ from pydantic import BaseModel, Field
47
+
48
+ from drydock.core.tools.base import (
49
+ BaseTool,
50
+ BaseToolConfig,
51
+ BaseToolState,
52
+ InvokeContext,
53
+ ToolPermission,
54
+ )
55
+ from drydock.core.tools.ui import ToolCallDisplay, ToolResultDisplay, ToolUIData
56
+ from drydock.core.types import ToolStreamEvent
57
+
58
+ if TYPE_CHECKING:
59
+ from drydock.core.types import ToolResultEvent
60
+
61
+
62
+ # ── Safe expression evaluator ─────────────────────────────────────────
63
+ # Whitelist nodes + names so the model can't import os / open files /
64
+ # subprocess. Everything goes through `math.*`, `statistics.*`,
65
+ # `Fraction`, `Decimal` plus basic operators and a small builtins set.
66
+
67
+ _ALLOWED_NODES = {
68
+ ast.Expression, ast.Constant,
69
+ ast.BinOp, ast.UnaryOp, ast.BoolOp, ast.Compare,
70
+ ast.Add, ast.Sub, ast.Mult, ast.Div, ast.FloorDiv, ast.Mod, ast.Pow,
71
+ ast.USub, ast.UAdd, ast.And, ast.Or, ast.Not,
72
+ ast.Eq, ast.NotEq, ast.Lt, ast.LtE, ast.Gt, ast.GtE,
73
+ ast.Call, ast.Name, ast.Load, ast.Attribute,
74
+ ast.Tuple, ast.List, ast.Subscript, ast.Slice, ast.Index,
75
+ }
76
+
77
+ _ALLOWED_NAMES: dict[str, Any] = {
78
+ "pi": math.pi,
79
+ "e": math.e,
80
+ "tau": math.tau,
81
+ "inf": math.inf,
82
+ "nan": math.nan,
83
+ "abs": abs, "round": round, "min": min, "max": max, "sum": sum,
84
+ "len": len, "pow": pow, "divmod": divmod,
85
+ "int": int, "float": float, "bool": bool, "complex": complex,
86
+ "list": list, "tuple": tuple, "range": range,
87
+ "math": math,
88
+ "statistics": statistics,
89
+ "Fraction": Fraction,
90
+ "Decimal": Decimal,
91
+ }
92
+
93
+ _MAX_EXPR_LEN = 4000
94
+
95
+
96
+ def _validate_ast(node: ast.AST) -> None:
97
+ for child in ast.walk(node):
98
+ if type(child) not in _ALLOWED_NODES:
99
+ raise ValueError(
100
+ f"disallowed expression node: {type(child).__name__}"
101
+ )
102
+ if isinstance(child, ast.Attribute):
103
+ if not (
104
+ isinstance(child.value, ast.Name)
105
+ and child.value.id in {"math", "statistics", "Fraction", "Decimal"}
106
+ ):
107
+ raise ValueError(
108
+ "attribute access only allowed on math, statistics, "
109
+ "Fraction, Decimal"
110
+ )
111
+ if isinstance(child, ast.Name) and child.id not in _ALLOWED_NAMES:
112
+ raise ValueError(f"disallowed name: {child.id}")
113
+
114
+
115
+ def safe_eval(expression: str) -> Any:
116
+ """Evaluate `expression` in a sandboxed environment.
117
+
118
+ Raises ValueError on anything beyond arithmetic + math/statistics +
119
+ Fraction/Decimal. Callers should catch and surface the error string
120
+ rather than re-raising — see `MathTool.run`.
121
+ """
122
+ if len(expression) > _MAX_EXPR_LEN:
123
+ raise ValueError(
124
+ f"expression too long ({len(expression)} > {_MAX_EXPR_LEN})"
125
+ )
126
+ tree = ast.parse(expression, mode="eval")
127
+ _validate_ast(tree)
128
+ return eval( # noqa: S307 — sandboxed via _validate_ast
129
+ compile(tree, "<safe_eval>", "eval"),
130
+ {"__builtins__": {}},
131
+ _ALLOWED_NAMES,
132
+ )
133
+
134
+
135
+ # ── Tool ───────────────────────────────────────────────────────────────
136
+
137
+
138
+ class MathArgs(BaseModel):
139
+ expression: str = Field(
140
+ description=(
141
+ "A Python expression to evaluate. Whitelist: arithmetic operators "
142
+ "(+ - * / // % **), comparisons, and/or/not, abs/round/min/max/"
143
+ "sum/len/pow/divmod/range/int/float/bool, the math module "
144
+ "(math.factorial, math.gcd, math.comb, math.sqrt, etc.), the "
145
+ "statistics module (statistics.mean, statistics.stdev, ...), "
146
+ "Fraction(num, den), Decimal('...'). Constants: pi, e, tau, "
147
+ "inf, nan. NO imports, NO open(), NO file/network access, NO "
148
+ "attribute access outside math/statistics/Fraction/Decimal."
149
+ )
150
+ )
151
+ decimal_precision: int = Field(
152
+ default=28,
153
+ ge=1,
154
+ le=200,
155
+ description=(
156
+ "Decimal context precision (digits). Only matters when the "
157
+ "expression uses `Decimal(...)`. Default 28."
158
+ ),
159
+ )
160
+
161
+
162
+ class MathResult(BaseModel):
163
+ ok: bool
164
+ result: str = "" # str so Fraction/Decimal/int-precision survive JSON
165
+ result_type: str = "" # "int" / "float" / "Fraction" / "Decimal" / "list" / etc.
166
+ error: str = ""
167
+
168
+
169
+ class MathConfig(BaseToolConfig):
170
+ permission: ToolPermission = ToolPermission.ALWAYS
171
+
172
+
173
+ class Math(
174
+ BaseTool[MathArgs, MathResult, MathConfig, BaseToolState],
175
+ ToolUIData[MathArgs, MathResult],
176
+ ):
177
+ description: ClassVar[str] = (
178
+ "Evaluate exact-math expressions via Python's stdlib (math, "
179
+ "statistics, Fraction, Decimal). Use INSTEAD of doing arithmetic "
180
+ "in your head when the answer needs to be exact: factorials "
181
+ "above 12!, large multiplies, prime tests, modular arithmetic, "
182
+ "GCD/LCM, statistics, exact fractions. One arg: `expression`. "
183
+ "Examples: math.factorial(20), math.comb(50, 5), "
184
+ "statistics.mean([1,2,3]), Fraction(1,3) + Fraction(1,6). "
185
+ "Sandboxed — no imports, no file/network access."
186
+ )
187
+
188
+ @classmethod
189
+ def format_call_display(cls, args: MathArgs) -> ToolCallDisplay:
190
+ e = args.expression.strip()
191
+ if len(e) > 60:
192
+ e = e[:57] + "..."
193
+ return ToolCallDisplay(summary=f"math: {e}")
194
+
195
+ @classmethod
196
+ def get_result_display(cls, event: "ToolResultEvent") -> ToolResultDisplay:
197
+ if isinstance(event.result, MathResult):
198
+ if not event.result.ok:
199
+ return ToolResultDisplay(
200
+ success=False,
201
+ message=f"math: {event.result.error[:80]}",
202
+ )
203
+ preview = event.result.result
204
+ if len(preview) > 80:
205
+ preview = preview[:77] + "..."
206
+ return ToolResultDisplay(success=True, message=f"= {preview}")
207
+ return ToolResultDisplay(success=True, message="math complete")
208
+
209
+ @classmethod
210
+ def get_status_text(cls) -> str:
211
+ return "Computing"
212
+
213
+ def resolve_permission(self, args: MathArgs) -> ToolPermission | None:
214
+ return ToolPermission.ALWAYS
215
+
216
+ @final
217
+ async def run(
218
+ self, args: MathArgs, ctx: InvokeContext | None = None
219
+ ) -> AsyncGenerator[ToolStreamEvent | MathResult, None]:
220
+ if args.decimal_precision and args.decimal_precision != 28:
221
+ getcontext().prec = args.decimal_precision
222
+ try:
223
+ value = safe_eval(args.expression)
224
+ except SyntaxError as e:
225
+ yield MathResult(
226
+ ok=False, error=f"SyntaxError: {e.msg} at column {e.offset or '?'}"
227
+ )
228
+ return
229
+ except ZeroDivisionError as e:
230
+ yield MathResult(ok=False, error=f"ZeroDivisionError: {e}")
231
+ return
232
+ except (ValueError, OverflowError, ArithmeticError, TypeError) as e:
233
+ yield MathResult(ok=False, error=f"{type(e).__name__}: {e}")
234
+ return
235
+
236
+ # Coerce non-JSON-friendly values to strings without losing exactness.
237
+ if isinstance(value, (Fraction, Decimal)):
238
+ yield MathResult(
239
+ ok=True, result=str(value), result_type=type(value).__name__
240
+ )
241
+ return
242
+ # Plain numbers / lists / tuples / bools — repr keeps int precision
243
+ # for huge factorials etc.
244
+ yield MathResult(
245
+ ok=True,
246
+ result=repr(value) if not isinstance(value, str) else value,
247
+ result_type=type(value).__name__,
248
+ )
@@ -83,13 +83,13 @@ class ListMcpResources(
83
83
  tasks.append(list_resources_http(
84
84
  srv.url,
85
85
  headers=srv.headers,
86
- startup_timeout_sec=srv.startup_timeout_seconds,
86
+ startup_timeout_sec=srv.startup_timeout_sec,
87
87
  ))
88
88
  elif isinstance(srv, MCPStdio):
89
89
  tasks.append(list_resources_stdio(
90
90
  srv.command,
91
91
  env=srv.env,
92
- startup_timeout_sec=srv.startup_timeout_seconds,
92
+ startup_timeout_sec=srv.startup_timeout_sec,
93
93
  ))
94
94
 
95
95
  if tasks:
@@ -167,13 +167,13 @@ class ReadMcpResource(
167
167
  content = await read_resource_http(
168
168
  srv.url, args.uri,
169
169
  headers=srv.headers,
170
- startup_timeout_sec=srv.startup_timeout_seconds,
170
+ startup_timeout_sec=srv.startup_timeout_sec,
171
171
  )
172
172
  elif isinstance(srv, MCPStdio):
173
173
  content = await read_resource_stdio(
174
174
  srv.command, args.uri,
175
175
  env=srv.env,
176
- startup_timeout_sec=srv.startup_timeout_seconds,
176
+ startup_timeout_sec=srv.startup_timeout_sec,
177
177
  )
178
178
  else:
179
179
  continue
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.8.20"
3
+ version = "2.8.22"
4
4
  description = "Local-first CLI coding agent — tested with Gemma 4 26B via vLLM"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -41,7 +41,7 @@ AUTH_URL="https://${GITHUB_TOKEN}@github.com/fbobe321/drydock.git"
41
41
  log "Running regression tests..."
42
42
  cd "$DRYDOCK_SRC"
43
43
  $PYTHON -m pip install -q "pytest>=9.0" 2>/dev/null
44
- if ! $PYTHON -m pytest tests/test_drydock_regression.py tests/test_drydock_tasks.py tests/test_loop_detection.py tests/test_curiosity.py tests/test_agent_tasks.py tests/test_integration.py tests/test_user_issues.py tests/test_real_issues.py \
44
+ if ! $PYTHON -m pytest tests/test_drydock_regression.py tests/test_drydock_tasks.py tests/test_loop_detection.py tests/test_curiosity.py tests/test_math_tool.py tests/test_agent_tasks.py tests/test_integration.py tests/test_user_issues.py tests/test_real_issues.py \
45
45
  -p no:xdist -p no:cov --override-ini="addopts=" -q 2>&1; then
46
46
  log "TESTS FAILED — deploy aborted. Fix the tests before deploying."
47
47
  exit 1