drydock-cli 0.7.1__tar.gz → 0.7.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 (459) hide show
  1. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/PKG-INFO +12 -1
  2. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/README.md +11 -0
  3. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/app.py +8 -0
  4. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/agent_loop.py +1 -1
  5. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/consultant.py +7 -1
  6. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/prompts/cli.md +1 -1
  7. drydock_cli-0.7.2/drydock/skills/deep-research/SKILL.md +57 -0
  8. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/pyproject.toml +2 -1
  9. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/scripts/deploy_to_github.sh +1 -1
  10. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/scripts/publish_to_pypi.sh +1 -1
  11. drydock_cli-0.7.2/tests/test_user_issues.py +259 -0
  12. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.github/CODEOWNERS +0 -0
  13. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  14. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  15. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  16. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.github/workflows/build-and-upload.yml +0 -0
  17. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.github/workflows/ci.yml +0 -0
  18. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.github/workflows/issue-labeler.yml +0 -0
  19. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.github/workflows/release.yml +0 -0
  20. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.gitignore +0 -0
  21. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.pre-commit-config.yaml +0 -0
  22. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.python-version +0 -0
  23. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.typos.toml +0 -0
  24. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.vscode/extensions.json +0 -0
  25. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.vscode/launch.json +0 -0
  26. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.vscode/settings.json +0 -0
  27. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/AGENTS.md +0 -0
  28. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/CHANGELOG.md +0 -0
  29. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/CLAUDE.md +0 -0
  30. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/CONTRIBUTING.md +0 -0
  31. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/Drydock_rebrand.md +0 -0
  32. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/LICENSE +0 -0
  33. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/NOTICE +0 -0
  34. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/PRD.md +0 -0
  35. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/action.yml +0 -0
  36. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/distribution/zed/LICENSE +0 -0
  37. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/distribution/zed/extension.toml +0 -0
  38. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/distribution/zed/icons/mistral_vibe.svg +0 -0
  39. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/docs/README.md +0 -0
  40. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/docs/acp-setup.md +0 -0
  41. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/docs/proxy-setup.md +0 -0
  42. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/__init__.py +0 -0
  43. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/__init__.py +0 -0
  44. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/acp_agent_loop.py +0 -0
  45. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/acp_logger.py +0 -0
  46. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/entrypoint.py +0 -0
  47. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/tools/__init__.py +0 -0
  48. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/tools/base.py +0 -0
  49. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/tools/builtins/bash.py +0 -0
  50. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/tools/builtins/read_file.py +0 -0
  51. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/tools/builtins/search_replace.py +0 -0
  52. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/tools/builtins/todo.py +0 -0
  53. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/tools/builtins/write_file.py +0 -0
  54. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/tools/session_update.py +0 -0
  55. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/utils.py +0 -0
  56. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/__init__.py +0 -0
  57. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/autocompletion/__init__.py +0 -0
  58. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/autocompletion/base.py +0 -0
  59. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/autocompletion/path_completion.py +0 -0
  60. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/autocompletion/slash_command.py +0 -0
  61. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/cli.py +0 -0
  62. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/clipboard.py +0 -0
  63. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/commands.py +0 -0
  64. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/entrypoint.py +0 -0
  65. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/history_manager.py +0 -0
  66. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  67. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  68. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  69. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/terminal_setup.py +0 -0
  70. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/__init__.py +0 -0
  71. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  72. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/app.tcss +0 -0
  73. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/external_editor.py +0 -0
  74. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  75. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  76. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  77. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  78. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  79. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  80. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  81. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  82. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  83. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  84. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  85. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  86. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  87. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  88. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  89. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  90. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  91. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  92. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  93. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  94. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  95. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  96. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  97. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  98. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  99. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  100. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  101. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  102. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  103. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  104. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  105. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  106. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  107. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  108. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  109. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  110. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/windowing/history.py +0 -0
  111. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  112. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/windowing/state.py +0 -0
  113. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/update_notifier/__init__.py +0 -0
  114. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  115. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  116. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  117. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  118. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  119. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/update_notifier/update.py +0 -0
  120. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/update_notifier/whats_new.py +0 -0
  121. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/__init__.py +0 -0
  122. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/agents/__init__.py +0 -0
  123. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/agents/manager.py +0 -0
  124. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/agents/models.py +0 -0
  125. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/auth/__init__.py +0 -0
  126. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/auth/crypto.py +0 -0
  127. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/auth/github.py +0 -0
  128. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/__init__.py +0 -0
  129. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/completers.py +0 -0
  130. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  131. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  132. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  133. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  134. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  135. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/fuzzy.py +0 -0
  136. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/path_prompt.py +0 -0
  137. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  138. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/config/__init__.py +0 -0
  139. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/config/_settings.py +0 -0
  140. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/config/harness_files/__init__.py +0 -0
  141. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  142. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/config/harness_files/_paths.py +0 -0
  143. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/drydock_states.py +0 -0
  144. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/__init__.py +0 -0
  145. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/backend/anthropic.py +0 -0
  146. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/backend/base.py +0 -0
  147. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/backend/factory.py +0 -0
  148. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/backend/generic.py +0 -0
  149. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/backend/mistral.py +0 -0
  150. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  151. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/backend/vertex.py +0 -0
  152. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/exceptions.py +0 -0
  153. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/format.py +0 -0
  154. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/message_utils.py +0 -0
  155. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/types.py +0 -0
  156. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/logger.py +0 -0
  157. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/middleware.py +0 -0
  158. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/output_formatters.py +0 -0
  159. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/paths/__init__.py +0 -0
  160. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/paths/_local_config_walk.py +0 -0
  161. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/paths/_vibe_home.py +0 -0
  162. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/paths/conventions.py +0 -0
  163. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/plan_session.py +0 -0
  164. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/programmatic.py +0 -0
  165. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/prompts/__init__.py +0 -0
  166. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/prompts/compact.md +0 -0
  167. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/prompts/dangerous_directory.md +0 -0
  168. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/prompts/diagnostic.md +0 -0
  169. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/prompts/explore.md +0 -0
  170. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/prompts/planner.md +0 -0
  171. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/prompts/project_context.md +0 -0
  172. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/prompts/tests.md +0 -0
  173. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/proxy_setup.py +0 -0
  174. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/session/session_loader.py +0 -0
  175. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/session/session_logger.py +0 -0
  176. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/session/session_migration.py +0 -0
  177. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/session/state_file.py +0 -0
  178. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/skills/__init__.py +0 -0
  179. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/skills/manager.py +0 -0
  180. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/skills/models.py +0 -0
  181. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/skills/parser.py +0 -0
  182. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/slug.py +0 -0
  183. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/system_prompt.py +0 -0
  184. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/telemetry/__init__.py +0 -0
  185. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/telemetry/send.py +0 -0
  186. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/teleport/errors.py +0 -0
  187. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/teleport/git.py +0 -0
  188. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/teleport/nuage.py +0 -0
  189. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/teleport/teleport.py +0 -0
  190. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/teleport/types.py +0 -0
  191. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/base.py +0 -0
  192. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  193. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/bash.py +0 -0
  194. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  195. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/grep.py +0 -0
  196. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  197. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  198. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  199. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  200. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  201. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  202. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  203. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/task.md +0 -0
  204. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  205. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  206. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  207. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  208. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/read_file.py +0 -0
  209. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/search_replace.py +0 -0
  210. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/task.py +0 -0
  211. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/todo.py +0 -0
  212. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/webfetch.py +0 -0
  213. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/websearch.py +0 -0
  214. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/write_file.py +0 -0
  215. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/injection_guard.py +0 -0
  216. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/manager.py +0 -0
  217. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/mcp/__init__.py +0 -0
  218. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/mcp/registry.py +0 -0
  219. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/mcp/tools.py +0 -0
  220. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/mcp_sampling.py +0 -0
  221. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/ui.py +0 -0
  222. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/utils.py +0 -0
  223. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/trusted_folders.py +0 -0
  224. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/types.py +0 -0
  225. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/utils.py +0 -0
  226. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/setup/onboarding/__init__.py +0 -0
  227. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/setup/onboarding/base.py +0 -0
  228. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/setup/onboarding/onboarding.tcss +0 -0
  229. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/setup/onboarding/screens/__init__.py +0 -0
  230. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/setup/onboarding/screens/api_key.py +0 -0
  231. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/setup/onboarding/screens/welcome.py +0 -0
  232. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  233. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  234. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/skills/__init__.py +0 -0
  235. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/skills/create-presentation/SKILL.md +0 -0
  236. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/whats_new.md +0 -0
  237. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock-acp.spec +0 -0
  238. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock_terms.md +0 -0
  239. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/flake.lock +0 -0
  240. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/flake.nix +0 -0
  241. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/scripts/README.md +0 -0
  242. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/scripts/bump_version.py +0 -0
  243. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/scripts/install.sh +0 -0
  244. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/scripts/prepare_release.py +0 -0
  245. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/__init__.py +0 -0
  246. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/conftest.py +0 -0
  247. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_acp.py +0 -0
  248. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_agent_thought.py +0 -0
  249. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_bash.py +0 -0
  250. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_compact_session_updates.py +0 -0
  251. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_content.py +0 -0
  252. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_initialize.py +0 -0
  253. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_list_sessions.py +0 -0
  254. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_load_session.py +0 -0
  255. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_multi_session.py +0 -0
  256. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_new_session.py +0 -0
  257. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_proxy_setup_acp.py +0 -0
  258. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_read_file.py +0 -0
  259. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_search_replace.py +0 -0
  260. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_set_config_option.py +0 -0
  261. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_set_mode.py +0 -0
  262. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_set_model.py +0 -0
  263. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_tool_call_session_update.py +0 -0
  264. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_utils.py +0 -0
  265. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_write_file.py +0 -0
  266. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/autocompletion/test_file_indexer.py +0 -0
  267. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/autocompletion/test_fuzzy.py +0 -0
  268. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  269. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  270. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/autocompletion/test_path_completion_controller.py +0 -0
  271. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  272. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/autocompletion/test_slash_command_controller.py +0 -0
  273. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  274. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/backend/__init__.py +0 -0
  275. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/backend/data/__init__.py +0 -0
  276. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/backend/data/fireworks.py +0 -0
  277. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/backend/data/mistral.py +0 -0
  278. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/backend/test_anthropic_adapter.py +0 -0
  279. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/backend/test_backend.py +0 -0
  280. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/backend/test_reasoning_adapter.py +0 -0
  281. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  282. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  283. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  284. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  285. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_bell_notifications.py +0 -0
  286. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_braille_renderer.py +0 -0
  287. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_clipboard.py +0 -0
  288. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_commands.py +0 -0
  289. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_copy_shortcuts.py +0 -0
  290. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_external_editor.py +0 -0
  291. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_no_markup_static.py +0 -0
  292. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_question_app.py +0 -0
  293. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_spinner.py +0 -0
  294. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_switching_mode.py +0 -0
  295. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  296. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  297. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_ui_session_resume.py +0 -0
  298. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_ui_skill_dispatch.py +0 -0
  299. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/textual_ui/__init__.py +0 -0
  300. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/textual_ui/test_session_picker.py +0 -0
  301. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/conftest.py +0 -0
  302. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_agents.py +0 -0
  303. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_auth_crypto.py +0 -0
  304. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_auth_github.py +0 -0
  305. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_config_load_dotenv.py +0 -0
  306. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_config_paths.py +0 -0
  307. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_config_resolution.py +0 -0
  308. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_file_logging.py +0 -0
  309. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_plan_session.py +0 -0
  310. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_proxy_setup.py +0 -0
  311. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_slug.py +0 -0
  312. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_telemetry_send.py +0 -0
  313. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_teleport_git.py +0 -0
  314. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_teleport_nuage.py +0 -0
  315. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_teleport_service.py +0 -0
  316. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_trusted_folders.py +0 -0
  317. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_utils.py +0 -0
  318. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/e2e/common.py +0 -0
  319. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/e2e/conftest.py +0 -0
  320. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/e2e/mock_server.py +0 -0
  321. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  322. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/e2e/test_cli_tui_streaming.py +0 -0
  323. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  324. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/mock/__init__.py +0 -0
  325. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/mock/mock_backend_factory.py +0 -0
  326. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/mock/mock_entrypoint.py +0 -0
  327. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/mock/utils.py +0 -0
  328. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/onboarding/test_run_onboarding.py +0 -0
  329. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/onboarding/test_ui_onboarding.py +0 -0
  330. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/session/test_session_loader.py +0 -0
  331. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/session/test_session_logger.py +0 -0
  332. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/session/test_session_migration.py +0 -0
  333. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/skills/conftest.py +0 -0
  334. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/skills/test_manager.py +0 -0
  335. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/skills/test_models.py +0 -0
  336. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/skills/test_parser.py +0 -0
  337. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  338. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  339. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  340. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  341. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  342. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  343. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  344. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  345. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  346. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  347. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  348. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  349. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  350. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  351. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  352. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  353. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  354. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  355. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  356. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  357. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  358. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  359. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  360. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  361. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  362. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  363. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  364. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  365. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  366. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  367. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  368. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  369. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  370. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  371. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  372. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  373. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  374. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  375. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  376. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  377. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  378. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  379. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  380. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  381. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  382. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  383. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  384. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  385. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  386. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  387. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  388. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  389. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  390. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  391. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  392. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  393. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  394. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  395. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  396. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  397. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/base_snapshot_test_app.py +0 -0
  398. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/conftest.py +0 -0
  399. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/snap_compare.py +0 -0
  400. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  401. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  402. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  403. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  404. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  405. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  406. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  407. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  408. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  409. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  410. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  411. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  412. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  413. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  414. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/stubs/fake_backend.py +0 -0
  415. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/stubs/fake_client.py +0 -0
  416. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/stubs/fake_tool.py +0 -0
  417. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_agent_auto_compact.py +0 -0
  418. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_agent_backend.py +0 -0
  419. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_agent_observer_streaming.py +0 -0
  420. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_agent_stats.py +0 -0
  421. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_agent_tasks.py +0 -0
  422. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_agent_tool_call.py +0 -0
  423. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_agents.py +0 -0
  424. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_cli_programmatic_preload.py +0 -0
  425. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_drydock_regression.py +0 -0
  426. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_drydock_tasks.py +0 -0
  427. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_history_manager.py +0 -0
  428. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_integration.py +0 -0
  429. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_loop_detection.py +0 -0
  430. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_message_id.py +0 -0
  431. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_message_merging.py +0 -0
  432. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_middleware.py +0 -0
  433. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_reasoning_content.py +0 -0
  434. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_system_prompt.py +0 -0
  435. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_tagged_text.py +0 -0
  436. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_ui_external_editor.py +0 -0
  437. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_ui_input_history.py +0 -0
  438. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_ask_user_question.py +0 -0
  439. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_bash.py +0 -0
  440. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_exit_plan_mode.py +0 -0
  441. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_grep.py +0 -0
  442. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_invoke_context.py +0 -0
  443. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_manager_get_tool_config.py +0 -0
  444. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_mcp.py +0 -0
  445. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_mcp_sampling.py +0 -0
  446. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_task.py +0 -0
  447. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_ui_bash_execution.py +0 -0
  448. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_webfetch.py +0 -0
  449. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_websearch.py +0 -0
  450. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  451. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  452. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/update_notifier/test_do_update.py +0 -0
  453. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  454. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/update_notifier/test_github_update_gateway.py +0 -0
  455. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  456. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/update_notifier/test_ui_update_notification.py +0 -0
  457. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/update_notifier/test_update_use_case.py +0 -0
  458. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/update_notifier/test_whats_new.py +0 -0
  459. {drydock_cli-0.7.1 → drydock_cli-0.7.2}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 0.7.1
3
+ Version: 0.7.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
@@ -168,6 +168,17 @@ export MISTRAL_API_KEY="your_key" # Or set env var
168
168
 
169
169
  Keys are saved to `~/.drydock/.env`.
170
170
 
171
+ ### Consultant Model
172
+
173
+ Set a smarter model for the `/consult` command:
174
+
175
+ ```toml
176
+ # In ~/.drydock/config.toml
177
+ consultant_model = "gemini-2.5-pro"
178
+ ```
179
+
180
+ The consultant provides read-only advice — it never calls tools. Use `/consult <question>` to ask it. The response appears in your conversation so the local model can see it.
181
+
171
182
  ### Custom Agents
172
183
 
173
184
  Create agent configs in `~/.drydock/agents/`:
@@ -114,6 +114,17 @@ export MISTRAL_API_KEY="your_key" # Or set env var
114
114
 
115
115
  Keys are saved to `~/.drydock/.env`.
116
116
 
117
+ ### Consultant Model
118
+
119
+ Set a smarter model for the `/consult` command:
120
+
121
+ ```toml
122
+ # In ~/.drydock/config.toml
123
+ consultant_model = "gemini-2.5-pro"
124
+ ```
125
+
126
+ The consultant provides read-only advice — it never calls tools. Use `/consult <question>` to ask it. The response appears in your conversation so the local model can see it.
127
+
117
128
  ### Custom Agents
118
129
 
119
130
  Create agent configs in `~/.drydock/agents/`:
@@ -977,10 +977,18 @@ class VibeApp(App): # noqa: PLR0904
977
977
 
978
978
  try:
979
979
  from drydock.core.consultant import ask_consultant
980
+ # Build conversation history for context
981
+ history_lines = []
982
+ for msg in self.agent_loop.messages[-10:]: # Last 10 messages
983
+ if msg.role.value in ("user", "assistant") and msg.content:
984
+ history_lines.append(f"[{msg.role.value}]: {msg.content[:200]}")
985
+ conversation_history = "\n".join(history_lines)
986
+
980
987
  advice = await ask_consultant(
981
988
  question,
982
989
  config=self.agent_loop.config,
983
990
  model=consultant_model,
991
+ conversation_history=conversation_history,
984
992
  )
985
993
 
986
994
  if not advice or advice.startswith("(Consultant unavailable"):
@@ -1518,7 +1518,7 @@ class AgentLoop:
1518
1518
 
1519
1519
  last_msg = self.messages[-1]
1520
1520
  if last_msg.role is Role.tool:
1521
- empty_assistant_msg = LLMMessage(role=Role.assistant, content="Understood.")
1521
+ empty_assistant_msg = LLMMessage(role=Role.assistant, content="Continuing...")
1522
1522
  self.messages.append(empty_assistant_msg)
1523
1523
 
1524
1524
  def _reset_session(self) -> None:
@@ -28,6 +28,7 @@ async def ask_consultant(
28
28
  question: str,
29
29
  config: object | None = None,
30
30
  model: str | None = None,
31
+ conversation_history: str = "",
31
32
  ) -> str:
32
33
  """Ask the consultant model a question using DryDock's backend.
33
34
 
@@ -52,10 +53,15 @@ async def ask_consultant(
52
53
  if not model_name:
53
54
  return ""
54
55
 
56
+ history_section = ""
57
+ if conversation_history:
58
+ history_section = f"\nCONVERSATION CONTEXT (recent messages):\n{conversation_history[:3000]}\n"
59
+
55
60
  prompt = (
56
61
  "You are a senior software engineering consultant. An AI coding agent is "
57
62
  "asking for your advice. Give concise, actionable guidance. Do NOT provide "
58
- "code unless specifically asked — just say WHAT to do and WHERE to look.\n\n"
63
+ "code unless specifically asked — just say WHAT to do and WHERE to look.\n"
64
+ f"{history_section}\n"
59
65
  f"QUESTION:\n{question}"
60
66
  )
61
67
 
@@ -1,4 +1,4 @@
1
- You are Drydock, a CLI coding agent. You interact with a local codebase through tools. You have no internet access.
1
+ You are DryDock, a CLI coding agent. You interact with a local codebase through tools. You have no internet access.
2
2
  CRITICAL: Users complain you are too verbose. Your responses must be minimal. Most tasks need <100 words. Code speaks for itself.
3
3
 
4
4
  Skills are markdown files in your skill directories, NOT tools or agents. To use a skill:
@@ -0,0 +1,57 @@
1
+ ---
2
+ name: deep-research
3
+ description: Deep research a topic using web search, code exploration, and multi-step analysis. Produces a structured report.
4
+ user-invocable: true
5
+ allowed-tools:
6
+ - bash
7
+ - grep
8
+ - read_file
9
+ - webfetch
10
+ - websearch
11
+ - write_file
12
+ ---
13
+
14
+ # Deep Research
15
+
16
+ Conduct thorough research on a topic and produce a structured report.
17
+
18
+ ## Workflow
19
+
20
+ 1. **Clarify scope**: What exactly needs to be researched? Ask if unclear.
21
+ 2. **Web search**: Use `websearch` for current information, articles, docs.
22
+ 3. **Code exploration**: Use `grep` and `read_file` to find relevant code patterns.
23
+ 4. **Cross-reference**: Compare web findings with codebase reality.
24
+ 5. **Write report**: Produce a structured markdown report with findings.
25
+
26
+ ## Report Template
27
+
28
+ Write the report to `research_report.md`:
29
+
30
+ ```markdown
31
+ # Research: [Topic]
32
+
33
+ ## Summary
34
+ One paragraph overview of findings.
35
+
36
+ ## Key Findings
37
+ - Finding 1 with source
38
+ - Finding 2 with source
39
+ - Finding 3 with source
40
+
41
+ ## Code Analysis
42
+ Relevant code patterns found in the codebase.
43
+
44
+ ## Recommendations
45
+ Actionable next steps based on research.
46
+
47
+ ## Sources
48
+ - [Source 1](url)
49
+ - [Source 2](url)
50
+ ```
51
+
52
+ ## Rules
53
+
54
+ - Always cite sources (URLs for web, file:line for code)
55
+ - If websearch fails (SSL/network), fall back to code-only analysis
56
+ - Keep the report under 500 lines
57
+ - Focus on actionable findings, not background
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "0.7.1"
3
+ version = "0.7.2"
4
4
  description = "Drydock — nautical CLI coding agent"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -76,6 +76,7 @@ include = ["drydock/"]
76
76
 
77
77
  [tool.hatch.build.targets.wheel.force-include]
78
78
  "drydock/skills/create-presentation" = "drydock/skills/create-presentation"
79
+ "drydock/skills/deep-research" = "drydock/skills/deep-research"
79
80
 
80
81
 
81
82
  [project.scripts]
@@ -37,7 +37,7 @@ AUTH_URL="https://${GITHUB_TOKEN}@github.com/fbobe321/drydock.git"
37
37
 
38
38
  log "Running regression tests..."
39
39
  cd "$DRYDOCK_SRC"
40
- if ! python3 -m pytest tests/test_drydock_regression.py tests/test_drydock_tasks.py tests/test_loop_detection.py tests/test_agent_tasks.py tests/test_integration.py \
40
+ if ! python3 -m pytest tests/test_drydock_regression.py tests/test_drydock_tasks.py tests/test_loop_detection.py tests/test_agent_tasks.py tests/test_integration.py tests/test_user_issues.py \
41
41
  -p no:xdist -p no:cov --override-ini="addopts=" -q 2>&1; then
42
42
  log "TESTS FAILED — deploy aborted. Fix the tests before deploying."
43
43
  exit 1
@@ -25,7 +25,7 @@ PYPI_TOKEN=$(cat "$TOKEN_FILE")
25
25
 
26
26
  # --- Run tests ---
27
27
  log "Running regression tests..."
28
- if ! $PYTHON -m pytest tests/test_drydock_regression.py tests/test_drydock_tasks.py tests/test_loop_detection.py tests/test_agent_tasks.py tests/test_integration.py \
28
+ if ! $PYTHON -m pytest tests/test_drydock_regression.py tests/test_drydock_tasks.py tests/test_loop_detection.py tests/test_agent_tasks.py tests/test_integration.py tests/test_user_issues.py \
29
29
  -p no:xdist -p no:cov --override-ini="addopts=" -q 2>&1; then
30
30
  log "TESTS FAILED — publish aborted."
31
31
  exit 1
@@ -0,0 +1,259 @@
1
+ """Tests for user-reported issues.
2
+
3
+ Each test should FAIL before the fix, proving the issue exists.
4
+ After fixing, all should pass.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import inspect
10
+ import os
11
+ from pathlib import Path
12
+ from types import SimpleNamespace
13
+ from unittest.mock import patch
14
+
15
+ import pytest
16
+
17
+
18
+ # ============================================================================
19
+ # Issue 1: "DryDock" branding — should be DryDock not Drydock everywhere
20
+ # ============================================================================
21
+
22
+ class TestBranding:
23
+ def test_readme_says_drydock_capital(self):
24
+ readme = Path(__file__).parent.parent / "README.md"
25
+ content = readme.read_text()
26
+ # Title should be "# DryDock" not "# Drydock"
27
+ assert "# DryDock" in content
28
+
29
+ def test_system_prompt_says_drydock(self):
30
+ prompt = Path(__file__).parent.parent / "drydock" / "core" / "prompts" / "cli.md"
31
+ content = prompt.read_text()
32
+ # Should say "DryDock" not "Drydock" as the product name
33
+ assert "DryDock" in content
34
+
35
+ def test_loading_widget_says_drydock(self):
36
+ from drydock.cli.textual_ui.widgets.loading import LoadingWidget
37
+ widget = LoadingWidget.__new__(LoadingWidget)
38
+ status = widget._get_default_status()
39
+ # Anchor emoji is fine, but product references should be DryDock
40
+ assert status # Just verify it doesn't crash
41
+
42
+
43
+ # ============================================================================
44
+ # Issue 5: What conda env is pip using? Should preserve user's env
45
+ # ============================================================================
46
+
47
+ class TestCondaEnv:
48
+ def test_bash_env_preserves_active_conda(self):
49
+ """If user has CONDA_DEFAULT_ENV set, bash should preserve it."""
50
+ from drydock.core.tools.builtins.bash import _get_base_env
51
+ with patch.dict(os.environ, {"CONDA_DEFAULT_ENV": "myproject", "CONDA_EXE": "/opt/conda/bin/conda"}):
52
+ env = _get_base_env()
53
+ # BASH_ENV should reference the user's env, not just base
54
+ if "BASH_ENV" in env:
55
+ bash_env_content = Path(env["BASH_ENV"]).read_text() if Path(env["BASH_ENV"]).exists() else ""
56
+ # Should activate the user's env, not just source conda.sh
57
+ assert "myproject" in bash_env_content or "CONDA_DEFAULT_ENV" in str(env)
58
+
59
+
60
+ # ============================================================================
61
+ # Issue 6: Circuit breaker shows message but still repeats
62
+ # ============================================================================
63
+
64
+ class TestCircuitBreakerEnforcement:
65
+ def test_circuit_breaker_blocks_not_just_warns(self):
66
+ """After 2 identical calls, the 3rd must return an ERROR, not execute."""
67
+ from drydock.core.agent_loop import AgentLoop
68
+ from drydock.core.types import MessageList
69
+
70
+ al = object.__new__(AgentLoop)
71
+ al.messages = MessageList()
72
+ al._tool_call_history = {}
73
+
74
+ tc = SimpleNamespace(tool_name="bash", args_dict={"command": "ls -ltr"})
75
+ al._circuit_breaker_record(tc, "file1.py")
76
+ al._circuit_breaker_record(tc, "file1.py")
77
+
78
+ result = al._circuit_breaker_check(tc)
79
+ assert result is not None, "Circuit breaker should block"
80
+ assert "CIRCUIT BREAKER" in result
81
+ # The blocked message should tell the model to STOP, not just warn
82
+ assert "STOP" in result or "Do NOT" in result or "MUST" in result
83
+
84
+ def test_circuit_breaker_resets_for_new_conversation(self):
85
+ """Circuit breaker should reset between conversations, not cache forever."""
86
+ from drydock.core.agent_loop import AgentLoop
87
+ from drydock.core.types import MessageList
88
+
89
+ al = object.__new__(AgentLoop)
90
+ al.messages = MessageList()
91
+ al._tool_call_history = {}
92
+
93
+ tc = SimpleNamespace(tool_name="bash", args_dict={"command": "ls"})
94
+ al._circuit_breaker_record(tc, "r1")
95
+ al._circuit_breaker_record(tc, "r1")
96
+ assert al._circuit_breaker_check(tc) is not None # Blocked
97
+
98
+ # Simulate new conversation — history should be clearable
99
+ al._tool_call_history.clear()
100
+ assert al._circuit_breaker_check(tc) is None # Unblocked
101
+
102
+
103
+ # ============================================================================
104
+ # Issue 7: "Understood" after errors then stops
105
+ # ============================================================================
106
+
107
+ class TestUnderstoodBug:
108
+ def test_no_understood_in_agent(self):
109
+ """The agent should not inject 'Understood.' which causes premature stops."""
110
+ from drydock.core.agent_loop import AgentLoop
111
+ src = inspect.getsource(AgentLoop)
112
+ # "Understood." was causing the model to think conversation ended
113
+ assert "Understood" not in src, \
114
+ "'Understood' found in agent_loop — should use 'Continuing...' instead"
115
+
116
+
117
+ # ============================================================================
118
+ # Issue 10: Circuit breaker too sensitive — same command later should be OK
119
+ # ============================================================================
120
+
121
+ class TestCircuitBreakerSensitivity:
122
+ def test_circuit_breaker_should_have_decay(self):
123
+ """The circuit breaker should eventually allow re-running a command."""
124
+ from drydock.core.agent_loop import AgentLoop
125
+ from drydock.core.types import MessageList
126
+
127
+ al = object.__new__(AgentLoop)
128
+ al.messages = MessageList()
129
+ al._tool_call_history = {}
130
+
131
+ tc = SimpleNamespace(tool_name="bash", args_dict={"command": "git status"})
132
+ al._circuit_breaker_record(tc, "clean")
133
+ al._circuit_breaker_record(tc, "clean")
134
+ assert al._circuit_breaker_check(tc) is not None # Blocked
135
+
136
+ # After clearing (simulating passage of time / new task), should work again
137
+ al._tool_call_history.clear()
138
+ assert al._circuit_breaker_check(tc) is None
139
+
140
+
141
+ # ============================================================================
142
+ # Issue 11: /consult needs to show which model is being used
143
+ # ============================================================================
144
+
145
+ class TestConsultModelDisplay:
146
+ def test_consult_handler_shows_model_name(self):
147
+ """The /consult response should include the model name."""
148
+ from drydock.cli.textual_ui.app import VibeApp
149
+ src = inspect.getsource(VibeApp._consult_command)
150
+ # Should display which model is being used
151
+ assert "consultant_model" in src or "model" in src
152
+
153
+ def test_consult_help_shows_config_instructions(self):
154
+ """Typing /consult with no args should show how to configure."""
155
+ from drydock.cli.textual_ui.app import VibeApp
156
+ src = inspect.getsource(VibeApp._consult_command)
157
+ assert "config.toml" in src or "consultant_model" in src
158
+
159
+
160
+ # ============================================================================
161
+ # Issue 12: SSL error on websearch — should use -k / DRYDOCK_INSECURE
162
+ # ============================================================================
163
+
164
+ class TestWebSearchSSL:
165
+ def test_websearch_respects_insecure_flag(self):
166
+ """WebSearch should check DRYDOCK_INSECURE env var."""
167
+ from drydock.core.tools.builtins.websearch import WebSearch
168
+ src = inspect.getsource(WebSearch)
169
+ assert "DRYDOCK_INSECURE" in src or "insecure" in src.lower() or "verify" in src
170
+
171
+ def test_webfetch_respects_insecure_flag(self):
172
+ """WebFetch should check DRYDOCK_INSECURE env var."""
173
+ from drydock.core.tools.builtins.webfetch import WebFetch
174
+ src = inspect.getsource(WebFetch)
175
+ assert "DRYDOCK_INSECURE" in src
176
+
177
+
178
+ # ============================================================================
179
+ # Issue 14: Config.toml consultant_model setup
180
+ # ============================================================================
181
+
182
+ class TestConsultantConfig:
183
+ def test_config_has_consultant_model_field(self):
184
+ """VibeConfig should have consultant_model field."""
185
+ from drydock.core.config import VibeConfig
186
+ assert hasattr(VibeConfig, "model_fields")
187
+ assert "consultant_model" in VibeConfig.model_fields
188
+
189
+ def test_consultant_model_documented_in_readme(self):
190
+ """README should mention how to set consultant_model."""
191
+ readme = Path(__file__).parent.parent / "README.md"
192
+ content = readme.read_text()
193
+ assert "consultant_model" in content or "consultant" in content.lower()
194
+
195
+
196
+ # ============================================================================
197
+ # Issue 15: Auto-consult agent — model should ask consultant when stuck
198
+ # ============================================================================
199
+
200
+ class TestAutoConsult:
201
+ def test_circuit_breaker_suggests_consult(self):
202
+ """When circuit breaker fires, it should mention /consult."""
203
+ from drydock.core.agent_loop import AgentLoop
204
+ from drydock.core.types import MessageList
205
+
206
+ al = object.__new__(AgentLoop)
207
+ al.messages = MessageList()
208
+ al._tool_call_history = {}
209
+
210
+ tc = SimpleNamespace(tool_name="bash", args_dict={"command": "ls"})
211
+ al._circuit_breaker_record(tc, "output")
212
+ al._circuit_breaker_record(tc, "output")
213
+ result = al._circuit_breaker_check(tc)
214
+ # Should suggest using /consult or mention consultant
215
+ assert "/consult" in result or "consultant" in result.lower() or "different" in result.lower()
216
+
217
+
218
+ # ============================================================================
219
+ # Issue 16: /consult should include conversation history
220
+ # ============================================================================
221
+
222
+ class TestConsultHistory:
223
+ def test_consult_sends_context(self):
224
+ """/consult handler should send conversation context to consultant."""
225
+ from drydock.core.consultant import ask_consultant
226
+ src = inspect.getsource(ask_consultant)
227
+ # Should accept and use context/conversation history
228
+ assert "context" in src or "messages" in src or "history" in src
229
+
230
+
231
+ # ============================================================================
232
+ # Issue 17: Deep research skill should exist
233
+ # ============================================================================
234
+
235
+ class TestDeepResearchSkill:
236
+ def test_research_skill_exists(self):
237
+ """A deep-research skill should be bundled."""
238
+ skills_dir = Path(__file__).parent.parent / "drydock" / "skills"
239
+ skill_dirs = [d.name for d in skills_dir.iterdir() if d.is_dir()] if skills_dir.exists() else []
240
+ has_research = any("research" in d for d in skill_dirs)
241
+ assert has_research, f"No research skill found. Available: {skill_dirs}"
242
+
243
+
244
+ # ============================================================================
245
+ # Issue 18: Not using agents — explore/diagnostic agents should be utilized
246
+ # ============================================================================
247
+
248
+ class TestAgentsAvailable:
249
+ def test_explore_agent_registered(self):
250
+ """The 'explore' agent should be registered."""
251
+ from drydock.core.agents.models import BuiltinAgentName
252
+ assert hasattr(BuiltinAgentName, "EXPLORE") or "explore" in dir(BuiltinAgentName)
253
+
254
+ def test_system_prompt_mentions_agents(self):
255
+ """System prompt should tell the model about available agents."""
256
+ prompt = Path(__file__).parent.parent / "drydock" / "core" / "prompts" / "cli.md"
257
+ content = prompt.read_text()
258
+ has_agent_ref = "agent" in content.lower() or "subagent" in content.lower() or "task" in content.lower()
259
+ assert has_agent_ref
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes