drydock-cli 1.1.5__tar.gz → 1.2.0__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 (496) hide show
  1. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/PKG-INFO +1 -1
  2. drydock_cli-1.2.0/PRD.md +231 -0
  3. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/prompts/cli.md +19 -1
  4. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/pyproject.toml +1 -1
  5. drydock_cli-1.2.0/tests/test_multi_agent.py +112 -0
  6. drydock_cli-1.1.5/PRD.md +0 -194
  7. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/.github/CODEOWNERS +0 -0
  8. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  9. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  10. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  11. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/.github/workflows/build-and-upload.yml +0 -0
  12. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/.github/workflows/ci.yml +0 -0
  13. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/.github/workflows/issue-labeler.yml +0 -0
  14. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/.github/workflows/release.yml +0 -0
  15. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/.gitignore +0 -0
  16. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/.pre-commit-config.yaml +0 -0
  17. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/.python-version +0 -0
  18. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/.typos.toml +0 -0
  19. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/.vscode/extensions.json +0 -0
  20. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/.vscode/launch.json +0 -0
  21. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/.vscode/settings.json +0 -0
  22. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/AGENTS.md +0 -0
  23. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/CHANGELOG.md +0 -0
  24. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/CLAUDE.md +0 -0
  25. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/CONTRIBUTING.md +0 -0
  26. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/Drydock_rebrand.md +0 -0
  27. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/LICENSE +0 -0
  28. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/NOTICE +0 -0
  29. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/README.md +0 -0
  30. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/action.yml +0 -0
  31. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/distribution/zed/LICENSE +0 -0
  32. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/distribution/zed/extension.toml +0 -0
  33. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/distribution/zed/icons/mistral_vibe.svg +0 -0
  34. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/docs/README.md +0 -0
  35. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/docs/acp-setup.md +0 -0
  36. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/docs/proxy-setup.md +0 -0
  37. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/__init__.py +0 -0
  38. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/acp/__init__.py +0 -0
  39. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/acp/acp_agent_loop.py +0 -0
  40. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/acp/acp_logger.py +0 -0
  41. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/acp/entrypoint.py +0 -0
  42. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/acp/tools/__init__.py +0 -0
  43. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/acp/tools/base.py +0 -0
  44. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/acp/tools/builtins/bash.py +0 -0
  45. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/acp/tools/builtins/read_file.py +0 -0
  46. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/acp/tools/builtins/search_replace.py +0 -0
  47. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/acp/tools/builtins/todo.py +0 -0
  48. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/acp/tools/builtins/write_file.py +0 -0
  49. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/acp/tools/session_update.py +0 -0
  50. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/acp/utils.py +0 -0
  51. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/__init__.py +0 -0
  52. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/autocompletion/__init__.py +0 -0
  53. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/autocompletion/base.py +0 -0
  54. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/autocompletion/path_completion.py +0 -0
  55. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/autocompletion/slash_command.py +0 -0
  56. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/cli.py +0 -0
  57. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/clipboard.py +0 -0
  58. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/commands.py +0 -0
  59. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/entrypoint.py +0 -0
  60. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/history_manager.py +0 -0
  61. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  62. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  63. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  64. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/terminal_setup.py +0 -0
  65. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/__init__.py +0 -0
  66. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  67. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/app.py +0 -0
  68. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/app.tcss +0 -0
  69. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/external_editor.py +0 -0
  70. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  71. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  72. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  73. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  74. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  75. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  76. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  77. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  78. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  79. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  80. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  81. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  82. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  83. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  84. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  85. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  86. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  87. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  88. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  89. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  90. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  91. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  92. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  93. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  94. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  95. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  96. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  97. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  98. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  99. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  100. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  101. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  102. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  103. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  104. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  105. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  106. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/windowing/history.py +0 -0
  107. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  108. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/textual_ui/windowing/state.py +0 -0
  109. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/update_notifier/__init__.py +0 -0
  110. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  111. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  112. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  113. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  114. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  115. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/update_notifier/update.py +0 -0
  116. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/cli/update_notifier/whats_new.py +0 -0
  117. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/__init__.py +0 -0
  118. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/agent_loop.py +0 -0
  119. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/agents/__init__.py +0 -0
  120. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/agents/manager.py +0 -0
  121. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/agents/models.py +0 -0
  122. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/auth/__init__.py +0 -0
  123. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/auth/crypto.py +0 -0
  124. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/auth/github.py +0 -0
  125. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/autocompletion/__init__.py +0 -0
  126. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/autocompletion/completers.py +0 -0
  127. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  128. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  129. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  130. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  131. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  132. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/autocompletion/fuzzy.py +0 -0
  133. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/autocompletion/path_prompt.py +0 -0
  134. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  135. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/config/__init__.py +0 -0
  136. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/config/_settings.py +0 -0
  137. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/config/harness_files/__init__.py +0 -0
  138. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  139. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/config/harness_files/_paths.py +0 -0
  140. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/consultant.py +0 -0
  141. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/drydock_states.py +0 -0
  142. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/hooks.py +0 -0
  143. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/llm/__init__.py +0 -0
  144. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/llm/backend/anthropic.py +0 -0
  145. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/llm/backend/base.py +0 -0
  146. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/llm/backend/factory.py +0 -0
  147. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/llm/backend/generic.py +0 -0
  148. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/llm/backend/mistral.py +0 -0
  149. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  150. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/llm/backend/vertex.py +0 -0
  151. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/llm/exceptions.py +0 -0
  152. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/llm/format.py +0 -0
  153. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/llm/message_utils.py +0 -0
  154. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/llm/types.py +0 -0
  155. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/logger.py +0 -0
  156. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/middleware.py +0 -0
  157. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/output_formatters.py +0 -0
  158. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/paths/__init__.py +0 -0
  159. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/paths/_local_config_walk.py +0 -0
  160. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/paths/_vibe_home.py +0 -0
  161. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/paths/conventions.py +0 -0
  162. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/plan_session.py +0 -0
  163. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/programmatic.py +0 -0
  164. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/prompts/__init__.py +0 -0
  165. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/prompts/compact.md +0 -0
  166. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/prompts/dangerous_directory.md +0 -0
  167. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/prompts/diagnostic.md +0 -0
  168. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/prompts/explore.md +0 -0
  169. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/prompts/planner.md +0 -0
  170. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/prompts/project_context.md +0 -0
  171. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/prompts/tests.md +0 -0
  172. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/proxy_setup.py +0 -0
  173. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/session/agent_memory.py +0 -0
  174. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/session/session_loader.py +0 -0
  175. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/session/session_logger.py +0 -0
  176. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/session/session_migration.py +0 -0
  177. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/session/state_file.py +0 -0
  178. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/skills/__init__.py +0 -0
  179. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/skills/manager.py +0 -0
  180. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/skills/models.py +0 -0
  181. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/skills/parser.py +0 -0
  182. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/slug.py +0 -0
  183. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/system_prompt.py +0 -0
  184. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/telemetry/__init__.py +0 -0
  185. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/telemetry/send.py +0 -0
  186. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/teleport/errors.py +0 -0
  187. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/teleport/git.py +0 -0
  188. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/teleport/nuage.py +0 -0
  189. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/teleport/teleport.py +0 -0
  190. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/teleport/types.py +0 -0
  191. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/base.py +0 -0
  192. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  193. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/bash.py +0 -0
  194. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/cron.py +0 -0
  195. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  196. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/glob_tool.py +0 -0
  197. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/grep.py +0 -0
  198. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  199. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/lsp.py +0 -0
  200. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  201. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  202. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/powershell.py +0 -0
  203. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  204. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  205. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  206. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  207. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  208. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  209. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  210. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  211. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  212. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  213. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  214. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  215. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  216. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  217. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/task.md +0 -0
  218. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  219. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  220. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  221. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  222. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  223. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  224. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  225. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/read_file.py +0 -0
  226. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/search_replace.py +0 -0
  227. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/task.py +0 -0
  228. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/task_manager.py +0 -0
  229. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/todo.py +0 -0
  230. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/tool_search.py +0 -0
  231. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/webfetch.py +0 -0
  232. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/websearch.py +0 -0
  233. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/worktree.py +0 -0
  234. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/builtins/write_file.py +0 -0
  235. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/injection_guard.py +0 -0
  236. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/manager.py +0 -0
  237. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/mcp/__init__.py +0 -0
  238. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/mcp/registry.py +0 -0
  239. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/mcp/tools.py +0 -0
  240. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/mcp_sampling.py +0 -0
  241. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/ui.py +0 -0
  242. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/tools/utils.py +0 -0
  243. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/trusted_folders.py +0 -0
  244. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/types.py +0 -0
  245. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/core/utils.py +0 -0
  246. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/setup/onboarding/__init__.py +0 -0
  247. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/setup/onboarding/base.py +0 -0
  248. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/setup/onboarding/onboarding.tcss +0 -0
  249. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/setup/onboarding/screens/__init__.py +0 -0
  250. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/setup/onboarding/screens/api_key.py +0 -0
  251. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/setup/onboarding/screens/welcome.py +0 -0
  252. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  253. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  254. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/skills/__init__.py +0 -0
  255. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/skills/batch/SKILL.md +0 -0
  256. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/skills/create-presentation/SKILL.md +0 -0
  257. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/skills/deep-research/SKILL.md +0 -0
  258. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/skills/investigate/SKILL.md +0 -0
  259. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/skills/review/SKILL.md +0 -0
  260. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/skills/ship/SKILL.md +0 -0
  261. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/skills/simplify/SKILL.md +0 -0
  262. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock/whats_new.md +0 -0
  263. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock-acp.spec +0 -0
  264. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/drydock_terms.md +0 -0
  265. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/flake.lock +0 -0
  266. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/flake.nix +0 -0
  267. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/scripts/README.md +0 -0
  268. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/scripts/backup.sh +0 -0
  269. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/scripts/bump_version.py +0 -0
  270. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/scripts/deploy_to_github.sh +0 -0
  271. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/scripts/install.sh +0 -0
  272. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/scripts/prepare_release.py +0 -0
  273. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/scripts/publish_to_pypi.sh +0 -0
  274. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/scripts/test_full.sh +0 -0
  275. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/scripts/test_smoke.sh +0 -0
  276. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/__init__.py +0 -0
  277. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/conftest.py +0 -0
  278. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/test_acp.py +0 -0
  279. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/test_agent_thought.py +0 -0
  280. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/test_bash.py +0 -0
  281. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/test_compact_session_updates.py +0 -0
  282. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/test_content.py +0 -0
  283. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/test_initialize.py +0 -0
  284. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/test_list_sessions.py +0 -0
  285. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/test_load_session.py +0 -0
  286. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/test_multi_session.py +0 -0
  287. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/test_new_session.py +0 -0
  288. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/test_proxy_setup_acp.py +0 -0
  289. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/test_read_file.py +0 -0
  290. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/test_search_replace.py +0 -0
  291. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/test_set_config_option.py +0 -0
  292. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/test_set_mode.py +0 -0
  293. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/test_set_model.py +0 -0
  294. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/test_tool_call_session_update.py +0 -0
  295. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/test_utils.py +0 -0
  296. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/acp/test_write_file.py +0 -0
  297. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/autocompletion/test_file_indexer.py +0 -0
  298. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/autocompletion/test_fuzzy.py +0 -0
  299. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  300. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  301. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/autocompletion/test_path_completion_controller.py +0 -0
  302. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  303. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/autocompletion/test_slash_command_controller.py +0 -0
  304. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  305. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/backend/__init__.py +0 -0
  306. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/backend/data/__init__.py +0 -0
  307. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/backend/data/fireworks.py +0 -0
  308. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/backend/data/mistral.py +0 -0
  309. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/backend/test_anthropic_adapter.py +0 -0
  310. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/backend/test_backend.py +0 -0
  311. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/backend/test_reasoning_adapter.py +0 -0
  312. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  313. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  314. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  315. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  316. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/cli/test_bell_notifications.py +0 -0
  317. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/cli/test_braille_renderer.py +0 -0
  318. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/cli/test_clipboard.py +0 -0
  319. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/cli/test_commands.py +0 -0
  320. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/cli/test_copy_shortcuts.py +0 -0
  321. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/cli/test_external_editor.py +0 -0
  322. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/cli/test_no_markup_static.py +0 -0
  323. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/cli/test_question_app.py +0 -0
  324. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/cli/test_spinner.py +0 -0
  325. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/cli/test_switching_mode.py +0 -0
  326. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  327. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  328. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/cli/test_ui_session_resume.py +0 -0
  329. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/cli/test_ui_skill_dispatch.py +0 -0
  330. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/cli/textual_ui/__init__.py +0 -0
  331. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/cli/textual_ui/test_session_picker.py +0 -0
  332. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/conftest.py +0 -0
  333. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/core/test_agents.py +0 -0
  334. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/core/test_auth_crypto.py +0 -0
  335. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/core/test_auth_github.py +0 -0
  336. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/core/test_config_load_dotenv.py +0 -0
  337. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/core/test_config_paths.py +0 -0
  338. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/core/test_config_resolution.py +0 -0
  339. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/core/test_file_logging.py +0 -0
  340. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/core/test_plan_session.py +0 -0
  341. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/core/test_proxy_setup.py +0 -0
  342. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/core/test_slug.py +0 -0
  343. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/core/test_telemetry_send.py +0 -0
  344. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/core/test_teleport_git.py +0 -0
  345. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/core/test_teleport_nuage.py +0 -0
  346. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/core/test_teleport_service.py +0 -0
  347. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/core/test_trusted_folders.py +0 -0
  348. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/core/test_utils.py +0 -0
  349. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/e2e/common.py +0 -0
  350. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/e2e/conftest.py +0 -0
  351. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/e2e/mock_server.py +0 -0
  352. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  353. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/e2e/test_cli_tui_streaming.py +0 -0
  354. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  355. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/mock/__init__.py +0 -0
  356. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/mock/mock_backend_factory.py +0 -0
  357. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/mock/mock_entrypoint.py +0 -0
  358. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/mock/utils.py +0 -0
  359. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/onboarding/test_run_onboarding.py +0 -0
  360. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/onboarding/test_ui_onboarding.py +0 -0
  361. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/session/test_session_loader.py +0 -0
  362. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/session/test_session_logger.py +0 -0
  363. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/session/test_session_migration.py +0 -0
  364. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/skills/conftest.py +0 -0
  365. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/skills/test_manager.py +0 -0
  366. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/skills/test_models.py +0 -0
  367. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/skills/test_parser.py +0 -0
  368. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  369. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  370. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  371. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  372. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  373. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  374. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  375. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  376. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  377. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  378. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  379. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  380. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  381. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  382. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  383. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  384. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  385. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  386. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  387. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  388. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  389. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  390. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  391. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  392. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  393. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  394. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  395. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  396. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  397. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  398. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  399. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  400. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  401. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  402. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  403. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  404. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  405. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  406. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  407. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  408. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  409. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  410. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  411. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  412. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  413. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  414. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  415. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  416. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  417. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  418. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  419. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  420. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  421. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  422. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  423. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  424. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  425. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  426. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  427. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  428. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/base_snapshot_test_app.py +0 -0
  429. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/conftest.py +0 -0
  430. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/snap_compare.py +0 -0
  431. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  432. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  433. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  434. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  435. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  436. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  437. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  438. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  439. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  440. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  441. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  442. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  443. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  444. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  445. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/stubs/fake_backend.py +0 -0
  446. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/stubs/fake_client.py +0 -0
  447. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/stubs/fake_tool.py +0 -0
  448. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_agent_auto_compact.py +0 -0
  449. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_agent_backend.py +0 -0
  450. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_agent_observer_streaming.py +0 -0
  451. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_agent_stats.py +0 -0
  452. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_agent_tasks.py +0 -0
  453. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_agent_tool_call.py +0 -0
  454. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_agents.py +0 -0
  455. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_cli_programmatic_preload.py +0 -0
  456. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_current_bugs.py +0 -0
  457. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_drydock_regression.py +0 -0
  458. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_drydock_tasks.py +0 -0
  459. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_full_regression.py +0 -0
  460. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_history_manager.py +0 -0
  461. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_integration.py +0 -0
  462. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_loop_detection.py +0 -0
  463. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_message_id.py +0 -0
  464. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_message_merging.py +0 -0
  465. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_middleware.py +0 -0
  466. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_real_failures.py +0 -0
  467. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_real_issues.py +0 -0
  468. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_reasoning_content.py +0 -0
  469. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_smoke.py +0 -0
  470. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_system_prompt.py +0 -0
  471. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_tagged_text.py +0 -0
  472. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_ui_external_editor.py +0 -0
  473. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_ui_input_history.py +0 -0
  474. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/test_user_issues.py +0 -0
  475. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/tools/test_ask_user_question.py +0 -0
  476. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/tools/test_bash.py +0 -0
  477. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/tools/test_exit_plan_mode.py +0 -0
  478. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/tools/test_grep.py +0 -0
  479. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/tools/test_invoke_context.py +0 -0
  480. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/tools/test_manager_get_tool_config.py +0 -0
  481. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/tools/test_mcp.py +0 -0
  482. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/tools/test_mcp_sampling.py +0 -0
  483. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/tools/test_task.py +0 -0
  484. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/tools/test_ui_bash_execution.py +0 -0
  485. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/tools/test_webfetch.py +0 -0
  486. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/tools/test_websearch.py +0 -0
  487. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  488. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  489. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/update_notifier/test_do_update.py +0 -0
  490. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  491. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/update_notifier/test_github_update_gateway.py +0 -0
  492. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  493. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/update_notifier/test_ui_update_notification.py +0 -0
  494. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/update_notifier/test_update_use_case.py +0 -0
  495. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/tests/update_notifier/test_whats_new.py +0 -0
  496. {drydock_cli-1.1.5 → drydock_cli-1.2.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 1.1.5
3
+ Version: 1.2.0
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
@@ -0,0 +1,231 @@
1
+ # DryDock — Local CLI Coding Agent
2
+
3
+ **Repository:** https://github.com/fbobe321/drydock
4
+ **PyPI:** https://pypi.org/project/drydock-cli/ (v1.1.5)
5
+ **License:** Apache 2.0 (fork of [mistralai/mistral-vibe](https://github.com/mistralai/mistral-vibe))
6
+ **Status:** Active development — continuous improvement running
7
+
8
+ ---
9
+
10
+ ## Deployment Process
11
+
12
+ Every change follows this pipeline:
13
+
14
+ 1. **Code** → modify files in `drydock/` package
15
+ 2. **Syntax check** → `python3 -c "import ast; ast.parse(...)"`
16
+ 3. **Smoke tests** → 20 tests, <1s, no backend needed (imports, branding, safety, tools, skills, config)
17
+ 4. **Commit** → descriptive message
18
+ 5. **Publish** → `./scripts/publish_to_pypi.sh` (smoke tests → build → PyPI → GitHub)
19
+ 6. **Full regression** → nightly at 2 AM, real vLLM backend, 13 tests
20
+
21
+ Scripts:
22
+ - `scripts/test_smoke.sh` — quick smoke tests (every deploy)
23
+ - `scripts/test_full.sh` — smoke + full regression (nightly)
24
+ - `scripts/deploy_to_github.sh` — smoke tests → sync to GitHub (daily 4 AM)
25
+ - `scripts/publish_to_pypi.sh` — smoke tests → bump → build → PyPI → GitHub
26
+ - `scripts/backup.sh` — rsync to NAS (daily 3 AM)
27
+
28
+ **No mock tests.** All behavior testing uses the real vLLM backend. Mock tests gave false confidence — the `raw_arguments` crash ran for days because mocks never hit the real code path.
29
+
30
+ ---
31
+
32
+ ## Test Suite
33
+
34
+ | Tier | File | Tests | Backend | Time | When |
35
+ |------|------|-------|---------|------|------|
36
+ | **Smoke** | `test_smoke.py` | 20 | None | <1s | Every deploy |
37
+ | **Full Regression** | `test_full_regression.py` | 13 | Real vLLM | 5-10 min | Nightly 2 AM |
38
+
39
+ ---
40
+
41
+ ## Continuous Improvement
42
+
43
+ | System | Schedule | What it does |
44
+ |--------|----------|-------------|
45
+ | `continuous_bench.sh` | Always running | SWE-bench batches (20 tasks, 600s timeout) |
46
+ | `analyze_batch.py` | After each batch | Detects crash patterns, multi-file misses, test edits |
47
+ | `auto_fix.py` | After analysis | Applies safe prompt fixes based on patterns |
48
+ | `monitor_health.sh` | Every 30 min | Prunes worktrees, checks vLLM, disk space, pass rates |
49
+ | `deploy_to_github.sh` | Daily 4 AM | Smoke tests → push to GitHub |
50
+ | `backup.sh` | Daily 3 AM | rsync to NAS (192.168.50.183) |
51
+ | `@reboot` cron | On restart | Restarts bench loop after 2 min |
52
+
53
+ **Latest SWE-bench results (Mar 28):**
54
+ - 2,220/2,294 unique tasks tested (97%)
55
+ - Recent pass rate: **39-42%** (up from 17% baseline)
56
+ - Net improvement: **+22% pass rate** after bash abuse fix and nudge improvements
57
+
58
+ ---
59
+
60
+ ## Tools (24 builtin)
61
+
62
+ | Tool | Description | Version |
63
+ |------|-------------|---------|
64
+ | `bash` | Shell execution, conda/pip support | Original |
65
+ | `grep` | Content search (ripgrep) | Original |
66
+ | `read_file` | Read files with offset/limit | Original |
67
+ | `write_file` | Create/overwrite files (blocks binary) | Original |
68
+ | `search_replace` | Edit files (blocks test files) | Original |
69
+ | `webfetch` | Fetch URLs | Original |
70
+ | `websearch` | DuckDuckGo search (no API key needed) | v0.8 |
71
+ | `ask_user_question` | Interactive questions | Original |
72
+ | `todo` | Todo list | Original |
73
+ | `task` | Delegate to subagent | Original |
74
+ | `exit_plan_mode` | Exit plan mode | Original |
75
+ | `glob` | Fast file pattern matching | v0.9 |
76
+ | `notebook_edit` | Edit Jupyter notebook cells | v0.9 |
77
+ | `task_create` | Create work item | v0.9 |
78
+ | `task_list` | List tasks | v0.9 |
79
+ | `task_update` | Update task status | v0.9 |
80
+ | `invoke_skill` | Model calls skills programmatically | v1.0 |
81
+ | `enter_worktree` | Git worktree isolation | v1.0 |
82
+ | `exit_worktree` | Return from worktree | v1.0 |
83
+ | `cron_create` | Schedule recurring prompt | v1.1 |
84
+ | `cron_list` | List scheduled crons | v1.1 |
85
+ | `cron_delete` | Delete cron | v1.1 |
86
+ | `tool_search` | Discover tools by keyword | v1.1 |
87
+ | `lsp` | Type checking, go-to-definition, find-references | v1.1 |
88
+ | `list_mcp_resources` | List MCP resources | v1.1 |
89
+ | `read_mcp_resource` | Read MCP resource | v1.1 |
90
+ | `powershell` | Windows/pwsh execution | v1.1 |
91
+
92
+ ## Skills (7 bundled)
93
+
94
+ | Skill | Description | Version |
95
+ |-------|-------------|---------|
96
+ | `/create-presentation` | PowerPoint via python-pptx | v0.4 |
97
+ | `/deep-research` | Web + code research → report | v0.4 |
98
+ | `/investigate` | 3-strike debugging, scope lock, blast radius | v0.8 |
99
+ | `/review` | Two-pass code review, scope drift detection | v0.8 |
100
+ | `/ship` | Test → review → commit → push → PR pipeline | v0.8 |
101
+ | `/batch` | Apply same change across many files | v0.9 |
102
+ | `/simplify` | Three-pass code quality review | v0.9 |
103
+
104
+ ## Commands
105
+
106
+ | Command | Description |
107
+ |---------|-------------|
108
+ | `/help` | Show shortcuts and commands |
109
+ | `/config` | Edit settings |
110
+ | `/clear` | Clear conversation |
111
+ | `/compact` | Summarize conversation to save context |
112
+ | `/consult` | Ask a smarter model for advice (in-context) |
113
+ | `/rewind` | Undo last assistant turn |
114
+ | `/status` | Show agent statistics |
115
+ | `/resume` | Browse and resume past sessions |
116
+
117
+ ---
118
+
119
+ ## Development Progress
120
+
121
+ ### Phase 1-4 (Mar 14-23): Foundation
122
+ Baseline analysis, core agent improvements, crash elimination, conda/pip support, rebrand from Mistral Vibe.
123
+
124
+ ### Phase 5 (Mar 24): UX Overhaul
125
+ Wave spinner, .drydock config, double Ctrl-C, --dangerously-skip-permissions, nautical Easter eggs, write timeouts, binary file guard, pptx skill, message queuing.
126
+
127
+ ### Phase 6 (Mar 25): GSD + Performance
128
+ GSD-inspired: tiered context warnings, prompt injection guard, state file, deviation rules. Circuit breaker, thinking throttle, conda env protection, --insecure flag, /consult command.
129
+
130
+ ### Phase 7 (Mar 26): Real Test-Driven Fixes
131
+ Shifted to TDD with real backend. Circuit breaker force-stop (was firing but model ignored it — 20 calls despite 17 breaker fires). Test file edits now blocked.
132
+
133
+ ### Phase 8 (Mar 27): Analysis-Driven Improvements
134
+ - **88% of no-patch failures = bash abuse** (model uses cat/grep/sed instead of search_replace)
135
+ - Fix: bash abuse detection at 5/8/12 calls, force stop at 12
136
+ - Fix: nudges as user messages (not buried in old tool results)
137
+ - Multi-file check: prompt model to grep for related files after first edit
138
+ - DuckDuckGo websearch restored from user's GitHub changes
139
+ - All "vibe" references fixed (model name, logger, client metadata)
140
+
141
+ ### Phase 9 (Mar 28): Feature Parity with Claude Code
142
+ Audit found 18 gaps vs Claude Code. All closed:
143
+
144
+ | Feature | What was built |
145
+ |---------|---------------|
146
+ | Glob tool | Fast file pattern matching |
147
+ | NotebookEdit | Jupyter cell editing |
148
+ | TaskCreate/List/Update | Interactive task lifecycle |
149
+ | Hook system | 6 events: PreToolUse, PostToolUse, SessionStart/End, PreEdit/PostEdit |
150
+ | InvokeSkill tool | Model calls skills programmatically |
151
+ | Worktree tools | Git worktree isolation (enter/exit) |
152
+ | CronCreate/List/Delete | Scheduled prompt execution |
153
+ | ToolSearch | Discover tools by keyword |
154
+ | LSP tool | Type checking, definition, references, symbols (pyright + grep fallback) |
155
+ | MCP Resources | List/read MCP server resources |
156
+ | PowerShell tool | Windows/pwsh support |
157
+ | Agent memory | Persistent per-agent memory across sessions |
158
+ | Per-agent model | Subagents can use different models |
159
+ | Markdown agents | Define agents in Markdown with YAML frontmatter |
160
+ | /batch skill | Apply changes across many files |
161
+ | /simplify skill | Three-pass code quality review |
162
+ | /rewind command | Undo last assistant turn |
163
+ | Skill infrastructure | context:fork, model selection, disable-model-invocation |
164
+
165
+ ### Phase 9b (Mar 28): Scroll and Copy Fix
166
+ - `app.run(mouse=False)` — terminal handles mouse natively
167
+ - Text selection works for copy/paste
168
+ - Shift+Up/Down scrolls chat history
169
+ - Version sync: TUI reads from package metadata (no more hardcoded __version__)
170
+ - Mouse wheel scroll still doesn't work in Textual alternate screen mode — Shift+Up/Down is the workaround
171
+
172
+ ---
173
+
174
+ ## Architecture
175
+
176
+ ```
177
+ drydock/
178
+ ├── drydock/
179
+ │ ├── core/
180
+ │ │ ├── agent_loop.py ← Main loop, circuit breaker, blast radius
181
+ │ │ ├── consultant.py ← /consult backend (read-only advisor)
182
+ │ │ ├── hooks.py ← Hook system (6 events)
183
+ │ │ ├── middleware.py ← Tiered context warnings
184
+ │ │ ├── programmatic.py ← Headless API
185
+ │ │ ├── session/
186
+ │ │ │ ├── state_file.py ← Cross-session state persistence
187
+ │ │ │ └── agent_memory.py ← Per-agent persistent memory
188
+ │ │ ├── tools/
189
+ │ │ │ ├── injection_guard.py ← Prompt injection detection
190
+ │ │ │ └── builtins/ ← 24 builtin tools
191
+ │ │ └── prompts/cli.md ← System prompt
192
+ │ ├── cli/
193
+ │ │ ├── entrypoint.py ← CLI flags (--insecure, --consultant, etc.)
194
+ │ │ ├── commands.py ← Slash commands (/consult, /rewind, etc.)
195
+ │ │ └── textual_ui/app.py ← TUI
196
+ │ └── skills/ ← 7 bundled skills
197
+ ├── tests/
198
+ │ ├── test_smoke.py ← 20 tests, <1s (every deploy)
199
+ │ └── test_full_regression.py ← 13 tests, real backend (nightly)
200
+ └── scripts/
201
+ ├── deploy_to_github.sh
202
+ ├── publish_to_pypi.sh
203
+ ├── test_smoke.sh
204
+ ├── test_full.sh
205
+ └── backup.sh
206
+ ```
207
+
208
+ ---
209
+
210
+ ## Key Decisions
211
+
212
+ **No mock tests.** Every behavior test runs against the real vLLM backend. Mocks gave false confidence — critical bugs like `raw_arguments` crash and circuit breaker failures passed all mock tests but broke in production.
213
+
214
+ **Circuit breaker force-stops.** After 3 consecutive breaker fires, the conversation is terminated. The model was ignoring error messages and repeating — the only fix is cutting the loop.
215
+
216
+ **Bash abuse = #1 failure cause.** 88% of no-patch failures were the model running cat/grep/sed via bash instead of using search_replace. Fixed with escalating nudges at 5/8/12 bash calls.
217
+
218
+ **Nudges as user messages.** `_inject_system_note` buries nudges in old tool results where the model doesn't see them. Nudges now go as direct user messages.
219
+
220
+ **Scroll workaround.** Mouse wheel doesn't work in Textual's alternate screen buffer. Shift+Up/Down is the working solution. Copy/paste works with native text selection (mouse=False).
221
+
222
+ ---
223
+
224
+ ## Lessons Learned
225
+
226
+ 1. **Mock tests are dangerous.** They pass when real code is broken.
227
+ 2. **Tests must fail first.** Write the test, watch it fail, then fix the code.
228
+ 3. **The model ignores warnings.** Only hard stops (circuit breaker, force exit) actually prevent loops.
229
+ 4. **Users find different bugs than benchmarks.** SWE-bench finds agent logic bugs. Real usage finds UI/UX bugs.
230
+ 5. **Fix the #1 failure mode.** Bash abuse caused 88% of failures — one fix doubled the pass rate.
231
+ 6. **I can't test the TUI.** I write code changes based on docs but can't verify visually. The user is the only tester for UI.
@@ -17,9 +17,27 @@ Investigate: user wants understanding, explanation, audit, review, or diagnosis
17
17
  Change: user wants code created, modified, or fixed → proceed to Plan then Execute.
18
18
  If unclear, default to investigate. It is better to explain what you would do than to make an unwanted change.
19
19
 
20
+ Multi-Agent Delegation (IMPORTANT):
21
+ You have subagents that run in their own context. USE THEM:
22
+ - For codebase exploration: `task(task="Explore the project structure and report what you find", agent="explore")`
23
+ - For investigating bugs: `task(task="Find the root cause of the X error in module Y", agent="explore")`
24
+ - For code review: `invoke_skill(skill_name="review")`
25
+ - For security audits or architecture review: delegate to a subagent so your main context stays clean
26
+
27
+ WHEN to delegate:
28
+ - The project has 3+ files to examine → delegate exploration to a subagent
29
+ - You need to understand a codebase before making changes → subagent explores, you fix
30
+ - You're doing a review or audit → use /review skill or delegate
31
+ - A task has multiple independent parts → run subagents in parallel
32
+
33
+ WHEN NOT to delegate:
34
+ - Simple single-file fixes
35
+ - Quick questions that need 1-2 tool calls
36
+ - Tasks where you already know exactly what to do
37
+
20
38
  Explore. Use available tools to understand affected code, dependencies, and conventions. Never edit a file you haven't read in this session.
21
39
  Identify constraints: language, framework, test setup, and any user restrictions on scope.
22
- When given multiple file paths or a complex task: Do not start reading files immediately. First, summarize your understanding of the task and propose a short plan. Wait for the user to confirm before exploring any files. This prevents wasted effort on the wrong path.
40
+ When given multiple file paths or a complex task: delegate exploration to a subagent with `task(task="...", agent="explore")` first. The subagent explores and reports back. You then fix based on its findings. This keeps your main context clean.
23
41
 
24
42
  Phase 2 — Plan (Change tasks only)
25
43
  State your plan before writing code:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "1.1.5"
3
+ version = "1.2.0"
4
4
  description = "Drydock — nautical CLI coding agent"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -0,0 +1,112 @@
1
+ """Tests that DryDock actually uses multi-agent delegation.
2
+
3
+ These MUST run against the real vLLM backend.
4
+ They should FAIL if the model does everything in a single context
5
+ without using the task tool for subagent delegation.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import asyncio
11
+ import os
12
+ from pathlib import Path
13
+
14
+ import httpx
15
+ import pytest
16
+
17
+ from drydock.core.config.harness_files import init_harness_files_manager
18
+ try:
19
+ init_harness_files_manager("user", "project")
20
+ except RuntimeError:
21
+ pass
22
+
23
+ from drydock.core.agent_loop import AgentLoop
24
+ from drydock.core.agents.models import BuiltinAgentName
25
+ from drydock.core.config import Backend, ModelConfig, ProviderConfig, VibeConfig
26
+ from drydock.core.types import AssistantEvent, BaseEvent, ToolCallEvent, ToolResultEvent
27
+
28
+
29
+ def _vllm_ok():
30
+ try:
31
+ return httpx.get("http://localhost:8000/v1/models", timeout=3).status_code == 200
32
+ except Exception:
33
+ return False
34
+
35
+ pytestmark = pytest.mark.skipif(not _vllm_ok(), reason="vLLM not running")
36
+
37
+
38
+ def _config(tmp_path):
39
+ return VibeConfig(
40
+ active_model="devstral", auto_approve=True, enable_telemetry=False,
41
+ include_project_context=False, system_prompt_id="cli",
42
+ providers=[ProviderConfig(name="local", api_base="http://localhost:8000/v1", api_key_env_var="", backend=Backend.GENERIC)],
43
+ models=[ModelConfig(name="devstral", provider="local", input_price=0, output_price=0)],
44
+ session_logging={"enabled": False, "save_dir": str(tmp_path / "logs")},
45
+ )
46
+
47
+ def _agent(tmp_path, max_turns=12):
48
+ return AgentLoop(config=_config(tmp_path), agent_name=BuiltinAgentName.AUTO_APPROVE, max_turns=max_turns)
49
+
50
+ async def _run(agent, prompt, max_events=80):
51
+ events = []
52
+ async for ev in agent.act(prompt):
53
+ events.append(ev)
54
+ if len(events) >= max_events:
55
+ break
56
+ return events
57
+
58
+
59
+ @pytest.mark.asyncio
60
+ async def test_agent_uses_subagent_naturally(tmp_path):
61
+ """Agent should use subagents WITHOUT being told to.
62
+
63
+ The system prompt must instruct the model to delegate complex tasks
64
+ to subagents. If the model does everything alone, this test FAILS.
65
+
66
+ The prompt does NOT mention subagents, task tool, or delegation.
67
+ """
68
+ # Create a multi-file project with enough complexity
69
+ proj = tmp_path / "project"
70
+ proj.mkdir()
71
+ (proj / "main.py").write_text(
72
+ "from auth import login\nfrom db import get_user\n\n"
73
+ "def handle_request(username, password):\n"
74
+ " user = get_user(username)\n"
75
+ " if login(user, password):\n"
76
+ " return {'status': 'ok'}\n"
77
+ " return {'status': 'denied'}\n"
78
+ )
79
+ (proj / "auth.py").write_text(
80
+ "import hashlib\n\ndef login(user, password):\n"
81
+ " hashed = hashlib.md5(password.encode()).hexdigest()\n"
82
+ " return user['password_hash'] == hashed\n"
83
+ )
84
+ (proj / "db.py").write_text(
85
+ "USERS = {'admin': {'password_hash': '21232f297a57a5a743894a0e4a801fc3', 'role': 'admin'}}\n\n"
86
+ "def get_user(username):\n return USERS.get(username)\n"
87
+ )
88
+ (proj / "config.py").write_text("DB_HOST = 'localhost'\nDB_PORT = 5432\nSECRET = 'changeme'\n")
89
+ (proj / "README.md").write_text("# My App\nA simple auth system.\n")
90
+
91
+ agent = _agent(tmp_path)
92
+
93
+ # Natural prompt — NO mention of subagents or task tool
94
+ events = await _run(agent,
95
+ f"Review the project at {proj}. It has multiple files. "
96
+ f"Find any security issues and explain the architecture."
97
+ )
98
+
99
+ tool_calls = {}
100
+ for ev in events:
101
+ if isinstance(ev, ToolCallEvent):
102
+ tool_calls[ev.tool_name] = tool_calls.get(ev.tool_name, 0) + 1
103
+
104
+ used_task = "task" in tool_calls
105
+ used_skill = "invoke_skill" in tool_calls
106
+
107
+ assert used_task or used_skill, (
108
+ f"FAIL: Agent did NOT use subagents for a multi-file review task. "
109
+ f"Tool calls: {tool_calls}. "
110
+ f"The system prompt must tell the model to use the task tool "
111
+ f"for codebase exploration and complex multi-file analysis."
112
+ )
drydock_cli-1.1.5/PRD.md DELETED
@@ -1,194 +0,0 @@
1
- # DryDock — Local CLI Coding Agent
2
-
3
- **Repository:** https://github.com/fbobe321/drydock
4
- **PyPI:** https://pypi.org/project/drydock-cli/ (v0.6.3)
5
- **License:** Apache 2.0 (fork of [mistralai/mistral-vibe](https://github.com/mistralai/mistral-vibe))
6
- **Status:** Active development — continuous improvement running
7
-
8
- ---
9
-
10
- ## Deployment Process
11
-
12
- Every change follows this pipeline:
13
-
14
- 1. **Code** → modify files in `drydock/` package directory
15
- 2. **Syntax check** → `python3 -c "import ast; ast.parse(...)"`
16
- 3. **Regression tests** → 81 tests must pass (auto-run by deploy scripts)
17
- 4. **Commit** → descriptive message with Co-Authored-By
18
- 5. **Publish** → `./scripts/publish_to_pypi.sh` (tests → build → PyPI → GitHub)
19
-
20
- Scripts:
21
- - `scripts/deploy_to_github.sh` — runs tests, syncs to GitHub. Cron daily at 4 AM.
22
- - `scripts/publish_to_pypi.sh` — runs tests, bumps version, builds wheel, uploads to PyPI, deploys to GitHub. Aborts on test failure.
23
-
24
- Both scripts gate on the full 81-test regression suite. No deploy happens if tests fail.
25
-
26
- ---
27
-
28
- ## Regression Test Suite (81 tests)
29
-
30
- Two test files, run in 0.3s:
31
-
32
- ```bash
33
- pytest tests/test_drydock_regression.py tests/test_drydock_tasks.py -p no:xdist -p no:cov --override-ini="addopts="
34
- ```
35
-
36
- **test_drydock_regression.py (37 tests):**
37
- Message ordering (6), system note injection (3), wave spinner (2), config paths (3), state terms (4), Easter eggs (2), bash allowlist (5), conda detection (2), CLI flags (2), loop thresholds (1), write file safety (3), loop patterns (2), loading widget (2)
38
-
39
- **test_drydock_tasks.py (44 tests):**
40
- Binary file guard (5), unknown tool handling (1), loop thresholds (3), file I/O timeouts (4), skill discovery (3), config migration (2), system prompt content (3), bash allowlist (2), wave spinner (3), Easter eggs (1), injection guard (4), state file (4), context warnings (3), deviation rules (1), circuit breaker (2), CLI flags (2), thinking throttle (1)
41
-
42
- ---
43
-
44
- ## Continuous Improvement
45
-
46
- DryDock improves itself automatically and survives restarts:
47
-
48
- 1. **`continuous_bench.sh`** runs SWE-bench batches in a loop (20 tasks, 600s timeout)
49
- 2. **`@reboot` cron** restarts 2 minutes after any system restart
50
- 3. **Every 6 hours** cron re-launches if the loop died
51
- 4. **Daily at 4 AM** deploys to GitHub (with test gate)
52
- 5. **State persists** in `continuous_bench_state.json`
53
-
54
- **Latest results (Mar 25):**
55
- - 520 task runs completed, 500/500 unique tasks covered
56
- - **254/500 passed (50.8%)** — up from 207/500 baseline (41.4%)
57
- - **+47 net improvement** (117 newly passing, 70 regressions from model non-determinism)
58
-
59
- ---
60
-
61
- ## Objective
62
-
63
- | | Value |
64
- |---|---|
65
- | **Baseline (Mar 15)** | 207/500 (41.4%) |
66
- | **Current (Mar 25)** | 254/500 (50.8%) |
67
- | **Net improvement** | +47 tasks (+9.4%) |
68
- | **Target** | 80%+ |
69
- | **Hardware** | 2x RTX 4060 Ti 16GB, devstral-24B-AWQ-4bit via vLLM, 128k context |
70
-
71
- ---
72
-
73
- ## Development Progress
74
-
75
- ### Phase 1: Baseline & Analysis (Mar 14–20)
76
- 1,138 task runs across 254 unique SWE-bench Verified tasks. Identified top failure modes: message ordering crashes (9%), wrong file edits (15%), loop kills (28%), prose-only responses (11%).
77
-
78
- ### Phase 2: Core Agent Improvements (Mar 15–20)
79
- 10 features: failure recovery middleware, fuzzy search_replace, grep source-first sorting, smarter loop detection, diagnostic/planner subagents, "never edit tests" rule, SWE-bench workflow prompt, .codeignore, message ordering fix.
80
-
81
- ### Phase 3: Crash Elimination (Mar 23)
82
- `_sanitize_message_ordering()` safety net, middleware safe injection, MessageList bug fix, loop threshold tuning, forced-edit nudges, ConversationLimitException exit 0. Result: zero crashes.
83
-
84
- ### Phase 4: Conda/Pip & Rebrand (Mar 23)
85
- Bash tool allowlist (pip, conda, pytest auto-approve), conda environment detection via BASH_ENV, full Mistral Vibe → DryDock rebrand. Published to GitHub.
86
-
87
- ### Phase 5: UX Overhaul (Mar 24)
88
- Wave spinner, .drydock config dir, double Ctrl-C, --dangerously-skip-permissions, nautical Easter eggs, status throttle, write file timeouts, binary file guard, pptx skill, bash abuse detection, alternating loop detection, progressive budget warnings, ambiguous prompt guard, message queuing, mouse scroll, ocean blue onboarding. 76 regression tests gating deploys.
89
-
90
- ### Phase 5b: Package Rename (Mar 24)
91
- `vibe/` → `drydock/` directory rename (908 imports, 257 files). Published to PyPI as drydock-cli. Removed `vibe` CLI entry point.
92
-
93
- ### Phase 6: GSD Integration & Performance (Mar 25)
94
-
95
- Inspired by [get-shit-done](https://github.com/gsd-build/get-shit-done) (41k stars):
96
-
97
- | Feature | Details |
98
- |---------|---------|
99
- | Tiered context warnings | 4 levels at 50/65/75/85% usage, debounced every 5 calls |
100
- | Prompt injection guard | Detects role overrides, invisible Unicode, hidden instructions |
101
- | Structured state file | `.drydock/state.md` persists task context across sessions |
102
- | Deviation handling rules | Auto-fix bugs/imports, ask user for architecture/scope decisions |
103
- | Circuit breaker | Blocks exact same tool call after 2 attempts with "already attempted" summary |
104
- | Thinking flicker fix | Status words change every 4s, not every token |
105
- | Conda env protection | Preserves user's active environment in subprocesses |
106
- | `--insecure` / `-k` flag | Disables SSL verification for corporate proxies |
107
- | `/consult` command | Ask a smarter model for advice — response visible to local model |
108
- | `consultant_model` config | Select consultant from configured models in config.toml |
109
- | `.vibe` auto-migration | Copies ~/.vibe → ~/.drydock on first run |
110
-
111
- ---
112
-
113
- ## Architecture
114
-
115
- ```
116
- drydock/
117
- ├── PRD.md ← This document
118
- ├── NOTICE ← Apache 2.0 attribution
119
- ├── drydock/
120
- │ ├── core/
121
- │ │ ├── agent_loop.py ← Loop detection, circuit breaker, message ordering
122
- │ │ ├── consultant.py ← /consult command backend (read-only advisor)
123
- │ │ ├── middleware.py ← Tiered context warnings
124
- │ │ ├── programmatic.py ← Headless API entry point
125
- │ │ ├── session/state_file.py ← Cross-session state persistence
126
- │ │ ├── tools/injection_guard.py ← Prompt injection detection
127
- │ │ ├── tools/builtins/bash.py ← Shell, conda/pip, allowlist/denylist
128
- │ │ ├── tools/builtins/search_replace.py ← Fuzzy auto-apply, recovery hints
129
- │ │ └── prompts/cli.md ← System prompt with deviation rules
130
- │ ├── cli/
131
- │ │ ├── entrypoint.py ← CLI flags (--insecure, --consultant, etc.)
132
- │ │ ├── commands.py ← Slash commands (/consult, /help, etc.)
133
- │ │ └── textual_ui/app.py ← TUI, message queuing, double Ctrl-C
134
- │ └── skills/
135
- │ └── create-presentation/SKILL.md ← Bundled pptx skill
136
- ├── tests/
137
- │ ├── test_drydock_regression.py ← 37 component tests
138
- │ └── test_drydock_tasks.py ← 44 behavior tests
139
- └── scripts/
140
- ├── deploy_to_github.sh ← Test-gated GitHub deploy
141
- └── publish_to_pypi.sh ← Test-gated PyPI publish
142
- ```
143
-
144
- ---
145
-
146
- ## Key Technical Decisions
147
-
148
- **Circuit breaker:** Tracks tool call signatures (hash of name + args). After 2 identical calls, blocks execution and returns the cached result with "ALREADY ATTEMPTED" summary and suggestions to try different approaches.
149
-
150
- **Consultant model:** `/consult` sends a question to a configured model using DryDock's own backend (same providers, same API keys). The consultant never calls tools — it only returns text advice that gets injected into the conversation so the local model can see and act on it.
151
-
152
- **Tiered context warnings:** 4 warning levels (50%, 65%, 75%, 85% context used). Debounced every 5 tool calls. Messages escalate from "wrap up" to "STOP NOW."
153
-
154
- **Config migration:** On first run, if `~/.vibe` exists but `~/.drydock` doesn't, auto-copies everything and leaves a `MIGRATED.txt` note.
155
-
156
- ---
157
-
158
- ## Lessons Learned
159
-
160
- 1. **Fix bugs before adding features.** The message ordering crash fix was worth more than all subagents combined.
161
- 2. **Non-determinism is real.** Run 500+ tasks to get stable numbers. 20-task batches are noise.
162
- 3. **The model needs hard guardrails, not suggestions.** The circuit breaker (block after 2) works better than warnings (which the model ignores).
163
- 4. **Test everything.** 81 regression tests catch issues before they ship. Gate deploys on tests.
164
- 5. **Users find different bugs than benchmarks.** SWE-bench found crash bugs. Real usage found UX bugs (flicker, loops, wrong config dirs).
165
-
166
- ---
167
-
168
- ## Next Steps
169
-
170
- ### P1: Startup optimization
171
- 20-second delay on launch. Profile imports, lazy-load heavy modules.
172
-
173
- ### P2: Expand to full SWE-bench (2,294 tasks)
174
- Batch file ready. Switch continuous_bench.sh once Verified is stable.
175
-
176
- ### P3: Task queue UI
177
- Show the user what the agent has planned in its execution pipeline.
178
-
179
- ### P4: Support more LLM backends
180
- Test with Claude, GPT-4, Gemini to understand which improvements are model-specific.
181
-
182
- ### Phase 7: Real Test-Driven Fixes (Mar 26)
183
-
184
- Shifted to test-driven development with real vLLM backend — no more mocks for critical bugs.
185
-
186
- | Issue | Test Result (before fix) | Fix | Test Result (after fix) |
187
- |-------|------------------------|-----|----------------------|
188
- | Circuit breaker fires but model keeps calling | FAILED: 20 bash calls, 17 breaker fires ignored | Force-stop conversation after 3 consecutive breaker fires + break tool loop | PASSED: stops within 3 calls |
189
-
190
- **Testing methodology changed:**
191
- - All critical tests run against real vLLM at localhost:8000
192
- - Tests must FAIL first (proving the bug exists)
193
- - Then fix code, re-run until PASS
194
- - 166 total tests (155 mock + 11 real backend)
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