drydock-cli 0.7.0__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.0 → drydock_cli-0.7.2}/PKG-INFO +12 -1
  2. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/README.md +11 -0
  3. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/app.py +8 -0
  4. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/agent_loop.py +1 -1
  5. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/consultant.py +7 -1
  6. {drydock_cli-0.7.0 → 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.0 → drydock_cli-0.7.2}/pyproject.toml +2 -1
  9. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/scripts/deploy_to_github.sh +1 -1
  10. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/scripts/publish_to_pypi.sh +1 -1
  11. drydock_cli-0.7.2/tests/test_integration.py +270 -0
  12. drydock_cli-0.7.2/tests/test_user_issues.py +259 -0
  13. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/.github/CODEOWNERS +0 -0
  14. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  15. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  16. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  17. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/.github/workflows/build-and-upload.yml +0 -0
  18. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/.github/workflows/ci.yml +0 -0
  19. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/.github/workflows/issue-labeler.yml +0 -0
  20. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/.github/workflows/release.yml +0 -0
  21. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/.gitignore +0 -0
  22. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/.pre-commit-config.yaml +0 -0
  23. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/.python-version +0 -0
  24. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/.typos.toml +0 -0
  25. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/.vscode/extensions.json +0 -0
  26. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/.vscode/launch.json +0 -0
  27. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/.vscode/settings.json +0 -0
  28. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/AGENTS.md +0 -0
  29. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/CHANGELOG.md +0 -0
  30. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/CLAUDE.md +0 -0
  31. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/CONTRIBUTING.md +0 -0
  32. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/Drydock_rebrand.md +0 -0
  33. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/LICENSE +0 -0
  34. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/NOTICE +0 -0
  35. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/PRD.md +0 -0
  36. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/action.yml +0 -0
  37. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/distribution/zed/LICENSE +0 -0
  38. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/distribution/zed/extension.toml +0 -0
  39. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/distribution/zed/icons/mistral_vibe.svg +0 -0
  40. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/docs/README.md +0 -0
  41. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/docs/acp-setup.md +0 -0
  42. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/docs/proxy-setup.md +0 -0
  43. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/__init__.py +0 -0
  44. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/acp/__init__.py +0 -0
  45. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/acp/acp_agent_loop.py +0 -0
  46. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/acp/acp_logger.py +0 -0
  47. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/acp/entrypoint.py +0 -0
  48. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/acp/tools/__init__.py +0 -0
  49. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/acp/tools/base.py +0 -0
  50. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/acp/tools/builtins/bash.py +0 -0
  51. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/acp/tools/builtins/read_file.py +0 -0
  52. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/acp/tools/builtins/search_replace.py +0 -0
  53. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/acp/tools/builtins/todo.py +0 -0
  54. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/acp/tools/builtins/write_file.py +0 -0
  55. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/acp/tools/session_update.py +0 -0
  56. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/acp/utils.py +0 -0
  57. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/__init__.py +0 -0
  58. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/autocompletion/__init__.py +0 -0
  59. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/autocompletion/base.py +0 -0
  60. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/autocompletion/path_completion.py +0 -0
  61. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/autocompletion/slash_command.py +0 -0
  62. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/cli.py +0 -0
  63. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/clipboard.py +0 -0
  64. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/commands.py +0 -0
  65. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/entrypoint.py +0 -0
  66. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/history_manager.py +0 -0
  67. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  68. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  69. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  70. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/terminal_setup.py +0 -0
  71. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/__init__.py +0 -0
  72. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  73. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/app.tcss +0 -0
  74. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/external_editor.py +0 -0
  75. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  76. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  77. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  78. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  79. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  80. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  81. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  82. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  83. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  84. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  85. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  86. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  87. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  88. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  89. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  90. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  91. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  92. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  93. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  94. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  95. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  96. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  97. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  98. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  99. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  100. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  101. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  102. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  103. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  104. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  105. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  106. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  107. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  108. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  109. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  110. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  111. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/windowing/history.py +0 -0
  112. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  113. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/textual_ui/windowing/state.py +0 -0
  114. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/update_notifier/__init__.py +0 -0
  115. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  116. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  117. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  118. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  119. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  120. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/update_notifier/update.py +0 -0
  121. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/cli/update_notifier/whats_new.py +0 -0
  122. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/__init__.py +0 -0
  123. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/agents/__init__.py +0 -0
  124. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/agents/manager.py +0 -0
  125. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/agents/models.py +0 -0
  126. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/auth/__init__.py +0 -0
  127. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/auth/crypto.py +0 -0
  128. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/auth/github.py +0 -0
  129. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/autocompletion/__init__.py +0 -0
  130. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/autocompletion/completers.py +0 -0
  131. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  132. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  133. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  134. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  135. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  136. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/autocompletion/fuzzy.py +0 -0
  137. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/autocompletion/path_prompt.py +0 -0
  138. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  139. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/config/__init__.py +0 -0
  140. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/config/_settings.py +0 -0
  141. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/config/harness_files/__init__.py +0 -0
  142. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  143. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/config/harness_files/_paths.py +0 -0
  144. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/drydock_states.py +0 -0
  145. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/llm/__init__.py +0 -0
  146. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/llm/backend/anthropic.py +0 -0
  147. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/llm/backend/base.py +0 -0
  148. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/llm/backend/factory.py +0 -0
  149. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/llm/backend/generic.py +0 -0
  150. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/llm/backend/mistral.py +0 -0
  151. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  152. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/llm/backend/vertex.py +0 -0
  153. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/llm/exceptions.py +0 -0
  154. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/llm/format.py +0 -0
  155. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/llm/message_utils.py +0 -0
  156. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/llm/types.py +0 -0
  157. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/logger.py +0 -0
  158. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/middleware.py +0 -0
  159. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/output_formatters.py +0 -0
  160. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/paths/__init__.py +0 -0
  161. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/paths/_local_config_walk.py +0 -0
  162. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/paths/_vibe_home.py +0 -0
  163. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/paths/conventions.py +0 -0
  164. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/plan_session.py +0 -0
  165. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/programmatic.py +0 -0
  166. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/prompts/__init__.py +0 -0
  167. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/prompts/compact.md +0 -0
  168. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/prompts/dangerous_directory.md +0 -0
  169. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/prompts/diagnostic.md +0 -0
  170. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/prompts/explore.md +0 -0
  171. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/prompts/planner.md +0 -0
  172. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/prompts/project_context.md +0 -0
  173. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/prompts/tests.md +0 -0
  174. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/proxy_setup.py +0 -0
  175. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/session/session_loader.py +0 -0
  176. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/session/session_logger.py +0 -0
  177. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/session/session_migration.py +0 -0
  178. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/session/state_file.py +0 -0
  179. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/skills/__init__.py +0 -0
  180. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/skills/manager.py +0 -0
  181. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/skills/models.py +0 -0
  182. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/skills/parser.py +0 -0
  183. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/slug.py +0 -0
  184. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/system_prompt.py +0 -0
  185. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/telemetry/__init__.py +0 -0
  186. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/telemetry/send.py +0 -0
  187. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/teleport/errors.py +0 -0
  188. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/teleport/git.py +0 -0
  189. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/teleport/nuage.py +0 -0
  190. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/teleport/teleport.py +0 -0
  191. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/teleport/types.py +0 -0
  192. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/base.py +0 -0
  193. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  194. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/bash.py +0 -0
  195. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  196. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/grep.py +0 -0
  197. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  198. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  199. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  200. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  201. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  202. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  203. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  204. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/task.md +0 -0
  205. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  206. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  207. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  208. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  209. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/read_file.py +0 -0
  210. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/search_replace.py +0 -0
  211. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/task.py +0 -0
  212. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/todo.py +0 -0
  213. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/webfetch.py +0 -0
  214. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/websearch.py +0 -0
  215. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/builtins/write_file.py +0 -0
  216. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/injection_guard.py +0 -0
  217. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/manager.py +0 -0
  218. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/mcp/__init__.py +0 -0
  219. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/mcp/registry.py +0 -0
  220. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/mcp/tools.py +0 -0
  221. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/mcp_sampling.py +0 -0
  222. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/ui.py +0 -0
  223. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/tools/utils.py +0 -0
  224. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/trusted_folders.py +0 -0
  225. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/types.py +0 -0
  226. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/core/utils.py +0 -0
  227. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/setup/onboarding/__init__.py +0 -0
  228. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/setup/onboarding/base.py +0 -0
  229. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/setup/onboarding/onboarding.tcss +0 -0
  230. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/setup/onboarding/screens/__init__.py +0 -0
  231. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/setup/onboarding/screens/api_key.py +0 -0
  232. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/setup/onboarding/screens/welcome.py +0 -0
  233. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  234. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  235. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/skills/__init__.py +0 -0
  236. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/skills/create-presentation/SKILL.md +0 -0
  237. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock/whats_new.md +0 -0
  238. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock-acp.spec +0 -0
  239. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/drydock_terms.md +0 -0
  240. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/flake.lock +0 -0
  241. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/flake.nix +0 -0
  242. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/scripts/README.md +0 -0
  243. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/scripts/bump_version.py +0 -0
  244. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/scripts/install.sh +0 -0
  245. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/scripts/prepare_release.py +0 -0
  246. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/__init__.py +0 -0
  247. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/conftest.py +0 -0
  248. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/test_acp.py +0 -0
  249. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/test_agent_thought.py +0 -0
  250. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/test_bash.py +0 -0
  251. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/test_compact_session_updates.py +0 -0
  252. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/test_content.py +0 -0
  253. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/test_initialize.py +0 -0
  254. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/test_list_sessions.py +0 -0
  255. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/test_load_session.py +0 -0
  256. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/test_multi_session.py +0 -0
  257. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/test_new_session.py +0 -0
  258. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/test_proxy_setup_acp.py +0 -0
  259. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/test_read_file.py +0 -0
  260. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/test_search_replace.py +0 -0
  261. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/test_set_config_option.py +0 -0
  262. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/test_set_mode.py +0 -0
  263. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/test_set_model.py +0 -0
  264. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/test_tool_call_session_update.py +0 -0
  265. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/test_utils.py +0 -0
  266. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/acp/test_write_file.py +0 -0
  267. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/autocompletion/test_file_indexer.py +0 -0
  268. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/autocompletion/test_fuzzy.py +0 -0
  269. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  270. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  271. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/autocompletion/test_path_completion_controller.py +0 -0
  272. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  273. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/autocompletion/test_slash_command_controller.py +0 -0
  274. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  275. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/backend/__init__.py +0 -0
  276. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/backend/data/__init__.py +0 -0
  277. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/backend/data/fireworks.py +0 -0
  278. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/backend/data/mistral.py +0 -0
  279. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/backend/test_anthropic_adapter.py +0 -0
  280. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/backend/test_backend.py +0 -0
  281. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/backend/test_reasoning_adapter.py +0 -0
  282. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  283. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  284. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  285. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  286. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/cli/test_bell_notifications.py +0 -0
  287. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/cli/test_braille_renderer.py +0 -0
  288. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/cli/test_clipboard.py +0 -0
  289. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/cli/test_commands.py +0 -0
  290. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/cli/test_copy_shortcuts.py +0 -0
  291. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/cli/test_external_editor.py +0 -0
  292. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/cli/test_no_markup_static.py +0 -0
  293. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/cli/test_question_app.py +0 -0
  294. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/cli/test_spinner.py +0 -0
  295. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/cli/test_switching_mode.py +0 -0
  296. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  297. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  298. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/cli/test_ui_session_resume.py +0 -0
  299. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/cli/test_ui_skill_dispatch.py +0 -0
  300. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/cli/textual_ui/__init__.py +0 -0
  301. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/cli/textual_ui/test_session_picker.py +0 -0
  302. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/conftest.py +0 -0
  303. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/core/test_agents.py +0 -0
  304. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/core/test_auth_crypto.py +0 -0
  305. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/core/test_auth_github.py +0 -0
  306. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/core/test_config_load_dotenv.py +0 -0
  307. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/core/test_config_paths.py +0 -0
  308. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/core/test_config_resolution.py +0 -0
  309. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/core/test_file_logging.py +0 -0
  310. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/core/test_plan_session.py +0 -0
  311. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/core/test_proxy_setup.py +0 -0
  312. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/core/test_slug.py +0 -0
  313. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/core/test_telemetry_send.py +0 -0
  314. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/core/test_teleport_git.py +0 -0
  315. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/core/test_teleport_nuage.py +0 -0
  316. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/core/test_teleport_service.py +0 -0
  317. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/core/test_trusted_folders.py +0 -0
  318. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/core/test_utils.py +0 -0
  319. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/e2e/common.py +0 -0
  320. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/e2e/conftest.py +0 -0
  321. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/e2e/mock_server.py +0 -0
  322. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  323. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/e2e/test_cli_tui_streaming.py +0 -0
  324. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  325. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/mock/__init__.py +0 -0
  326. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/mock/mock_backend_factory.py +0 -0
  327. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/mock/mock_entrypoint.py +0 -0
  328. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/mock/utils.py +0 -0
  329. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/onboarding/test_run_onboarding.py +0 -0
  330. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/onboarding/test_ui_onboarding.py +0 -0
  331. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/session/test_session_loader.py +0 -0
  332. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/session/test_session_logger.py +0 -0
  333. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/session/test_session_migration.py +0 -0
  334. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/skills/conftest.py +0 -0
  335. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/skills/test_manager.py +0 -0
  336. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/skills/test_models.py +0 -0
  337. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/skills/test_parser.py +0 -0
  338. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  339. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  340. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  341. {drydock_cli-0.7.0 → 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
  342. {drydock_cli-0.7.0 → 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
  343. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  344. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  345. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  346. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  347. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  348. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  349. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  350. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  351. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  352. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  353. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  354. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  355. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  356. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  357. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  358. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  359. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  360. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  361. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  362. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  363. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  364. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  365. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  366. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  367. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  368. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  369. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  370. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  371. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  372. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  373. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  374. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  375. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  376. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  377. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  378. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  379. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  380. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  381. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  382. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  383. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  384. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  385. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  386. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  387. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  388. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  389. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  390. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  391. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  392. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  393. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  394. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  395. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  396. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  397. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  398. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/base_snapshot_test_app.py +0 -0
  399. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/conftest.py +0 -0
  400. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/snap_compare.py +0 -0
  401. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  402. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  403. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  404. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  405. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  406. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  407. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  408. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  409. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  410. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  411. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  412. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  413. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  414. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  415. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/stubs/fake_backend.py +0 -0
  416. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/stubs/fake_client.py +0 -0
  417. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/stubs/fake_tool.py +0 -0
  418. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_agent_auto_compact.py +0 -0
  419. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_agent_backend.py +0 -0
  420. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_agent_observer_streaming.py +0 -0
  421. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_agent_stats.py +0 -0
  422. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_agent_tasks.py +0 -0
  423. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_agent_tool_call.py +0 -0
  424. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_agents.py +0 -0
  425. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_cli_programmatic_preload.py +0 -0
  426. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_drydock_regression.py +0 -0
  427. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_drydock_tasks.py +0 -0
  428. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_history_manager.py +0 -0
  429. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_loop_detection.py +0 -0
  430. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_message_id.py +0 -0
  431. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_message_merging.py +0 -0
  432. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_middleware.py +0 -0
  433. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_reasoning_content.py +0 -0
  434. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_system_prompt.py +0 -0
  435. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_tagged_text.py +0 -0
  436. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_ui_external_editor.py +0 -0
  437. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/test_ui_input_history.py +0 -0
  438. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/tools/test_ask_user_question.py +0 -0
  439. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/tools/test_bash.py +0 -0
  440. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/tools/test_exit_plan_mode.py +0 -0
  441. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/tools/test_grep.py +0 -0
  442. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/tools/test_invoke_context.py +0 -0
  443. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/tools/test_manager_get_tool_config.py +0 -0
  444. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/tools/test_mcp.py +0 -0
  445. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/tools/test_mcp_sampling.py +0 -0
  446. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/tools/test_task.py +0 -0
  447. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/tools/test_ui_bash_execution.py +0 -0
  448. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/tools/test_webfetch.py +0 -0
  449. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/tools/test_websearch.py +0 -0
  450. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  451. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  452. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/update_notifier/test_do_update.py +0 -0
  453. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  454. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/update_notifier/test_github_update_gateway.py +0 -0
  455. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  456. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/update_notifier/test_ui_update_notification.py +0 -0
  457. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/update_notifier/test_update_use_case.py +0 -0
  458. {drydock_cli-0.7.0 → drydock_cli-0.7.2}/tests/update_notifier/test_whats_new.py +0 -0
  459. {drydock_cli-0.7.0 → 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.0
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.0"
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 \
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 \
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,270 @@
1
+ """Integration tests — use the REAL vLLM backend.
2
+
3
+ These tests hit the actual LLM at localhost:8000 and verify the full
4
+ pipeline works end-to-end. They catch issues that mock tests miss
5
+ (like the raw_arguments crash that broke 159 tasks).
6
+
7
+ Skip if vLLM is not running (CI environments).
8
+
9
+ Run manually: pytest tests/test_integration.py -v -s
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import asyncio
15
+ import json
16
+ import os
17
+ from pathlib import Path
18
+
19
+ import httpx
20
+ import pytest
21
+
22
+ from drydock.core.agent_loop import AgentLoop
23
+ from drydock.core.agents.models import BuiltinAgentName
24
+ from drydock.core.config import (
25
+ Backend,
26
+ ModelConfig,
27
+ ProviderConfig,
28
+ VibeConfig,
29
+ )
30
+ from drydock.core.types import (
31
+ AssistantEvent,
32
+ BaseEvent,
33
+ ToolCallEvent,
34
+ ToolResultEvent,
35
+ UserMessageEvent,
36
+ )
37
+
38
+
39
+ # ============================================================================
40
+ # Skip if vLLM not running
41
+ # ============================================================================
42
+
43
+ def _vllm_available() -> bool:
44
+ try:
45
+ r = httpx.get("http://localhost:8000/v1/models", timeout=3)
46
+ return r.status_code == 200
47
+ except Exception:
48
+ return False
49
+
50
+
51
+ pytestmark = pytest.mark.skipif(
52
+ not _vllm_available(),
53
+ reason="vLLM not running at localhost:8000"
54
+ )
55
+
56
+
57
+ # ============================================================================
58
+ # Helpers
59
+ # ============================================================================
60
+
61
+ def _make_config(tmp_path: Path) -> VibeConfig:
62
+ """Create a config that uses local vLLM."""
63
+ return VibeConfig(
64
+ active_model="devstral",
65
+ auto_approve=True,
66
+ enable_telemetry=False,
67
+ include_project_context=False,
68
+ include_prompt_detail=False,
69
+ system_prompt_id="tests",
70
+ providers=[
71
+ ProviderConfig(
72
+ name="local-vllm",
73
+ api_base="http://localhost:8000/v1",
74
+ api_key_env_var="",
75
+ backend=Backend.GENERIC,
76
+ ),
77
+ ],
78
+ models=[
79
+ ModelConfig(
80
+ name="devstral",
81
+ provider="local-vllm",
82
+ alias="devstral",
83
+ input_price=0.0,
84
+ output_price=0.0,
85
+ ),
86
+ ],
87
+ session_logging={"enabled": False, "save_dir": str(tmp_path / "logs")},
88
+ )
89
+
90
+
91
+ def _make_agent(tmp_path: Path) -> AgentLoop:
92
+ config = _make_config(tmp_path)
93
+ return AgentLoop(
94
+ config=config,
95
+ agent_name=BuiltinAgentName.AUTO_APPROVE,
96
+ max_turns=5, # Safety limit
97
+ )
98
+
99
+
100
+ async def _run(agent: AgentLoop, prompt: str, max_events: int = 100) -> list[BaseEvent]:
101
+ events = []
102
+ async for ev in agent.act(prompt):
103
+ events.append(ev)
104
+ if len(events) >= max_events:
105
+ break
106
+ return events
107
+
108
+
109
+ # ============================================================================
110
+ # Test 1: Simple text response from real LLM
111
+ # ============================================================================
112
+
113
+ @pytest.mark.asyncio
114
+ async def test_real_llm_responds(tmp_path):
115
+ """Real LLM produces a text response without crashing."""
116
+ agent = _make_agent(tmp_path)
117
+ events = await _run(agent, "Say hello in one word.")
118
+
119
+ assert any(isinstance(e, AssistantEvent) for e in events)
120
+ text = [e for e in events if isinstance(e, AssistantEvent) and e.content]
121
+ assert len(text) >= 1
122
+
123
+
124
+ # ============================================================================
125
+ # Test 2: LLM calls a tool and gets result
126
+ # ============================================================================
127
+
128
+ @pytest.mark.asyncio
129
+ async def test_real_tool_call(tmp_path):
130
+ """Real LLM calls a tool (e.g., bash/grep) and receives the result."""
131
+ agent = _make_agent(tmp_path)
132
+ events = await _run(agent, "Run: echo 'drydock test passed'")
133
+
134
+ # Should have at least one tool call or text response
135
+ has_tool = any(isinstance(e, ToolCallEvent) for e in events)
136
+ has_text = any(isinstance(e, AssistantEvent) and e.content for e in events)
137
+ assert has_tool or has_text, "LLM produced neither tool calls nor text"
138
+
139
+
140
+ # ============================================================================
141
+ # Test 3: No crash on tool execution path
142
+ # ============================================================================
143
+
144
+ @pytest.mark.asyncio
145
+ async def test_no_crash_on_tool_path(tmp_path):
146
+ """The full tool execution path (resolve → execute → result) doesn't crash."""
147
+ agent = _make_agent(tmp_path)
148
+
149
+ # This prompt should trigger grep or read_file
150
+ events = await _run(agent, "What files are in the current directory? Use ls.")
151
+
152
+ # If we get any events at all without exception, the path works
153
+ assert len(events) >= 1
154
+
155
+ # No tool results should have crash errors
156
+ for e in events:
157
+ if isinstance(e, ToolResultEvent) and e.error:
158
+ assert "AttributeError" not in e.error, f"Crash in tool path: {e.error}"
159
+ assert "raw_arguments" not in e.error, f"Old bug present: {e.error}"
160
+
161
+
162
+ # ============================================================================
163
+ # Test 4: Circuit breaker doesn't crash on real tool calls
164
+ # ============================================================================
165
+
166
+ @pytest.mark.asyncio
167
+ async def test_circuit_breaker_no_crash(tmp_path):
168
+ """Circuit breaker works with real ResolvedToolCall objects."""
169
+ agent = _make_agent(tmp_path)
170
+
171
+ # Ask something that triggers a tool call
172
+ events = await _run(agent, "Read the first 3 lines of /etc/hostname")
173
+
174
+ # Verify circuit breaker state was populated (even if only 1 call)
175
+ # The key thing is it didn't crash
176
+ assert hasattr(agent, "_tool_call_history")
177
+ assert isinstance(agent._tool_call_history, dict)
178
+
179
+
180
+ # ============================================================================
181
+ # Test 5: Message ordering stays clean after real conversation
182
+ # ============================================================================
183
+
184
+ @pytest.mark.asyncio
185
+ async def test_message_ordering_real(tmp_path):
186
+ """No user-after-tool violations after a real multi-turn conversation."""
187
+ agent = _make_agent(tmp_path)
188
+ events = await _run(agent, "What is 2+2? Just answer the number.")
189
+
190
+ from drydock.core.types import Role
191
+ for i in range(1, len(agent.messages)):
192
+ if agent.messages[i].role == Role.user and agent.messages[i - 1].role == Role.tool:
193
+ pytest.fail(f"user after tool at message {i}")
194
+
195
+
196
+ # ============================================================================
197
+ # Test 6: Agent stops within turn limit
198
+ # ============================================================================
199
+
200
+ @pytest.mark.asyncio
201
+ async def test_turn_limit_respected(tmp_path):
202
+ """Agent respects max_turns and doesn't loop forever."""
203
+ agent = _make_agent(tmp_path) # max_turns=5
204
+ events = await _run(agent, "Explore this entire codebase thoroughly.", max_events=200)
205
+
206
+ # Should stop eventually (max_turns=5 or natural stop)
207
+ assert len(events) < 200, "Agent seems to be looping"
208
+
209
+
210
+ # ============================================================================
211
+ # Test 7: Bash tool works end-to-end
212
+ # ============================================================================
213
+
214
+ @pytest.mark.asyncio
215
+ async def test_bash_tool_works(tmp_path):
216
+ """Bash tool executes and returns output through the full pipeline."""
217
+ agent = _make_agent(tmp_path)
218
+ events = await _run(agent, "Run this exact command: echo 'hello from drydock'")
219
+
220
+ tool_results = [e for e in events if isinstance(e, ToolResultEvent)]
221
+ # Either the model called bash successfully, or gave a text response
222
+ has_any_output = len(tool_results) > 0 or any(
223
+ isinstance(e, AssistantEvent) and e.content for e in events
224
+ )
225
+ assert has_any_output
226
+
227
+
228
+ # ============================================================================
229
+ # Test 8: Agent handles ambiguous prompt without infinite loop
230
+ # ============================================================================
231
+
232
+ @pytest.mark.asyncio
233
+ async def test_ambiguous_prompt_no_loop(tmp_path):
234
+ """Short ambiguous prompt ('test') doesn't cause infinite filesystem exploration."""
235
+ agent = _make_agent(tmp_path)
236
+ events = await _run(agent, "test", max_events=50)
237
+
238
+ # Should not use excessive tool calls
239
+ tool_calls = [e for e in events if isinstance(e, ToolCallEvent)]
240
+ assert len(tool_calls) < 20, f"Too many tool calls ({len(tool_calls)}) for ambiguous prompt"
241
+
242
+
243
+ # ============================================================================
244
+ # Test 9: MessageList integrity after real execution
245
+ # ============================================================================
246
+
247
+ @pytest.mark.asyncio
248
+ async def test_messagelist_integrity_real(tmp_path):
249
+ """MessageList is never replaced with plain list during real execution."""
250
+ agent = _make_agent(tmp_path)
251
+ await _run(agent, "Hello")
252
+
253
+ from drydock.core.types import MessageList
254
+ assert isinstance(agent.messages, MessageList), \
255
+ f"messages is {type(agent.messages)}, not MessageList"
256
+
257
+
258
+ # ============================================================================
259
+ # Test 10: Sanitize message ordering runs without error
260
+ # ============================================================================
261
+
262
+ @pytest.mark.asyncio
263
+ async def test_sanitize_runs_on_real_messages(tmp_path):
264
+ """_sanitize_message_ordering doesn't crash on real message history."""
265
+ agent = _make_agent(tmp_path)
266
+ await _run(agent, "What time is it?")
267
+
268
+ # Run sanitize explicitly — should not raise
269
+ agent._sanitize_message_ordering()
270
+ assert len(agent.messages) >= 2 # At least system + user