drydock-cli 1.5.0__tar.gz → 1.5.2__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 (510) hide show
  1. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/PKG-INFO +1 -1
  2. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/agent_loop.py +163 -5
  3. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/prompts/cli.md +8 -1
  4. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/pyproject.toml +1 -1
  5. drydock_cli-1.5.2/scripts/monitor_test_battery.sh +115 -0
  6. drydock_cli-1.5.2/tests/test_bank_prd.py +775 -0
  7. drydock_cli-1.5.2/tests/test_bank_prd_extended.py +765 -0
  8. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/.github/CODEOWNERS +0 -0
  9. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  10. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  11. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  12. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/.github/workflows/build-and-upload.yml +0 -0
  13. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/.github/workflows/ci.yml +0 -0
  14. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/.github/workflows/issue-labeler.yml +0 -0
  15. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/.github/workflows/release.yml +0 -0
  16. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/.gitignore +0 -0
  17. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/.pre-commit-config.yaml +0 -0
  18. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/.python-version +0 -0
  19. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/.typos.toml +0 -0
  20. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/.vscode/extensions.json +0 -0
  21. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/.vscode/launch.json +0 -0
  22. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/.vscode/settings.json +0 -0
  23. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/AGENTS.md +0 -0
  24. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/CHANGELOG.md +0 -0
  25. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/CLAUDE.md +0 -0
  26. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/CONTRIBUTING.md +0 -0
  27. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/Drydock_rebrand.md +0 -0
  28. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/LICENSE +0 -0
  29. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/NOTICE +0 -0
  30. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/PRD.md +0 -0
  31. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/README.md +0 -0
  32. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/action.yml +0 -0
  33. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/distribution/zed/LICENSE +0 -0
  34. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/distribution/zed/extension.toml +0 -0
  35. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/distribution/zed/icons/mistral_vibe.svg +0 -0
  36. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/docs/README.md +0 -0
  37. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/docs/acp-setup.md +0 -0
  38. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/docs/proxy-setup.md +0 -0
  39. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/__init__.py +0 -0
  40. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/acp/__init__.py +0 -0
  41. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/acp/acp_agent_loop.py +0 -0
  42. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/acp/acp_logger.py +0 -0
  43. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/acp/entrypoint.py +0 -0
  44. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/acp/tools/__init__.py +0 -0
  45. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/acp/tools/base.py +0 -0
  46. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/acp/tools/builtins/bash.py +0 -0
  47. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/acp/tools/builtins/read_file.py +0 -0
  48. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/acp/tools/builtins/search_replace.py +0 -0
  49. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/acp/tools/builtins/todo.py +0 -0
  50. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/acp/tools/builtins/write_file.py +0 -0
  51. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/acp/tools/session_update.py +0 -0
  52. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/acp/utils.py +0 -0
  53. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/__init__.py +0 -0
  54. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/autocompletion/__init__.py +0 -0
  55. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/autocompletion/base.py +0 -0
  56. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/autocompletion/path_completion.py +0 -0
  57. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/autocompletion/slash_command.py +0 -0
  58. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/cli.py +0 -0
  59. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/clipboard.py +0 -0
  60. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/commands.py +0 -0
  61. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/entrypoint.py +0 -0
  62. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/history_manager.py +0 -0
  63. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  64. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  65. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  66. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/terminal_setup.py +0 -0
  67. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/__init__.py +0 -0
  68. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  69. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/app.py +0 -0
  70. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/app.tcss +0 -0
  71. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/external_editor.py +0 -0
  72. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  73. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  74. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  75. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  76. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  77. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  78. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  79. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  80. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  81. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  82. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  83. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  84. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  85. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  86. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  87. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  88. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  89. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  90. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  91. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  92. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  93. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  94. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  95. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  96. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  97. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  98. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  99. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  100. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  101. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  102. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  103. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  104. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  105. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  106. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  107. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  108. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/windowing/history.py +0 -0
  109. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  110. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/textual_ui/windowing/state.py +0 -0
  111. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/update_notifier/__init__.py +0 -0
  112. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  113. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  114. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  115. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  116. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  117. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/update_notifier/update.py +0 -0
  118. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/cli/update_notifier/whats_new.py +0 -0
  119. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/__init__.py +0 -0
  120. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/agents/__init__.py +0 -0
  121. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/agents/manager.py +0 -0
  122. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/agents/models.py +0 -0
  123. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/auth/__init__.py +0 -0
  124. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/auth/crypto.py +0 -0
  125. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/auth/github.py +0 -0
  126. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/autocompletion/__init__.py +0 -0
  127. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/autocompletion/completers.py +0 -0
  128. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  129. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  130. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  131. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  132. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  133. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/autocompletion/fuzzy.py +0 -0
  134. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/autocompletion/path_prompt.py +0 -0
  135. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  136. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/config/__init__.py +0 -0
  137. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/config/_settings.py +0 -0
  138. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/config/harness_files/__init__.py +0 -0
  139. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  140. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/config/harness_files/_paths.py +0 -0
  141. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/consultant.py +0 -0
  142. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/drydock_states.py +0 -0
  143. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/hooks.py +0 -0
  144. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/llm/__init__.py +0 -0
  145. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/llm/backend/anthropic.py +0 -0
  146. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/llm/backend/base.py +0 -0
  147. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/llm/backend/factory.py +0 -0
  148. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/llm/backend/generic.py +0 -0
  149. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/llm/backend/mistral.py +0 -0
  150. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  151. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/llm/backend/vertex.py +0 -0
  152. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/llm/exceptions.py +0 -0
  153. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/llm/format.py +0 -0
  154. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/llm/message_utils.py +0 -0
  155. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/llm/types.py +0 -0
  156. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/logger.py +0 -0
  157. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/middleware.py +0 -0
  158. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/output_formatters.py +0 -0
  159. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/paths/__init__.py +0 -0
  160. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/paths/_local_config_walk.py +0 -0
  161. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/paths/_vibe_home.py +0 -0
  162. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/paths/conventions.py +0 -0
  163. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/plan_session.py +0 -0
  164. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/plugins.py +0 -0
  165. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/programmatic.py +0 -0
  166. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/prompts/__init__.py +0 -0
  167. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/prompts/compact.md +0 -0
  168. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/prompts/dangerous_directory.md +0 -0
  169. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/prompts/diagnostic.md +0 -0
  170. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/prompts/explore.md +0 -0
  171. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/prompts/planner.md +0 -0
  172. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/prompts/project_context.md +0 -0
  173. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/prompts/tests.md +0 -0
  174. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/proxy_setup.py +0 -0
  175. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/session/agent_memory.py +0 -0
  176. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/session/checkpoints.py +0 -0
  177. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/session/session_loader.py +0 -0
  178. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/session/session_logger.py +0 -0
  179. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/session/session_migration.py +0 -0
  180. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/session/state_file.py +0 -0
  181. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/skills/__init__.py +0 -0
  182. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/skills/manager.py +0 -0
  183. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/skills/models.py +0 -0
  184. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/skills/parser.py +0 -0
  185. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/slug.py +0 -0
  186. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/system_prompt.py +0 -0
  187. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/telemetry/__init__.py +0 -0
  188. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/telemetry/send.py +0 -0
  189. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/teleport/errors.py +0 -0
  190. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/teleport/git.py +0 -0
  191. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/teleport/nuage.py +0 -0
  192. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/teleport/teleport.py +0 -0
  193. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/teleport/types.py +0 -0
  194. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/base.py +0 -0
  195. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  196. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/bash.py +0 -0
  197. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/cron.py +0 -0
  198. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  199. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/glob_tool.py +0 -0
  200. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/grep.py +0 -0
  201. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  202. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/lsp.py +0 -0
  203. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  204. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  205. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/powershell.py +0 -0
  206. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  207. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  208. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  209. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  210. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  211. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  212. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  213. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  214. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  215. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  216. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  217. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  218. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  219. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  220. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/task.md +0 -0
  221. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  222. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  223. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  224. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  225. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  226. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  227. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  228. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/read_file.py +0 -0
  229. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/search_replace.py +0 -0
  230. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/task.py +0 -0
  231. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/task_manager.py +0 -0
  232. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/todo.py +0 -0
  233. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/tool_search.py +0 -0
  234. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/webfetch.py +0 -0
  235. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/websearch.py +0 -0
  236. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/worktree.py +0 -0
  237. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/builtins/write_file.py +0 -0
  238. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/injection_guard.py +0 -0
  239. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/manager.py +0 -0
  240. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/mcp/__init__.py +0 -0
  241. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/mcp/registry.py +0 -0
  242. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/mcp/tools.py +0 -0
  243. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/mcp_sampling.py +0 -0
  244. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/ui.py +0 -0
  245. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/tools/utils.py +0 -0
  246. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/trusted_folders.py +0 -0
  247. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/types.py +0 -0
  248. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/core/utils.py +0 -0
  249. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/setup/onboarding/__init__.py +0 -0
  250. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/setup/onboarding/base.py +0 -0
  251. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/setup/onboarding/onboarding.tcss +0 -0
  252. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/setup/onboarding/screens/__init__.py +0 -0
  253. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/setup/onboarding/screens/api_key.py +0 -0
  254. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/setup/onboarding/screens/welcome.py +0 -0
  255. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  256. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  257. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/skills/__init__.py +0 -0
  258. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/skills/batch/SKILL.md +0 -0
  259. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/skills/create-presentation/SKILL.md +0 -0
  260. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/skills/deep-research/SKILL.md +0 -0
  261. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/skills/investigate/SKILL.md +0 -0
  262. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/skills/review/SKILL.md +0 -0
  263. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/skills/ship/SKILL.md +0 -0
  264. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/skills/simplify/SKILL.md +0 -0
  265. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock/whats_new.md +0 -0
  266. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock-acp.spec +0 -0
  267. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/drydock_terms.md +0 -0
  268. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/flake.lock +0 -0
  269. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/flake.nix +0 -0
  270. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/scripts/README.md +0 -0
  271. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/scripts/backup.sh +0 -0
  272. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/scripts/bump_version.py +0 -0
  273. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/scripts/deploy_to_github.sh +0 -0
  274. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/scripts/install.sh +0 -0
  275. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/scripts/prepare_release.py +0 -0
  276. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/scripts/publish_to_pypi.sh +0 -0
  277. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/scripts/test_bank.sh +0 -0
  278. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/scripts/test_full.sh +0 -0
  279. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/scripts/test_smoke.sh +0 -0
  280. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/__init__.py +0 -0
  281. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/conftest.py +0 -0
  282. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/test_acp.py +0 -0
  283. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/test_agent_thought.py +0 -0
  284. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/test_bash.py +0 -0
  285. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/test_compact_session_updates.py +0 -0
  286. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/test_content.py +0 -0
  287. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/test_initialize.py +0 -0
  288. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/test_list_sessions.py +0 -0
  289. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/test_load_session.py +0 -0
  290. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/test_multi_session.py +0 -0
  291. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/test_new_session.py +0 -0
  292. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/test_proxy_setup_acp.py +0 -0
  293. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/test_read_file.py +0 -0
  294. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/test_search_replace.py +0 -0
  295. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/test_set_config_option.py +0 -0
  296. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/test_set_mode.py +0 -0
  297. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/test_set_model.py +0 -0
  298. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/test_tool_call_session_update.py +0 -0
  299. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/test_utils.py +0 -0
  300. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/acp/test_write_file.py +0 -0
  301. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/autocompletion/test_file_indexer.py +0 -0
  302. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/autocompletion/test_fuzzy.py +0 -0
  303. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  304. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  305. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/autocompletion/test_path_completion_controller.py +0 -0
  306. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  307. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/autocompletion/test_slash_command_controller.py +0 -0
  308. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  309. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/backend/__init__.py +0 -0
  310. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/backend/data/__init__.py +0 -0
  311. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/backend/data/fireworks.py +0 -0
  312. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/backend/data/mistral.py +0 -0
  313. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/backend/test_anthropic_adapter.py +0 -0
  314. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/backend/test_backend.py +0 -0
  315. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/backend/test_reasoning_adapter.py +0 -0
  316. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  317. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  318. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  319. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  320. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/cli/test_bell_notifications.py +0 -0
  321. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/cli/test_braille_renderer.py +0 -0
  322. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/cli/test_clipboard.py +0 -0
  323. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/cli/test_commands.py +0 -0
  324. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/cli/test_copy_shortcuts.py +0 -0
  325. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/cli/test_external_editor.py +0 -0
  326. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/cli/test_no_markup_static.py +0 -0
  327. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/cli/test_question_app.py +0 -0
  328. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/cli/test_spinner.py +0 -0
  329. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/cli/test_switching_mode.py +0 -0
  330. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  331. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  332. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/cli/test_ui_session_resume.py +0 -0
  333. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/cli/test_ui_skill_dispatch.py +0 -0
  334. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/cli/textual_ui/__init__.py +0 -0
  335. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/cli/textual_ui/test_session_picker.py +0 -0
  336. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/conftest.py +0 -0
  337. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/core/test_agents.py +0 -0
  338. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/core/test_auth_crypto.py +0 -0
  339. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/core/test_auth_github.py +0 -0
  340. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/core/test_config_load_dotenv.py +0 -0
  341. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/core/test_config_paths.py +0 -0
  342. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/core/test_config_resolution.py +0 -0
  343. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/core/test_file_logging.py +0 -0
  344. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/core/test_plan_session.py +0 -0
  345. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/core/test_proxy_setup.py +0 -0
  346. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/core/test_slug.py +0 -0
  347. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/core/test_telemetry_send.py +0 -0
  348. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/core/test_teleport_git.py +0 -0
  349. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/core/test_teleport_nuage.py +0 -0
  350. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/core/test_teleport_service.py +0 -0
  351. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/core/test_trusted_folders.py +0 -0
  352. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/core/test_utils.py +0 -0
  353. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/e2e/common.py +0 -0
  354. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/e2e/conftest.py +0 -0
  355. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/e2e/mock_server.py +0 -0
  356. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  357. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/e2e/test_cli_tui_streaming.py +0 -0
  358. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  359. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/mock/__init__.py +0 -0
  360. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/mock/mock_backend_factory.py +0 -0
  361. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/mock/mock_entrypoint.py +0 -0
  362. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/mock/utils.py +0 -0
  363. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/onboarding/test_run_onboarding.py +0 -0
  364. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/onboarding/test_ui_onboarding.py +0 -0
  365. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/session/test_session_loader.py +0 -0
  366. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/session/test_session_logger.py +0 -0
  367. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/session/test_session_migration.py +0 -0
  368. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/skills/conftest.py +0 -0
  369. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/skills/test_manager.py +0 -0
  370. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/skills/test_models.py +0 -0
  371. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/skills/test_parser.py +0 -0
  372. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  373. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  374. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  375. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  376. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  377. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  378. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  379. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  380. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  381. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  382. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  383. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  384. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  385. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  386. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  387. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  388. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  389. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  390. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  391. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  392. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  393. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  394. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  395. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  396. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  397. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  398. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  399. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  400. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  401. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  402. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  403. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  404. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  405. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  406. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  407. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  408. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  409. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  410. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  411. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  412. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  413. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  414. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  415. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  416. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  417. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  418. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  419. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  420. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  421. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  422. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  423. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  424. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  425. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  426. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  427. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  428. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  429. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  430. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  431. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  432. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/base_snapshot_test_app.py +0 -0
  433. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/conftest.py +0 -0
  434. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/snap_compare.py +0 -0
  435. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  436. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  437. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  438. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  439. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  440. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  441. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  442. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  443. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  444. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  445. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  446. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  447. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  448. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  449. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/stubs/fake_backend.py +0 -0
  450. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/stubs/fake_client.py +0 -0
  451. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/stubs/fake_tool.py +0 -0
  452. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_agent_auto_compact.py +0 -0
  453. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_agent_backend.py +0 -0
  454. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_agent_observer_streaming.py +0 -0
  455. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_agent_stats.py +0 -0
  456. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_agent_tasks.py +0 -0
  457. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_agent_tool_call.py +0 -0
  458. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_agents.py +0 -0
  459. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_bank_build.py +0 -0
  460. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_bank_debug.py +0 -0
  461. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_bank_multiagent.py +0 -0
  462. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_bank_tools.py +0 -0
  463. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_bank_update.py +0 -0
  464. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_build_projects.py +0 -0
  465. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_cli_programmatic_preload.py +0 -0
  466. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_current_bugs.py +0 -0
  467. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_drydock_regression.py +0 -0
  468. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_drydock_tasks.py +0 -0
  469. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_full_regression.py +0 -0
  470. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_history_manager.py +0 -0
  471. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_integration.py +0 -0
  472. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_loop_detection.py +0 -0
  473. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_message_id.py +0 -0
  474. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_message_merging.py +0 -0
  475. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_middleware.py +0 -0
  476. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_multi_agent.py +0 -0
  477. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_real_failures.py +0 -0
  478. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_real_issues.py +0 -0
  479. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_real_workflow.py +0 -0
  480. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_reasoning_content.py +0 -0
  481. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_smoke.py +0 -0
  482. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_system_prompt.py +0 -0
  483. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_tagged_text.py +0 -0
  484. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_ui_external_editor.py +0 -0
  485. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_ui_input_history.py +0 -0
  486. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_user_issues.py +0 -0
  487. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/test_workloads.py +0 -0
  488. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/testbank_helpers.py +0 -0
  489. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/tools/test_ask_user_question.py +0 -0
  490. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/tools/test_bash.py +0 -0
  491. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/tools/test_exit_plan_mode.py +0 -0
  492. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/tools/test_grep.py +0 -0
  493. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/tools/test_invoke_context.py +0 -0
  494. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/tools/test_manager_get_tool_config.py +0 -0
  495. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/tools/test_mcp.py +0 -0
  496. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/tools/test_mcp_sampling.py +0 -0
  497. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/tools/test_task.py +0 -0
  498. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/tools/test_ui_bash_execution.py +0 -0
  499. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/tools/test_webfetch.py +0 -0
  500. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/tools/test_websearch.py +0 -0
  501. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  502. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  503. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/update_notifier/test_do_update.py +0 -0
  504. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  505. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/update_notifier/test_github_update_gateway.py +0 -0
  506. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  507. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/update_notifier/test_ui_update_notification.py +0 -0
  508. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/update_notifier/test_update_use_case.py +0 -0
  509. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/tests/update_notifier/test_whats_new.py +0 -0
  510. {drydock_cli-1.5.0 → drydock_cli-1.5.2}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 1.5.0
3
+ Version: 1.5.2
4
4
  Summary: Drydock — nautical CLI coding agent
5
5
  Project-URL: Homepage, https://github.com/fbobe321/drydock
6
6
  Project-URL: Repository, https://github.com/fbobe321/drydock
@@ -473,6 +473,13 @@ class AgentLoop:
473
473
 
474
474
  yield UserMessageEvent(content=user_msg, message_id=user_message.message_id)
475
475
 
476
+ # === AUTO-DELEGATION ===
477
+ # Inject context automatically so the model doesn't have to choose to delegate.
478
+ # This replaces relying on the model to call task()/invoke_skill().
479
+ auto_context = self._build_auto_context(user_msg)
480
+ if auto_context:
481
+ self._inject_system_note(auto_context)
482
+
476
483
  try:
477
484
  should_break_loop = False
478
485
  tool_turns = 0
@@ -627,6 +634,41 @@ class AgentLoop:
627
634
  f"Consider stopping to verify your approach."
628
635
  )
629
636
 
637
+ # Post-edit bash loop: model made edits but now loops on bash
638
+ # trying to test code that keeps failing
639
+ if has_made_edit and bash_count >= 3:
640
+ # Count consecutive bash calls at end of tool history
641
+ consecutive_bash = 0
642
+ for tc_name in reversed(self._recent_tool_names()):
643
+ if tc_name in ("bash", "run_command"):
644
+ consecutive_bash += 1
645
+ else:
646
+ break
647
+ if consecutive_bash >= 4:
648
+ self._inject_system_note(
649
+ "You have run 4+ bash commands in a row after editing files. "
650
+ "Each one failed or gave the same result. STOP running bash. "
651
+ "Read the error message carefully, then use search_replace "
652
+ "to fix the actual code. Running the same command again will "
653
+ "not give a different result."
654
+ )
655
+
656
+ # Detect bash file creation (touch, echo >, cat <<)
657
+ for msg in reversed(self.messages[-3:]):
658
+ if msg.role == Role.assistant and msg.tool_calls:
659
+ for tc in msg.tool_calls:
660
+ if tc.function and tc.function.name in ("bash", "run_command"):
661
+ cmd = ""
662
+ try:
663
+ cmd = json.loads(tc.function.arguments or "{}").get("command", "")
664
+ except (json.JSONDecodeError, AttributeError):
665
+ pass
666
+ if any(kw in cmd for kw in ("touch ", "echo ", "cat <<", "printf ", "> ")):
667
+ self._inject_system_note(
668
+ f"Do NOT use bash to create files. Use write_file instead. "
669
+ f"bash touch/echo/cat does not create proper code files."
670
+ )
671
+
630
672
  # Bash abuse detection: model uses bash instead of proper tools
631
673
  if not has_made_edit and bash_count >= 3:
632
674
  if bash_count == 3:
@@ -1203,17 +1245,33 @@ class AgentLoop:
1203
1245
  "Add more surrounding context lines to old_str to make it unique.]"
1204
1246
  )
1205
1247
 
1206
- # RECOVERY: After bash failure with traceback, extract file/line and nudge
1248
+ # RECOVERY: Relative import error tell model to use absolute imports or -m
1249
+ if tool_call.tool_name in ("bash", "run_command") and "relative import with no known parent" in str(exc):
1250
+ self._inject_system_note(
1251
+ "The error 'relative import with no known parent package' means you are "
1252
+ "running a package file directly (python3 pkg/file.py). Fix: either "
1253
+ "(1) change 'from .module import X' to 'from pkg.module import X' (absolute imports), or "
1254
+ "(2) run with 'python3 -m pkg' instead of 'python3 pkg/file.py'. "
1255
+ "Use search_replace to change the imports to absolute imports NOW."
1256
+ )
1257
+
1258
+ # RECOVERY: After bash failure with traceback, extract file/line and
1259
+ # inject a STRONG system note (not just error text) to force read→fix
1207
1260
  if tool_call.tool_name in ("bash", "run_command") and "Traceback" in str(exc):
1208
1261
  import re
1209
- # Extract last File "path", line N from traceback
1210
1262
  tb_matches = re.findall(r'File "([^"]+)", line (\d+)', str(exc))
1211
1263
  if tb_matches:
1212
1264
  tb_file, tb_line = tb_matches[-1]
1213
- if not tb_file.startswith("/home") and not "site-packages" in tb_file:
1265
+ if not tb_file.startswith("/home") and "site-packages" not in tb_file:
1214
1266
  error_msg += (
1215
- f"\n\n[NEXT STEP: Read the source at {tb_file} around line {tb_line} "
1216
- f"with read_file to understand the bug, then fix it with search_replace.]"
1267
+ f"\n\n[NEXT STEP: Read {tb_file} around line {tb_line} "
1268
+ f"with read_file, then fix it with search_replace.]"
1269
+ )
1270
+ # Also inject as system note — harder for model to ignore
1271
+ self._inject_system_note(
1272
+ f"STOP running bash. The error is at {tb_file}:{tb_line}. "
1273
+ f"Use read_file to read that file, then search_replace to fix the bug. "
1274
+ f"Do NOT run another bash command until you have fixed the code."
1217
1275
  )
1218
1276
 
1219
1277
  yield ToolResultEvent(
@@ -1584,6 +1642,106 @@ class AgentLoop:
1584
1642
 
1585
1643
  return None
1586
1644
 
1645
+ def _build_auto_context(self, user_msg: str) -> str | None:
1646
+ """Build auto-delegation context based on the prompt and project state.
1647
+
1648
+ Instead of hoping the model calls task()/invoke_skill(), we inject:
1649
+ 1. Project file listing (if files exist) — replaces explore subagent
1650
+ 2. Skill content (if prompt matches a skill) — replaces invoke_skill
1651
+ 3. Planning prompt (if complex build task) — replaces planner subagent
1652
+ """
1653
+ parts: list[str] = []
1654
+ msg_lower = user_msg.lower()
1655
+
1656
+ # 1. Auto-explore: list project files so model doesn't have to
1657
+ try:
1658
+ cwd = Path.cwd()
1659
+ py_files = sorted(cwd.rglob("*.py"))
1660
+ py_files = [f for f in py_files if ".logs" not in str(f) and ".venv" not in str(f)]
1661
+ if len(py_files) >= 3:
1662
+ listing = "\n".join(f" {f.relative_to(cwd)}" for f in py_files[:30])
1663
+ parts.append(f"PROJECT FILES ({len(py_files)} Python files):\n{listing}")
1664
+ if len(py_files) > 30:
1665
+ parts.append(f" ... and {len(py_files) - 30} more")
1666
+ except Exception:
1667
+ pass
1668
+
1669
+ # Also list non-Python files of interest
1670
+ try:
1671
+ for pattern in ("*.md", "*.txt", "*.json", "*.yaml", "*.yml", "*.toml", "*.csv"):
1672
+ for f in sorted(cwd.glob(pattern))[:5]:
1673
+ if f.name not in (".logs",):
1674
+ parts.append(f" {f.name} ({f.stat().st_size} bytes)")
1675
+ except Exception:
1676
+ pass
1677
+
1678
+ # 2. Skill routing: match prompt to skill and inject content
1679
+ skill_name = None
1680
+ if any(kw in msg_lower for kw in ("review this", "review the", "code review", "audit")):
1681
+ skill_name = "review"
1682
+ elif any(kw in msg_lower for kw in ("investigate", "debug", "why does", "why is", "broken", "diagnose")):
1683
+ skill_name = "investigate"
1684
+ elif any(kw in msg_lower for kw in ("ship it", "commit and push", "create a pr", "open a pr")):
1685
+ skill_name = "ship"
1686
+ elif any(kw in msg_lower for kw in ("simplify", "clean up", "reduce complexity")):
1687
+ skill_name = "simplify"
1688
+
1689
+ if skill_name:
1690
+ skill_info = self.skill_manager.get_skill(skill_name)
1691
+ if skill_info and skill_info.skill_path:
1692
+ try:
1693
+ content = skill_info.skill_path.read_text(encoding="utf-8")
1694
+ # Strip frontmatter
1695
+ if content.startswith("---"):
1696
+ end = content.find("---", 3)
1697
+ if end > 0:
1698
+ content = content[end + 3:].strip()
1699
+ parts.append(f"FOLLOW THIS WORKFLOW ({skill_name} skill):\n{content[:2000]}")
1700
+ except Exception:
1701
+ pass
1702
+
1703
+ # 3. Planning nudge for complex build tasks
1704
+ is_build = any(kw in msg_lower for kw in (
1705
+ "build", "create", "implement", "make a", "write a",
1706
+ "set up", "scaffold", "get started", "prd",
1707
+ ))
1708
+ is_complex = len(user_msg) > 100 or any(kw in msg_lower for kw in (
1709
+ "multiple", "modules", "package", "api", "database",
1710
+ "features", "cli", "commands",
1711
+ ))
1712
+ if is_build and is_complex:
1713
+ parts.append(
1714
+ "PLANNING REQUIRED — This is a complex build task. Before writing code:\n"
1715
+ "1. List ALL files you will create (with brief purpose)\n"
1716
+ "2. Define the package structure\n"
1717
+ "3. Use ABSOLUTE imports (from pkg.module import X), NOT relative imports\n"
1718
+ "4. Create files in dependency order (utilities first, then modules that import them)\n"
1719
+ "5. After creating all files, test with: python3 -m package_name\n"
1720
+ "6. If tests fail, READ the error, then FIX with search_replace"
1721
+ )
1722
+ elif is_build:
1723
+ parts.append(
1724
+ "REMINDER: Use write_file to create files. Use absolute imports. "
1725
+ "Test with python3 -m package_name (not python3 package/file.py)."
1726
+ )
1727
+
1728
+ if not parts:
1729
+ return None
1730
+ return "\n\n".join(parts)
1731
+
1732
+ def _recent_tool_names(self, limit: int = 10) -> list[str]:
1733
+ """Return recent tool names from message history (most recent last)."""
1734
+ names: list[str] = []
1735
+ for msg in reversed(self.messages):
1736
+ if msg.role == Role.assistant and msg.tool_calls:
1737
+ for tc in msg.tool_calls:
1738
+ if tc.function and tc.function.name:
1739
+ names.append(tc.function.name)
1740
+ if len(names) >= limit:
1741
+ break
1742
+ names.reverse()
1743
+ return names
1744
+
1587
1745
  def _prune_repeated_tool_calls(self) -> None:
1588
1746
  """Remove duplicate tool call/result pairs from recent history.
1589
1747
 
@@ -223,6 +223,13 @@ Error Handling:
223
223
  - After ANY error, your next action must be DIFFERENT from what just failed.
224
224
  - Never run the same failing command twice — the result won't change.
225
225
 
226
+ Python Package Rules:
227
+ When creating Python packages (directories with __init__.py):
228
+ - Use ABSOLUTE imports, not relative. Write `from mypackage.module import X`, NOT `from .module import X`
229
+ - To run a package: `python3 -m mypackage` (requires __main__.py), NOT `python3 mypackage/main.py`
230
+ - Relative imports (from .foo) ONLY work with `python3 -m`, not direct file execution
231
+ - If you get "attempted relative import with no known parent package", switch to absolute imports
232
+
226
233
  Debugging Best Practices:
227
234
  When fixing bugs, follow this cycle: RUN → READ → FIX → VERIFY.
228
235
  1. RUN the failing command to see the exact error (traceback, assertion, etc.)
@@ -231,7 +238,7 @@ When fixing bugs, follow this cycle: RUN → READ → FIX → VERIFY.
231
238
  - TypeError (str + int): add type conversion (int(), float(), str())
232
239
  - KeyError: add .get() with default, or check key existence
233
240
  - IndexError: fix loop bounds or add bounds check
234
- - ImportError: fix the import path or module name
241
+ - ImportError: fix the import path, use absolute imports, or run with python3 -m
235
242
  - Off-by-one: check if index starts at 0 or 1
236
243
  - Missing return value: check if function returns in all paths
237
244
  4. VERIFY by running the command again — if it still fails, read the NEW error
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "1.5.0"
3
+ version = "1.5.2"
4
4
  description = "Drydock — nautical CLI coding agent"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -0,0 +1,115 @@
1
+ #!/bin/bash
2
+ # Monitor the overnight PRD test battery.
3
+ # Restarts if stuck, logs results, and stops on repeated failures.
4
+ # Cron: */10 * * * * /data3/drydock/scripts/monitor_test_battery.sh
5
+
6
+ set -euo pipefail
7
+
8
+ export PATH="/home/bobef/miniconda3/bin:$PATH"
9
+ PYTHON="/home/bobef/miniconda3/bin/python3"
10
+ DRYDOCK="/data3/drydock"
11
+ LOGDIR="$DRYDOCK/test_bank_results"
12
+ LOGFILE="$LOGDIR/overnight_run2.log"
13
+ MONITOR_LOG="$LOGDIR/monitor.log"
14
+ LOCKFILE="/tmp/drydock_test_monitor.lock"
15
+
16
+ log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "$MONITOR_LOG"; }
17
+
18
+ # Prevent concurrent monitors
19
+ if [ -f "$LOCKFILE" ]; then
20
+ pid=$(cat "$LOCKFILE" 2>/dev/null)
21
+ if kill -0 "$pid" 2>/dev/null; then
22
+ exit 0
23
+ fi
24
+ fi
25
+ echo $$ > "$LOCKFILE"
26
+ trap "rm -f $LOCKFILE" EXIT
27
+
28
+ cd "$DRYDOCK"
29
+
30
+ # Check if test process is running
31
+ TEST_PID=$(pgrep -f "pytest.*test_bank_prd" 2>/dev/null | head -1 || echo "")
32
+
33
+ if [ -z "$TEST_PID" ]; then
34
+ # Check if it completed
35
+ if [ -f "$LOGFILE" ] && grep -q "passed" "$LOGFILE" 2>/dev/null; then
36
+ PASSED=$(grep -c "PASSED" "$LOGFILE" 2>/dev/null || echo 0)
37
+ FAILED=$(grep -c "FAILED" "$LOGFILE" 2>/dev/null || echo 0)
38
+ TOTAL=$((PASSED + FAILED))
39
+
40
+ if [ "$TOTAL" -ge 65 ]; then
41
+ log "TEST BATTERY COMPLETE: $PASSED passed, $FAILED failed out of $TOTAL"
42
+ # Log failures
43
+ grep "FAILED" "$LOGFILE" >> "$MONITOR_LOG" 2>/dev/null || true
44
+ exit 0
45
+ fi
46
+ fi
47
+
48
+ # Not running and not complete — restart
49
+ log "Test battery not running. Restarting..."
50
+
51
+ # Check how many tests already completed
52
+ DONE=$(grep -c "PASSED\|FAILED" "$LOGFILE" 2>/dev/null || echo 0)
53
+
54
+ if [ "$DONE" -gt 0 ]; then
55
+ # Save progress
56
+ cp "$LOGFILE" "$LOGDIR/overnight_run2_partial_$(date +%H%M).log" 2>/dev/null || true
57
+
58
+ # Check for repeated failures (same test failing 3+ times across runs)
59
+ FAIL_LOG="$LOGDIR/failure_tracking.log"
60
+ grep "FAILED" "$LOGFILE" >> "$FAIL_LOG" 2>/dev/null || true
61
+
62
+ # If a specific test has failed 3+ times, skip it
63
+ SKIP_TESTS=""
64
+ if [ -f "$FAIL_LOG" ]; then
65
+ while IFS= read -r test_name; do
66
+ COUNT=$(grep -c "$test_name" "$FAIL_LOG" 2>/dev/null || echo 0)
67
+ if [ "$COUNT" -ge 3 ]; then
68
+ log "SKIP: $test_name failed $COUNT times, skipping"
69
+ SKIP_TESTS="$SKIP_TESTS and not ${test_name##*::}"
70
+ fi
71
+ done < <(grep "FAILED" "$FAIL_LOG" | sed 's/ .*//' | sort -u)
72
+ fi
73
+ fi
74
+
75
+ # Restart
76
+ DESELECT=""
77
+ if [ -n "${SKIP_TESTS:-}" ]; then
78
+ DESELECT="-k 'not _PLACEHOLDER_ $SKIP_TESTS'"
79
+ fi
80
+
81
+ nohup $PYTHON -m pytest tests/test_bank_prd.py tests/test_bank_prd_extended.py \
82
+ -v -p no:xdist -p no:cov --override-ini="addopts=" --tb=short \
83
+ $DESELECT \
84
+ > "$LOGFILE" 2>&1 &
85
+
86
+ log "Restarted with PID $! (skipping: ${SKIP_TESTS:-none})"
87
+ exit 0
88
+ fi
89
+
90
+ # Process is running — check if stuck
91
+ LAST_MODIFIED=$(stat -c %Y "$LOGFILE" 2>/dev/null || echo 0)
92
+ NOW=$(date +%s)
93
+ STALE=$((NOW - LAST_MODIFIED))
94
+
95
+ if [ "$STALE" -gt 600 ]; then
96
+ # Log file hasn't been updated in 10 minutes — test might be stuck
97
+ CURRENT_TEST=$(tail -1 "$LOGFILE" | grep -o "test_[a-z_]*" | head -1 || echo "unknown")
98
+ log "WARNING: Test battery stale for ${STALE}s. Current test: $CURRENT_TEST"
99
+
100
+ if [ "$STALE" -gt 1200 ]; then
101
+ # 20 minutes stuck — kill and restart
102
+ log "STUCK: Killing PID $TEST_PID (stale ${STALE}s on $CURRENT_TEST)"
103
+ kill "$TEST_PID" 2>/dev/null || true
104
+ sleep 5
105
+ kill -9 "$TEST_PID" 2>/dev/null || true
106
+
107
+ # Will restart on next cron run
108
+ fi
109
+ else
110
+ # Running fine — log progress
111
+ PASSED=$(grep -c "PASSED" "$LOGFILE" 2>/dev/null || echo 0)
112
+ FAILED=$(grep -c "FAILED" "$LOGFILE" 2>/dev/null || echo 0)
113
+ TOTAL=$((PASSED + FAILED))
114
+ log "Running: $TOTAL/65 done ($PASSED passed, $FAILED failed)"
115
+ fi