drydock-cli 2.8.45__tar.gz → 2.8.46__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 (822) hide show
  1. drydock_cli-2.8.46/.auto_release.lock +1 -0
  2. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/PKG-INFO +1 -1
  3. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/commands.py +14 -0
  4. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/app.py +152 -0
  5. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/agent_loop.py +84 -0
  6. drydock_cli-2.8.46/drydock/core/goal.py +147 -0
  7. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/pyproject.toml +1 -1
  8. drydock_cli-2.8.46/tests/test_goal.py +203 -0
  9. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/trip_log.md +13 -0
  10. drydock_cli-2.8.45/.auto_release.lock +0 -1
  11. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/.github/CODEOWNERS +0 -0
  12. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  13. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  14. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  15. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/.github/workflows/build-and-upload.yml +0 -0
  16. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/.github/workflows/ci.yml +0 -0
  17. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/.github/workflows/issue-labeler.yml +0 -0
  18. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/.github/workflows/release.yml +0 -0
  19. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/.gitignore +0 -0
  20. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/.pause_stress +0 -0
  21. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/.pre-commit-config.yaml +0 -0
  22. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/.python-version +0 -0
  23. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/.typos.toml +0 -0
  24. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/.vscode/extensions.json +0 -0
  25. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/.vscode/launch.json +0 -0
  26. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/.vscode/settings.json +0 -0
  27. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/AGENTS.md +0 -0
  28. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/Admiral.md +0 -0
  29. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/CHANGELOG.md +0 -0
  30. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/CLAUDE.md +0 -0
  31. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/CONTRIBUTING.md +0 -0
  32. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/DEEP_NOIR_PRD.md +0 -0
  33. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/DEPLOYMENT.md +0 -0
  34. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/DRYDOCK.md +0 -0
  35. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/HLE_PRD.md +0 -0
  36. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/JETSON_BENCH.md +0 -0
  37. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/LICENSE +0 -0
  38. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/MODEL_SHORTCOMINGS.md +0 -0
  39. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/NOTICE +0 -0
  40. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/README.md +0 -0
  41. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/SOVEREIGN_PRD.md +0 -0
  42. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/TRIAGE_v1.md +0 -0
  43. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/action.yml +0 -0
  44. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/baseline_history/README.md +0 -0
  45. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/baseline_history/results1.tsv +0 -0
  46. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/baseline_history/results13.tsv +0 -0
  47. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/baseline_history/results14.tsv +0 -0
  48. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/baseline_history/results15.tsv +0 -0
  49. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/baseline_history/results16.tsv +0 -0
  50. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/baseline_history/results17.tsv +0 -0
  51. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/baseline_history/results18.tsv +0 -0
  52. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/baseline_history/results19.tsv +0 -0
  53. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/baseline_history/results2.tsv +0 -0
  54. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/baseline_history/results20.tsv +0 -0
  55. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/baseline_history/results3.tsv +0 -0
  56. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/baseline_history/results4.tsv +0 -0
  57. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/baseline_history/results5.tsv +0 -0
  58. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/baseline_history/results6.tsv +0 -0
  59. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/baseline_history/results7.tsv +0 -0
  60. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/baseline_history/results8.tsv +0 -0
  61. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/baseline_history/results9.tsv +0 -0
  62. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/baseline_history/results_evolved_v1.tsv +0 -0
  63. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/distribution/zed/LICENSE +0 -0
  64. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/distribution/zed/extension.toml +0 -0
  65. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/distribution/zed/icons/mistral_vibe.svg +0 -0
  66. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/docs/README.md +0 -0
  67. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/docs/acp-setup.md +0 -0
  68. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/docs/archive/BASELINE_412.md +0 -0
  69. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/docs/archive/Drydock_rebrand.md +0 -0
  70. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/docs/archive/OVERNIGHT_PROGRESS.md +0 -0
  71. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/docs/archive/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  72. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/docs/archive/PERF_SWEEP_PLAN.md +0 -0
  73. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/docs/archive/PRD.md +0 -0
  74. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/docs/archive/drydock_terms.md +0 -0
  75. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/docs/archive/resume.md +0 -0
  76. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/docs/proxy-setup.md +0 -0
  77. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/__init__.py +0 -0
  78. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/__main__.py +0 -0
  79. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/acp/__init__.py +0 -0
  80. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/acp/acp_agent_loop.py +0 -0
  81. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/acp/acp_logger.py +0 -0
  82. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/acp/entrypoint.py +0 -0
  83. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/acp/tools/__init__.py +0 -0
  84. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/acp/tools/base.py +0 -0
  85. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/acp/tools/builtins/bash.py +0 -0
  86. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/acp/tools/builtins/read_file.py +0 -0
  87. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/acp/tools/builtins/search_replace.py +0 -0
  88. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/acp/tools/builtins/todo.py +0 -0
  89. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/acp/tools/builtins/write_file.py +0 -0
  90. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/acp/tools/session_update.py +0 -0
  91. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/acp/utils.py +0 -0
  92. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/admiral/__init__.py +0 -0
  93. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/admiral/detectors.py +0 -0
  94. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/admiral/detectors_proposed.py +0 -0
  95. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/admiral/history.py +0 -0
  96. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/admiral/interventions.py +0 -0
  97. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/admiral/llm_analyzer.py +0 -0
  98. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/admiral/metrics.py +0 -0
  99. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/admiral/opus_escalator.py +0 -0
  100. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/admiral/persistence.py +0 -0
  101. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/admiral/policy.py +0 -0
  102. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/admiral/proposer.py +0 -0
  103. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/admiral/stager.py +0 -0
  104. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/admiral/task_classifier.py +0 -0
  105. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/admiral/tuning.py +0 -0
  106. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/admiral/validator.py +0 -0
  107. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/admiral/worker.py +0 -0
  108. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/__init__.py +0 -0
  109. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/autocompletion/__init__.py +0 -0
  110. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/autocompletion/base.py +0 -0
  111. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/autocompletion/path_completion.py +0 -0
  112. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/autocompletion/slash_command.py +0 -0
  113. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/cli.py +0 -0
  114. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/clipboard.py +0 -0
  115. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/entrypoint.py +0 -0
  116. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/fix_windows_path.py +0 -0
  117. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/history_manager.py +0 -0
  118. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  119. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  120. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  121. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/terminal_setup.py +0 -0
  122. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/__init__.py +0 -0
  123. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  124. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/app.tcss +0 -0
  125. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/external_editor.py +0 -0
  126. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  127. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  128. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  129. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  130. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  131. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  132. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  133. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  134. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  135. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  136. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  137. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  138. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  139. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  140. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  141. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  142. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  143. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  144. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  145. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  146. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  147. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  148. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  149. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  150. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  151. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  152. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  153. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  154. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  155. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  156. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  157. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  158. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  159. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  160. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  161. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  162. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  163. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/windowing/history.py +0 -0
  164. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  165. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/textual_ui/windowing/state.py +0 -0
  166. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/update_notifier/__init__.py +0 -0
  167. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  168. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  169. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  170. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  171. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  172. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/update_notifier/update.py +0 -0
  173. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/cli/update_notifier/whats_new.py +0 -0
  174. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/__init__.py +0 -0
  175. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/agents/__init__.py +0 -0
  176. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/agents/manager.py +0 -0
  177. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/agents/models.py +0 -0
  178. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/auth/__init__.py +0 -0
  179. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/auth/crypto.py +0 -0
  180. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/auth/github.py +0 -0
  181. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/auto_solve.py +0 -0
  182. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/autocompletion/__init__.py +0 -0
  183. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/autocompletion/completers.py +0 -0
  184. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  185. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  186. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  187. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  188. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  189. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/autocompletion/fuzzy.py +0 -0
  190. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/autocompletion/path_prompt.py +0 -0
  191. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  192. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/build_orchestrator.py +0 -0
  193. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/checkpoint.py +0 -0
  194. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/classifier/__init__.py +0 -0
  195. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/classifier/__main__.py +0 -0
  196. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/classifier/classifier.py +0 -0
  197. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/classifier/dispatcher.py +0 -0
  198. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/classifier/rules.py +0 -0
  199. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/classifier/signal.py +0 -0
  200. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/config/__init__.py +0 -0
  201. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/config/_dotenv.py +0 -0
  202. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/config/_settings.py +0 -0
  203. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/config/doctor.py +0 -0
  204. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/config/harness_files/__init__.py +0 -0
  205. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  206. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/config/harness_files/_paths.py +0 -0
  207. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/config/local_detect.py +0 -0
  208. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/config/migrate.py +0 -0
  209. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/constraint_extract.py +0 -0
  210. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/constraint_hint.py +0 -0
  211. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/consultant.py +0 -0
  212. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/context_recovery.py +0 -0
  213. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/drydock_states.py +0 -0
  214. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/hooks.py +0 -0
  215. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/llm/__init__.py +0 -0
  216. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/llm/backend/anthropic.py +0 -0
  217. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/llm/backend/base.py +0 -0
  218. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/llm/backend/factory.py +0 -0
  219. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/llm/backend/generic.py +0 -0
  220. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/llm/backend/mistral.py +0 -0
  221. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  222. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/llm/backend/vertex.py +0 -0
  223. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/llm/exceptions.py +0 -0
  224. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/llm/format.py +0 -0
  225. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/llm/message_utils.py +0 -0
  226. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/llm/types.py +0 -0
  227. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/logger.py +0 -0
  228. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/middleware.py +0 -0
  229. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/output_formatters.py +0 -0
  230. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/paths/__init__.py +0 -0
  231. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/paths/_drydock_home.py +0 -0
  232. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/paths/_local_config_walk.py +0 -0
  233. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/paths/conventions.py +0 -0
  234. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/plan_session.py +0 -0
  235. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/plugins.py +0 -0
  236. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/programmatic.py +0 -0
  237. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/prompts/__init__.py +0 -0
  238. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/prompts/builder.md +0 -0
  239. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/prompts/cli.md +0 -0
  240. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/prompts/compact.md +0 -0
  241. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/prompts/dangerous_directory.md +0 -0
  242. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/prompts/diagnostic.md +0 -0
  243. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/prompts/explore.md +0 -0
  244. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/prompts/gemma4.md +0 -0
  245. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/prompts/planner.md +0 -0
  246. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/prompts/project_context.md +0 -0
  247. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/prompts/tests.md +0 -0
  248. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/proxy_setup.py +0 -0
  249. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/session/agent_memory.py +0 -0
  250. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/session/checkpoints.py +0 -0
  251. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/session/session_loader.py +0 -0
  252. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/session/session_logger.py +0 -0
  253. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/session/session_migration.py +0 -0
  254. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/session/state_file.py +0 -0
  255. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/session_checker.py +0 -0
  256. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/skills/__init__.py +0 -0
  257. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/skills/manager.py +0 -0
  258. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/skills/models.py +0 -0
  259. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/skills/parser.py +0 -0
  260. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/slug.py +0 -0
  261. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/steering_hook.py +0 -0
  262. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/system_prompt.py +0 -0
  263. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/telemetry/__init__.py +0 -0
  264. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/telemetry/send.py +0 -0
  265. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/teleport/errors.py +0 -0
  266. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/teleport/git.py +0 -0
  267. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/teleport/nuage.py +0 -0
  268. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/teleport/teleport.py +0 -0
  269. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/teleport/types.py +0 -0
  270. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/base.py +0 -0
  271. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/_task_manager.py +0 -0
  272. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/algebra_tool.py +0 -0
  273. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  274. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/bash.py +0 -0
  275. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/chemistry_tool.py +0 -0
  276. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/count_tool.py +0 -0
  277. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/cron.py +0 -0
  278. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  279. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/glob_tool.py +0 -0
  280. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/grep.py +0 -0
  281. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  282. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/linear_algebra_tool.py +0 -0
  283. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/logic_tool.py +0 -0
  284. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/lsp.py +0 -0
  285. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/math_tool.py +0 -0
  286. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  287. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/memory_tool.py +0 -0
  288. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  289. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/number_theory_tool.py +0 -0
  290. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/powershell.py +0 -0
  291. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  292. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  293. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  294. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  295. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  296. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  297. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  298. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  299. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  300. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  301. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  302. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  303. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
  304. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  305. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  306. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/task.md +0 -0
  307. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  308. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  309. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  310. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  311. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  312. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  313. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  314. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/read_file.py +0 -0
  315. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/retrieve.py +0 -0
  316. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/search_replace.py +0 -0
  317. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/set_tool.py +0 -0
  318. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/solve_tool.py +0 -0
  319. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/stats_tool.py +0 -0
  320. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/task.py +0 -0
  321. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/todo.py +0 -0
  322. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/tool_search.py +0 -0
  323. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/units_tool.py +0 -0
  324. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/verify_tool.py +0 -0
  325. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/webfetch.py +0 -0
  326. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/websearch.py +0 -0
  327. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/worktree.py +0 -0
  328. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/builtins/write_file.py +0 -0
  329. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/injection_guard.py +0 -0
  330. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/manager.py +0 -0
  331. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/mcp/__init__.py +0 -0
  332. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/mcp/registry.py +0 -0
  333. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/mcp/tools.py +0 -0
  334. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/mcp_sampling.py +0 -0
  335. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/ui.py +0 -0
  336. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/tools/utils.py +0 -0
  337. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/trusted_folders.py +0 -0
  338. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/types.py +0 -0
  339. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/core/utils.py +0 -0
  340. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/curiosity/__init__.py +0 -0
  341. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/curiosity/__main__.py +0 -0
  342. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/curiosity/gap_detector.py +0 -0
  343. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/curiosity/item.py +0 -0
  344. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/curiosity/queue.py +0 -0
  345. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/curiosity/surprise.py +0 -0
  346. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/graphrag/__init__.py +0 -0
  347. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/graphrag/__main__.py +0 -0
  348. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/graphrag/code_indexer.py +0 -0
  349. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/graphrag/retriever.py +0 -0
  350. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/graphrag/storage.py +0 -0
  351. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/graphrag/text_indexer.py +0 -0
  352. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/setup/onboarding/__init__.py +0 -0
  353. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/setup/onboarding/base.py +0 -0
  354. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/setup/onboarding/onboarding.tcss +0 -0
  355. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/setup/onboarding/screens/__init__.py +0 -0
  356. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/setup/onboarding/screens/api_key.py +0 -0
  357. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/setup/onboarding/screens/choice.py +0 -0
  358. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/setup/onboarding/screens/local_model.py +0 -0
  359. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/setup/onboarding/screens/welcome.py +0 -0
  360. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  361. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  362. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/__init__.py +0 -0
  363. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/api-design/SKILL.md +0 -0
  364. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/audit-tests/SKILL.md +0 -0
  365. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/batch/SKILL.md +0 -0
  366. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/commit-code/SKILL.md +0 -0
  367. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/constraint-reasoning/SKILL.md +0 -0
  368. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/context-summary/SKILL.md +0 -0
  369. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/create-presentation/SKILL.md +0 -0
  370. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/deep-research/SKILL.md +0 -0
  371. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/deploy/SKILL.md +0 -0
  372. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/diff-review/SKILL.md +0 -0
  373. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/doc-gen/SKILL.md +0 -0
  374. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/explain-code/SKILL.md +0 -0
  375. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/explore-code/SKILL.md +0 -0
  376. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/fix-issue/SKILL.md +0 -0
  377. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/git-ops/SKILL.md +0 -0
  378. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/init-project/SKILL.md +0 -0
  379. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/investigate/SKILL.md +0 -0
  380. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/logic/SKILL.md +0 -0
  381. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/logic/assets/cheat_sheet_full.txt +0 -0
  382. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/loop/SKILL.md +0 -0
  383. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/migrate/SKILL.md +0 -0
  384. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/perf-analyze/SKILL.md +0 -0
  385. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/plan-impl/SKILL.md +0 -0
  386. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/pr-review/SKILL.md +0 -0
  387. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/prove/SKILL.md +0 -0
  388. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/refactor/SKILL.md +0 -0
  389. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/regex-help/SKILL.md +0 -0
  390. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/review/SKILL.md +0 -0
  391. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/security-review/SKILL.md +0 -0
  392. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/ship/SKILL.md +0 -0
  393. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/simplify/SKILL.md +0 -0
  394. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/strong-tests/SKILL.md +0 -0
  395. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/skills/test-verify/SKILL.md +0 -0
  396. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/steering/__init__.py +0 -0
  397. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/steering/__main__.py +0 -0
  398. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/steering/applier.py +0 -0
  399. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/steering/config.py +0 -0
  400. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/steering/registry.py +0 -0
  401. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/steering/sandbox.py +0 -0
  402. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/steering/sidecar/__init__.py +0 -0
  403. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/steering/sidecar/header_parser.py +0 -0
  404. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/steering/sidecar/hooks.py +0 -0
  405. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/steering/sidecar/loader.py +0 -0
  406. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/steering/sidecar/server.py +0 -0
  407. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/steering/train/__init__.py +0 -0
  408. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/steering/train/capture.py +0 -0
  409. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/steering/train/compute_vector.py +0 -0
  410. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/steering/train/extract_pairs.py +0 -0
  411. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/steering/train/scan_sessions.py +0 -0
  412. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/steering/vectors.py +0 -0
  413. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock/whats_new.md +0 -0
  414. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/drydock-acp.spec +0 -0
  415. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/flake.lock +0 -0
  416. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/flake.nix +0 -0
  417. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/outlook_draft_assistant.tar.gz +0 -0
  418. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/research/README.md +0 -0
  419. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/research/config_base.toml +0 -0
  420. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/research/config_best.toml +0 -0
  421. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/research/deep_noir/pairs/empty_after_bash.jsonl +0 -0
  422. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/research/deep_noir/pairs/scan_empty_after_bash.jsonl +0 -0
  423. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/research/domain_spec.md +0 -0
  424. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/research/experimenter.py +0 -0
  425. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/research/kernel.py +0 -0
  426. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/research/mini_prd.md +0 -0
  427. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/research/mini_prompts.txt +0 -0
  428. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/research/proposer.py +0 -0
  429. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/research/results.tsv +0 -0
  430. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/resume.md +0 -0
  431. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/README.md +0 -0
  432. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/admiral_probe.py +0 -0
  433. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/archive/auto_test_loop.sh +0 -0
  434. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/archive/monitor_test_battery.sh +0 -0
  435. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/archive/overnight_agents_test.sh +0 -0
  436. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/archive/test_bank.sh +0 -0
  437. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/archive/test_full.sh +0 -0
  438. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/archive/test_smoke.sh +0 -0
  439. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/archive/tui_test.py +0 -0
  440. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/audit_sampler.py +0 -0
  441. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/auto_generate_tests.py +0 -0
  442. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/auto_release.sh +0 -0
  443. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/auto_solve_audit.py +0 -0
  444. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/autonomous_review.sh +0 -0
  445. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/autonomous_review_prompt.md +0 -0
  446. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/backfill_hle_curiosity.py +0 -0
  447. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/backup.sh +0 -0
  448. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/bench_inference.py +0 -0
  449. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/bump_version.py +0 -0
  450. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/classify_pulse.sh +0 -0
  451. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/consume_retrieval_queue.py +0 -0
  452. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/curiosity_idle_cycle.sh +0 -0
  453. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/dedupe_dispatch_queues.py +0 -0
  454. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/deploy_to_github.sh +0 -0
  455. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/dispatch_report.py +0 -0
  456. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/drydock_status.sh +0 -0
  457. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/fetch_arxiv_abstracts.py +0 -0
  458. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/gen_2000_prompts.py +0 -0
  459. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/hle_aggregate.py +0 -0
  460. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/hle_babysitter.sh +0 -0
  461. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/hle_burndown.sh +0 -0
  462. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/hle_burndown_keepalive.sh +0 -0
  463. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/hle_burndown_status.py +0 -0
  464. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/hle_eval.py +0 -0
  465. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/hle_eval_seed.jsonl +0 -0
  466. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/llm_balancer.py +0 -0
  467. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/notify_release.py +0 -0
  468. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/perf_baseline_when_idle.sh +0 -0
  469. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/perf_sweep.py +0 -0
  470. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/poll_issues.sh +0 -0
  471. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/publish_to_pypi.sh +0 -0
  472. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/queue_top.py +0 -0
  473. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/ralph_loop.py +0 -0
  474. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/rejudge_hle.py +0 -0
  475. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/research_babysitter.sh +0 -0
  476. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/shakedown.py +0 -0
  477. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/shakedown_interactive.py +0 -0
  478. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/shakedown_suite.sh +0 -0
  479. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/shakedown_variance.sh +0 -0
  480. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/start_steering_sidecar.sh +0 -0
  481. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/stress_babysitter.sh +0 -0
  482. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/stress_prompts_50.txt +0 -0
  483. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/stress_prompts_realuser.txt +0 -0
  484. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/stress_prompts_tool_agent.txt +0 -0
  485. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
  486. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/stress_shakedown.py +0 -0
  487. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/stress_telegram_status.py +0 -0
  488. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/stress_watcher.py +0 -0
  489. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/telegram_bot.py +0 -0
  490. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/tool_usage_report.py +0 -0
  491. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/scripts/vllm_failover.sh +0 -0
  492. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/__init__.py +0 -0
  493. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/conftest.py +0 -0
  494. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/test_acp.py +0 -0
  495. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/test_agent_thought.py +0 -0
  496. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/test_bash.py +0 -0
  497. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/test_compact_session_updates.py +0 -0
  498. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/test_content.py +0 -0
  499. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/test_initialize.py +0 -0
  500. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/test_list_sessions.py +0 -0
  501. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/test_load_session.py +0 -0
  502. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/test_multi_session.py +0 -0
  503. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/test_new_session.py +0 -0
  504. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/test_proxy_setup_acp.py +0 -0
  505. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/test_read_file.py +0 -0
  506. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/test_search_replace.py +0 -0
  507. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/test_set_config_option.py +0 -0
  508. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/test_set_mode.py +0 -0
  509. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/test_set_model.py +0 -0
  510. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/test_tool_call_session_update.py +0 -0
  511. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/test_utils.py +0 -0
  512. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/acp/test_write_file.py +0 -0
  513. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/autocompletion/test_file_indexer.py +0 -0
  514. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/autocompletion/test_fuzzy.py +0 -0
  515. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  516. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  517. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/autocompletion/test_path_completion_controller.py +0 -0
  518. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  519. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/autocompletion/test_slash_command_controller.py +0 -0
  520. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  521. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/backend/__init__.py +0 -0
  522. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/backend/data/__init__.py +0 -0
  523. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/backend/data/fireworks.py +0 -0
  524. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/backend/data/mistral.py +0 -0
  525. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/backend/test_anthropic_adapter.py +0 -0
  526. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/backend/test_backend.py +0 -0
  527. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  528. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/backend/test_reasoning_adapter.py +0 -0
  529. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  530. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  531. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  532. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  533. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/cli/test_bell_notifications.py +0 -0
  534. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/cli/test_braille_renderer.py +0 -0
  535. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/cli/test_clipboard.py +0 -0
  536. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/cli/test_commands.py +0 -0
  537. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/cli/test_copy_shortcuts.py +0 -0
  538. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/cli/test_external_editor.py +0 -0
  539. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/cli/test_no_markup_static.py +0 -0
  540. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/cli/test_question_app.py +0 -0
  541. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/cli/test_spinner.py +0 -0
  542. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/cli/test_switching_mode.py +0 -0
  543. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  544. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  545. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/cli/test_ui_session_resume.py +0 -0
  546. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/cli/test_ui_skill_dispatch.py +0 -0
  547. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/cli/textual_ui/__init__.py +0 -0
  548. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/cli/textual_ui/test_session_picker.py +0 -0
  549. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/conftest.py +0 -0
  550. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/core/test_agents.py +0 -0
  551. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/core/test_auth_crypto.py +0 -0
  552. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/core/test_auth_github.py +0 -0
  553. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  554. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  555. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/core/test_config_load_dotenv.py +0 -0
  556. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/core/test_config_paths.py +0 -0
  557. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/core/test_config_resolution.py +0 -0
  558. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/core/test_file_logging.py +0 -0
  559. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/core/test_plan_session.py +0 -0
  560. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/core/test_proxy_setup.py +0 -0
  561. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/core/test_slug.py +0 -0
  562. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/core/test_telemetry_send.py +0 -0
  563. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/core/test_teleport_git.py +0 -0
  564. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/core/test_teleport_nuage.py +0 -0
  565. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/core/test_teleport_service.py +0 -0
  566. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/core/test_trusted_folders.py +0 -0
  567. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/core/test_utils.py +0 -0
  568. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/e2e/common.py +0 -0
  569. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/e2e/conftest.py +0 -0
  570. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/e2e/mock_server.py +0 -0
  571. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  572. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/e2e/test_cli_tui_streaming.py +0 -0
  573. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  574. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/fixtures/doc_qa_system_prd.md +0 -0
  575. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/mock/__init__.py +0 -0
  576. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/mock/mock_backend_factory.py +0 -0
  577. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/mock/mock_entrypoint.py +0 -0
  578. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/mock/utils.py +0 -0
  579. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/onboarding/test_run_onboarding.py +0 -0
  580. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/onboarding/test_ui_onboarding.py +0 -0
  581. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/session/test_session_loader.py +0 -0
  582. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/session/test_session_logger.py +0 -0
  583. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/session/test_session_migration.py +0 -0
  584. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/skills/conftest.py +0 -0
  585. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/skills/test_manager.py +0 -0
  586. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/skills/test_models.py +0 -0
  587. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/skills/test_parser.py +0 -0
  588. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  589. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  590. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  591. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  592. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  593. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  594. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  595. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  596. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  597. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  598. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  599. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  600. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  601. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  602. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  603. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  604. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  605. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  606. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  607. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  608. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  609. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  610. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  611. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  612. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  613. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  614. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  615. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  616. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  617. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  618. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  619. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  620. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  621. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  622. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  623. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  624. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  625. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  626. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  627. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  628. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  629. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  630. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  631. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  632. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  633. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  634. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  635. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  636. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  637. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  638. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  639. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  640. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  641. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  642. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  643. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  644. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  645. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  646. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  647. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  648. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/base_snapshot_test_app.py +0 -0
  649. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/conftest.py +0 -0
  650. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/snap_compare.py +0 -0
  651. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  652. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  653. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  654. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  655. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  656. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  657. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  658. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  659. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  660. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  661. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  662. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  663. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  664. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  665. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/stubs/fake_backend.py +0 -0
  666. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/stubs/fake_client.py +0 -0
  667. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/stubs/fake_tool.py +0 -0
  668. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_admiral.py +0 -0
  669. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
  670. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_admiral_intervention_outcome.py +0 -0
  671. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_admiral_phase3.py +0 -0
  672. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_admiral_proposed.py +0 -0
  673. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_admiral_session_id.py +0 -0
  674. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_admiral_struggle_dedup.py +0 -0
  675. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_agent_auto_compact.py +0 -0
  676. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_agent_backend.py +0 -0
  677. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_agent_observer_streaming.py +0 -0
  678. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_agent_stats.py +0 -0
  679. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_agent_tasks.py +0 -0
  680. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_agent_tool_call.py +0 -0
  681. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_agents.py +0 -0
  682. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_algebra_tool.py +0 -0
  683. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_api_error_recovery.py +0 -0
  684. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_auto_retrieve_soft_nudge.py +0 -0
  685. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_auto_solve.py +0 -0
  686. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_bank_build.py +0 -0
  687. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_bank_debug.py +0 -0
  688. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_bank_multiagent.py +0 -0
  689. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_bank_prd.py +0 -0
  690. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_bank_prd_extended.py +0 -0
  691. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_bank_tools.py +0 -0
  692. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_bank_update.py +0 -0
  693. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_build_projects.py +0 -0
  694. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_checkpoint.py +0 -0
  695. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_chemistry_tool.py +0 -0
  696. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_classifier.py +0 -0
  697. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_cli_programmatic_preload.py +0 -0
  698. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_config_migration.py +0 -0
  699. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_constraint_extract.py +0 -0
  700. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_constraint_hint.py +0 -0
  701. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_context_recovery.py +0 -0
  702. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_count_tool.py +0 -0
  703. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_curiosity.py +0 -0
  704. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_current_bugs.py +0 -0
  705. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_dispatch_report.py +0 -0
  706. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_dispatcher.py +0 -0
  707. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_drydock_regression.py +0 -0
  708. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_drydock_tasks.py +0 -0
  709. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  710. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_full_regression.py +0 -0
  711. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_graphrag.py +0 -0
  712. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_graphrag_worked_examples.py +0 -0
  713. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_hallucinated_tool_suppression.py +0 -0
  714. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_history_manager.py +0 -0
  715. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_hle_aggregate.py +0 -0
  716. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_hle_score_method_split.py +0 -0
  717. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_hle_typing.py +0 -0
  718. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_integration.py +0 -0
  719. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_issue_fixes.py +0 -0
  720. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_linear_algebra_tool.py +0 -0
  721. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_local_detect.py +0 -0
  722. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_logic_tool.py +0 -0
  723. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_loop_detection.py +0 -0
  724. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_math_tool.py +0 -0
  725. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_mcp_settings.py +0 -0
  726. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_memory_tool.py +0 -0
  727. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_message_id.py +0 -0
  728. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_message_merging.py +0 -0
  729. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_middleware.py +0 -0
  730. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_multi_agent.py +0 -0
  731. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_number_theory_tool.py +0 -0
  732. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_read_file_not_found_listing.py +0 -0
  733. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_real_failures.py +0 -0
  734. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_real_issues.py +0 -0
  735. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_real_workflow.py +0 -0
  736. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_reasoning_content.py +0 -0
  737. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_rejudge_hle.py +0 -0
  738. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_retrieval_consumer.py +0 -0
  739. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_retrieve_tool.py +0 -0
  740. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_search_replace_args_not_truncated.py +0 -0
  741. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_set_tool.py +0 -0
  742. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_smoke.py +0 -0
  743. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_solve_tool.py +0 -0
  744. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_stats_tool.py +0 -0
  745. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_steering.py +0 -0
  746. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_steering_capture.py +0 -0
  747. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_steering_compute_vector.py +0 -0
  748. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_steering_extract_pairs.py +0 -0
  749. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_steering_hook.py +0 -0
  750. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_steering_sidecar_chat_inputs.py +0 -0
  751. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_steering_sidecar_hooks.py +0 -0
  752. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_system_prompt.py +0 -0
  753. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_tagged_text.py +0 -0
  754. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_task_complete_nudge.py +0 -0
  755. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_tool_args.py +0 -0
  756. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_truncate_args_valid_json.py +0 -0
  757. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_truncated_arg_path_hint.py +0 -0
  758. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_truncated_search_replace_escalation.py +0 -0
  759. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_truncated_write_escalation.py +0 -0
  760. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_ui_external_editor.py +0 -0
  761. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_ui_input_history.py +0 -0
  762. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_units_tool.py +0 -0
  763. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_user_issues.py +0 -0
  764. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_verify_tool.py +0 -0
  765. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_wall_of_text_rescue.py +0 -0
  766. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_workloads.py +0 -0
  767. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/test_write_file_missing_path.py +0 -0
  768. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/testbank_helpers.py +0 -0
  769. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_ask_user_question.py +0 -0
  770. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_bash.py +0 -0
  771. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_bash_binary_grep_hint.py +0 -0
  772. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_bash_consec_empty_search.py +0 -0
  773. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
  774. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
  775. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_bash_error_loop_breaker.py +0 -0
  776. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
  777. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
  778. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
  779. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
  780. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_exit_plan_mode.py +0 -0
  781. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_grep.py +0 -0
  782. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
  783. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_invoke_context.py +0 -0
  784. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  785. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_manager_get_tool_config.py +0 -0
  786. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_mcp.py +0 -0
  787. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_mcp_sampling.py +0 -0
  788. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
  789. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  790. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_read_file_directory.py +0 -0
  791. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_read_file_limit_truncation.py +0 -0
  792. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_search_replace_append_fallback.py +0 -0
  793. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_search_replace_dir_path.py +0 -0
  794. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_search_replace_empty_content.py +0 -0
  795. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_search_replace_file_not_found.py +0 -0
  796. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
  797. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_search_replace_hard_stop.py +0 -0
  798. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_search_replace_malformed_block.py +0 -0
  799. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  800. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_search_replace_placeholder.py +0 -0
  801. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  802. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_task.py +0 -0
  803. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_ui_bash_execution.py +0 -0
  804. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_webfetch.py +0 -0
  805. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_websearch.py +0 -0
  806. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  807. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  808. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  809. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  810. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/update_notifier/test_do_update.py +0 -0
  811. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  812. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/update_notifier/test_github_update_gateway.py +0 -0
  813. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  814. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/update_notifier/test_ui_update_notification.py +0 -0
  815. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/update_notifier/test_update_use_case.py +0 -0
  816. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/tests/update_notifier/test_whats_new.py +0 -0
  817. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/uv.lock +0 -0
  818. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/worked_examples/README.md +0 -0
  819. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/worked_examples/cli_subcommand_dispatch.py +0 -0
  820. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/worked_examples/lookup.json +0 -0
  821. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/worked_examples/sql_parser.py +0 -0
  822. {drydock_cli-2.8.45 → drydock_cli-2.8.46}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 2173622
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.8.45
3
+ Version: 2.8.46
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
@@ -47,6 +47,20 @@ class CommandRegistry:
47
47
  ),
48
48
  handler="_undo_last_turn",
49
49
  ),
50
+ "goal": Command(
51
+ aliases=frozenset(["/goal"]),
52
+ description=(
53
+ "Set a completion condition and auto-continue across "
54
+ "turns until met. Usage:\n"
55
+ " /goal <condition> — set a goal\n"
56
+ " /goal — show current goal status\n"
57
+ " /goal clear — cancel the active goal\n"
58
+ "After each turn, a small evaluator checks the "
59
+ "condition. If not met, drydock injects a continuation "
60
+ "prompt and runs another turn (capped at 20 iterations)."
61
+ ),
62
+ handler="_goal_command",
63
+ ),
50
64
  "log": Command(
51
65
  aliases=frozenset(["/log"]),
52
66
  description="Show path to current interaction log file",
@@ -851,6 +851,21 @@ class DrydockApp(App): # noqa: PLR0904
851
851
  loading_widget=self._loading_widget,
852
852
  )
853
853
 
854
+ # /goal post-turn hook — if a goal is active, ask the
855
+ # evaluator whether the condition is met. Met → clear and
856
+ # tell the user. Not met → queue a continuation prompt so
857
+ # the next turn fires automatically. The hook only runs on
858
+ # the success path (skipped on exception below) so a broken
859
+ # turn doesn't trigger an auto-continuation that re-trips
860
+ # the same failure.
861
+ try:
862
+ await self._check_goal_continuation()
863
+ except Exception as _goal_e: # noqa: BLE001
864
+ import logging
865
+ logging.getLogger(__name__).warning(
866
+ "[goal] post-turn hook failed (skipped): %s", _goal_e,
867
+ )
868
+
854
869
  except asyncio.CancelledError:
855
870
  if self._loading_widget and self._loading_widget.parent:
856
871
  await self._loading_widget.remove()
@@ -2204,6 +2219,143 @@ class DrydockApp(App): # noqa: PLR0904
2204
2219
  )
2205
2220
  )
2206
2221
 
2222
+ async def _check_goal_continuation(self) -> None:
2223
+ """Called from `_handle_agent_loop_turn` after the agent's turn
2224
+ finishes. If a goal is active, run the evaluator and either
2225
+ clear (met) or queue a continuation prompt (not met).
2226
+ """
2227
+ loop = self.agent_loop
2228
+ goal = getattr(loop, "goal", None)
2229
+ if goal is None or not goal.active:
2230
+ return
2231
+
2232
+ # Cap check first — never call the evaluator past the cap.
2233
+ if goal.iterations >= goal.max_iterations:
2234
+ await self._mount_and_scroll(UserCommandMessage(
2235
+ f"**Goal hit iteration cap** ({goal.max_iterations}). "
2236
+ f"Stopping auto-continuation for: _{goal.condition}_.\n\n"
2237
+ f"Last verdict: {goal.last_verdict or '(none)'}. "
2238
+ f"Re-issue `/goal <condition>` to restart, or send a "
2239
+ f"normal prompt to continue manually."
2240
+ ))
2241
+ loop.clear_goal()
2242
+ return
2243
+
2244
+ # If the user typed something while we were processing, defer
2245
+ # to their input — don't pre-empt with an auto-continuation.
2246
+ # The queued message will run via _process_queued_message in
2247
+ # the `finally` block below, and the goal will re-evaluate
2248
+ # after THAT turn.
2249
+ if hasattr(self, "_pending_messages") and self._pending_messages:
2250
+ return
2251
+
2252
+ verdict, reasoning = await loop.evaluate_goal()
2253
+ goal.iterations += 1
2254
+
2255
+ if verdict == "YES":
2256
+ await self._mount_and_scroll(UserCommandMessage(
2257
+ f"**Goal met** after {goal.iterations} turn(s): "
2258
+ f"_{goal.condition}_.\n\n"
2259
+ f"Evaluator reasoning: {reasoning or '—'}\n\n"
2260
+ f"Auto-continuation cleared."
2261
+ ))
2262
+ loop.clear_goal()
2263
+ return
2264
+
2265
+ if verdict == "ERROR":
2266
+ # Repeated evaluator errors are not the model's fault and
2267
+ # shouldn't lock the user in. Three errors → stop.
2268
+ err_key = "_goal_eval_error_streak"
2269
+ n = getattr(self, err_key, 0) + 1
2270
+ setattr(self, err_key, n)
2271
+ if n >= 3:
2272
+ await self._mount_and_scroll(UserCommandMessage(
2273
+ f"**Goal evaluator failing repeatedly** (3 errors in a "
2274
+ f"row). Last reason: {reasoning}. Clearing the goal — "
2275
+ f"re-issue `/goal` to retry."
2276
+ ))
2277
+ loop.clear_goal()
2278
+ setattr(self, err_key, 0)
2279
+ return
2280
+ # On a single error, keep the goal but don't auto-continue —
2281
+ # safer than running another turn blind.
2282
+ await self._mount_and_scroll(UserCommandMessage(
2283
+ f"Goal evaluator returned an error: {reasoning}. "
2284
+ f"Pausing auto-continuation for this turn; goal still "
2285
+ f"active. Type any prompt to continue manually."
2286
+ ))
2287
+ return
2288
+
2289
+ # NO — queue a continuation prompt so the next turn fires.
2290
+ setattr(self, "_goal_eval_error_streak", 0)
2291
+ from drydock.core.goal import make_continuation_prompt
2292
+ cont_prompt = make_continuation_prompt(goal)
2293
+ if not hasattr(self, "_pending_messages"):
2294
+ self._pending_messages = []
2295
+ self._pending_messages.append(cont_prompt)
2296
+ await self._mount_and_scroll(UserCommandMessage(
2297
+ f"_Auto-continuing toward goal (turn {goal.iterations}/"
2298
+ f"{goal.max_iterations}): {reasoning or 'not yet met'}_"
2299
+ ))
2300
+
2301
+ async def _goal_command(self, args: str = "") -> None:
2302
+ """/goal — set / show / clear a session-scoped goal that drives
2303
+ automatic turn-after-turn work toward a verifiable condition.
2304
+
2305
+ Usage:
2306
+ /goal <condition> set a goal (and start auto-continuation)
2307
+ /goal show the current goal's status
2308
+ /goal clear cancel the active goal
2309
+ """
2310
+ args = (args or "").strip()
2311
+ loop = self.agent_loop
2312
+
2313
+ # Status (no args) — show whatever goal is active
2314
+ if not args:
2315
+ g = getattr(loop, "goal", None)
2316
+ if g is None or not g.active:
2317
+ await self._mount_and_scroll(UserCommandMessage(
2318
+ "No active goal. Set one with `/goal <condition>`."
2319
+ ))
2320
+ return
2321
+ verdict = g.last_verdict or "(not yet evaluated)"
2322
+ reason = g.last_evaluator_reasoning or ""
2323
+ await self._mount_and_scroll(UserCommandMessage(
2324
+ f"**Goal:** {g.condition}\n\n"
2325
+ f"- Iterations: {g.iterations} / {g.max_iterations}\n"
2326
+ f"- Last verdict: {verdict}\n"
2327
+ f"- Reasoning: {reason or '—'}\n\n"
2328
+ f"Use `/goal clear` to cancel."
2329
+ ))
2330
+ return
2331
+
2332
+ # Clear
2333
+ if args.lower() in ("clear", "cancel", "stop", "off"):
2334
+ loop.clear_goal()
2335
+ await self._mount_and_scroll(UserCommandMessage(
2336
+ "Goal cleared."
2337
+ ))
2338
+ return
2339
+
2340
+ # Set a new goal
2341
+ # Read DRYDOCK_GOAL_MAX_ITERATIONS for the operator-overridable cap
2342
+ import os
2343
+ try:
2344
+ cap = int(os.environ.get("DRYDOCK_GOAL_MAX_ITERATIONS", "20"))
2345
+ if cap < 1:
2346
+ cap = 20
2347
+ except ValueError:
2348
+ cap = 20
2349
+ loop.set_goal(args, max_iterations=cap)
2350
+ await self._mount_and_scroll(UserCommandMessage(
2351
+ f"**Goal set:** {args}\n\n"
2352
+ f"After each turn, a fast evaluator will check whether the "
2353
+ f"condition holds. If not, drydock will keep working "
2354
+ f"automatically (up to {cap} turns). The goal will clear "
2355
+ f"once met. Use `/goal` to check status, `/goal clear` to "
2356
+ f"cancel."
2357
+ ))
2358
+
2207
2359
  async def _undo_last_turn(self) -> None:
2208
2360
  """Roll back the last user→assistant turn without wiping the
2209
2361
  whole session. Safer alternative to /clear when an error
@@ -4373,6 +4373,86 @@ or replace freely; future sessions will respect your edits._
4373
4373
  def set_user_input_callback(self, callback: UserInputCallback) -> None:
4374
4374
  self.user_input_callback = callback
4375
4375
 
4376
+ # ------------------------------------------------------------------
4377
+ # Goal pursuit (Claude Code /goal feature) — see drydock/core/goal.py
4378
+ # ------------------------------------------------------------------
4379
+
4380
+ def set_goal(self, condition: str, max_iterations: int = 20) -> None:
4381
+ """Activate goal-pursuit mode. The TUI calls this when the user
4382
+ types `/goal <condition>`. The agent loop itself doesn't act on
4383
+ the goal — the TUI's post-turn hook checks `self.goal` and
4384
+ decides whether to inject a continuation prompt."""
4385
+ from drydock.core.goal import GoalState
4386
+ self.goal = GoalState(
4387
+ condition=condition.strip(),
4388
+ max_iterations=max_iterations,
4389
+ )
4390
+ logger.warning(
4391
+ "[goal] activated: %r (cap=%d turns)",
4392
+ condition[:80], max_iterations,
4393
+ )
4394
+
4395
+ def clear_goal(self) -> None:
4396
+ """Cancel goal-pursuit. Idempotent."""
4397
+ if getattr(self, "goal", None) is not None:
4398
+ logger.warning("[goal] cleared")
4399
+ self.goal = None
4400
+
4401
+ async def evaluate_goal(self) -> tuple[str, str]:
4402
+ """Ask the model whether the active goal has been met.
4403
+
4404
+ Returns (verdict, reasoning) where verdict ∈ {"YES", "NO", "ERROR"}.
4405
+ ERROR means the call itself failed or the response couldn't be
4406
+ parsed — caller should treat as NO and continue (or, after a
4407
+ threshold of ERRORs in a row, clear the goal as a safety hatch).
4408
+ """
4409
+ from drydock.core.goal import (
4410
+ EVALUATOR_SYSTEM_PROMPT,
4411
+ build_evaluator_prompt,
4412
+ collect_recent_message_snippets,
4413
+ parse_verdict,
4414
+ )
4415
+ goal = getattr(self, "goal", None)
4416
+ if goal is None or not goal.active:
4417
+ return ("ERROR", "no active goal")
4418
+
4419
+ snippets = collect_recent_message_snippets(self.messages, n=8)
4420
+ user_prompt = build_evaluator_prompt(goal, snippets)
4421
+
4422
+ eval_messages = [
4423
+ LLMMessage(role=Role.system, content=EVALUATOR_SYSTEM_PROMPT),
4424
+ LLMMessage(role=Role.user, content=user_prompt),
4425
+ ]
4426
+ active_model = self.config.get_active_model()
4427
+ try:
4428
+ # Tight budget — evaluator returns ~30 tokens at most.
4429
+ # Temperature low for determinism. No tools.
4430
+ result = await self.backend.complete(
4431
+ model=active_model,
4432
+ messages=eval_messages,
4433
+ temperature=0.0,
4434
+ tools=[],
4435
+ tool_choice=None,
4436
+ extra_headers=self._get_extra_headers(
4437
+ self.config.get_active_provider()
4438
+ ),
4439
+ max_tokens=120,
4440
+ metadata=None,
4441
+ )
4442
+ except Exception as e: # noqa: BLE001 — never crash the TUI on eval error
4443
+ logger.warning("[goal] evaluator call failed: %s", e)
4444
+ return ("ERROR", f"evaluator backend error: {e!s}"[:200])
4445
+
4446
+ raw = (result.message.content or "").strip()
4447
+ verdict, reasoning = parse_verdict(raw)
4448
+ goal.last_verdict = verdict
4449
+ goal.last_evaluator_reasoning = reasoning
4450
+ logger.warning(
4451
+ "[goal] verdict=%s iter=%d/%d reason=%r",
4452
+ verdict, goal.iterations, goal.max_iterations, reasoning[:120],
4453
+ )
4454
+ return (verdict, reasoning)
4455
+
4376
4456
  async def undo_last_turn(self) -> tuple[bool, str]:
4377
4457
  """Rewind history past the LAST user message, dropping the
4378
4458
  assistant turn (and any tool results) it triggered AND the
@@ -4479,6 +4559,10 @@ or replace freely; future sessions will respect your edits._
4479
4559
  self._empty_nudge_last_user_idx = -1
4480
4560
  self._total_error_rounds = 0
4481
4561
  self._read_file_state = {}
4562
+ # /goal state: None means no active goal. Cleared by /clear and
4563
+ # /compact since the goal is session-scoped and a fresh session
4564
+ # shouldn't inherit the prior pursuit.
4565
+ self.goal = None
4482
4566
 
4483
4567
  async def compact(self) -> str:
4484
4568
  try:
@@ -0,0 +1,147 @@
1
+ """Goal pursuit — autonomous turn-after-turn work toward a condition.
2
+
3
+ Mirrors the Claude Code `/goal` feature. The user sets a completion
4
+ condition; after every turn, a small evaluator model decides whether
5
+ the condition holds. If not, drydock injects a continuation prompt
6
+ and runs another turn. The goal clears automatically once met.
7
+
8
+ Design notes:
9
+ - Iteration cap (default 20) prevents infinite loops on unverifiable
10
+ or impossible goals.
11
+ - Evaluator uses the same provider/model as the agent loop. A small
12
+ dedicated model would be cleaner but complicates local deployment.
13
+ The evaluator prompt is tight: it returns a single YES/NO token.
14
+ - The continuation prompt is synthesised — same shape as the existing
15
+ DRYDOCK_AUTO_CONTINUE mechanism — but tagged with the goal so the
16
+ main agent loop knows we're on a goal turn, not a user turn.
17
+ - Status (`/goal` with no args), set (`/goal <condition>`), and
18
+ clear (`/goal clear`) live in commands.py; this module owns the
19
+ state, evaluation, and continuation-prompt synthesis.
20
+ """
21
+ from __future__ import annotations
22
+
23
+ import logging
24
+ from dataclasses import dataclass, field
25
+
26
+ logger = logging.getLogger("drydock.goal")
27
+
28
+
29
+ @dataclass
30
+ class GoalState:
31
+ """Per-session goal state. Owned by the TUI / AgentLoop wrapper."""
32
+
33
+ condition: str
34
+ iterations: int = 0
35
+ # Conservative cap — covers most realistic workflows (per-turn ~30-80s
36
+ # on Gemma 4, so 20 turns ~10-25 min) without letting a runaway goal
37
+ # burn the whole afternoon. Operator can override.
38
+ max_iterations: int = 20
39
+ last_verdict: str = "" # "YES" | "NO" | "ERROR" | "" before first eval
40
+ last_evaluator_reasoning: str = ""
41
+
42
+ @property
43
+ def active(self) -> bool:
44
+ return bool(self.condition.strip())
45
+
46
+ @property
47
+ def remaining(self) -> int:
48
+ return max(0, self.max_iterations - self.iterations)
49
+
50
+
51
+ # ── Evaluation prompt ───────────────────────────────────────────────────
52
+
53
+ EVALUATOR_SYSTEM_PROMPT = (
54
+ "You are a goal-completion evaluator. You read a goal condition "
55
+ "plus the recent conversation between a user and a coding agent, "
56
+ "and you decide whether the goal has been met.\n\n"
57
+ "Output rules (STRICT):\n"
58
+ "1. Your FIRST line must be exactly `VERDICT: YES` or `VERDICT: NO`.\n"
59
+ "2. Your SECOND line should be a one-sentence reason (≤120 chars).\n"
60
+ "3. Output NOTHING else. No preamble, no markdown, no quotes.\n\n"
61
+ "Be conservative — only say YES if the conversation contains "
62
+ "concrete evidence the goal is satisfied. Tool output, test "
63
+ "results, file contents, or explicit confirmation from the agent. "
64
+ "Plans, intentions, and 'I will' statements are NOT evidence."
65
+ )
66
+
67
+
68
+ def build_evaluator_prompt(goal: GoalState, recent_messages: list[str]) -> str:
69
+ """Render the evaluator user prompt from the goal + last N msgs."""
70
+ convo = "\n\n---\n\n".join(recent_messages[-12:])
71
+ if len(convo) > 8000:
72
+ convo = convo[:8000] + "\n[... earlier turns truncated]"
73
+ return (
74
+ f"GOAL CONDITION:\n{goal.condition}\n\n"
75
+ f"RECENT CONVERSATION:\n{convo}\n\n"
76
+ f"Has the goal been met? Respond with VERDICT: YES or VERDICT: NO."
77
+ )
78
+
79
+
80
+ def parse_verdict(raw: str) -> tuple[str, str]:
81
+ """Parse an evaluator response into (verdict, reasoning).
82
+
83
+ verdict ∈ {"YES", "NO", "ERROR"}.
84
+ """
85
+ if not raw:
86
+ return ("ERROR", "evaluator returned empty response")
87
+ lines = [l.strip() for l in raw.splitlines() if l.strip()]
88
+ if not lines:
89
+ return ("ERROR", "evaluator returned only whitespace")
90
+ first = lines[0].upper()
91
+ reasoning = lines[1] if len(lines) > 1 else ""
92
+ # Accept both strict ("VERDICT: YES") and lenient ("YES.") forms
93
+ if first.startswith("VERDICT:"):
94
+ verdict_token = first.replace("VERDICT:", "").strip().rstrip(".").strip()
95
+ else:
96
+ verdict_token = first.rstrip(".").strip()
97
+ if verdict_token.startswith("YES"):
98
+ return ("YES", reasoning)
99
+ if verdict_token.startswith("NO"):
100
+ return ("NO", reasoning)
101
+ return ("ERROR", f"unrecognised verdict token: {first[:60]!r}")
102
+
103
+
104
+ def make_continuation_prompt(goal: GoalState) -> str:
105
+ """The synthesised user message that keeps the agent working.
106
+
107
+ Kept short so it doesn't dominate the next turn's context. The
108
+ main agent loop's system prompt already explains the agent's
109
+ role; the continuation just refocuses on the goal.
110
+ """
111
+ return (
112
+ f"Continue working toward the goal: {goal.condition}\n"
113
+ f"(Iteration {goal.iterations}/{goal.max_iterations}. "
114
+ f"Goal will auto-clear when met.)"
115
+ )
116
+
117
+
118
+ # ── Snippet extraction for the evaluator ────────────────────────────────
119
+
120
+ def collect_recent_message_snippets(messages, n: int = 8) -> list[str]:
121
+ """Render the last n messages as short strings the evaluator can
122
+ read. Truncates each to ≤600 chars so the evaluator prompt stays
123
+ bounded.
124
+
125
+ `messages` is the AgentLoop's `self.messages` — a sequence of
126
+ LLMMessage objects with .role and .content.
127
+ """
128
+ out: list[str] = []
129
+ # Skip the system message (index 0); take the tail.
130
+ tail = list(messages)[-n:] if len(messages) > n else list(messages)
131
+ for m in tail:
132
+ role = getattr(m, "role", "?")
133
+ role_str = getattr(role, "value", None) or str(role)
134
+ content = getattr(m, "content", "") or ""
135
+ # Include tool-call summaries since they're often the evidence
136
+ # the evaluator needs (test pass, file written, etc.).
137
+ tcs = getattr(m, "tool_calls", None) or []
138
+ if tcs and not content:
139
+ tc_summary = ", ".join(
140
+ getattr(getattr(tc, "function", None), "name", "?")
141
+ for tc in tcs
142
+ )
143
+ content = f"[tool calls: {tc_summary}]"
144
+ if len(content) > 600:
145
+ content = content[:600] + "...[truncated]"
146
+ out.append(f"[{role_str}] {content}")
147
+ return out
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.8.45"
3
+ version = "2.8.46"
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"
@@ -0,0 +1,203 @@
1
+ """Tests for the /goal autonomous-pursuit feature."""
2
+ from __future__ import annotations
3
+
4
+ from unittest.mock import MagicMock
5
+
6
+ import pytest
7
+
8
+ from drydock.core.goal import (
9
+ EVALUATOR_SYSTEM_PROMPT,
10
+ GoalState,
11
+ build_evaluator_prompt,
12
+ collect_recent_message_snippets,
13
+ make_continuation_prompt,
14
+ parse_verdict,
15
+ )
16
+
17
+
18
+ # ── GoalState ───────────────────────────────────────────────────────────
19
+
20
+ def test_goal_state_defaults():
21
+ g = GoalState(condition="All tests pass")
22
+ assert g.active is True
23
+ assert g.iterations == 0
24
+ assert g.max_iterations == 20
25
+ assert g.remaining == 20
26
+ assert g.last_verdict == ""
27
+
28
+
29
+ def test_goal_state_inactive_when_empty():
30
+ g = GoalState(condition="")
31
+ assert g.active is False
32
+ g = GoalState(condition=" ")
33
+ assert g.active is False
34
+
35
+
36
+ def test_goal_state_remaining_decreases():
37
+ g = GoalState(condition="X", max_iterations=5)
38
+ g.iterations = 3
39
+ assert g.remaining == 2
40
+ g.iterations = 10 # past cap
41
+ assert g.remaining == 0
42
+
43
+
44
+ # ── parse_verdict ───────────────────────────────────────────────────────
45
+
46
+ @pytest.mark.parametrize("raw,expected_verdict", [
47
+ ("VERDICT: YES\nAll tests pass.", "YES"),
48
+ ("VERDICT: NO\nThree tests still failing.", "NO"),
49
+ ("VERDICT:YES", "YES"),
50
+ ("verdict: yes\nreason", "YES"),
51
+ ("YES.", "YES"),
52
+ ("No.", "NO"),
53
+ ("yes\n", "YES"),
54
+ ])
55
+ def test_parse_verdict_recognises_clear_yes_no(raw, expected_verdict):
56
+ v, _ = parse_verdict(raw)
57
+ assert v == expected_verdict
58
+
59
+
60
+ def test_parse_verdict_returns_error_for_ambiguous():
61
+ v, reason = parse_verdict("maybe?")
62
+ assert v == "ERROR"
63
+ assert "unrecognised" in reason
64
+
65
+
66
+ def test_parse_verdict_empty():
67
+ v, reason = parse_verdict("")
68
+ assert v == "ERROR"
69
+
70
+
71
+ def test_parse_verdict_extracts_reasoning_from_second_line():
72
+ v, reason = parse_verdict("VERDICT: NO\nx.py:42 still raises TypeError")
73
+ assert v == "NO"
74
+ assert "x.py:42" in reason
75
+
76
+
77
+ # ── build_evaluator_prompt + system prompt ──────────────────────────────
78
+
79
+ def test_evaluator_system_prompt_requires_strict_format():
80
+ """The system prompt must constrain the evaluator output enough
81
+ that parse_verdict can read its FIRST line as VERDICT:YES/NO."""
82
+ assert "VERDICT: YES" in EVALUATOR_SYSTEM_PROMPT
83
+ assert "VERDICT: NO" in EVALUATOR_SYSTEM_PROMPT
84
+ assert "FIRST line" in EVALUATOR_SYSTEM_PROMPT
85
+
86
+
87
+ def test_build_evaluator_prompt_includes_goal_and_snippets():
88
+ g = GoalState(condition="x.py:42 returns 0 for empty input")
89
+ out = build_evaluator_prompt(g, ["[user] write fix", "[assistant] done"])
90
+ assert "x.py:42 returns 0 for empty input" in out
91
+ assert "[user]" in out
92
+ assert "[assistant]" in out
93
+
94
+
95
+ def test_build_evaluator_prompt_truncates_long_conversations():
96
+ g = GoalState(condition="X")
97
+ huge = ["[user] " + "Z" * 2000] * 10
98
+ out = build_evaluator_prompt(g, huge)
99
+ # The function caps total conversation context at 8000 chars
100
+ assert len(out) < 9000
101
+
102
+
103
+ # ── make_continuation_prompt ────────────────────────────────────────────
104
+
105
+ def test_continuation_prompt_mentions_goal_and_iteration():
106
+ g = GoalState(condition="All linters pass", max_iterations=10)
107
+ g.iterations = 4
108
+ out = make_continuation_prompt(g)
109
+ assert "All linters pass" in out
110
+ assert "4/10" in out
111
+ assert "auto-clear" in out
112
+
113
+
114
+ # ── collect_recent_message_snippets ─────────────────────────────────────
115
+
116
+ class _FakeRole:
117
+ def __init__(self, v):
118
+ self.value = v
119
+
120
+
121
+ class _FakeMsg:
122
+ def __init__(self, role, content="", tool_calls=None):
123
+ self.role = _FakeRole(role)
124
+ self.content = content
125
+ self.tool_calls = tool_calls
126
+
127
+
128
+ def test_collect_snippets_keeps_last_n_and_truncates_long():
129
+ msgs = [_FakeMsg("user", f"prompt {i}") for i in range(20)]
130
+ out = collect_recent_message_snippets(msgs, n=5)
131
+ assert len(out) == 5
132
+ assert "prompt 15" in out[0]
133
+ assert "prompt 19" in out[-1]
134
+
135
+
136
+ def test_collect_snippets_summarises_tool_calls_when_content_empty():
137
+ tc1 = MagicMock()
138
+ tc1.function.name = "read_file"
139
+ tc2 = MagicMock()
140
+ tc2.function.name = "bash"
141
+ msg = _FakeMsg("assistant", content="", tool_calls=[tc1, tc2])
142
+ out = collect_recent_message_snippets([msg], n=5)
143
+ assert len(out) == 1
144
+ assert "read_file" in out[0]
145
+ assert "bash" in out[0]
146
+
147
+
148
+ def test_collect_snippets_truncates_each_content_to_600():
149
+ msg = _FakeMsg("assistant", "x" * 2000)
150
+ out = collect_recent_message_snippets([msg], n=1)
151
+ assert len(out[0]) < 700 # role tag + 600 chars + truncation marker
152
+
153
+
154
+ # ── Command registry ────────────────────────────────────────────────────
155
+
156
+ def test_goal_command_registered():
157
+ from drydock.cli.commands import CommandRegistry
158
+ r = CommandRegistry()
159
+ cmd = r.commands.get("goal")
160
+ assert cmd is not None
161
+ assert "/goal" in cmd.aliases
162
+ assert cmd.handler == "_goal_command"
163
+
164
+
165
+ # ── AgentLoop set_goal / clear_goal / evaluate_goal API ────────────────
166
+
167
+ def test_agent_loop_exposes_goal_api():
168
+ from drydock.core.agent_loop import AgentLoop
169
+ assert callable(getattr(AgentLoop, "set_goal", None))
170
+ assert callable(getattr(AgentLoop, "clear_goal", None))
171
+ assert callable(getattr(AgentLoop, "evaluate_goal", None))
172
+
173
+
174
+ def test_set_goal_creates_active_state():
175
+ """Smoke test of set_goal/clear_goal on a stubbed AgentLoop."""
176
+ from drydock.core.agent_loop import AgentLoop
177
+ loop = MagicMock(spec=AgentLoop)
178
+ # bind the real methods
179
+ loop.set_goal = AgentLoop.set_goal.__get__(loop)
180
+ loop.clear_goal = AgentLoop.clear_goal.__get__(loop)
181
+ loop.goal = None
182
+
183
+ loop.set_goal("Make tests pass")
184
+ assert loop.goal is not None
185
+ assert loop.goal.active
186
+ assert loop.goal.condition == "Make tests pass"
187
+ assert loop.goal.max_iterations == 20
188
+
189
+ loop.set_goal("Different goal", max_iterations=5)
190
+ assert loop.goal.condition == "Different goal"
191
+ assert loop.goal.max_iterations == 5
192
+
193
+ loop.clear_goal()
194
+ assert loop.goal is None
195
+
196
+
197
+ def test_clear_goal_is_idempotent():
198
+ from drydock.core.agent_loop import AgentLoop
199
+ loop = MagicMock(spec=AgentLoop)
200
+ loop.clear_goal = AgentLoop.clear_goal.__get__(loop)
201
+ loop.goal = None
202
+ loop.clear_goal() # should not raise
203
+ assert loop.goal is None
@@ -1,5 +1,18 @@
1
1
  # Drydock Trip Log
2
2
 
3
+ ## 2026-05-16 13:00 UTC tick
4
+ - Stress: paused (.pause_stress sentinel active)
5
+ - Write rate: N/A (stress paused)
6
+ - HLE: 74/603 = 12.3% lifetime; burndown running (PID 2169324, physics batch, 10+ min elapsed)
7
+ - Admiral last 30 min: N/A (stress paused)
8
+ - vLLM 400s: 0 (llamacpp healthy, Q3_K_M + reasoning-budget=12000 + mmproj loaded)
9
+ - GH issues: 0 open (GH #23 closed by 4ef879a mmproj vision feat)
10
+ - Dispatch queue: harness=20 (all thinking_stall false-positives from autonomous_review.log re-classification; already addressed by 23f3530), curiosity=1977 pending
11
+ - Retrieval drain: 0 projects (all already ingested)
12
+ - Curiosity action: consumed 5168c5160c15cdf3 (robot arm timeout — empty prediction, addressed by TOOL_STOP_AFTER + reasoning-budget=12000 existing fixes; 320 hle_failure remain pending)
13
+ - Auto-solve: 120 no_extract events — Z3 hook running but geometry/visual HLE questions don't have extractable formulas (expected)
14
+ - Action this tick: no new fix committed — system healthy
15
+
3
16
  ## 2026-05-16 12:00 UTC tick
4
17
  - Stress: paused (.pause_stress sentinel active)
5
18
  - Write rate: N/A (stress paused)
@@ -1 +0,0 @@
1
- 2172060