drydock-cli 2.6.7__tar.gz → 2.6.9__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 (553) hide show
  1. drydock_cli-2.6.9/.auto_release.lock +1 -0
  2. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/PKG-INFO +1 -1
  3. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/app.py +10 -2
  4. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/agent_loop.py +27 -12
  5. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/gemma4.md +1 -1
  6. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/search_replace.py +5 -6
  7. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/manager.py +1 -1
  8. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/pyproject.toml +1 -1
  9. drydock_cli-2.6.9/tests/test_user_issues.py +129 -0
  10. drydock_cli-2.6.7/.auto_release.lock +0 -1
  11. drydock_cli-2.6.7/tests/test_user_issues.py +0 -265
  12. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.github/CODEOWNERS +0 -0
  13. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  14. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  15. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  16. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.github/workflows/build-and-upload.yml +0 -0
  17. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.github/workflows/ci.yml +0 -0
  18. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.github/workflows/issue-labeler.yml +0 -0
  19. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.github/workflows/release.yml +0 -0
  20. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.gitignore +0 -0
  21. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.pre-commit-config.yaml +0 -0
  22. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.python-version +0 -0
  23. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.typos.toml +0 -0
  24. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.vscode/extensions.json +0 -0
  25. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.vscode/launch.json +0 -0
  26. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.vscode/settings.json +0 -0
  27. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/AGENTS.md +0 -0
  28. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/CHANGELOG.md +0 -0
  29. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/CLAUDE.md +0 -0
  30. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/CONTRIBUTING.md +0 -0
  31. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/Drydock_rebrand.md +0 -0
  32. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/LICENSE +0 -0
  33. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/NOTICE +0 -0
  34. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/PRD.md +0 -0
  35. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/README.md +0 -0
  36. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/action.yml +0 -0
  37. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/distribution/zed/LICENSE +0 -0
  38. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/distribution/zed/extension.toml +0 -0
  39. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/distribution/zed/icons/mistral_vibe.svg +0 -0
  40. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/docs/README.md +0 -0
  41. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/docs/acp-setup.md +0 -0
  42. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/docs/proxy-setup.md +0 -0
  43. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/__init__.py +0 -0
  44. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/__init__.py +0 -0
  45. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/acp_agent_loop.py +0 -0
  46. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/acp_logger.py +0 -0
  47. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/entrypoint.py +0 -0
  48. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/tools/__init__.py +0 -0
  49. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/tools/base.py +0 -0
  50. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/tools/builtins/bash.py +0 -0
  51. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/tools/builtins/read_file.py +0 -0
  52. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/tools/builtins/search_replace.py +0 -0
  53. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/tools/builtins/todo.py +0 -0
  54. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/tools/builtins/write_file.py +0 -0
  55. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/tools/session_update.py +0 -0
  56. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/utils.py +0 -0
  57. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/__init__.py +0 -0
  58. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/autocompletion/__init__.py +0 -0
  59. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/autocompletion/base.py +0 -0
  60. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/autocompletion/path_completion.py +0 -0
  61. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/autocompletion/slash_command.py +0 -0
  62. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/cli.py +0 -0
  63. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/clipboard.py +0 -0
  64. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/commands.py +0 -0
  65. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/entrypoint.py +0 -0
  66. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/history_manager.py +0 -0
  67. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  68. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  69. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  70. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/terminal_setup.py +0 -0
  71. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/__init__.py +0 -0
  72. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  73. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/app.tcss +0 -0
  74. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/external_editor.py +0 -0
  75. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  76. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  77. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  78. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  79. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  80. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  81. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  82. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  83. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  84. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  85. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  86. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  87. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  88. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  89. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  90. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  91. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  92. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  93. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  94. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  95. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  96. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  97. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  98. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  99. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  100. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  101. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  102. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  103. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  104. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  105. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  106. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  107. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  108. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  109. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  110. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  111. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/windowing/history.py +0 -0
  112. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  113. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/windowing/state.py +0 -0
  114. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/update_notifier/__init__.py +0 -0
  115. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  116. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  117. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  118. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  119. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  120. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/update_notifier/update.py +0 -0
  121. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/update_notifier/whats_new.py +0 -0
  122. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/__init__.py +0 -0
  123. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/agents/__init__.py +0 -0
  124. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/agents/manager.py +0 -0
  125. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/agents/models.py +0 -0
  126. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/auth/__init__.py +0 -0
  127. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/auth/crypto.py +0 -0
  128. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/auth/github.py +0 -0
  129. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/__init__.py +0 -0
  130. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/completers.py +0 -0
  131. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  132. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  133. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  134. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  135. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  136. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/fuzzy.py +0 -0
  137. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/path_prompt.py +0 -0
  138. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  139. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/build_orchestrator.py +0 -0
  140. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/config/__init__.py +0 -0
  141. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/config/_settings.py +0 -0
  142. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/config/harness_files/__init__.py +0 -0
  143. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  144. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/config/harness_files/_paths.py +0 -0
  145. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/consultant.py +0 -0
  146. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/drydock_states.py +0 -0
  147. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/hooks.py +0 -0
  148. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/__init__.py +0 -0
  149. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/backend/anthropic.py +0 -0
  150. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/backend/base.py +0 -0
  151. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/backend/factory.py +0 -0
  152. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/backend/generic.py +0 -0
  153. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/backend/mistral.py +0 -0
  154. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  155. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/backend/vertex.py +0 -0
  156. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/exceptions.py +0 -0
  157. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/format.py +0 -0
  158. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/message_utils.py +0 -0
  159. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/types.py +0 -0
  160. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/logger.py +0 -0
  161. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/middleware.py +0 -0
  162. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/output_formatters.py +0 -0
  163. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/paths/__init__.py +0 -0
  164. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/paths/_local_config_walk.py +0 -0
  165. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/paths/_vibe_home.py +0 -0
  166. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/paths/conventions.py +0 -0
  167. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/plan_session.py +0 -0
  168. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/plugins.py +0 -0
  169. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/programmatic.py +0 -0
  170. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/__init__.py +0 -0
  171. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/builder.md +0 -0
  172. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/cli.md +0 -0
  173. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/compact.md +0 -0
  174. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/dangerous_directory.md +0 -0
  175. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/diagnostic.md +0 -0
  176. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/explore.md +0 -0
  177. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/planner.md +0 -0
  178. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/project_context.md +0 -0
  179. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/tests.md +0 -0
  180. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/proxy_setup.py +0 -0
  181. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/session/agent_memory.py +0 -0
  182. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/session/checkpoints.py +0 -0
  183. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/session/session_loader.py +0 -0
  184. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/session/session_logger.py +0 -0
  185. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/session/session_migration.py +0 -0
  186. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/session/state_file.py +0 -0
  187. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/session_checker.py +0 -0
  188. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/skills/__init__.py +0 -0
  189. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/skills/manager.py +0 -0
  190. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/skills/models.py +0 -0
  191. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/skills/parser.py +0 -0
  192. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/slug.py +0 -0
  193. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/system_prompt.py +0 -0
  194. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/telemetry/__init__.py +0 -0
  195. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/telemetry/send.py +0 -0
  196. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/teleport/errors.py +0 -0
  197. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/teleport/git.py +0 -0
  198. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/teleport/nuage.py +0 -0
  199. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/teleport/teleport.py +0 -0
  200. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/teleport/types.py +0 -0
  201. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/base.py +0 -0
  202. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  203. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/bash.py +0 -0
  204. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/cron.py +0 -0
  205. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  206. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/glob_tool.py +0 -0
  207. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/grep.py +0 -0
  208. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  209. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/lsp.py +0 -0
  210. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  211. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  212. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/powershell.py +0 -0
  213. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  214. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  215. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  216. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  217. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  218. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  219. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  220. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  221. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  222. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  223. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  224. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  225. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  226. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  227. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/task.md +0 -0
  228. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  229. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  230. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  231. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  232. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  233. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  234. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  235. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/read_file.py +0 -0
  236. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/task.py +0 -0
  237. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/task_manager.py +0 -0
  238. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/todo.py +0 -0
  239. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/tool_search.py +0 -0
  240. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/webfetch.py +0 -0
  241. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/websearch.py +0 -0
  242. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/worktree.py +0 -0
  243. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/write_file.py +0 -0
  244. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/injection_guard.py +0 -0
  245. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/mcp/__init__.py +0 -0
  246. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/mcp/registry.py +0 -0
  247. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/mcp/tools.py +0 -0
  248. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/mcp_sampling.py +0 -0
  249. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/ui.py +0 -0
  250. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/utils.py +0 -0
  251. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/trusted_folders.py +0 -0
  252. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/types.py +0 -0
  253. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/utils.py +0 -0
  254. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/setup/onboarding/__init__.py +0 -0
  255. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/setup/onboarding/base.py +0 -0
  256. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/setup/onboarding/onboarding.tcss +0 -0
  257. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/setup/onboarding/screens/__init__.py +0 -0
  258. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/setup/onboarding/screens/api_key.py +0 -0
  259. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/setup/onboarding/screens/welcome.py +0 -0
  260. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  261. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  262. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/__init__.py +0 -0
  263. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/api-design/SKILL.md +0 -0
  264. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/batch/SKILL.md +0 -0
  265. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/commit-code/SKILL.md +0 -0
  266. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/context-summary/SKILL.md +0 -0
  267. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/create-presentation/SKILL.md +0 -0
  268. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/deep-research/SKILL.md +0 -0
  269. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/deploy/SKILL.md +0 -0
  270. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/diff-review/SKILL.md +0 -0
  271. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/doc-gen/SKILL.md +0 -0
  272. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/explain-code/SKILL.md +0 -0
  273. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/explore-code/SKILL.md +0 -0
  274. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/fix-issue/SKILL.md +0 -0
  275. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/git-ops/SKILL.md +0 -0
  276. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/init-project/SKILL.md +0 -0
  277. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/investigate/SKILL.md +0 -0
  278. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/loop/SKILL.md +0 -0
  279. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/migrate/SKILL.md +0 -0
  280. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/perf-analyze/SKILL.md +0 -0
  281. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/plan-impl/SKILL.md +0 -0
  282. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/pr-review/SKILL.md +0 -0
  283. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/refactor/SKILL.md +0 -0
  284. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/regex-help/SKILL.md +0 -0
  285. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/review/SKILL.md +0 -0
  286. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/security-review/SKILL.md +0 -0
  287. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/ship/SKILL.md +0 -0
  288. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/simplify/SKILL.md +0 -0
  289. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/test-verify/SKILL.md +0 -0
  290. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/whats_new.md +0 -0
  291. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock-acp.spec +0 -0
  292. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock_terms.md +0 -0
  293. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/flake.lock +0 -0
  294. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/flake.nix +0 -0
  295. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/log_analyzer/__init__.py +0 -0
  296. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/log_analyzer/__main__.py +0 -0
  297. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/log_analyzer/analyzer.py +0 -0
  298. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/log_analyzer/cli.py +0 -0
  299. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/README.md +0 -0
  300. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/auto_release.sh +0 -0
  301. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/auto_test_loop.sh +0 -0
  302. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/backup.sh +0 -0
  303. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/bump_version.py +0 -0
  304. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/deploy_to_github.sh +0 -0
  305. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/discover_cli_tools.sh +0 -0
  306. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/install.sh +0 -0
  307. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/llm_balancer.py +0 -0
  308. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/monitor_swebench.sh +0 -0
  309. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/monitor_test_battery.sh +0 -0
  310. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/notify_release.py +0 -0
  311. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/overnight_agents_test.sh +0 -0
  312. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/prepare_release.py +0 -0
  313. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/publish_to_pypi.sh +0 -0
  314. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/telegram_bot.py +0 -0
  315. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/test_bank.sh +0 -0
  316. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/test_full.sh +0 -0
  317. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/test_smoke.sh +0 -0
  318. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/test_tui_path.py +0 -0
  319. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/tui_test.py +0 -0
  320. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/vllm_failover.sh +0 -0
  321. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/__init__.py +0 -0
  322. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/conftest.py +0 -0
  323. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_acp.py +0 -0
  324. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_agent_thought.py +0 -0
  325. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_bash.py +0 -0
  326. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_compact_session_updates.py +0 -0
  327. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_content.py +0 -0
  328. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_initialize.py +0 -0
  329. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_list_sessions.py +0 -0
  330. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_load_session.py +0 -0
  331. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_multi_session.py +0 -0
  332. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_new_session.py +0 -0
  333. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_proxy_setup_acp.py +0 -0
  334. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_read_file.py +0 -0
  335. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_search_replace.py +0 -0
  336. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_set_config_option.py +0 -0
  337. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_set_mode.py +0 -0
  338. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_set_model.py +0 -0
  339. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_tool_call_session_update.py +0 -0
  340. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_utils.py +0 -0
  341. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_write_file.py +0 -0
  342. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/autocompletion/test_file_indexer.py +0 -0
  343. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/autocompletion/test_fuzzy.py +0 -0
  344. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  345. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  346. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/autocompletion/test_path_completion_controller.py +0 -0
  347. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  348. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/autocompletion/test_slash_command_controller.py +0 -0
  349. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  350. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/backend/__init__.py +0 -0
  351. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/backend/data/__init__.py +0 -0
  352. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/backend/data/fireworks.py +0 -0
  353. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/backend/data/mistral.py +0 -0
  354. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/backend/test_anthropic_adapter.py +0 -0
  355. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/backend/test_backend.py +0 -0
  356. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/backend/test_reasoning_adapter.py +0 -0
  357. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  358. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  359. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  360. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  361. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_bell_notifications.py +0 -0
  362. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_braille_renderer.py +0 -0
  363. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_clipboard.py +0 -0
  364. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_commands.py +0 -0
  365. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_copy_shortcuts.py +0 -0
  366. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_external_editor.py +0 -0
  367. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_no_markup_static.py +0 -0
  368. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_question_app.py +0 -0
  369. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_spinner.py +0 -0
  370. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_switching_mode.py +0 -0
  371. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  372. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  373. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_ui_session_resume.py +0 -0
  374. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_ui_skill_dispatch.py +0 -0
  375. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/textual_ui/__init__.py +0 -0
  376. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/textual_ui/test_session_picker.py +0 -0
  377. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/conftest.py +0 -0
  378. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_agents.py +0 -0
  379. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_auth_crypto.py +0 -0
  380. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_auth_github.py +0 -0
  381. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_config_load_dotenv.py +0 -0
  382. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_config_paths.py +0 -0
  383. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_config_resolution.py +0 -0
  384. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_file_logging.py +0 -0
  385. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_plan_session.py +0 -0
  386. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_proxy_setup.py +0 -0
  387. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_slug.py +0 -0
  388. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_telemetry_send.py +0 -0
  389. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_teleport_git.py +0 -0
  390. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_teleport_nuage.py +0 -0
  391. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_teleport_service.py +0 -0
  392. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_trusted_folders.py +0 -0
  393. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_utils.py +0 -0
  394. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/e2e/common.py +0 -0
  395. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/e2e/conftest.py +0 -0
  396. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/e2e/mock_server.py +0 -0
  397. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  398. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/e2e/test_cli_tui_streaming.py +0 -0
  399. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  400. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/mock/__init__.py +0 -0
  401. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/mock/mock_backend_factory.py +0 -0
  402. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/mock/mock_entrypoint.py +0 -0
  403. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/mock/utils.py +0 -0
  404. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/onboarding/test_run_onboarding.py +0 -0
  405. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/onboarding/test_ui_onboarding.py +0 -0
  406. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/session/test_session_loader.py +0 -0
  407. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/session/test_session_logger.py +0 -0
  408. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/session/test_session_migration.py +0 -0
  409. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/skills/conftest.py +0 -0
  410. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/skills/test_manager.py +0 -0
  411. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/skills/test_models.py +0 -0
  412. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/skills/test_parser.py +0 -0
  413. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  414. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  415. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  416. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  417. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  418. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  419. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  420. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  421. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  422. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  423. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  424. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  425. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  426. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  427. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  428. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  429. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  430. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  431. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  432. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  433. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  434. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  435. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  436. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  437. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  438. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  439. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  440. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  441. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  442. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  443. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  444. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  445. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  446. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  447. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  448. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  449. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  450. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  451. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  452. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  453. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  454. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  455. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  456. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  457. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  458. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  459. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  460. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  461. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  462. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  463. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  464. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  465. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  466. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  467. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  468. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  469. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  470. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  471. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  472. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  473. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/base_snapshot_test_app.py +0 -0
  474. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/conftest.py +0 -0
  475. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/snap_compare.py +0 -0
  476. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  477. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  478. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  479. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  480. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  481. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  482. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  483. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  484. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  485. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  486. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  487. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  488. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  489. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  490. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/stubs/fake_backend.py +0 -0
  491. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/stubs/fake_client.py +0 -0
  492. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/stubs/fake_tool.py +0 -0
  493. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_agent_auto_compact.py +0 -0
  494. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_agent_backend.py +0 -0
  495. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_agent_observer_streaming.py +0 -0
  496. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_agent_stats.py +0 -0
  497. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_agent_tasks.py +0 -0
  498. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_agent_tool_call.py +0 -0
  499. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_agents.py +0 -0
  500. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_bank_build.py +0 -0
  501. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_bank_debug.py +0 -0
  502. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_bank_multiagent.py +0 -0
  503. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_bank_prd.py +0 -0
  504. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_bank_prd_extended.py +0 -0
  505. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_bank_tools.py +0 -0
  506. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_bank_update.py +0 -0
  507. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_build_projects.py +0 -0
  508. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_cli_programmatic_preload.py +0 -0
  509. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_current_bugs.py +0 -0
  510. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_drydock_regression.py +0 -0
  511. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_drydock_tasks.py +0 -0
  512. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_full_regression.py +0 -0
  513. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_history_manager.py +0 -0
  514. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_integration.py +0 -0
  515. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_loop_detection.py +0 -0
  516. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_message_id.py +0 -0
  517. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_message_merging.py +0 -0
  518. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_middleware.py +0 -0
  519. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_multi_agent.py +0 -0
  520. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_real_failures.py +0 -0
  521. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_real_issues.py +0 -0
  522. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_real_workflow.py +0 -0
  523. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_reasoning_content.py +0 -0
  524. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_smoke.py +0 -0
  525. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_system_prompt.py +0 -0
  526. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_tagged_text.py +0 -0
  527. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_tool_args.py +0 -0
  528. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_ui_external_editor.py +0 -0
  529. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_ui_input_history.py +0 -0
  530. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_workloads.py +0 -0
  531. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/testbank_helpers.py +0 -0
  532. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_ask_user_question.py +0 -0
  533. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_bash.py +0 -0
  534. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_exit_plan_mode.py +0 -0
  535. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_grep.py +0 -0
  536. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_invoke_context.py +0 -0
  537. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_manager_get_tool_config.py +0 -0
  538. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_mcp.py +0 -0
  539. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_mcp_sampling.py +0 -0
  540. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_task.py +0 -0
  541. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_ui_bash_execution.py +0 -0
  542. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_webfetch.py +0 -0
  543. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_websearch.py +0 -0
  544. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  545. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  546. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/update_notifier/test_do_update.py +0 -0
  547. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  548. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/update_notifier/test_github_update_gateway.py +0 -0
  549. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  550. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/update_notifier/test_ui_update_notification.py +0 -0
  551. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/update_notifier/test_update_use_case.py +0 -0
  552. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/update_notifier/test_whats_new.py +0 -0
  553. {drydock_cli-2.6.7 → drydock_cli-2.6.9}/uv.lock +0 -0
@@ -0,0 +1 @@
1
+ 3928923
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.6.7
3
+ Version: 2.6.9
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
@@ -394,10 +394,18 @@ class VibeApp(App): # noqa: PLR0904
394
394
  input_widget.value = ""
395
395
 
396
396
  if self._agent_running:
397
- # Queue the message instead of interrupting process after current task
397
+ # Queue the message join rapid-fire inputs (multi-line paste)
398
398
  if not hasattr(self, "_pending_messages"):
399
399
  self._pending_messages: list[str] = []
400
- self._pending_messages.append(value)
400
+ import time
401
+ now = time.time()
402
+ last_queue_time = getattr(self, "_last_queue_time", 0)
403
+ if now - last_queue_time < 0.5 and self._pending_messages:
404
+ # Rapid input (< 500ms apart) = likely paste — join with newline
405
+ self._pending_messages[-1] += "\n" + value
406
+ else:
407
+ self._pending_messages.append(value)
408
+ self._last_queue_time = now
401
409
  preview = value[:60] + "..." if len(value) > 60 else value
402
410
  self.notify(f"Queued: \"{preview}\" ({len(self._pending_messages)} pending)")
403
411
  return
@@ -567,23 +567,34 @@ class AgentLoop:
567
567
  or "maximum context" in error_str.lower()
568
568
  or "400 bad request" in error_str.lower()
569
569
  or "status: 400" in error_str.lower()):
570
- # Context limit or malformed request — aggressively compact
570
+ # Context limit or malformed request — aggressive recovery
571
571
  try:
572
- compacted = 0
572
+ # First try: truncate old messages
573
573
  for i, msg in enumerate(self.messages):
574
574
  if i >= len(self.messages) - 4:
575
- break # Keep last 4 messages
575
+ break
576
576
  if msg.role == Role.tool and hasattr(msg, 'content'):
577
577
  content = str(msg.content) if msg.content else ""
578
578
  if len(content) > 200:
579
- msg.content = content[:100] + "\n[truncated]\n" + content[-50:]
580
- compacted += 1
579
+ msg.content = content[:100] + "\n[truncated]"
581
580
  elif msg.role == Role.assistant and hasattr(msg, 'content'):
582
581
  content = str(msg.content) if msg.content else ""
583
582
  if len(content) > 500:
584
583
  msg.content = content[:200] + "\n[truncated]"
585
- compacted += 1
586
- logger.info("Emergency compaction: truncated %d messages", compacted)
584
+
585
+ # Second try: if messages > 20, keep only last 6
586
+ if len(self.messages) > 20:
587
+ first_user = None
588
+ for msg in self.messages:
589
+ if msg.role == Role.user:
590
+ first_user = msg
591
+ break
592
+ kept = []
593
+ if first_user:
594
+ kept.append(first_user)
595
+ kept.extend(self.messages[-5:])
596
+ self.messages.reset(kept)
597
+ logger.info("Emergency reset: kept first user + last 5 messages")
587
598
  except Exception:
588
599
  pass
589
600
  error_text = "Context compacted due to API error. Continue with your task."
@@ -592,6 +603,8 @@ class AgentLoop:
592
603
  self._inject_system_note(error_text)
593
604
  continue
594
605
 
606
+ if not self.messages:
607
+ continue
595
608
  last_message = self.messages[-1]
596
609
 
597
610
  # Track edits — no circuit breakers, just track for has_made_edit
@@ -625,6 +638,8 @@ class AgentLoop:
625
638
  if assistant_event.content:
626
639
  yield assistant_event
627
640
 
641
+ if not self.messages:
642
+ return
628
643
  last_message = self.messages[-1]
629
644
 
630
645
  # Detect repetitive text generation (Gemma 4 sometimes loops text within one response)
@@ -752,7 +767,7 @@ class AgentLoop:
752
767
  - Other (bash with commands): block after 3
753
768
  """
754
769
  args_str = json.dumps(tool_call.args_dict, sort_keys=True, default=str)
755
- sig = hashlib.md5(
770
+ sig = hashlib.sha256(
756
771
  f"{tool_call.tool_name}:{args_str}".encode()
757
772
  ).hexdigest()
758
773
 
@@ -804,7 +819,7 @@ class AgentLoop:
804
819
  def _circuit_breaker_record(self, tool_call: ResolvedToolCall, result_text: str) -> None:
805
820
  """Record a tool call execution for circuit breaker tracking."""
806
821
  args_str = json.dumps(tool_call.args_dict, sort_keys=True, default=str)
807
- sig = hashlib.md5(
822
+ sig = hashlib.sha256(
808
823
  f"{tool_call.tool_name}:{args_str}".encode()
809
824
  ).hexdigest()
810
825
  count, _ = self._tool_call_history.get(sig, (0, ""))
@@ -1147,7 +1162,7 @@ class AgentLoop:
1147
1162
  self.messages.reset(cleaned)
1148
1163
 
1149
1164
  # Fix 2: If last message is assistant, add a user "Continue." prompt
1150
- if self.messages[-1].role == Role.assistant:
1165
+ if self.messages and self.messages[-1].role == Role.assistant:
1151
1166
  self.messages.append(LLMMessage(role=Role.user, content="Continue."))
1152
1167
 
1153
1168
  async def _chat(self, max_tokens: int | None = None) -> LLMChunk:
@@ -1509,7 +1524,7 @@ class AgentLoop:
1509
1524
  f"{tc.function.name}:{tc.function.arguments}"
1510
1525
  )
1511
1526
  tool_names.append(tc.function.name or "")
1512
- sig = hashlib.md5(
1527
+ sig = hashlib.sha256(
1513
1528
  "|".join(sorted(call_parts)).encode()
1514
1529
  ).hexdigest()[:16]
1515
1530
  sigs.append(sig)
@@ -1942,7 +1957,7 @@ class AgentLoop:
1942
1957
  except (json.JSONDecodeError, TypeError):
1943
1958
  pass
1944
1959
  call_parts.append(f"{fn_name}:{fn_args}")
1945
- sig = hashlib.md5("|".join(sorted(call_parts)).encode()).hexdigest()[:16]
1960
+ sig = hashlib.sha256("|".join(sorted(call_parts)).encode()).hexdigest()[:16]
1946
1961
 
1947
1962
  if sig in seen_sigs:
1948
1963
  # Duplicate — mark for removal (assistant msg + next tool result)
@@ -1,6 +1,6 @@
1
1
  You are DryDock, a CLI coding agent. You write code, fix bugs, and build projects.
2
2
 
3
- ACT IMMEDIATELY. Do NOT ask for permission. Do NOT explain what you will do. Just do it.
3
+ ACT IMMEDIATELY. Your FIRST response must be a tool call — not text. Do NOT explain, plan, or ask. Call a tool NOW.
4
4
 
5
5
  Your tools: read_file, write_file, search_replace, grep, glob, bash.
6
6
 
@@ -241,14 +241,13 @@ class SearchReplace(
241
241
  ">>>>>>> REPLACE"
242
242
  )
243
243
 
244
- # Detect garbled token output (common with some models/parsers)
244
+ # Detect garbled token output only flag obvious corruption
245
+ # (mixed angle brackets + repeated letters like <<t<ttt<t), not normal repeats
245
246
  for block in search_replace_blocks:
246
- if re.search(r'(.)\1{4,}', block.search) or re.search(r'<{3,}[a-z]', block.search):
247
+ if re.search(r'<[a-z]<[a-z]{2,}<[a-z]', block.search):
247
248
  raise ToolError(
248
- "Your search text appears garbled (repeated/corrupted characters). "
249
- "This happens when regex or special characters confuse the tool call parser. "
250
- "WORKAROUND: Use read_file to get the exact line numbers, then use write_file "
251
- "to rewrite the entire function instead of search_replace on complex regex patterns."
249
+ "Your search text appears garbled (token corruption). "
250
+ "Use write_file to rewrite the function instead of search_replace."
252
251
  )
253
252
 
254
253
  return file_path, search_replace_blocks
@@ -49,7 +49,7 @@ def _compute_module_name(path: Path) -> str:
49
49
  return canonical
50
50
 
51
51
  resolved = path.resolve()
52
- path_hash = hashlib.md5(str(resolved).encode()).hexdigest()[:8]
52
+ path_hash = hashlib.sha256(str(resolved).encode()).hexdigest()[:8]
53
53
  stem = re.sub(r"[^0-9A-Za-z_]", "_", path.stem) or "mod"
54
54
  return f"vibe_tools_discovered_{stem}_{path_hash}"
55
55
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.6.7"
3
+ version = "2.6.9"
4
4
  description = "Drydock — nautical CLI coding agent"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -0,0 +1,129 @@
1
+ """Tests for user-reported issues (2026-04-07).
2
+
3
+ Each test should FAIL before the fix and PASS after.
4
+ """
5
+ import hashlib
6
+ import pytest
7
+ from unittest.mock import patch, MagicMock
8
+
9
+
10
+ class TestMD5Crash:
11
+ """#61: Crash after install — md5 error in manager.py."""
12
+
13
+ def test_md5_usedforsecurity(self):
14
+ """md5 should work with usedforsecurity=False."""
15
+ h = hashlib.md5(b"test", usedforsecurity=False)
16
+ assert h.hexdigest() == "098f6bcd4621d373cade4e832627b4f6"
17
+
18
+ def test_tool_manager_import(self):
19
+ """Tool manager should not crash on import."""
20
+ from drydock.core.tools.manager import ToolManager
21
+ assert ToolManager is not None
22
+
23
+
24
+ class TestSearchReplaceGarbled:
25
+ """#55: search_replace garbled characters."""
26
+
27
+ def test_garbled_detection(self):
28
+ from drydock.core.tools.builtins.search_replace import SearchReplaceArgs
29
+ args = SearchReplaceArgs.model_validate({
30
+ "file_path": "test.py",
31
+ "content": "<<<<<<< SEARCH\nold text\n=======\nnew text\n>>>>>>> REPLACE",
32
+ })
33
+ assert args.file_path == "test.py"
34
+
35
+
36
+ class TestTodoEnumQuotes:
37
+ """#60: Todo enum quoting issues."""
38
+
39
+ def test_double_quoted(self):
40
+ from drydock.core.tools.builtins.todo import TodoItem
41
+ item = TodoItem.model_validate({
42
+ "id": "1", "content": "test",
43
+ "status": '"completed"', "priority": '"high"',
44
+ })
45
+ assert item.status.value == "completed"
46
+
47
+ def test_single_quoted(self):
48
+ from drydock.core.tools.builtins.todo import TodoItem
49
+ item = TodoItem.model_validate({
50
+ "id": "1", "content": "test",
51
+ "status": "'completed'", "priority": "'high'",
52
+ })
53
+ assert item.status.value == "completed"
54
+
55
+
56
+ class TestEmptyState:
57
+ """#58: IndexError on empty lists."""
58
+
59
+ def test_empty_tool_calls(self):
60
+ from drydock.core.types import LLMMessage, Role
61
+ msg = LLMMessage(role=Role.assistant, content="hello", tool_calls=None)
62
+ calls = msg.tool_calls or []
63
+ assert calls == []
64
+
65
+
66
+ if __name__ == "__main__":
67
+ pytest.main([__file__, "-v"])
68
+
69
+
70
+ class TestSearchReplaceGarbledAdvanced:
71
+ """#55: Garbled detection should only catch real corruption."""
72
+
73
+ def test_legitimate_repeats_not_flagged(self):
74
+ """Normal repeated chars like ===== should NOT be flagged."""
75
+ from drydock.core.tools.builtins.search_replace import SearchReplace
76
+ blocks = SearchReplace._parse_search_replace_blocks(
77
+ "<<<<<<< SEARCH\ndef foo():\n x = 5\n=======\ndef foo():\n x = 10\n>>>>>>> REPLACE"
78
+ )
79
+ assert len(blocks) == 1
80
+ assert "x = 5" in blocks[0].search
81
+
82
+ def test_real_garble_detected(self):
83
+ """Token corruption like <<t<ttt<t should be caught."""
84
+ import re
85
+ garbled = "(?P<<t<ttt<t<tststssts>\\d+)"
86
+ assert re.search(r'<[a-z]<[a-z]{2,}<[a-z]', garbled)
87
+
88
+ def test_normal_regex_not_garbled(self):
89
+ """Normal regex should not trigger garble detection."""
90
+ import re
91
+ normal = r"(?P<timestamp>\d{4}-\d{2}-\d{2})"
92
+ assert not re.search(r'<[a-z]<[a-z]{2,}<[a-z]', normal)
93
+
94
+
95
+ class TestIndexErrorGuards:
96
+ """#58: Guard all [-1] accesses on potentially empty lists."""
97
+
98
+ def test_empty_messages_safe(self):
99
+ """Accessing last message on empty list should not crash."""
100
+ messages = []
101
+ last = messages[-1] if messages else None
102
+ assert last is None
103
+
104
+ def test_agent_loop_no_md5(self):
105
+ """Agent loop should use sha256, not md5."""
106
+ import inspect
107
+ from drydock.core.agent_loop import AgentLoop
108
+ source = inspect.getsource(AgentLoop)
109
+ assert "hashlib.md5" not in source, "Still using md5 in agent_loop"
110
+ assert "hashlib.sha256" in source or "sha256" not in source # either uses sha256 or doesn't hash at all
111
+
112
+
113
+ class TestAPIRecovery:
114
+ """#57: API error recovery should auto-compact."""
115
+
116
+ def test_message_list_reset_keeps_structure(self):
117
+ """Reset should produce valid message ordering."""
118
+ from drydock.core.types import MessageList, LLMMessage, Role
119
+ ml = MessageList()
120
+ for i in range(25):
121
+ ml.append(LLMMessage(role=Role.user, content=f"msg {i}"))
122
+ ml.append(LLMMessage(role=Role.assistant, content=f"reply {i}"))
123
+
124
+ # Simulate emergency reset: keep first user + last 5
125
+ first_user = ml[0]
126
+ kept = [first_user] + list(ml[-5:])
127
+ ml.reset(kept)
128
+ assert len(ml) == 6
129
+ assert ml[0].role == Role.user
@@ -1 +0,0 @@
1
- 3888135
@@ -1,265 +0,0 @@
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_disabled(self):
66
- """Circuit breaker is disabled — even failed commands are never blocked."""
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": "bad_cmd"})
75
- for _ in range(3):
76
- al._circuit_breaker_record(tc, "FAILED: command not found")
77
-
78
- # CB is disabled — always returns None
79
- assert al._circuit_breaker_check(tc) is None
80
-
81
- def test_circuit_breaker_resets_for_new_conversation(self):
82
- """Circuit breaker history is clearable between conversations."""
83
- from drydock.core.agent_loop import AgentLoop
84
- from drydock.core.types import MessageList
85
-
86
- al = object.__new__(AgentLoop)
87
- al.messages = MessageList()
88
- al._tool_call_history = {}
89
-
90
- tc = SimpleNamespace(tool_name="bash", args_dict={"command": "bad_cmd"})
91
- for _ in range(3):
92
- al._circuit_breaker_record(tc, "FAILED: command not found")
93
- # CB is disabled — returns None even before clearing
94
- assert al._circuit_breaker_check(tc) is None
95
-
96
- # Simulate new conversation — history should be clearable
97
- al._tool_call_history.clear()
98
- assert al._circuit_breaker_check(tc) is None # Still None
99
-
100
-
101
- # ============================================================================
102
- # Issue 7: "Understood" after errors then stops
103
- # ============================================================================
104
-
105
- class TestUnderstoodBug:
106
- def test_no_understood_in_agent(self):
107
- """The agent should not inject 'Understood.' which causes premature stops."""
108
- from drydock.core.agent_loop import AgentLoop
109
- src = inspect.getsource(AgentLoop)
110
- # "Understood." was causing the model to think conversation ended
111
- assert "Understood" not in src, \
112
- "'Understood' found in agent_loop — should use 'Continuing...' instead"
113
-
114
-
115
- # ============================================================================
116
- # Issue 10: Circuit breaker too sensitive — same command later should be OK
117
- # ============================================================================
118
-
119
- class TestCircuitBreakerSensitivity:
120
- def test_successful_commands_never_blocked(self):
121
- """Successful commands are never blocked."""
122
- from drydock.core.agent_loop import AgentLoop
123
- from drydock.core.types import MessageList
124
-
125
- al = object.__new__(AgentLoop)
126
- al.messages = MessageList()
127
- al._tool_call_history = {}
128
-
129
- tc = SimpleNamespace(tool_name="bash", args_dict={"command": "git status"})
130
- for _ in range(10):
131
- al._circuit_breaker_record(tc, "clean")
132
- assert al._circuit_breaker_check(tc) is None # Never blocked
133
-
134
- def test_failed_commands_not_blocked_cb_disabled(self):
135
- """CB disabled — failed commands are NOT blocked even after 3 repeats."""
136
- from drydock.core.agent_loop import AgentLoop
137
- from drydock.core.types import MessageList
138
-
139
- al = object.__new__(AgentLoop)
140
- al.messages = MessageList()
141
- al._tool_call_history = {}
142
-
143
- tc = SimpleNamespace(tool_name="bash", args_dict={"command": "git status"})
144
- for _ in range(3):
145
- al._circuit_breaker_record(tc, "FAILED: not a git repo")
146
- assert al._circuit_breaker_check(tc) is None # CB disabled
147
-
148
-
149
- # ============================================================================
150
- # Issue 11: /consult needs to show which model is being used
151
- # ============================================================================
152
-
153
- class TestConsultModelDisplay:
154
- def test_consult_handler_shows_model_name(self):
155
- """The /consult response should include the model name."""
156
- from drydock.cli.textual_ui.app import VibeApp
157
- src = inspect.getsource(VibeApp._consult_command)
158
- # Should display which model is being used
159
- assert "consultant_model" in src or "model" in src
160
-
161
- def test_consult_help_shows_config_instructions(self):
162
- """Typing /consult with no args should show how to configure."""
163
- from drydock.cli.textual_ui.app import VibeApp
164
- src = inspect.getsource(VibeApp._consult_command)
165
- assert "config.toml" in src or "consultant_model" in src
166
-
167
-
168
- # ============================================================================
169
- # Issue 12: SSL error on websearch — should use -k / DRYDOCK_INSECURE
170
- # ============================================================================
171
-
172
- class TestWebSearchSSL:
173
- def test_websearch_respects_insecure_flag(self):
174
- """WebSearch should check DRYDOCK_INSECURE env var."""
175
- from drydock.core.tools.builtins.websearch import WebSearch
176
- src = inspect.getsource(WebSearch)
177
- assert "DRYDOCK_INSECURE" in src or "insecure" in src.lower() or "verify" in src
178
-
179
- def test_webfetch_respects_insecure_flag(self):
180
- """WebFetch should check DRYDOCK_INSECURE env var."""
181
- from drydock.core.tools.builtins.webfetch import WebFetch
182
- src = inspect.getsource(WebFetch)
183
- assert "DRYDOCK_INSECURE" in src
184
-
185
-
186
- # ============================================================================
187
- # Issue 14: Config.toml consultant_model setup
188
- # ============================================================================
189
-
190
- class TestConsultantConfig:
191
- def test_config_has_consultant_model_field(self):
192
- """VibeConfig should have consultant_model field."""
193
- from drydock.core.config import VibeConfig
194
- assert hasattr(VibeConfig, "model_fields")
195
- assert "consultant_model" in VibeConfig.model_fields
196
-
197
- def test_consultant_model_documented_in_readme(self):
198
- """README should mention how to set consultant_model."""
199
- readme = Path(__file__).parent.parent / "README.md"
200
- content = readme.read_text()
201
- assert "consultant_model" in content or "consultant" in content.lower()
202
-
203
-
204
- # ============================================================================
205
- # Issue 15: Auto-consult agent — model should ask consultant when stuck
206
- # ============================================================================
207
-
208
- class TestAutoConsult:
209
- def test_circuit_breaker_disabled_returns_none(self):
210
- """CB is disabled — returns None even for repeatedly failed commands."""
211
- from drydock.core.agent_loop import AgentLoop
212
- from drydock.core.types import MessageList
213
-
214
- al = object.__new__(AgentLoop)
215
- al.messages = MessageList()
216
- al._tool_call_history = {}
217
-
218
- tc = SimpleNamespace(tool_name="bash", args_dict={"command": "bad_cmd"})
219
- for _ in range(3):
220
- al._circuit_breaker_record(tc, "FAILED: command not found")
221
- assert al._circuit_breaker_check(tc) is None
222
-
223
-
224
- # ============================================================================
225
- # Issue 16: /consult should include conversation history
226
- # ============================================================================
227
-
228
- class TestConsultHistory:
229
- def test_consult_sends_context(self):
230
- """/consult handler should send conversation context to consultant."""
231
- from drydock.core.consultant import ask_consultant
232
- src = inspect.getsource(ask_consultant)
233
- # Should accept and use context/conversation history
234
- assert "context" in src or "messages" in src or "history" in src
235
-
236
-
237
- # ============================================================================
238
- # Issue 17: Deep research skill should exist
239
- # ============================================================================
240
-
241
- class TestDeepResearchSkill:
242
- def test_research_skill_exists(self):
243
- """A deep-research skill should be bundled."""
244
- skills_dir = Path(__file__).parent.parent / "drydock" / "skills"
245
- skill_dirs = [d.name for d in skills_dir.iterdir() if d.is_dir()] if skills_dir.exists() else []
246
- has_research = any("research" in d for d in skill_dirs)
247
- assert has_research, f"No research skill found. Available: {skill_dirs}"
248
-
249
-
250
- # ============================================================================
251
- # Issue 18: Not using agents — explore/diagnostic agents should be utilized
252
- # ============================================================================
253
-
254
- class TestAgentsAvailable:
255
- def test_explore_agent_registered(self):
256
- """The 'explore' agent should be registered."""
257
- from drydock.core.agents.models import BuiltinAgentName
258
- assert hasattr(BuiltinAgentName, "EXPLORE") or "explore" in dir(BuiltinAgentName)
259
-
260
- def test_system_prompt_mentions_agents(self):
261
- """System prompt should tell the model about available agents."""
262
- prompt = Path(__file__).parent.parent / "drydock" / "core" / "prompts" / "cli.md"
263
- content = prompt.read_text()
264
- has_agent_ref = "agent" in content.lower() or "subagent" in content.lower() or "task" in content.lower()
265
- 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