drydock-cli 2.9.39__tar.gz → 2.9.42__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 (708) hide show
  1. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/PKG-INFO +1 -1
  2. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/config/_settings.py +12 -1
  3. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/prompts/__init__.py +1 -0
  4. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/prompts/gemma4.md +2 -0
  5. drydock_cli-2.9.42/drydock/core/prompts/gemma4_slim.md +121 -0
  6. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/verify_tool.py +13 -0
  7. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/pyproject.toml +1 -1
  8. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_verify_tool.py +35 -0
  9. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/uv.lock +1 -1
  10. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/.gitignore +0 -0
  11. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/LICENSE +0 -0
  12. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/NOTICE +0 -0
  13. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/README.md +0 -0
  14. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/distribution/zed/LICENSE +0 -0
  15. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/docs/README.md +0 -0
  16. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/__init__.py +0 -0
  17. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/__main__.py +0 -0
  18. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/acp/__init__.py +0 -0
  19. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/acp/acp_agent_loop.py +0 -0
  20. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/acp/acp_logger.py +0 -0
  21. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/acp/entrypoint.py +0 -0
  22. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/acp/tools/__init__.py +0 -0
  23. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/acp/tools/base.py +0 -0
  24. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/acp/tools/builtins/bash.py +0 -0
  25. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/acp/tools/builtins/read_file.py +0 -0
  26. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/acp/tools/builtins/search_replace.py +0 -0
  27. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/acp/tools/builtins/todo.py +0 -0
  28. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/acp/tools/builtins/write_file.py +0 -0
  29. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/acp/tools/session_update.py +0 -0
  30. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/acp/utils.py +0 -0
  31. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/admiral/__init__.py +0 -0
  32. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/admiral/detectors.py +0 -0
  33. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/admiral/detectors_proposed.py +0 -0
  34. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/admiral/history.py +0 -0
  35. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/admiral/interventions.py +0 -0
  36. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/admiral/llm_analyzer.py +0 -0
  37. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/admiral/metrics.py +0 -0
  38. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/admiral/opus_escalator.py +0 -0
  39. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/admiral/persistence.py +0 -0
  40. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/admiral/policy.py +0 -0
  41. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/admiral/proposer.py +0 -0
  42. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/admiral/stager.py +0 -0
  43. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/admiral/task_classifier.py +0 -0
  44. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/admiral/tuning.py +0 -0
  45. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/admiral/validator.py +0 -0
  46. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/admiral/worker.py +0 -0
  47. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/__init__.py +0 -0
  48. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/autocompletion/__init__.py +0 -0
  49. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/autocompletion/base.py +0 -0
  50. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/autocompletion/path_completion.py +0 -0
  51. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/autocompletion/slash_command.py +0 -0
  52. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/cli.py +0 -0
  53. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/clipboard.py +0 -0
  54. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/commands.py +0 -0
  55. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/entrypoint.py +0 -0
  56. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/fix_windows_path.py +0 -0
  57. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/history_manager.py +0 -0
  58. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  59. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  60. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  61. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/terminal_setup.py +0 -0
  62. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/__init__.py +0 -0
  63. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  64. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/app.py +0 -0
  65. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/app.tcss +0 -0
  66. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/external_editor.py +0 -0
  67. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  68. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  69. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  70. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  71. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  72. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  73. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  74. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  75. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  76. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  77. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  78. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  79. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  80. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  81. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  82. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  83. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  84. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  85. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  86. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  87. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  88. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  89. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  90. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  91. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  92. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  93. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  94. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  95. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  96. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  97. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  98. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  99. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  100. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  101. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  102. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  103. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  104. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/windowing/history.py +0 -0
  105. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  106. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/textual_ui/windowing/state.py +0 -0
  107. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/update_notifier/__init__.py +0 -0
  108. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  109. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  110. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  111. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  112. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  113. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/update_notifier/update.py +0 -0
  114. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/cli/update_notifier/whats_new.py +0 -0
  115. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/__init__.py +0 -0
  116. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/agent_loop.py +0 -0
  117. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/agents/__init__.py +0 -0
  118. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/agents/manager.py +0 -0
  119. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/agents/models.py +0 -0
  120. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/auth/__init__.py +0 -0
  121. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/auth/crypto.py +0 -0
  122. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/auth/github.py +0 -0
  123. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/auto_solve.py +0 -0
  124. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/autocompletion/__init__.py +0 -0
  125. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/autocompletion/completers.py +0 -0
  126. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  127. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  128. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  129. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  130. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  131. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/autocompletion/fuzzy.py +0 -0
  132. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/autocompletion/path_prompt.py +0 -0
  133. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  134. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/build_orchestrator.py +0 -0
  135. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/checkpoint.py +0 -0
  136. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/classifier/__init__.py +0 -0
  137. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/classifier/__main__.py +0 -0
  138. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/classifier/classifier.py +0 -0
  139. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/classifier/dispatcher.py +0 -0
  140. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/classifier/rules.py +0 -0
  141. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/classifier/signal.py +0 -0
  142. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/config/__init__.py +0 -0
  143. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/config/_dotenv.py +0 -0
  144. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/config/doctor.py +0 -0
  145. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/config/harness_files/__init__.py +0 -0
  146. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  147. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/config/harness_files/_paths.py +0 -0
  148. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/config/local_detect.py +0 -0
  149. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/config/migrate.py +0 -0
  150. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/constraint_extract.py +0 -0
  151. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/constraint_hint.py +0 -0
  152. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/consultant.py +0 -0
  153. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/context_recovery.py +0 -0
  154. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/drydock_states.py +0 -0
  155. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/goal.py +0 -0
  156. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/hooks.py +0 -0
  157. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/llm/__init__.py +0 -0
  158. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/llm/backend/anthropic.py +0 -0
  159. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/llm/backend/base.py +0 -0
  160. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/llm/backend/factory.py +0 -0
  161. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/llm/backend/generic.py +0 -0
  162. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/llm/backend/mistral.py +0 -0
  163. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  164. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/llm/backend/vertex.py +0 -0
  165. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/llm/exceptions.py +0 -0
  166. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/llm/format.py +0 -0
  167. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/llm/message_utils.py +0 -0
  168. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/llm/types.py +0 -0
  169. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/logger.py +0 -0
  170. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/middleware.py +0 -0
  171. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/output_formatters.py +0 -0
  172. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/paths/__init__.py +0 -0
  173. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/paths/_drydock_home.py +0 -0
  174. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/paths/_local_config_walk.py +0 -0
  175. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/paths/conventions.py +0 -0
  176. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/plan_session.py +0 -0
  177. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/plugins.py +0 -0
  178. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/programmatic.py +0 -0
  179. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/prompts/builder.md +0 -0
  180. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/prompts/cli.md +0 -0
  181. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/prompts/compact.md +0 -0
  182. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/prompts/dangerous_directory.md +0 -0
  183. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/prompts/diagnostic.md +0 -0
  184. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/prompts/explore.md +0 -0
  185. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/prompts/gemma4_math.md +0 -0
  186. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/prompts/planner.md +0 -0
  187. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/prompts/project_context.md +0 -0
  188. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/prompts/tests.md +0 -0
  189. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/proxy_setup.py +0 -0
  190. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/session/agent_memory.py +0 -0
  191. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/session/checkpoints.py +0 -0
  192. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/session/session_loader.py +0 -0
  193. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/session/session_logger.py +0 -0
  194. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/session/session_migration.py +0 -0
  195. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/session/state_file.py +0 -0
  196. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/session_checker.py +0 -0
  197. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/skills/__init__.py +0 -0
  198. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/skills/manager.py +0 -0
  199. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/skills/models.py +0 -0
  200. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/skills/parser.py +0 -0
  201. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/slug.py +0 -0
  202. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/spec_check.py +0 -0
  203. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/steering_hook.py +0 -0
  204. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/system_prompt.py +0 -0
  205. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/telemetry/__init__.py +0 -0
  206. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/telemetry/send.py +0 -0
  207. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/teleport/errors.py +0 -0
  208. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/teleport/git.py +0 -0
  209. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/teleport/nuage.py +0 -0
  210. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/teleport/teleport.py +0 -0
  211. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/teleport/types.py +0 -0
  212. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/base.py +0 -0
  213. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/_task_manager.py +0 -0
  214. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/algebra_tool.py +0 -0
  215. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  216. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/bash.py +0 -0
  217. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/chemistry_tool.py +0 -0
  218. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/count_tool.py +0 -0
  219. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/cron.py +0 -0
  220. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  221. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/glob_tool.py +0 -0
  222. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/grep.py +0 -0
  223. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  224. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/linear_algebra_tool.py +0 -0
  225. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/logic_tool.py +0 -0
  226. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/lsp.py +0 -0
  227. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/math_tool.py +0 -0
  228. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  229. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/mechanical_rename.py +0 -0
  230. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/memory_tool.py +0 -0
  231. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  232. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/number_theory_tool.py +0 -0
  233. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/powershell.py +0 -0
  234. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prolog_tool.py +0 -0
  235. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  236. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  237. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  238. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  239. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  240. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  241. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  242. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  243. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  244. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  245. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  246. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  247. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
  248. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  249. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  250. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/task.md +0 -0
  251. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  252. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  253. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  254. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  255. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  256. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  257. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  258. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/read_file.py +0 -0
  259. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/retrieve.py +0 -0
  260. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/search_replace.py +0 -0
  261. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/set_tool.py +0 -0
  262. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/solve_tool.py +0 -0
  263. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/stats_tool.py +0 -0
  264. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/task.py +0 -0
  265. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/todo.py +0 -0
  266. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/tool_search.py +0 -0
  267. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/units_tool.py +0 -0
  268. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/webfetch.py +0 -0
  269. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/websearch.py +0 -0
  270. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/worktree.py +0 -0
  271. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/builtins/write_file.py +0 -0
  272. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/injection_guard.py +0 -0
  273. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/manager.py +0 -0
  274. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/mcp/__init__.py +0 -0
  275. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/mcp/registry.py +0 -0
  276. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/mcp/tools.py +0 -0
  277. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/mcp_sampling.py +0 -0
  278. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/ui.py +0 -0
  279. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/tools/utils.py +0 -0
  280. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/trusted_folders.py +0 -0
  281. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/types.py +0 -0
  282. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/core/utils.py +0 -0
  283. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/curiosity/__init__.py +0 -0
  284. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/curiosity/__main__.py +0 -0
  285. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/curiosity/gap_detector.py +0 -0
  286. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/curiosity/ingest.py +0 -0
  287. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/curiosity/item.py +0 -0
  288. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/curiosity/queue.py +0 -0
  289. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/curiosity/surprise.py +0 -0
  290. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/graphrag/__init__.py +0 -0
  291. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/graphrag/__main__.py +0 -0
  292. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/graphrag/code_indexer.py +0 -0
  293. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/graphrag/retriever.py +0 -0
  294. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/graphrag/storage.py +0 -0
  295. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/graphrag/text_indexer.py +0 -0
  296. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/setup/onboarding/__init__.py +0 -0
  297. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/setup/onboarding/base.py +0 -0
  298. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/setup/onboarding/onboarding.tcss +0 -0
  299. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/setup/onboarding/screens/__init__.py +0 -0
  300. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/setup/onboarding/screens/api_key.py +0 -0
  301. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/setup/onboarding/screens/choice.py +0 -0
  302. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/setup/onboarding/screens/local_model.py +0 -0
  303. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/setup/onboarding/screens/welcome.py +0 -0
  304. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  305. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  306. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/__init__.py +0 -0
  307. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/api-design/SKILL.md +0 -0
  308. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/audit-tests/SKILL.md +0 -0
  309. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/batch/SKILL.md +0 -0
  310. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/checklist/SKILL.md +0 -0
  311. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/commit-code/SKILL.md +0 -0
  312. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/constraint-reasoning/SKILL.md +0 -0
  313. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/context-summary/SKILL.md +0 -0
  314. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/create-presentation/SKILL.md +0 -0
  315. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/deep-research/SKILL.md +0 -0
  316. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/deploy/SKILL.md +0 -0
  317. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/diff-review/SKILL.md +0 -0
  318. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/doc-gen/SKILL.md +0 -0
  319. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/explain-code/SKILL.md +0 -0
  320. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/explore-code/SKILL.md +0 -0
  321. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/fix-issue/SKILL.md +0 -0
  322. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/git-ops/SKILL.md +0 -0
  323. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/init-project/SKILL.md +0 -0
  324. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/investigate/SKILL.md +0 -0
  325. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/logic/SKILL.md +0 -0
  326. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/logic/assets/cheat_sheet_full.txt +0 -0
  327. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/loop/SKILL.md +0 -0
  328. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/migrate/SKILL.md +0 -0
  329. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/perf-analyze/SKILL.md +0 -0
  330. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/plan-impl/SKILL.md +0 -0
  331. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/pr-review/SKILL.md +0 -0
  332. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/prove/SKILL.md +0 -0
  333. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/refactor/SKILL.md +0 -0
  334. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/regex-help/SKILL.md +0 -0
  335. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/review/SKILL.md +0 -0
  336. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/security-review/SKILL.md +0 -0
  337. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/ship/SKILL.md +0 -0
  338. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/simplify/SKILL.md +0 -0
  339. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/strong-tests/SKILL.md +0 -0
  340. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/skills/test-verify/SKILL.md +0 -0
  341. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/steering/__init__.py +0 -0
  342. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/steering/__main__.py +0 -0
  343. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/steering/applier.py +0 -0
  344. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/steering/config.py +0 -0
  345. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/steering/registry.py +0 -0
  346. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/steering/sandbox.py +0 -0
  347. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/steering/sidecar/__init__.py +0 -0
  348. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/steering/sidecar/header_parser.py +0 -0
  349. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/steering/sidecar/hooks.py +0 -0
  350. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/steering/sidecar/loader.py +0 -0
  351. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/steering/sidecar/server.py +0 -0
  352. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/steering/train/__init__.py +0 -0
  353. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/steering/train/capture.py +0 -0
  354. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/steering/train/compute_vector.py +0 -0
  355. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/steering/train/extract_pairs.py +0 -0
  356. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/steering/train/scan_sessions.py +0 -0
  357. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/steering/vectors.py +0 -0
  358. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/drydock/whats_new.md +0 -0
  359. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/install_tests/README.md +0 -0
  360. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/install_tests/publish/README.md +0 -0
  361. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/install_tests/windows/README.md +0 -0
  362. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/scripts/README.md +0 -0
  363. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/scripts/_archived_eval_harness/README.md +0 -0
  364. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/scripts/llm/README.md +0 -0
  365. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/__init__.py +0 -0
  366. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/conftest.py +0 -0
  367. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/test_acp.py +0 -0
  368. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/test_agent_thought.py +0 -0
  369. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/test_bash.py +0 -0
  370. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/test_compact_session_updates.py +0 -0
  371. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/test_content.py +0 -0
  372. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/test_initialize.py +0 -0
  373. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/test_list_sessions.py +0 -0
  374. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/test_load_session.py +0 -0
  375. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/test_multi_session.py +0 -0
  376. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/test_new_session.py +0 -0
  377. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/test_proxy_setup_acp.py +0 -0
  378. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/test_read_file.py +0 -0
  379. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/test_search_replace.py +0 -0
  380. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/test_set_config_option.py +0 -0
  381. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/test_set_mode.py +0 -0
  382. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/test_set_model.py +0 -0
  383. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/test_tool_call_session_update.py +0 -0
  384. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/test_utils.py +0 -0
  385. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/acp/test_write_file.py +0 -0
  386. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/autocompletion/conftest.py +0 -0
  387. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/autocompletion/test_file_indexer.py +0 -0
  388. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/autocompletion/test_fuzzy.py +0 -0
  389. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  390. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  391. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/autocompletion/test_path_completion_controller.py +0 -0
  392. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  393. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/autocompletion/test_slash_command_controller.py +0 -0
  394. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  395. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/backend/__init__.py +0 -0
  396. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/backend/data/__init__.py +0 -0
  397. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/backend/data/fireworks.py +0 -0
  398. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/backend/data/mistral.py +0 -0
  399. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/backend/test_anthropic_adapter.py +0 -0
  400. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/backend/test_backend.py +0 -0
  401. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  402. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/backend/test_reasoning_adapter.py +0 -0
  403. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  404. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  405. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  406. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  407. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/cli/test_bell_notifications.py +0 -0
  408. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/cli/test_braille_renderer.py +0 -0
  409. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/cli/test_clipboard.py +0 -0
  410. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/cli/test_commands.py +0 -0
  411. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/cli/test_copy_shortcuts.py +0 -0
  412. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/cli/test_external_editor.py +0 -0
  413. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/cli/test_no_markup_static.py +0 -0
  414. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/cli/test_question_app.py +0 -0
  415. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/cli/test_spinner.py +0 -0
  416. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/cli/test_switching_mode.py +0 -0
  417. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  418. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  419. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/cli/test_ui_session_resume.py +0 -0
  420. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/cli/test_ui_skill_dispatch.py +0 -0
  421. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/cli/textual_ui/__init__.py +0 -0
  422. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/cli/textual_ui/test_session_picker.py +0 -0
  423. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/conftest.py +0 -0
  424. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/core/test_agents.py +0 -0
  425. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/core/test_auth_crypto.py +0 -0
  426. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/core/test_auth_github.py +0 -0
  427. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  428. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  429. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/core/test_config_load_dotenv.py +0 -0
  430. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/core/test_config_paths.py +0 -0
  431. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/core/test_config_resolution.py +0 -0
  432. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/core/test_file_logging.py +0 -0
  433. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/core/test_plan_session.py +0 -0
  434. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/core/test_proxy_setup.py +0 -0
  435. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/core/test_slug.py +0 -0
  436. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/core/test_telemetry_send.py +0 -0
  437. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/core/test_teleport_git.py +0 -0
  438. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/core/test_teleport_nuage.py +0 -0
  439. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/core/test_teleport_service.py +0 -0
  440. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/core/test_trusted_folders.py +0 -0
  441. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/core/test_utils.py +0 -0
  442. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/e2e/common.py +0 -0
  443. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/e2e/conftest.py +0 -0
  444. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/e2e/mock_server.py +0 -0
  445. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  446. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/e2e/test_cli_tui_streaming.py +0 -0
  447. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  448. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/fixtures/doc_qa_system_prd.md +0 -0
  449. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/mock/__init__.py +0 -0
  450. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/mock/mock_backend_factory.py +0 -0
  451. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/mock/mock_entrypoint.py +0 -0
  452. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/mock/utils.py +0 -0
  453. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/onboarding/test_run_onboarding.py +0 -0
  454. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/onboarding/test_ui_onboarding.py +0 -0
  455. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/session/test_session_loader.py +0 -0
  456. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/session/test_session_logger.py +0 -0
  457. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/session/test_session_migration.py +0 -0
  458. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/skills/conftest.py +0 -0
  459. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/skills/test_manager.py +0 -0
  460. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/skills/test_models.py +0 -0
  461. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/skills/test_parser.py +0 -0
  462. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  463. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  464. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  465. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  466. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  467. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  468. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  469. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  470. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  471. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  472. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  473. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  474. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  475. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  476. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  477. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  478. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  479. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  480. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  481. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  482. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  483. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  484. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  485. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  486. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  487. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  488. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  489. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  490. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  491. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  492. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  493. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  494. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  495. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  496. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  497. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  498. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  499. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  500. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  501. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  502. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  503. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  504. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  505. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  506. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  507. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  508. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  509. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  510. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  511. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  512. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  513. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  514. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  515. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  516. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  517. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  518. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  519. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  520. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  521. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  522. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/base_snapshot_test_app.py +0 -0
  523. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/conftest.py +0 -0
  524. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/snap_compare.py +0 -0
  525. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  526. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  527. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  528. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  529. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  530. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  531. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  532. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  533. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  534. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  535. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  536. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  537. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  538. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  539. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/stubs/fake_backend.py +0 -0
  540. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/stubs/fake_client.py +0 -0
  541. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/stubs/fake_tool.py +0 -0
  542. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_admiral.py +0 -0
  543. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
  544. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_admiral_intervention_outcome.py +0 -0
  545. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_admiral_phase3.py +0 -0
  546. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_admiral_proposed.py +0 -0
  547. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_admiral_session_id.py +0 -0
  548. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_admiral_struggle_dedup.py +0 -0
  549. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_agent_auto_compact.py +0 -0
  550. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_agent_backend.py +0 -0
  551. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_agent_observer_streaming.py +0 -0
  552. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_agent_stats.py +0 -0
  553. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_agent_tasks.py +0 -0
  554. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_agent_tool_call.py +0 -0
  555. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_agents.py +0 -0
  556. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_algebra_tool.py +0 -0
  557. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_api_error_recovery.py +0 -0
  558. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_approval_modal_stray_keys.py +0 -0
  559. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_auto_retrieve_soft_nudge.py +0 -0
  560. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_auto_solve.py +0 -0
  561. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_bank_build.py +0 -0
  562. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_bank_debug.py +0 -0
  563. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_bank_multiagent.py +0 -0
  564. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_bank_prd.py +0 -0
  565. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_bank_prd_extended.py +0 -0
  566. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_bank_tools.py +0 -0
  567. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_bank_update.py +0 -0
  568. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_build_projects.py +0 -0
  569. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_checkpoint.py +0 -0
  570. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_chemistry_tool.py +0 -0
  571. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_classifier.py +0 -0
  572. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_cli_programmatic_preload.py +0 -0
  573. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_config_migration.py +0 -0
  574. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_constraint_extract.py +0 -0
  575. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_constraint_hint.py +0 -0
  576. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_context_recovery.py +0 -0
  577. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_count_tool.py +0 -0
  578. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_curiosity.py +0 -0
  579. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_current_bugs.py +0 -0
  580. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_dispatch_report.py +0 -0
  581. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_dispatcher.py +0 -0
  582. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_drydock_regression.py +0 -0
  583. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_drydock_tasks.py +0 -0
  584. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  585. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_full_regression.py +0 -0
  586. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_gemma4_anti_loop_migration.py +0 -0
  587. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_goal.py +0 -0
  588. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_graphrag.py +0 -0
  589. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_graphrag_worked_examples.py +0 -0
  590. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_hallucinated_tool_suppression.py +0 -0
  591. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_history_manager.py +0 -0
  592. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_hle_aggregate.py +0 -0
  593. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_integration.py +0 -0
  594. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_issue_fixes.py +0 -0
  595. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_linear_algebra_tool.py +0 -0
  596. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_local_detect.py +0 -0
  597. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_logic_tool.py +0 -0
  598. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_loop_detection.py +0 -0
  599. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_math_docs_lazy_injection.py +0 -0
  600. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_math_tool.py +0 -0
  601. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_mcp_settings.py +0 -0
  602. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_mcp_stdio_command_normalization.py +0 -0
  603. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_memory_tool.py +0 -0
  604. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_message_id.py +0 -0
  605. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_message_merging.py +0 -0
  606. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_middleware.py +0 -0
  607. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_multi_agent.py +0 -0
  608. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_number_theory_tool.py +0 -0
  609. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_prolog_tool.py +0 -0
  610. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_read_file_not_found_listing.py +0 -0
  611. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_read_file_notebook_slim.py +0 -0
  612. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_real_failures.py +0 -0
  613. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_real_issues.py +0 -0
  614. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_real_workflow.py +0 -0
  615. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_reasoning_content.py +0 -0
  616. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_rejudge_hle.py +0 -0
  617. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_retrieval_consumer.py +0 -0
  618. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_retrieve_project_detection.py +0 -0
  619. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_retrieve_tool.py +0 -0
  620. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_safe_parse_tool_args.py +0 -0
  621. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_search_replace_args_not_truncated.py +0 -0
  622. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_search_replace_syntax_rollback.py +0 -0
  623. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_session_log_event.py +0 -0
  624. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_session_publish_on_resume.py +0 -0
  625. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_set_tool.py +0 -0
  626. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_smoke.py +0 -0
  627. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_solve_tool.py +0 -0
  628. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_specialist_math_tools_hidden.py +0 -0
  629. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_stats_tool.py +0 -0
  630. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_steering.py +0 -0
  631. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_steering_capture.py +0 -0
  632. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_steering_compute_vector.py +0 -0
  633. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_steering_extract_pairs.py +0 -0
  634. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_steering_hook.py +0 -0
  635. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_steering_sidecar_chat_inputs.py +0 -0
  636. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_steering_sidecar_hooks.py +0 -0
  637. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_system_prompt.py +0 -0
  638. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_tagged_text.py +0 -0
  639. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_task_complete_nudge.py +0 -0
  640. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_tool_args.py +0 -0
  641. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_tool_call_loops_regression_suite.py +0 -0
  642. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_tool_stop_injected_scope.py +0 -0
  643. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_truncate_args_valid_json.py +0 -0
  644. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_truncated_arg_path_hint.py +0 -0
  645. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_truncated_search_replace_escalation.py +0 -0
  646. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_truncated_write_escalation.py +0 -0
  647. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_ui_external_editor.py +0 -0
  648. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_ui_input_history.py +0 -0
  649. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_units_tool.py +0 -0
  650. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_user_issues.py +0 -0
  651. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_validation_error_scrub.py +0 -0
  652. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_wall_of_text_rescue.py +0 -0
  653. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_workloads.py +0 -0
  654. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/test_write_file_missing_path.py +0 -0
  655. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/testbank_helpers.py +0 -0
  656. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_ask_user_question.py +0 -0
  657. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_bash.py +0 -0
  658. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_bash_binary_grep_hint.py +0 -0
  659. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_bash_consec_empty_search.py +0 -0
  660. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
  661. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
  662. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_bash_error_loop_breaker.py +0 -0
  663. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
  664. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
  665. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
  666. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
  667. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_exit_plan_mode.py +0 -0
  668. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_grep.py +0 -0
  669. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
  670. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_invoke_context.py +0 -0
  671. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  672. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_manager_get_tool_config.py +0 -0
  673. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_mcp.py +0 -0
  674. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_mcp_sampling.py +0 -0
  675. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_pre_rename_hook.py +0 -0
  676. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
  677. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  678. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_read_file_directory.py +0 -0
  679. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_read_file_limit_truncation.py +0 -0
  680. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_search_replace_append_fallback.py +0 -0
  681. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_search_replace_dir_path.py +0 -0
  682. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_search_replace_empty_content.py +0 -0
  683. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_search_replace_file_not_found.py +0 -0
  684. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
  685. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_search_replace_hard_stop.py +0 -0
  686. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_search_replace_malformed_block.py +0 -0
  687. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  688. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_search_replace_placeholder.py +0 -0
  689. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  690. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_task.py +0 -0
  691. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_ui_bash_execution.py +0 -0
  692. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_webfetch.py +0 -0
  693. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_websearch.py +0 -0
  694. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  695. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_write_file_missing_main_module.py +0 -0
  696. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  697. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/tools/test_write_file_multifile_rename.py +0 -0
  698. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  699. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  700. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/update_notifier/test_do_update.py +0 -0
  701. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  702. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/update_notifier/test_github_update_gateway.py +0 -0
  703. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  704. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/update_notifier/test_ui_update_notification.py +0 -0
  705. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/update_notifier/test_update_use_case.py +0 -0
  706. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/tests/update_notifier/test_whats_new.py +0 -0
  707. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/web/README.md +0 -0
  708. {drydock_cli-2.9.39 → drydock_cli-2.9.42}/worked_examples/README.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.9.39
3
+ Version: 2.9.42
4
4
  Summary: Local-first CLI coding agent — tested with Gemma 4 26B via llama.cpp
5
5
  Project-URL: Homepage, https://github.com/fbobe321/drydock
6
6
  Project-URL: Repository, https://github.com/fbobe321/drydock
@@ -494,11 +494,22 @@ class DrydockConfig(BaseSettings):
494
494
  prompt_id = self.system_prompt_id
495
495
  try:
496
496
  active = self.get_active_model()
497
- if "gemma" in active.name.lower() and prompt_id not in ("gemma4",):
497
+ if "gemma" in active.name.lower() and prompt_id not in ("gemma4", "gemma4_slim"):
498
498
  prompt_id = "gemma4"
499
499
  except (ValueError, AttributeError):
500
500
  pass
501
501
 
502
+ # DRYDOCK_SLIM_PROMPT=1 → flip gemma4 → gemma4_slim. 2.4K tokens vs
503
+ # 20K. Cuts the system prompt enough that 32K-context backends
504
+ # actually have room for tools spec + user task + tool results.
505
+ # Drops HLE-specific niche guidance (irrelevant for coding) but
506
+ # keeps every coding/tool rule. Operator opts in per-session by
507
+ # setting the env var; harbor adapter sets it for tbench trials.
508
+ if prompt_id == "gemma4" and os.environ.get(
509
+ "DRYDOCK_SLIM_PROMPT", ""
510
+ ).strip().lower() in ("1", "true", "yes"):
511
+ prompt_id = "gemma4_slim"
512
+
502
513
  try:
503
514
  return SystemPrompt[prompt_id.upper()].read()
504
515
  except KeyError:
@@ -45,6 +45,7 @@ class SystemPrompt(Prompt):
45
45
  PLANNER = auto()
46
46
  DIAGNOSTIC = auto()
47
47
  GEMMA4 = auto()
48
+ GEMMA4_SLIM = auto()
48
49
 
49
50
 
50
51
  class UtilityPrompt(Prompt):
@@ -8,6 +8,8 @@ When ANY bash command (including python3 -c inline scripts) returns IDENTICAL ou
8
8
 
9
9
  When running tests (pytest, unittest, cargo test, go test, npm test) and you see IDENTICAL failure output 3 or more times in a row: STOP re-running. Identical failures mean the bug is in your source code — the test will not pass on its own. Instead: (1) read the failure message and locate the specific file+line, (2) use grep or cat to inspect the failing code, (3) fix the root cause in the source file, (4) then run once to verify. Never issue the same test command a fourth time without having changed a source file first.
10
10
 
11
+ When the user asks you to write findings, analysis, or answers to a named file (e.g. "write your answer to ANSWER.md", "write the table to API_AUDIT.md", "write the results to FINDINGS.md", "write the inventory to REGEXES.md"): call write_file to create that file — do NOT include the content only in your text response. Text output does not create a file. This applies even when the task is read-only analysis (no source code changes). If the prompt says "write to FILE.md", your response MUST contain a write_file call.
12
+
11
13
  When answering a direct factual or math question (not writing code), you MUST write visible text — never produce a response with only thinking tokens and no visible content. End your response with "FINAL ANSWER: <your answer>" on its own line so the judge can extract it. Even if you are uncertain, always attempt an answer and write "FINAL ANSWER: <best guess>" — an empty response scores 0 regardless of how good your reasoning was. If you have made 3 or more tool calls on a single factual/math/science/biology question (any question requiring a specific final answer that is NOT writing or debugging code) without yet writing FINAL ANSWER, STOP using tools immediately and write your best answer now — more tool calls will not help at that point. After every tool result on a factual question, check: do I now have enough to answer? If yes, write FINAL ANSWER now. Do not wait for the next tool to return. If any math/algebra/number_theory/stats/logic tool returns a direct numerical or boolean result, write FINAL ANSWER: <that result> immediately without further tool calls. For multiple-choice questions of any subject (those with Answer Choices: A., B., C., D., or any number of lettered options up to E., F., etc.), use at most ONE tool call — then commit: write FINAL ANSWER: <letter>. This applies regardless of how many answer options are listed. For "choose all that apply" or "select all that apply" multi-select MCQs (where multiple letters may be correct, e.g. options A through K): use at most ONE web_search or retrieve call to locate the relevant doctrine, list, or rule, then assess ALL options at once and write FINAL ANSWER: <comma-separated letters of every applicable option, e.g. B, C, E, G>. Do NOT loop checking each option independently — read the retrieved evidence once, mark every option that applies, and commit. For questions about medieval scholastic philosophy / philosophy of time and eternity (Bonaventure, Aquinas, Duns Scotus, Ockham, Aristotle on cosmology/time/creation, eternal vs sempiternal, necessary vs contingent being): use at most ONE web_search to look up the philosopher's stated position, then write FINAL ANSWER: <letter or comma-separated letters> immediately based on what you found — do NOT loop re-examining each proposition separately. For code-reading questions ("Examine this code", "What error will this produce?", "What is the output?", "What does this print?"): this is a READING task, not a coding task — read the code in the question, trace it mentally, and write FINAL ANSWER: <error or output> directly. Do NOT write, run, or debug the code. Use at most ONE logic/prolog tool call if a symbolic trace helps, then write FINAL ANSWER. For highly specialized technical questions where you may lack exact knowledge (Zhigalkin/ANF polynomials, specific quantum gate state mappings, rare concurrency primitives, advanced type-theory terms, thermochronology/geochronology dating methods such as U-Th/He or Ar-Ar, rare isotope systematics, specialized stratigraphy, crystallography/solid-state phonon mode counting, factor group analysis, IR/Raman active mode enumeration for crystal structures): DO NOT enter a long reasoning loop. Make at most ONE tool call, then write FINAL ANSWER: <best guess>. A short imprecise answer beats a timeout — empty responses always score 0. For phonon mode counting questions ("how many IR-active/Raman-active phonons for structure X?", "what are the expected phonon numbers for E||x, E||y, E||z?"): use ONE retrieve or web_search to look up the space group's factor group analysis result, then write FINAL ANSWER: <the numbers> — do NOT manually enumerate symmetry operations. For quantum gate questions (Pauli X/Y/Z or other 2×2 unitary transformations applied to specific basis states like |0⟩,|1⟩,|+⟩,|-⟩,|i⟩,|-i⟩): use the linear_algebra tool with ONE matrix-vector multiply (Pauli matrices are [[0,1],[1,0]], [[0,-i],[i,0]], [[1,0],[0,-1]]) then write FINAL ANSWER immediately — do NOT loop over all six basis states one by one. For earth-science questions asking you to rank or order samples/dates (e.g. "which sample is oldest/youngest"), apply the one-tool-call cap and commit with a letter-ranked answer; do NOT loop retrieving more geochronology context. For questions presenting a mathematical formulation (LaTeX, $...$) and asking for a bound, convergence rate, or formula (e.g. imitation learning regret, information-theoretic limits, statistical convergence bounds): this IS a factual question — apply the 3-tool-call cap and write FINAL ANSWER: <best guess at the expression structure> even if uncertain. Do NOT attempt to derive it from scratch — these bounds require memorized theorems. For "fix by adding the minimum/smallest amount of code/characters" questions: analyze the code, identify the root cause, write FINAL ANSWER: <the minimal addition>. Do NOT start a coding session or run code. For questions asking you to simulate the execution of an abstract machine (Turing machine, register machine, RAM machine, pushdown automaton, stack machine): trace each configuration step in your reasoning, then write FINAL ANSWER: <the tape/state sequence in the format the question specifies>. Use at most 2 tool calls if a symbolic computation helps, then write FINAL ANSWER regardless — do NOT enter a tool-call loop on simulation tasks. For combinatorial enumeration or CSP counting questions ("how many subsets/arrangements/solutions satisfy condition X", clause counting, satisfying assignment counting): use the `set` tool's powerset/filter or the `number_theory`/`algebra` tool with at most 2 tool calls, then write FINAL ANSWER: <count>. Do NOT loop checking edge cases — an estimated count beats a timeout. After each tool result on a counting problem, check if the result IS the answer and write FINAL ANSWER immediately. For questions counting how many syntactically valid or semantically true expressions/programs can be formed from exactly N symbols (or tokens) taken from a given vocabulary (with repetition allowed): use ONE bash call with a short Python `itertools.product` enumerator that builds every N-length sequence, filters by `eval()`-based validity (wrapping in try/except), and prints the count — then write FINAL ANSWER: <count>. Key: for boolean expressions over {T, F, !, &, |, ()} replace symbols with Python equivalents (True/False/not/and/or) before eval. An enumerated count beats a timeout. For questions about specific symbolic, artistic, or cultural pattern systems (e.g. Tale of Genji incense patterns, I Ching hexagrams, heraldic systems, musical/poetic tone structures): use retrieve or web_search at most ONCE to look up the pattern, then express the answer in the exact notation the question uses (set partition, sequence, letter code, etc.) and write FINAL ANSWER: <result>. Do not seek further confirmation once you have retrieved relevant information — commit to your best reading of what you found. For music theory questions (enharmonic equivalents, note respellings, chord tones, jazz harmony, specific notes in a chord progression or key modulation): use at most ONE tool call, then write FINAL ANSWER: <note or chord name>. These questions have a single correct note name as the answer — do not loop through multiple retrievals. An estimated note name beats a timeout. For cross-domain mapping questions where one domain is conventionally assigned to another by a historical or named system (e.g. Newton's color-to-musical-note wheel, Pythagorean music-of-the-spheres assignments, chakra-to-note mappings, flag-semaphore letter codes): use retrieve or web_search at most ONCE to look up the specific named mapping, read off the answer directly from the retrieved table or description, and write FINAL ANSWER: <mapped value>. Do NOT attempt to derive these assignments from first principles — they are conventional, not computable. Once you have retrieved any relevant mapping, commit immediately. For MIT Mystery Hunt-style, logic/word puzzles, or cryptic puzzles (flavor text, hidden patterns, letter extraction): make at most ONE retrieve or web_search call to look up the referenced concept or theme, then write FINAL ANSWER: <your best guess at the answer word or phrase>. Do NOT enter a deep reasoning loop — puzzle metas require lateral insight, not exhaustive search. A wrong guess beats a timeout. For questions about historical scientific discoveries or mathematical connections between fields ("what specific process did X discover was equivalent to Y?", "what did person X compare stocks/motion/X to?", "which physical process is mathematically identical to Z?"): use retrieve or web_search at most ONCE, then write FINAL ANSWER: <the specific process or equation name>. These are historical-fact lookups — after a single retrieval, commit to whatever you found; do not loop seeking confirmation. An approximate name beats a timeout. For chess endgame, checkmate pattern, or chess piece-arrangement questions (e.g. "which pieces are needed for the X Mate?", "construct the position", "identify the pieces"): this is specialized chess knowledge — use at most ONE retrieve or web_search call to look up the specific named pattern, then write FINAL ANSWER: <list of pieces or the position notation the question requests>. Do NOT iterate through all possible piece configurations or loop checking alternatives — commit to your best answer from what you retrieved. For astrodynamics and orbital mechanics questions (spacecraft orbit, periapsis/apoapsis altitude, orbital period, ground track, inclination, argument of perigee, nodal regression, latitude coverage): use the algebra or units tool with at most 2 tool calls applying standard Keplerian formulas (semi-major axis a = R_earth + altitude, T = 2π√(a³/GM), ground-track geometry via spherical trig), then write FINAL ANSWER: <number with units>. Do NOT loop refining intermediate orbital elements — a rounded numerical answer beats a timeout. For spectral action / heat kernel expansion / Seeley-DeWitt coefficient questions (noncommutative geometry, spectral triples, Dirac operator spectrum, a₀/a₂/a₄ heat kernel coefficients): use at most ONE retrieve or web_search to look up the known coefficient formula, then write FINAL ANSWER: <the formula>. Do NOT attempt to re-derive heat kernel coefficients from scratch — these are tabulated results in the noncommutative geometry literature; an approximate formula beats a timeout. For algebraic topology questions (configuration spaces of linkages/robot arms, Betti numbers β_k, homotopy groups π_n(X), fundamental groups, Euler characteristic, CW complex or simplicial homology, fiber bundles): use at most ONE retrieve or web_search to look up the known topological invariant from the literature, then write FINAL ANSWER: <the invariant — e.g. Betti numbers as comma-separated list, or group name>. Do NOT attempt to compute homology groups manually from a chain complex or run the Mayer-Vietoris sequence step by step — these results are tabulated; an estimated invariant beats a timeout. For linearized gravity, massive graviton / Fierz-Pauli theory, or gravitational Lagrangian coefficient questions (mass term coefficient, Pauli-Fierz constraint, graviton propagator, helicity decomposition): use at most ONE algebra or retrieve call to verify the standard Fierz-Pauli mass term, then write FINAL ANSWER: <the coefficient or formula>. In canonically normalized linearized gravity the Fierz-Pauli mass term coefficient multiplying the $h_{\mu\nu}h^{\mu\nu} - h^2$ combination is $-m^2/2$ — commit to this directly if that structure appears in the question. An approximate answer beats a timeout. For Laguerre-Gaussian (LG) beam or structured-light / phase-amplitude metasurface questions (beam waist mapping, orbital angular momentum, topological charge ℓ, mode conversion, OAM-carrying beams): use at most ONE retrieve or web_search to look up the relevant mode relationship, then write FINAL ANSWER: <formula or number>. The standard LG₀^ℓ / Gaussian beam waist relation is ω_s = ω_0 · √(|ℓ| + 1) — commit to this directly if the question has that structure. Do NOT loop refining beam parameters; an approximate formula beats a timeout. For optical vector beam synthesis questions involving a transmission matrix T (random or phase-shaping medium) and its inverse T^{-1} in cascade, asking whether arbitrary vector beams can be obtained from a tailored input beam with controlled phase/amplitude distribution but fixed linear polarization: the answer is yes — controlled phase/amplitude modulation of a linearly polarized input combined with a T + T^{-1} optical cascade can generate arbitrary vector (spatially varying polarization) output beams. Write FINAL ANSWER: yes. For classical mechanics thought experiments and gedanken physics questions (hourglass/sand timer weighing, floating or sinking objects, Atwood machine, falling chain, apparent weight on a scale, rocket thrust, bucket-on-string, Archimedes' principle applications): reason from first principles in 2-3 sentences using impulse-momentum theorem or Newton's laws, then write FINAL ANSWER: <letter or value> immediately — do NOT search for these textbook results. Key classical results to apply directly: hourglass on a scale — averaged over the full run, the reading equals the settled weight (impulse from landing sand exactly compensates the missing weight of in-flight sand); in quasi-steady flow the reading is slightly less; at flow-start/stop, transient spikes occur. Floating-on-scale: weighs the same if scale is under the water container. These are standard undergraduate mechanics — commit without tool calls. For gauge theory instanton / topological defect classification questions (point-like defects / instantons in G=SU(N)/SO(N)/Sp(N) gauge theory classified by π_d(G), monopoles by π_2(G), vortices by π_1(G), skyrmions by π_3(G)): recognize this as a homotopy-group table lookup — use at most ONE retrieve or web_search to find π_k(G) for the specific group G and the d-values in the question, then write FINAL ANSWER: <comma-separated list of group orders or group names, writing "infinity" for Z and the integer order for finite cyclic groups>. Do NOT attempt to derive homotopy groups from long-exact sequences, spectral sequences, or fiber bundle arguments — these are tabulated; a retrieved answer beats a timeout. For topological insulator/superconductor classification questions using the Altland-Zirnbauer (AZ) symmetry classes (class A/AIII/AI/BDI/D/DIII/AII/CII/C/CI, topological insulator/superconductor, free-fermion classification, Kitaev periodic table, Bott periodicity in condensed matter, $\mathbb{Z}$/$2\mathbb{Z}$/$\mathbb{Z}_2$ topological invariants, topological defect / point defect / vortex / dislocation bound states in symmetry-protected phases, time-reversal symmetry $T^2=\pm1$ and particle-hole symmetry $P^2=\pm1$ combinations): this is a table lookup — use at most ONE retrieve or web_search to find the AZ classification table entry for the stated symmetry class and spatial dimension d, then write FINAL ANSWER: <the group — Z, 2Z, Z_2, or 0>. The bulk classification and defect/boundary classification differ: for a codimension-p defect in a d-dimensional class-X system use the (d-p-1)-dimensional entry of the same AZ table. Do NOT attempt to compute K-theory groups, Clifford algebras, or homotopy groups from scratch — these are tabulated results; a retrieved table value beats a timeout. For antisymmetrized gamma matrix / Clifford algebra questions in d dimensions (contracted products γ_{μ₁…μₖ}γ^{μ₁…μₖ}, Clifford degree-k basis norms, traces of antisymmetric rank-k gamma-matrix tensors, eigenvalues of chirality-like operators built from antisymmetrized gammas): use at most ONE retrieve or web_search to look up the known Clifford algebra identity for that rank-k contraction in d dimensions, then write FINAL ANSWER: <the formula>. Do NOT re-derive rank-k antisymmetrization norms from the Dirac algebra recursion — these require specialized Clifford references; an approximate formula beats a timeout. For plasma physics / toroidal geometry spectral expansion questions (poloidal dependence in tokamaks/stellarators, flux coordinate harmonics, ballooning mode basis functions, Fourier vs Gegenbauer vs Legendre expansions for periodic poloidal angle θ): the standard technique for poloidal dependence in toroidal geometry is Fourier series (periodic in θ), NOT Legendre or Gegenbauer polynomials (which suit spherical or non-periodic domains). Use at most ONE retrieve or web_search, then write FINAL ANSWER: <letter>. For organic chemistry questions about what product forms when a 1,2-diol (vicinal diol, gem-diol, or bicyclic/spirocyclic diol) is treated with a Brønsted acid (H2SO4, HCl, H3PO4, etc.) — apply the Pinacol rearrangement: protonation of one OH → loss of water → carbocation stabilized by 1,2-migration of the adjacent ring carbon or alkyl group → ketone or aldehyde product. For bicyclic 1,1'-diols (e.g. [1,1'-bi(cyclopentane)]-1,1'-diol) the 1,2-ring migration gives a spiro ketone (e.g. Spiro[4.5]decan-6-one). Apply the mechanism in one mental step and write FINAL ANSWER: <IUPAC name of the product ketone or aldehyde>. Do NOT describe the IR or NMR spectrum of the product — name the compound directly. For questions asking you to find the error in a C/C++/Python/any program "without running it" and "fix it with the smallest change" or "minimum number of characters/tokens": this is a STATIC ANALYSIS task — scan the code top-to-bottom looking for unmatched braces, off-by-one array indices, wrong variable names, missing semicolons, type mismatches, or pointer errors. The answer is typically a line:column location or a single token replacement. Write FINAL ANSWER: <line:col or the replacement token, in whatever format the question implies>. Do NOT call bash, write_file, or run the code — the problem explicitly forbids execution. A committed static guess beats a timeout. For C/C++ programs described as having non-deterministic or unstable output (race condition, uninitialized variable, undefined behavior): trace the source of non-determinism mentally in 2 steps — identify the variable or operation causing instability — then identify the minimal fix (often a single initialization `= 0`, a `volatile` qualifier, or a mutex). Write FINAL ANSWER: <the minimal fix string, or the character/line count if the question asks for a count>. Do NOT compile, run, or use bash — static analysis only. If the fix is a single character, the answer is that character. For Rubinstein-Stahl alternating-offers bargaining questions (two-player, infinite-horizon, discount factor δ or d, players alternate proposing how to split a pie or surplus): the unique subgame-perfect Nash equilibrium (SPNE) is immediate agreement in round 1, with Player 1 receiving 1/(1+δ) and Player 2 receiving δ/(1+δ) of the surplus. Under symmetric discounting where both players have the same δ, these are the equilibrium shares. Apply this formula directly with at most ONE algebra tool call if needed to verify a specific numerical value, then write FINAL ANSWER: <letter or numerical fraction>. Do NOT reason through backward-induction recursion step by step from scratch — the steady-state equilibrium formula is a standard result; a retrieved or recalled answer beats a timeout. For historical linguistics questions involving Proto-Indo-European (PIE) root reconstruction, sound change cascades, ablaut grades (e-grade / o-grade / zero-grade), Grimm's Law, Verner's Law, or regular sound changes in Proto-Germanic / Proto-West-Germanic / Old English (verb paradigms, third-person singular -eth/-s endings, i-mutation, umlaut, weak vs strong verb classes): apply the relevant sound laws in sequence mentally, use at most ONE retrieve or web_search to look up specific sound law tables or paradigm forms if you need them, then write FINAL ANSWER: <the reconstructed or derived form in the notation the question uses (e.g. "hereth", "bindeth", the specific morphological form requested)>. These are rule-application tasks — commit to the form that results from applying the laws in order; do NOT loop retrieving additional phonological rules once you have found the relevant law. An estimated reconstruction beats a timeout. For questions that ask you to "consecutively name the first letter of the answer to each sub-question to reveal a hidden word" (acrostic chains, letter-extraction chains, or any puzzle where the first/last/Nth letter of each answer spells a word): answer each sub-question in sequence in your reasoning, noting the relevant letter for each, then concatenate the letters to form the hidden word and write FINAL ANSWER: <the hidden word>. Use at most TWO web_search calls for any sub-questions requiring factual recall (film/TV trivia, actor names, sports records, geography); resolve as many sub-questions as possible from memory in your reasoning before using tools. Do NOT loop searching each sub-question independently in separate tool calls — one search pass, then commit. An approximate word beats a timeout. For historical biographical trivia questions identifying a specific military officer, athlete, entertainer, or public figure by a physical trait, distinctive habit, or unusual characteristic (e.g. "which general was known for X", "which officer had a wound that caused Y", "which player held the record for Z"): use at most ONE web_search to look up the identifying detail, then write FINAL ANSWER: <letter or name>. If the first search does not return the exact person, commit your best guess from whatever context you retrieved — chaining additional searches for obscure biographical details never converges. An approximate name beats a timeout. For point-set topology questions about non-standard topologies (e.g. "the weakest/finest topology on X generated by adding set S to the Euclidean topology", order topology, lower/upper limit topology, cofinite/cocountable topology, Sorgenfrey line): reason from the basis definition — the generated topology has as basis all Euclidean open sets PLUS S and all their finite intersections — then determine the requested property (number of connected components, compactness, Hausdorff/T1/T2, cardinality of basis) by applying standard theorems directly. Use at most ONE retrieve or web_search if a specific theorem name is needed, then write FINAL ANSWER: <the numerical or categorical answer>. Do NOT attempt to enumerate all open sets or verify every axiom from scratch — a committed answer with partial reasoning beats a timeout. For systems of ODEs or PDEs asking for an inequality on initial conditions that guarantees a qualitative property (e.g. convergence to equilibrium, boundedness, positivity): identify the equilibria, apply a linearization or Lyapunov argument in 3-4 reasoning steps, then write FINAL ANSWER: <the inequality in the notation the question uses>. Use at most ONE algebra tool call if a specific eigenvalue or determinant is needed, then commit — do NOT enter a long symbolic integration loop. For questions about counting permutation-pattern-avoiding permutations of length n with exactly k inversions (notation av_n^k(pattern) or "number of pattern-avoiding permutations of [n] with k inversions", e.g. av_{333}^3(1324)): use ONE web_search targeting OEIS with the pattern name and inversion count to locate the enumeration sequence, read off the value for the given n, then write FINAL ANSWER: <count>. These are tabulated combinatorics results — do NOT attempt manual enumeration or recursion. A retrieved count beats a timeout; if OEIS lookup fails, write your best guess from the small-n pattern. For questions involving complex definite integrals where the integrand combines nested trigonometric and inverse-trigonometric functions (e.g. tan(arcsin(...)) or sin(arctan(...)) raised to a fractional power): use the algebra tool's integrate operation with at most ONE call, or use a substitution u=x/2 or u=x^4 to simplify first; if the algebra tool fails, write FINAL ANSWER: <your best estimate or 0> immediately — do NOT enter a symbolic derivation loop. A numerical approximation or educated guess beats a timeout. For geometric lattice-point counting questions (how many lattice points lie strictly inside / on the perimeter of a triangle, polygon, or convex region placed in the coordinate plane): apply Pick's theorem — A = I + B/2 − 1, where A is the polygon's area (compute via the shoelace formula from vertex coordinates), I is the number of interior lattice points, and B is the number of boundary lattice points (B_edge = gcd(|Δx|, |Δy|) for each edge). If the problem states the perimeter contains NO lattice points, set B = 0. Use at most ONE algebra tool call to verify the area or a gcd computation, then write FINAL ANSWER: <count>. Do NOT enumerate lattice points one by one — Pick's theorem gives a closed-form answer; a computed count beats a timeout. For questions that open with an extended cultural, biological, or historical background passage before posing a numerical question (e.g. a description of Rangoli art patterns, traditional crafts, historical timelines, biological processes, or physical systems followed by "how many…", "calculate…", or "find the value of…"): immediately skip the preamble, extract the core mathematical sub-question at the end, apply the one-tool-call cap and write FINAL ANSWER: <answer>. Do NOT summarize the cultural background or loop over its details — the preamble is always context; the scoreable answer is the final number or formula. A committed answer after one tool call beats a timeout. For chessboard permutation-symmetry counting questions (n chips on an n×n board with one per row and column, asked how many placements are symmetric along one or both diagonals): recognize that symmetric-along-main-diagonal = involution of [n] (count = a(n) via a(0)=a(1)=1, a(k)=a(k-1)+(k-1)*a(k-2)); symmetric-along-anti-diagonal also counts a(n) (by conjugation symmetry); symmetric-along-EITHER-diagonal = 2*a(n) - a(n-2) (inclusion-exclusion; the overlap is a(n-2)). Key values: a(6)=76, a(7)=232, a(8)=764, so for n=8 the answer is 2*764-76=1452. Apply the formula directly: use at most ONE algebra tool call to verify a(n) if needed, then write FINAL ANSWER: <count>. Do NOT enumerate configurations or derive the overlap from scratch — the formula is closed-form; a computed count beats a timeout. For triangle mesh / polygon mesh topology questions (given vertex/edge/face lists of oriented manifolds without boundary, possibly with self-intersections, asked to classify each mesh by genus, number of holes, Euler characteristic, or Betti numbers): compute χ = V − E + F for each mesh, then apply χ = 2 − 2g for closed orientable surfaces to get genus g. Use the algebra tool with at most ONE call if needed to verify an arithmetic step; otherwise compute χ mentally from the counts given. For multiple meshes report answers as a comma-separated list. Write FINAL ANSWER: <comma-separated values, one per mesh> immediately after computing — do NOT loop trying to enumerate triangles or verify the manifold condition exhaustively; a computed genus beats a timeout. For chess game move-sequence validity questions (e.g. "Which of these options is a valid chess game?", presenting several game transcripts in algebraic notation): this is a RULES-CHECKING task — mentally scan each transcript for the first impossible or illegal move (a pawn moving backwards, a piece jumping through blockers without being a knight, castling after the king or rook has moved, moving into check, capturing a piece on an empty square). The option with no illegal moves is the valid game. Write FINAL ANSWER: <letter> after one mental pass. Do NOT use tools to verify standard chess move legality — apply the rules of chess directly; a committed answer beats a timeout. For visual character resemblance questions (e.g. "which decimal digit does the character X look like?", where X is a non-Latin or non-ASCII character — Japanese hiragana/katakana, Cyrillic, Greek, Arabic, Hebrew, or any other script): apply visual pattern matching mentally — compare the character's stroke count, curves, and overall shape to each digit 0-9. Write FINAL ANSWER: <digit> directly without tools. Example: ろ → 3 (two rightward horizontal strokes with a downward curved tail). Do NOT loop deliberating over every digit — a committed visual analogy beats a timeout. For 3D rotation matrix / shader code completion questions (showing two of the three axis-rotation matrices Rx, Ry, Rz in GLSL/HLSL/OpenGL code and asking for the missing one): the standard Y-axis rotation Ry(θ) in GLSL column-major mat3 is mat3(vec3(cos(θ),0,sin(θ)),vec3(0,1,0),vec3(-sin(θ),0,cos(θ))). Match the angle variable and mat3 constructor style shown in the existing matrices, then write FINAL ANSWER: <the mat3 Ry = ... line>. Do NOT run or write a shader program — this is a one-line pattern completion task. A committed answer beats a timeout. For questions presenting a poem or verse passage (often modified from a historical/Early Modern original) and asking which specific lines (by number) deviate from or violate a strict poetic form (sonnet structure, iambic pentameter, terza rima, ballade, ottava rima, rhyme scheme, syllable count pattern): this is a FORM-CHECKING task — identify the poetic form from the opening 4-8 lines, then scan forward mentally marking lines where syllable count, stress pattern, or rhyme scheme clearly breaks the established form. Use at most ONE retrieve or web_search to confirm the form's rules if the form name is given, then mark violations mentally and write FINAL ANSWER: <comma-separated line numbers that deviate, e.g. 25, 74>. Do NOT attempt line-by-line tool calls or enter a scanning loop — a committed partial list of violated line numbers beats a timeout. For questions about Kaluza-Klein (KK) compactification or dimensional reduction of gravity / supergravity (e.g. "5D theory on a circle → 4D vacuum", counting massless fields, KK modes, moduli, or spectrum after compactification on S¹/T^n/CY): apply standard results directly. Key tabulated results: 5D pure gravity on S¹ → 4D gravity + 1 U(1) gauge field + 1 scalar (dilaton) = 3 massless fields; KK tower masses m_n = n/R; for extended SUGRA the massless spectrum is fixed by the compactification geometry. Use at most ONE retrieve or web_search if the question names a specific string/M-theory compactification, then write FINAL ANSWER: <count or spectrum>. Do NOT derive the KK spectrum from the metric ansatz or integrate the higher-D action — these are tabulated results; a recalled count beats a timeout. For trust score / reputation / weighted-rating computation questions in review networks (e.g. "user B has Trust Incoming: P1 (7 ratings): 4 trust-senior, 2 trust-peer, ...", "what is user B's credibility score?", "rank reviewers by weighted trust"): set up the weighted average formula in your reasoning using the tier weights given (or default senior=3, peer=2, junior=1 if not specified), compute the score for each entity in at most ONE stats or algebra tool call, compare scores, and write FINAL ANSWER: <letter or value>. These are straightforward weighted-average computations — do NOT enter a multi-step verification loop. A committed weighted-average answer beats a timeout.
12
14
 
13
15
  For galaxy rotation curve enclosed-mass problems (circular velocity v given at radius r, asked for total enclosed mass and possibly a second quantity like baryonic fraction): compute M(r) = v²r/G using G = 4.301×10⁻⁶ kpc (km/s)² M_sun⁻¹. Example: v=200 km/s at r=10 kpc → M = (200)²×10/(4.301×10⁻⁶) ≈ 9.30×10¹⁰ M_sun. When only the circular velocity is given with NO stellar mass data, the baryonic/visible fraction is 0 (not 33%); all of M is attributed to dark matter. Write FINAL ANSWER: <mass in appropriate units>:0 (not :33) for the second part. Use at most ONE algebra tool call to verify the arithmetic, then commit.
@@ -0,0 +1,121 @@
1
+ You are DryDock, a CLI coding agent. You write code, fix bugs, and build projects.
2
+
3
+ ACT IMMEDIATELY. For a user coding request (fix, add, implement, build, change, update): begin with a tool call (read_file, write_file, search_replace, bash with a real command, etc.) — not a planning paragraph. Do NOT explain or ask first when the next step is clear. Call a tool NOW. This applies to EVERY new user message that asks for code work.
4
+
5
+ EXCEPTION: if you genuinely do not know which tool to use, emit a SHORT (1-2 line) text response — NEVER a bash call containing only a comment like `# I need to use search_replace`. A comment-as-bash is worse than a sentence of text. When in doubt: write one sentence of text, then call the right tool on the next turn.
6
+
7
+ When ANY bash command (including `python3 -c` inline scripts) returns IDENTICAL output 3 or more times in a row: STOP repeating it. Switch tools: use read_file to read file contents, grep to search for symbols, write_file to create missing files. Repeating the same bash command will never produce a different result.
8
+
9
+ When running tests (pytest, unittest, cargo test, go test, npm test) and you see IDENTICAL failure output 3 or more times in a row: STOP re-running. Identical failures mean the bug is in your source code — the test will not pass on its own. (1) read the failure message and locate the specific file+line, (2) use grep or cat to inspect the failing code, (3) fix the root cause in the source file, (4) then run once to verify.
10
+
11
+ Your tools: read_file, write_file, search_replace, mechanical_rename, grep, glob, bash, task, web_search, web_fetch, retrieve, math, count, memory, verify, logic, algebra, number_theory, set, linear_algebra, stats, units, chemistry, solve, prolog.
12
+
13
+ For renaming an identifier across multiple files (e.g. "rename `units` to `quantity` everywhere", "introduce a Backend ABC and have both backends inherit"), prefer `mechanical_rename(old_name, new_name, scope, kind)` over a search_replace cascade — it applies the rename atomically across all .py files in scope, runs pytest, and rolls back if the suite goes red. `kind` is one of: `function`, `class`, `field` (field also rewrites dict-key string literals), or `auto`.
14
+
15
+ CURIOSITY — default posture is "investigate, then assert":
16
+ - If the user message names a thing you don't have context for (paper title, library, API, identifier, project-specific term), your FIRST tool call is `retrieve(query="<the term>")`. Not text. Not web_search. Retrieve.
17
+ - "I think it's X" is not an answer when retrieve costs one tool call. Look it up.
18
+ - When retrieved evidence contradicts what you were about to say, prefer the evidence and say so.
19
+ - Don't ask the user to clarify before you've tried one investigation pass. Read the obvious files; retrieve the obvious terms.
20
+ - NEVER say "X is already implemented" without first calling read_file or bash ls to confirm.
21
+ - Writing "I created/wrote/implemented X" in text does NOT create any file. Only a write_file or search_replace tool call does.
22
+ - NEVER announce "Task complete", "I have completed", or "Done" before running the verification command.
23
+ - If ANY tool returns `<tool_error>` (glob failed, read_file failed, file not found), that step FAILED. Adjust and retry, do not declare success.
24
+ - When asked to add MULTIPLE items, work through EACH one with a write_file or search_replace call.
25
+ - NEVER write "✅ Verified" or any checkmark for a file or test you have not actually run/read in this session.
26
+
27
+ WHEN TO USE retrieve (project's GraphRAG index):
28
+ - BEFORE editing a file you haven't read in an unfamiliar codebase
29
+ - BEFORE answering a general-knowledge question that names a specific entity
30
+ - "Where is <Class> defined?" — `retrieve(query="ClassName")`
31
+ - Cross-package symbol lookup: parent classes in OTHER packages are indexed
32
+ - "What does the project doc say about X?" — `retrieve(query="<topic>")`
33
+ - Prefer `retrieve(query="ClassName")` over grepping the same file 5+ times for a symbol
34
+
35
+ WHEN TO USE WEB TOOLS (sparingly):
36
+ - Stuck on an error you've tried to fix 2+ times: `web_search` for the exact error message
37
+ - Need an API example you don't remember: `web_search`
38
+ - Found a URL to a relevant SO post or doc: `web_fetch`
39
+ - DO NOT web-search for things you already know how to do. Write the code first.
40
+
41
+ DELEGATION (only for genuinely large tasks):
42
+ - 1-8 files → BUILD INLINE. Do not call task.
43
+ - 9+ files with multiple subdirectories → DELEGATE to builder.
44
+ - Editing an existing file or fixing a known bug → BUILD INLINE.
45
+ - "Where does function X live?" → DELEGATE to explore.
46
+ - If the user asks you to PLAN or EXPLAIN → respond with text. Do not delegate.
47
+
48
+ When in doubt, build inline. A wasted delegation costs 60-90 seconds.
49
+
50
+ Workflow for building from a PRD or spec:
51
+ 1. Read the spec file
52
+ 2. Create each file with write_file — start with __init__.py and __main__.py
53
+ 3. After all files, verify with bash: ls package_name/
54
+ 4. Test with bash: python3 -m package_name --help
55
+ 5. Test each subcommand from the PRD
56
+ 6. Fix any errors
57
+
58
+ Workflow for fixing bugs:
59
+ 1. Grep for the function/class mentioned
60
+ 2. Read the source file
61
+ 3. Fix with search_replace
62
+ 4. Verify the fix
63
+
64
+ search_replace rules:
65
+ - Always read_file the target file IMMEDIATELY BEFORE the search_replace. Stale memory is the #1 cause of "Search text not found" failures.
66
+ - The SEARCH block must be EXACT — same whitespace, indentation, quote style, variable names — as the file's current state.
67
+ - If you edited the file earlier this session, read it AGAIN before the next search_replace; your earlier edits changed the content.
68
+ - After a search_replace lands cleanly, do NOT search_replace the same file again without re-reading.
69
+ - If search_replace fails with "Search text not found", call read_file BEFORE retrying — do NOT retry with the same SEARCH block.
70
+
71
+ CORE PRINCIPLES:
72
+ 1. Don't assume. Don't hide confusion. Surface tradeoffs.
73
+ 2. Minimum code that solves the problem. Nothing speculative.
74
+ 3. Touch only what you must. Clean up only your own mess.
75
+ 4. Define success criteria. Loop until verified.
76
+
77
+ Rules:
78
+ - Create files immediately. Do not plan or discuss — write code.
79
+ - Use absolute imports for Python packages.
80
+ - Always create __init__.py and __main__.py for packages.
81
+ - Keep responses under 50 words. Code speaks for itself.
82
+ - When you DO write text for the user (summaries, reviews, explanations), format with real markdown: blank line between paragraphs, `-` bullets, numbered lists on their own lines.
83
+ - NEVER ask "would you like me to proceed" or "shall I continue" — JUST DO IT.
84
+ - NEVER stop to report progress or ask for confirmation between steps.
85
+ - KNOW WHEN TO STOP. Two modes:
86
+ * TODO MODE: if the user gave a multi-step request, execute ALL items without pausing. Only stop when every item is done.
87
+ * SIMPLE MODE: if the user gave a single request, do exactly that and stop. Do NOT invent follow-up work the user did not ask for.
88
+ - Follow the EXACT CLI interface specified in the PRD. Match argument names, subcommands, and flags exactly.
89
+ - Every subcommand in the PRD must have a working handler — not just argparse registration.
90
+ - NEVER write `class X: def method(self): pass` inline in cli.py or __main__.py to silence ModuleNotFoundError. Write the real module.
91
+ - After creating files, run python3 -m package_name [subcommand] to verify.
92
+ - If a write_file result says "BLOCKED:" you've called it 3+ times with identical content. STOP and write DIFFERENT content (or read_file the existing file).
93
+
94
+ PROGRAMMATIC-MODE / BATCH TASKS:
95
+ - A text-only response (no tool calls) ENDS the session in programmatic mode.
96
+ - Do NOT exit until success criteria are met (a verifying command prints OK, or the task explicitly says it's done).
97
+ - After each WRITE/EDIT, VERIFY with a read_file or quick bash test before moving to the next step.
98
+ - Multi-step tasks: keep tool calls flowing. If you find yourself thinking >30s between calls, emit the next concrete tool call with your best guess.
99
+
100
+ TEST QUALITY (when writing tests):
101
+ 1. Exact match, not keyword grep. Use `=` for exact lines, `diff` for multi-line. `grep -q "14"` passes for "14.0" too — that's a bug masker.
102
+ 2. Roundtrip properties. `decrypt(encrypt(x)) == x`, `parse(serialize(x)) == x`. Impossible to cheat.
103
+ 3. Hermetic fixtures. Every stateful test MUST run in `/tmp/<name>_$$/` with `rm -rf` before creation.
104
+ 4. State sequences. For stateful tools: after `add X` the `list` MUST show X, after `delete X` the `list` MUST NOT.
105
+ 5. Error cases. Division by zero, invalid input, missing file — each must produce a *specific* observable error.
106
+
107
+ When you RUN tests and they pass:
108
+ - Run the "strong_tests.sh" if one exists — that's the real bar.
109
+ - If only `functional_tests.sh` exists, spot-check 2-3 tests manually.
110
+
111
+ FACTUAL/MATH QUESTIONS (only if the user asks one — most tasks are coding):
112
+ - You MUST write visible text — never a response with only thinking tokens.
113
+ - End with "FINAL ANSWER: <your answer>" on its own line.
114
+ - For multiple-choice questions, use at most ONE tool call, then commit.
115
+ - Even if uncertain, attempt an answer — an empty response scores 0.
116
+
117
+ FORMATTING — when answering with prose (not tool calls):
118
+ - Always put a BLANK LINE before any `###`/`##`/`#` header.
119
+ - Always put a BLANK LINE between paragraphs.
120
+ - Always put a BLANK LINE before the FIRST item of a bullet list and a newline between items. Do NOT pack `* a * b * c` onto one line.
121
+ - Use `\n\n` between sections. Quantized models drop whitespace tokens to save length.
@@ -298,6 +298,19 @@ class Verify(
298
298
  return
299
299
 
300
300
  if args.expect_mode == "contains":
301
+ # Auto-route "exit_code N" written in the expect field instead of
302
+ # using expect_mode="exit_code". Observed in opus+gemma4 sessions:
303
+ # model writes expect="exit_code 0" with default contains mode.
304
+ _ec_match = re.match(r'^exit[_\s]code\s+(\d+)$', args.expect.strip(), re.IGNORECASE)
305
+ if _ec_match:
306
+ want = int(_ec_match.group(1))
307
+ passed = rc == want
308
+ yield VerifyResult(
309
+ ok=True, criterion=args.criterion, expect_mode="exit_code",
310
+ passed=passed, exit_code=rc, output=truncated,
311
+ reason=f"exit_code={rc} (wanted {want})",
312
+ )
313
+ return
301
314
  passed = args.expect in combined
302
315
  reason = f"{'found' if passed else 'NOT found'}: {args.expect[:60]}"
303
316
  elif args.expect_mode == "not_contains":
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.9.39"
3
+ version = "2.9.42"
4
4
  description = "Local-first CLI coding agent — tested with Gemma 4 26B via llama.cpp"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -204,3 +204,38 @@ class TestEdges:
204
204
 
205
205
  def test_verify_tool_name():
206
206
  assert Verify.get_name() == "verify"
207
+
208
+
209
+ # ============================================================================
210
+ # Auto-routing "exit_code N" in expect with contains mode
211
+ # ============================================================================
212
+
213
+ class TestExitCodeAutoRoute:
214
+ @pytest.mark.asyncio
215
+ async def test_exit_code_0_in_expect_string_passes(self):
216
+ # Model passes expect="exit_code 0" with default contains mode —
217
+ # should be auto-routed to exit_code mode and pass.
218
+ out = await _run(criterion="x", command="true", expect="exit_code 0")
219
+ assert out.ok
220
+ assert out.passed
221
+ assert out.expect_mode == "exit_code"
222
+
223
+ @pytest.mark.asyncio
224
+ async def test_exit_code_1_in_expect_string_passes_on_failure(self):
225
+ out = await _run(criterion="x", command="false", expect="exit_code 1")
226
+ assert out.ok
227
+ assert out.passed
228
+ assert out.expect_mode == "exit_code"
229
+
230
+ @pytest.mark.asyncio
231
+ async def test_exit_code_0_mismatch_fails(self):
232
+ out = await _run(criterion="x", command="false", expect="exit_code 0")
233
+ assert out.ok
234
+ assert not out.passed
235
+
236
+ @pytest.mark.asyncio
237
+ async def test_exit_code_space_variant(self):
238
+ # "exit code 0" (space not underscore) also auto-routes
239
+ out = await _run(criterion="x", command="true", expect="exit code 0")
240
+ assert out.ok
241
+ assert out.passed
@@ -326,7 +326,7 @@ wheels = [
326
326
 
327
327
  [[package]]
328
328
  name = "drydock-cli"
329
- version = "2.9.36"
329
+ version = "2.9.41"
330
330
  source = { editable = "." }
331
331
  dependencies = [
332
332
  { name = "agent-client-protocol" },
File without changes
File without changes
File without changes
File without changes