drydock-cli 2.2.2__tar.gz → 2.2.4__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 (517) hide show
  1. drydock_cli-2.2.4/CLAUDE.md +282 -0
  2. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/PKG-INFO +1 -1
  3. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/agent_loop.py +29 -10
  4. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/system_prompt.py +20 -14
  5. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/pyproject.toml +1 -1
  6. drydock_cli-2.2.2/CLAUDE.md +0 -152
  7. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.github/CODEOWNERS +0 -0
  8. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  9. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  10. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  11. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.github/workflows/build-and-upload.yml +0 -0
  12. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.github/workflows/ci.yml +0 -0
  13. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.github/workflows/issue-labeler.yml +0 -0
  14. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.github/workflows/release.yml +0 -0
  15. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.gitignore +0 -0
  16. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.pre-commit-config.yaml +0 -0
  17. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.python-version +0 -0
  18. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.typos.toml +0 -0
  19. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.vscode/extensions.json +0 -0
  20. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.vscode/launch.json +0 -0
  21. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.vscode/settings.json +0 -0
  22. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/AGENTS.md +0 -0
  23. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/CHANGELOG.md +0 -0
  24. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/CONTRIBUTING.md +0 -0
  25. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/Drydock_rebrand.md +0 -0
  26. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/LICENSE +0 -0
  27. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/NOTICE +0 -0
  28. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/PRD.md +0 -0
  29. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/README.md +0 -0
  30. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/action.yml +0 -0
  31. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/distribution/zed/LICENSE +0 -0
  32. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/distribution/zed/extension.toml +0 -0
  33. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/distribution/zed/icons/mistral_vibe.svg +0 -0
  34. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/docs/README.md +0 -0
  35. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/docs/acp-setup.md +0 -0
  36. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/docs/proxy-setup.md +0 -0
  37. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/__init__.py +0 -0
  38. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/__init__.py +0 -0
  39. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/acp_agent_loop.py +0 -0
  40. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/acp_logger.py +0 -0
  41. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/entrypoint.py +0 -0
  42. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/tools/__init__.py +0 -0
  43. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/tools/base.py +0 -0
  44. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/tools/builtins/bash.py +0 -0
  45. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/tools/builtins/read_file.py +0 -0
  46. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/tools/builtins/search_replace.py +0 -0
  47. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/tools/builtins/todo.py +0 -0
  48. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/tools/builtins/write_file.py +0 -0
  49. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/tools/session_update.py +0 -0
  50. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/utils.py +0 -0
  51. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/__init__.py +0 -0
  52. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/autocompletion/__init__.py +0 -0
  53. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/autocompletion/base.py +0 -0
  54. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/autocompletion/path_completion.py +0 -0
  55. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/autocompletion/slash_command.py +0 -0
  56. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/cli.py +0 -0
  57. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/clipboard.py +0 -0
  58. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/commands.py +0 -0
  59. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/entrypoint.py +0 -0
  60. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/history_manager.py +0 -0
  61. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  62. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  63. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  64. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/terminal_setup.py +0 -0
  65. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/__init__.py +0 -0
  66. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  67. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/app.py +0 -0
  68. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/app.tcss +0 -0
  69. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/external_editor.py +0 -0
  70. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  71. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  72. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  73. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  74. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  75. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  76. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  77. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  78. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  79. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  80. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  81. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  82. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  83. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  84. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  85. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  86. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  87. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  88. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  89. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  90. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  91. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  92. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  93. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  94. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  95. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  96. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  97. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  98. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  99. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  100. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  101. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  102. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  103. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  104. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  105. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  106. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/windowing/history.py +0 -0
  107. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  108. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/windowing/state.py +0 -0
  109. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/update_notifier/__init__.py +0 -0
  110. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  111. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  112. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  113. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  114. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  115. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/update_notifier/update.py +0 -0
  116. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/update_notifier/whats_new.py +0 -0
  117. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/__init__.py +0 -0
  118. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/agents/__init__.py +0 -0
  119. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/agents/manager.py +0 -0
  120. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/agents/models.py +0 -0
  121. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/auth/__init__.py +0 -0
  122. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/auth/crypto.py +0 -0
  123. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/auth/github.py +0 -0
  124. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/__init__.py +0 -0
  125. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/completers.py +0 -0
  126. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  127. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  128. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  129. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  130. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  131. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/fuzzy.py +0 -0
  132. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/path_prompt.py +0 -0
  133. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  134. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/build_orchestrator.py +0 -0
  135. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/config/__init__.py +0 -0
  136. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/config/_settings.py +0 -0
  137. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/config/harness_files/__init__.py +0 -0
  138. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  139. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/config/harness_files/_paths.py +0 -0
  140. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/consultant.py +0 -0
  141. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/drydock_states.py +0 -0
  142. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/hooks.py +0 -0
  143. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/__init__.py +0 -0
  144. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/backend/anthropic.py +0 -0
  145. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/backend/base.py +0 -0
  146. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/backend/factory.py +0 -0
  147. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/backend/generic.py +0 -0
  148. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/backend/mistral.py +0 -0
  149. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  150. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/backend/vertex.py +0 -0
  151. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/exceptions.py +0 -0
  152. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/format.py +0 -0
  153. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/message_utils.py +0 -0
  154. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/types.py +0 -0
  155. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/logger.py +0 -0
  156. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/middleware.py +0 -0
  157. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/output_formatters.py +0 -0
  158. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/paths/__init__.py +0 -0
  159. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/paths/_local_config_walk.py +0 -0
  160. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/paths/_vibe_home.py +0 -0
  161. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/paths/conventions.py +0 -0
  162. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/plan_session.py +0 -0
  163. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/plugins.py +0 -0
  164. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/programmatic.py +0 -0
  165. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/__init__.py +0 -0
  166. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/builder.md +0 -0
  167. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/cli.md +0 -0
  168. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/compact.md +0 -0
  169. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/dangerous_directory.md +0 -0
  170. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/diagnostic.md +0 -0
  171. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/explore.md +0 -0
  172. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/planner.md +0 -0
  173. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/project_context.md +0 -0
  174. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/tests.md +0 -0
  175. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/proxy_setup.py +0 -0
  176. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/session/agent_memory.py +0 -0
  177. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/session/checkpoints.py +0 -0
  178. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/session/session_loader.py +0 -0
  179. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/session/session_logger.py +0 -0
  180. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/session/session_migration.py +0 -0
  181. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/session/state_file.py +0 -0
  182. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/skills/__init__.py +0 -0
  183. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/skills/manager.py +0 -0
  184. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/skills/models.py +0 -0
  185. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/skills/parser.py +0 -0
  186. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/slug.py +0 -0
  187. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/telemetry/__init__.py +0 -0
  188. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/telemetry/send.py +0 -0
  189. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/teleport/errors.py +0 -0
  190. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/teleport/git.py +0 -0
  191. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/teleport/nuage.py +0 -0
  192. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/teleport/teleport.py +0 -0
  193. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/teleport/types.py +0 -0
  194. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/base.py +0 -0
  195. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  196. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/bash.py +0 -0
  197. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/cron.py +0 -0
  198. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  199. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/glob_tool.py +0 -0
  200. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/grep.py +0 -0
  201. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  202. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/lsp.py +0 -0
  203. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  204. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  205. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/powershell.py +0 -0
  206. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  207. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  208. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  209. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  210. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  211. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  212. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  213. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  214. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  215. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  216. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  217. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  218. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  219. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  220. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/task.md +0 -0
  221. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  222. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  223. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  224. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  225. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  226. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  227. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  228. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/read_file.py +0 -0
  229. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/search_replace.py +0 -0
  230. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/task.py +0 -0
  231. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/task_manager.py +0 -0
  232. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/todo.py +0 -0
  233. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/tool_search.py +0 -0
  234. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/webfetch.py +0 -0
  235. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/websearch.py +0 -0
  236. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/worktree.py +0 -0
  237. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/write_file.py +0 -0
  238. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/injection_guard.py +0 -0
  239. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/manager.py +0 -0
  240. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/mcp/__init__.py +0 -0
  241. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/mcp/registry.py +0 -0
  242. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/mcp/tools.py +0 -0
  243. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/mcp_sampling.py +0 -0
  244. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/ui.py +0 -0
  245. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/utils.py +0 -0
  246. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/trusted_folders.py +0 -0
  247. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/types.py +0 -0
  248. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/utils.py +0 -0
  249. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/setup/onboarding/__init__.py +0 -0
  250. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/setup/onboarding/base.py +0 -0
  251. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/setup/onboarding/onboarding.tcss +0 -0
  252. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/setup/onboarding/screens/__init__.py +0 -0
  253. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/setup/onboarding/screens/api_key.py +0 -0
  254. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/setup/onboarding/screens/welcome.py +0 -0
  255. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  256. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  257. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/skills/__init__.py +0 -0
  258. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/skills/batch/SKILL.md +0 -0
  259. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/skills/create-presentation/SKILL.md +0 -0
  260. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/skills/deep-research/SKILL.md +0 -0
  261. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/skills/investigate/SKILL.md +0 -0
  262. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/skills/review/SKILL.md +0 -0
  263. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/skills/ship/SKILL.md +0 -0
  264. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/skills/simplify/SKILL.md +0 -0
  265. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/whats_new.md +0 -0
  266. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock-acp.spec +0 -0
  267. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock_terms.md +0 -0
  268. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/flake.lock +0 -0
  269. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/flake.nix +0 -0
  270. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/README.md +0 -0
  271. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/auto_test_loop.sh +0 -0
  272. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/backup.sh +0 -0
  273. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/bump_version.py +0 -0
  274. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/deploy_to_github.sh +0 -0
  275. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/install.sh +0 -0
  276. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/monitor_swebench.sh +0 -0
  277. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/monitor_test_battery.sh +0 -0
  278. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/notify_release.py +0 -0
  279. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/overnight_agents_test.sh +0 -0
  280. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/prepare_release.py +0 -0
  281. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/publish_to_pypi.sh +0 -0
  282. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/test_bank.sh +0 -0
  283. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/test_full.sh +0 -0
  284. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/test_smoke.sh +0 -0
  285. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/__init__.py +0 -0
  286. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/conftest.py +0 -0
  287. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_acp.py +0 -0
  288. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_agent_thought.py +0 -0
  289. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_bash.py +0 -0
  290. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_compact_session_updates.py +0 -0
  291. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_content.py +0 -0
  292. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_initialize.py +0 -0
  293. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_list_sessions.py +0 -0
  294. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_load_session.py +0 -0
  295. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_multi_session.py +0 -0
  296. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_new_session.py +0 -0
  297. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_proxy_setup_acp.py +0 -0
  298. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_read_file.py +0 -0
  299. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_search_replace.py +0 -0
  300. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_set_config_option.py +0 -0
  301. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_set_mode.py +0 -0
  302. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_set_model.py +0 -0
  303. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_tool_call_session_update.py +0 -0
  304. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_utils.py +0 -0
  305. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_write_file.py +0 -0
  306. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/autocompletion/test_file_indexer.py +0 -0
  307. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/autocompletion/test_fuzzy.py +0 -0
  308. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  309. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  310. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/autocompletion/test_path_completion_controller.py +0 -0
  311. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  312. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/autocompletion/test_slash_command_controller.py +0 -0
  313. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  314. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/backend/__init__.py +0 -0
  315. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/backend/data/__init__.py +0 -0
  316. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/backend/data/fireworks.py +0 -0
  317. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/backend/data/mistral.py +0 -0
  318. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/backend/test_anthropic_adapter.py +0 -0
  319. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/backend/test_backend.py +0 -0
  320. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/backend/test_reasoning_adapter.py +0 -0
  321. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  322. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  323. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  324. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  325. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_bell_notifications.py +0 -0
  326. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_braille_renderer.py +0 -0
  327. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_clipboard.py +0 -0
  328. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_commands.py +0 -0
  329. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_copy_shortcuts.py +0 -0
  330. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_external_editor.py +0 -0
  331. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_no_markup_static.py +0 -0
  332. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_question_app.py +0 -0
  333. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_spinner.py +0 -0
  334. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_switching_mode.py +0 -0
  335. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  336. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  337. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_ui_session_resume.py +0 -0
  338. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_ui_skill_dispatch.py +0 -0
  339. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/textual_ui/__init__.py +0 -0
  340. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/textual_ui/test_session_picker.py +0 -0
  341. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/conftest.py +0 -0
  342. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_agents.py +0 -0
  343. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_auth_crypto.py +0 -0
  344. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_auth_github.py +0 -0
  345. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_config_load_dotenv.py +0 -0
  346. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_config_paths.py +0 -0
  347. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_config_resolution.py +0 -0
  348. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_file_logging.py +0 -0
  349. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_plan_session.py +0 -0
  350. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_proxy_setup.py +0 -0
  351. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_slug.py +0 -0
  352. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_telemetry_send.py +0 -0
  353. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_teleport_git.py +0 -0
  354. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_teleport_nuage.py +0 -0
  355. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_teleport_service.py +0 -0
  356. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_trusted_folders.py +0 -0
  357. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_utils.py +0 -0
  358. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/e2e/common.py +0 -0
  359. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/e2e/conftest.py +0 -0
  360. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/e2e/mock_server.py +0 -0
  361. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  362. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/e2e/test_cli_tui_streaming.py +0 -0
  363. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  364. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/mock/__init__.py +0 -0
  365. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/mock/mock_backend_factory.py +0 -0
  366. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/mock/mock_entrypoint.py +0 -0
  367. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/mock/utils.py +0 -0
  368. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/onboarding/test_run_onboarding.py +0 -0
  369. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/onboarding/test_ui_onboarding.py +0 -0
  370. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/session/test_session_loader.py +0 -0
  371. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/session/test_session_logger.py +0 -0
  372. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/session/test_session_migration.py +0 -0
  373. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/skills/conftest.py +0 -0
  374. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/skills/test_manager.py +0 -0
  375. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/skills/test_models.py +0 -0
  376. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/skills/test_parser.py +0 -0
  377. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  378. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  379. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  380. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  381. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  382. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  383. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  384. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  385. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  386. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  387. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  388. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  389. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  390. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  391. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  392. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  393. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  394. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  395. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  396. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  397. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  398. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  399. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  400. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  401. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  402. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  403. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  404. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  405. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  406. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  407. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  408. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  409. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  410. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  411. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  412. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  413. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  414. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  415. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  416. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  417. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  418. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  419. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  420. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  421. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  422. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  423. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  424. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  425. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  426. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  427. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  428. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  429. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  430. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  431. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  432. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  433. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  434. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  435. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  436. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  437. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/base_snapshot_test_app.py +0 -0
  438. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/conftest.py +0 -0
  439. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/snap_compare.py +0 -0
  440. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  441. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  442. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  443. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  444. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  445. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  446. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  447. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  448. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  449. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  450. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  451. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  452. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  453. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  454. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/stubs/fake_backend.py +0 -0
  455. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/stubs/fake_client.py +0 -0
  456. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/stubs/fake_tool.py +0 -0
  457. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_agent_auto_compact.py +0 -0
  458. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_agent_backend.py +0 -0
  459. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_agent_observer_streaming.py +0 -0
  460. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_agent_stats.py +0 -0
  461. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_agent_tasks.py +0 -0
  462. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_agent_tool_call.py +0 -0
  463. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_agents.py +0 -0
  464. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_bank_build.py +0 -0
  465. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_bank_debug.py +0 -0
  466. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_bank_multiagent.py +0 -0
  467. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_bank_prd.py +0 -0
  468. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_bank_prd_extended.py +0 -0
  469. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_bank_tools.py +0 -0
  470. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_bank_update.py +0 -0
  471. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_build_projects.py +0 -0
  472. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_cli_programmatic_preload.py +0 -0
  473. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_current_bugs.py +0 -0
  474. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_drydock_regression.py +0 -0
  475. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_drydock_tasks.py +0 -0
  476. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_full_regression.py +0 -0
  477. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_history_manager.py +0 -0
  478. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_integration.py +0 -0
  479. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_loop_detection.py +0 -0
  480. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_message_id.py +0 -0
  481. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_message_merging.py +0 -0
  482. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_middleware.py +0 -0
  483. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_multi_agent.py +0 -0
  484. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_real_failures.py +0 -0
  485. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_real_issues.py +0 -0
  486. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_real_workflow.py +0 -0
  487. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_reasoning_content.py +0 -0
  488. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_smoke.py +0 -0
  489. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_system_prompt.py +0 -0
  490. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_tagged_text.py +0 -0
  491. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_ui_external_editor.py +0 -0
  492. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_ui_input_history.py +0 -0
  493. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_user_issues.py +0 -0
  494. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_workloads.py +0 -0
  495. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/testbank_helpers.py +0 -0
  496. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_ask_user_question.py +0 -0
  497. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_bash.py +0 -0
  498. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_exit_plan_mode.py +0 -0
  499. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_grep.py +0 -0
  500. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_invoke_context.py +0 -0
  501. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_manager_get_tool_config.py +0 -0
  502. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_mcp.py +0 -0
  503. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_mcp_sampling.py +0 -0
  504. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_task.py +0 -0
  505. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_ui_bash_execution.py +0 -0
  506. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_webfetch.py +0 -0
  507. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_websearch.py +0 -0
  508. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  509. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  510. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/update_notifier/test_do_update.py +0 -0
  511. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  512. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/update_notifier/test_github_update_gateway.py +0 -0
  513. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  514. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/update_notifier/test_ui_update_notification.py +0 -0
  515. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/update_notifier/test_update_use_case.py +0 -0
  516. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/update_notifier/test_whats_new.py +0 -0
  517. {drydock_cli-2.2.2 → drydock_cli-2.2.4}/uv.lock +0 -0
@@ -0,0 +1,282 @@
1
+ # Drydock Development Guide
2
+
3
+ ## Project
4
+
5
+ Drydock is a local CLI coding agent (fork of mistral-vibe, Apache 2.0).
6
+ - **Repo:** https://github.com/fbobe321/drydock
7
+ - **PyPI:** https://pypi.org/project/drydock-cli/ (v2.2.1 for v2, v3.0.0 for v3)
8
+ - **Goal:** Best-in-class SWE-bench Verified pass rate with local LLMs
9
+ - **Hardware:** 2x RTX 4060 Ti 16GB, Gemma 4 26B MoE (A4B) via vLLM Docker at localhost:8000
10
+ - **Server:** remus (Ubuntu 22.04, user: bobef)
11
+ - **Active model:** Gemma 4 26B-A4B-it-AWQ-4bit (replaced devstral-24B — 3-4x faster, better results)
12
+ - **Active codebase:** DryDock v3 at `/data3/drydock-v3/` (clean rewrite)
13
+
14
+ ## Build & Test
15
+
16
+ ### DryDock v3 (active)
17
+
18
+ ```bash
19
+ # Install (minimal deps: only openai>=1.0)
20
+ cd /data3/drydock-v3 && pip install -e .
21
+
22
+ # Run drydock CLI (defaults to gemma4 model)
23
+ python -m drydock
24
+ python -m drydock --model gemma4
25
+
26
+ # Run programmatically (headless, for benchmarks)
27
+ PYTHONPATH=/data3/drydock-v3 python3 -c "import sys; sys.path.insert(0, '/data3/drydock-v3'); from drydock.cli import main; main()"
28
+
29
+ # Start Gemma 4 model server
30
+ bash /data3/Models/start_gemma4.sh
31
+
32
+ # Check model is running
33
+ curl http://localhost:8000/v1/models
34
+
35
+ # Syntax check modified files
36
+ python3 -c "import ast; ast.parse(open('path/to/file.py').read())"
37
+ ```
38
+
39
+ ### DryDock v2 (legacy)
40
+
41
+ ```bash
42
+ # Install
43
+ uv sync
44
+
45
+ # Run drydock CLI
46
+ uv run drydock
47
+
48
+ # Run programmatically (headless, for benchmarks)
49
+ python3 -c "import sys; sys.path.insert(0, '.'); from drydock.cli.entrypoint import main; main()" --agent auto-approve -p "your prompt"
50
+
51
+ # Run tests
52
+ uv run pytest tests/ -x -q --timeout=30
53
+
54
+ # Syntax check modified files
55
+ python3 -c "import ast; ast.parse(open('path/to/file.py').read())"
56
+ ```
57
+
58
+ ## Key Architecture
59
+
60
+ ### DryDock v3 (active — clean rewrite at `/data3/drydock-v3/`)
61
+
62
+ v3 is a from-scratch rewrite using nano-claude-code as foundation. 4 core files, ~750 lines total. Provider-agnostic, works with any OpenAI-compatible endpoint.
63
+
64
+ - `drydock/agent.py` — Core agent loop (161 lines). Multi-turn tool calling, event-driven. **Most changes go here.**
65
+ - `drydock/providers.py` — LLM abstraction (209 lines). Provider registry (vLLM, Ollama, LM Studio, OpenAI, Anthropic). Streams responses, filters Gemma 4 thinking tokens.
66
+ - `drydock/tool_registry.py` — Tool plugin system (46 lines). Register/execute tools by name.
67
+ - `drydock/tools/__init__.py` — 6 built-in tools (258 lines): Read, Write, Edit, Bash, Glob, Grep
68
+ - `drydock/cli.py` — CLI entry point (213 lines). Default model: gemma4.
69
+ - `drydock/compaction.py` — Two-tier context management (119 lines). Normal compaction + emergency compaction on 400 errors.
70
+
71
+ ### DryDock v2 (legacy at `/data3/drydock/`)
72
+
73
+ - `drydock/core/agent_loop.py` — Main agent loop. Loop detection, message ordering, tool execution.
74
+ - `drydock/core/programmatic.py` — Headless API entry point used by SWE-bench harness
75
+ - `drydock/core/build_orchestrator.py` — Multi-phase build pipeline (currently disabled, model drives builds)
76
+ - `drydock/core/tools/builtins/bash.py` — Shell tool with allowlist/denylist, conda support
77
+ - `drydock/core/tools/builtins/search_replace.py` — File editing tool with fuzzy matching
78
+ - `drydock/core/prompts/cli.md` — System prompt (workflow, delegation, tool rules)
79
+ - `drydock/core/prompts/builder.md` — Minimal prompt for file builder subagents
80
+ - `drydock/core/system_prompt.py` — Builds system prompt, loads AGENTS.md/DRYDOCK.md
81
+ - `drydock/core/types.py` — `MessageList` (custom Sequence, use `.reset()` not `=[]`)
82
+ - `drydock/core/middleware.py` — Tiered context warnings, auto-compaction
83
+ - `drydock/core/agents/models.py` — Agent profiles (explore, diagnostic, planner, builder)
84
+ - `drydock/core/skills/manager.py` — Skill discovery and loading
85
+ - `drydock/cli/textual_ui/app.py` — TUI application
86
+ - `drydock/cli/commands.py` — Slash commands (/help, /setup-model, /consult, etc.)
87
+
88
+ ## Critical Constraints
89
+
90
+ ### v3 Constraints
91
+ - **Gemma 4 leaks thinking tokens.** The model emits `<|channel>thought<channel|>` tokens that must be filtered out. `providers.py` strips these via regex before displaying output.
92
+ - **Two-tier compaction.** Normal compaction truncates old tool results. Emergency compaction triggers on 400 errors (context overflow) with aggressive truncation.
93
+ - **Provider-agnostic design.** No model-specific hacks in the agent loop. All model quirks handled in `providers.py`.
94
+
95
+ ### v2 Constraints (still apply to v2 codebase)
96
+ - **MessageList is not a plain list.** Never `self.messages = [...]`. Use `self.messages.reset([...])`.
97
+ - **vLLM/Mistral rejects `user` after `tool` messages.** `_sanitize_message_ordering()` runs before every LLM call. All injection must use `_inject_system_note()`.
98
+ - **`os._exit()` in programmatic.py** — necessary because async cleanup hangs. Ensure stdout is flushed before calling.
99
+ - **AGENTS.md is CRITICAL for devstral.** Without per-project instructions, the model loops on ls/bash. Auto-created by `_ensure_agents_md()`.
100
+
101
+ ### Shared Constraints
102
+ - **"Restate the goal" blocks tool calling.** Never ask the model to output text before its first tool call — it pre-empts the tool-calling mechanism.
103
+ - **Additive-only harness changes.** Every control flow modification (circuit breaker, orchestrator, nudges) caused regressions. Just inject better context before the agent loop.
104
+ - **Circuit breaker is disabled.** It blocked valid retries. Loop detection prunes duplicates and nudges instead. Never stops the session.
105
+ - **Loop detection never stops.** Only prunes repeated tool calls and injects guidance. The only hard stop is MAX_TOOL_TURNS (200).
106
+
107
+ ## Gemma 4 Tool Calling (v3 — active)
108
+
109
+ - **Model:** Gemma-4-26B-A4B-it-AWQ-4bit (26B MoE, only 4B active params per token)
110
+ - **Serving:** vLLM Docker image `vllm/vllm-openai:gemma4` with `--tool-call-parser gemma4 --enable-auto-tool-choice`
111
+ - **Start script:** `/data3/Models/start_gemma4.sh` (Docker: 2 GPU tensor parallel, 131K context, fp8 KV cache)
112
+ - **Performance:** 3-4x faster than devstral-24B, 0% timeouts on SWE-bench, 70% file match (vs 60% devstral)
113
+ - **Thinking tokens:** Model leaks `<|channel>thought<channel|>` — filtered in `providers.py` via regex
114
+ - **Tool choice:** `tool_choice="auto"` (default), model natively decides tool vs text
115
+ - **No AGENTS.md dependency:** Gemma 4 does not loop without AGENTS.md (unlike devstral)
116
+ - **Docker management:** `docker stop gemma4 && docker rm gemma4` to restart
117
+
118
+ ## Mistral/devstral Tool Calling (v2 — legacy)
119
+
120
+ - `tool_choice="auto"` (default): model decides whether to call a tool or respond with text
121
+ - Never ask for text before first tool call — blocks tool calling
122
+ - `tool_choice="required"` forces a tool call (useful for first-turn delegation)
123
+ - AGENTS.md anchors model behavior — without it, devstral loops
124
+ - Plan→Edit workflow: use plan mode first, then switch to accept-edits
125
+
126
+ ## File Locations
127
+
128
+ ```
129
+ /data3/drydock-v3/ ← DryDock v3 (active, clean rewrite)
130
+ ├── drydock/ ← Python package (~750 lines total)
131
+ │ ├── agent.py ← Core agent loop (THE most important file)
132
+ │ ├── providers.py ← LLM abstraction (vLLM, Ollama, etc.)
133
+ │ ├── tool_registry.py ← Tool plugin system
134
+ │ ├── tools/__init__.py ← 6 built-in tools (Read, Write, Edit, Bash, Glob, Grep)
135
+ │ ├── cli.py ← CLI entry point
136
+ │ ├── compaction.py ← Two-tier context management
137
+ │ ├── memory/ ← Memory system
138
+ │ └── skills/ ← Skill framework
139
+ ├── scripts/
140
+ │ └── monitor.sh ← Process monitor (restarts Gemma 4 if needed)
141
+ ├── logs/ ← Runtime logs
142
+ ├── pyproject.toml ← v3.0.0, depends only on openai>=1.0
143
+ └── AGENTS.md ← Project instructions
144
+ ```
145
+
146
+ ```
147
+ /data3/drydock/ ← DryDock v2 (legacy, original codebase)
148
+ ├── drydock/ ← Python package
149
+ │ ├── core/
150
+ │ │ ├── agent_loop.py ← v2 agent loop
151
+ │ │ ├── prompts/cli.md ← System prompt
152
+ │ │ ├── build_orchestrator.py ← Multi-phase builder (disabled)
153
+ │ │ ├── tools/builtins/ ← 24 builtin tools
154
+ │ │ ├── agents/ ← Subagent definitions
155
+ │ │ └── skills/ ← Skill framework
156
+ │ ├── cli/textual_ui/app.py ← TUI application
157
+ │ └── skills/ ← 7 bundled skills
158
+ ├── tests/
159
+ │ ├── test_smoke.py ← 20 fast tests
160
+ │ ├── test_loop_detection.py ← 38 loop tests
161
+ │ ├── test_bank_prd.py ← 15 PRD-driven tests
162
+ │ └── testbank_helpers.py ← Shared test infrastructure
163
+ ├── scripts/
164
+ │ ├── deploy_to_github.sh ← Daily push (4 AM)
165
+ │ ├── publish_to_pypi.sh ← Tests → build → PyPI → tag
166
+ │ ├── notify_release.py ← Telegram notifications
167
+ │ └── backup.sh ← rsync to NAS (3 AM)
168
+ └── test_bank_results/ ← Test logs
169
+ ```
170
+
171
+ ```
172
+ /data3/swe_bench_runs/ ← SWE-bench infrastructure (separate)
173
+ ├── harness.py ← Runs drydock on SWE-bench tasks (supports v2 + v3 backends)
174
+ ├── continuous_bench.sh ← Continuous improvement loop (v2/devstral)
175
+ ├── continuous_gemma4.sh ← Continuous improvement loop (v3/Gemma 4, 20-task batches)
176
+ └── logs/ ← Batch results
177
+ ```
178
+
179
+ ```
180
+ /data3/Models/ ← Model files and startup scripts
181
+ ├── Gemma-4-26B-A4B-it-AWQ-4bit/ ← Gemma 4 model weights
182
+ └── start_gemma4.sh ← Docker startup (vLLM + Gemma 4)
183
+ ```
184
+
185
+ ## Configuration Management
186
+
187
+ **All scripts use explicit Python path:** `/home/bobef/miniconda3/bin/python3`
188
+ **Cron PATH doesn't inherit shell.** Every script exports PATH explicitly.
189
+ **User's DryDock install:** `/home/bobef/miniforge3/envs/drydock/bin/python3` (Python 3.14)
190
+ **Dev/test Python:** `/home/bobef/miniconda3/bin/python3` (Python 3.12)
191
+ **Config:** `~/.drydock/config.toml`
192
+ **Tokens:** `~/.config/drydock/github_token`, `~/.config/drydock/pypi_token`
193
+ **Git remotes:** `drydock` → github.com/fbobe321/drydock, `origin` → github.com/mistralai/mistral-vibe
194
+
195
+ ## Deployment Process
196
+
197
+ 1. Code → modify files
198
+ 2. Syntax check → `python3 -c "import ast; ..."`
199
+ 3. Tests → `pytest tests/test_smoke.py tests/test_loop_detection.py -q`
200
+ 4. Commit → descriptive message
201
+ 5. Publish → `./scripts/publish_to_pypi.sh` (tests → build → PyPI → tag → integration test → GitHub → Telegram)
202
+ 6. Install on user's env → `/home/bobef/miniforge3/envs/drydock/bin/pip install --force-reinstall --no-deps --no-cache-dir drydock-cli==X.Y.Z`
203
+
204
+ ## SWE-bench
205
+
206
+ ### Current Results (Gemma 4 + DryDock v3)
207
+ - **70% file match** (vs 60% devstral v2), 0% timeouts, 8x faster per task
208
+ - Harness at `/data3/swe_bench_runs/harness.py` supports both v2 (devstral) and v3 (gemma4) backends
209
+ - Continuous bench loop: `/data3/swe_bench_runs/continuous_gemma4.sh` (20-task batches with Telegram updates)
210
+ - AGENTS.md auto-created per task with bug-fix workflow
211
+ - Environment bootstrapping (Meta-Harness technique) gathers repo structure before first LLM call
212
+
213
+ ### Previous Results (devstral + DryDock v2)
214
+ - 42% file match, 62% real patches (50-task eval)
215
+ - Target was 68% (devstral-small-2 published score)
216
+ - Continuous bench loop: `/data3/swe_bench_runs/continuous_bench.sh`
217
+
218
+ ## Improvement Backlog (from research papers + industry analysis)
219
+
220
+ **Meta-Harness (arXiv:2603.28052) — still TODO:**
221
+ - Execution trace logging (full prompts + tool calls per task for failure diagnosis)
222
+ - Repo-specific routing (different strategies per SWE-bench repo)
223
+ - Draft-then-verify (generate patch, verify against tests before committing)
224
+ - Contrastive examples (similar bugs with different fixes)
225
+ - Pareto frontier tracking (accuracy vs token cost)
226
+
227
+ **Industry design patterns — still TODO:**
228
+ - Parallel tool execution (multiple independent tool calls per turn)
229
+ - Background memory consolidation (clean context during idle time)
230
+ - Three-tier memory system (index + topics + archives)
231
+ - Frustration detection (regex-based, adjust approach when user is stuck)
232
+ - Extended reasoning allocation (detect complex tasks, give more compute)
233
+ - Git safety guards (stash before destructive ops)
234
+
235
+ **Implemented:**
236
+ - ✅ Static/dynamic prompt split (prefix caching)
237
+ - ✅ AGENTS.md auto-creation
238
+ - ✅ Environment bootstrapping
239
+ - ✅ Additive-only harness changes
240
+ - ✅ Permission denial feedback (suggest alternatives)
241
+ - ✅ "Task Completed" false claim detection
242
+ - ✅ Loop guidance (never stops, only redirects)
243
+ - ✅ Composable prompt (static first, dynamic after)
244
+ - ✅ DryDock v3 clean rewrite (provider-agnostic, ~750 lines)
245
+ - ✅ Gemma 4 MoE model (3-4x faster, 70% file match)
246
+ - ✅ Two-tier context compaction (normal + emergency on 400 errors)
247
+ - ✅ Docker-based model serving (vLLM + Gemma 4)
248
+ - ✅ Multi-backend SWE-bench harness (v2/devstral + v3/gemma4)
249
+ - ✅ Thinking token filtering (Gemma 4 `<|channel>` leak)
250
+
251
+ **Legal note:** All patterns are standard design concepts implemented from scratch. No proprietary code copied.
252
+
253
+ ## Key Learnings
254
+
255
+ 1. AGENTS.md is essential — devstral loops without it (Gemma 4 does not have this problem)
256
+ 2. "Restate the goal" blocked tool calling for months — one line
257
+ 3. Additive-only changes work best — control flow mods regress
258
+ 4. The harness matters as much as the model (Meta-Harness paper)
259
+ 5. Environment bootstrapping saves 2-4 exploratory turns
260
+ 6. Plan→Edit workflow is Mistral's design, don't fight it
261
+ 7. Circuit breaker was net negative — removed entirely
262
+ 8. Loop detection should guide, never stop
263
+ 9. Test the installed package, not source (different Python envs)
264
+ 10. Never wait for full test runs — fix issues from early results
265
+ 11. Clean rewrites beat incremental fixes — v3 (~750 lines) outperforms v2 (~5000+ lines)
266
+ 12. Model choice matters more than agent complexity — Gemma 4 MoE gives 3-4x speed + better accuracy than devstral
267
+ 13. Gemma 4 leaks thinking tokens (`<|channel>thought<channel|>`) — must filter in provider layer
268
+ 14. Two-tier compaction (normal + emergency on 400) is more robust than single-tier
269
+ 15. Provider-agnostic design enables fast model switching — v3 works with any OpenAI-compatible endpoint
270
+ 16. Docker-based model serving (vLLM) is more reliable than bare-metal — easier restarts, GPU management
271
+
272
+ ## When Compacting
273
+
274
+ Always preserve: the list of files modified in this session, any failing test output, current SWE-bench results, and the user's latest instructions.
275
+
276
+ ## Style
277
+
278
+ - Python 3.12+, type hints, pathlib over os.path
279
+ - Match existing patterns in the codebase
280
+ - No unnecessary abstractions — keep fixes minimal
281
+ - Always run syntax check after editing .py files
282
+ - Don't add features beyond what was asked
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.2.2
3
+ Version: 2.2.4
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
@@ -781,21 +781,28 @@ class AgentLoop:
781
781
  "to make your edit. Do NOT say the task is done until search_replace succeeds."
782
782
  )
783
783
  elif text_without_action == 1:
784
- # Check if model already identified a TARGET in its text
785
- last_text = (last_message.content or "").upper()
786
- has_target = "TARGET:" in last_text or "FILE:" in last_text
787
- if has_target:
784
+ last_text = (last_message.content or "").lower()
785
+ # Detect model asking for confirmation instead of acting
786
+ is_asking = any(kw in last_text for kw in (
787
+ "standing by", "waiting for", "please provide",
788
+ "what would you like", "how can i help",
789
+ "what should i", "do you want me to",
790
+ ))
791
+ if is_asking:
788
792
  nudge_text = (
789
- "Good you identified the target. Now proceed to PHASE 2: "
790
- "use read_file to read the target function, then search_replace to fix it. "
791
- "Do NOT describe the fix apply it with search_replace."
793
+ "DO NOT ask for confirmation. Act NOW. "
794
+ "If there is a PRD.md, implement it with write_file. "
795
+ "If there is code, read it with read_file and fix bugs with search_replace. "
796
+ "Call a tool on your next response."
797
+ )
798
+ elif "TARGET:" in last_text.upper() or "FILE:" in last_text.upper():
799
+ nudge_text = (
800
+ "Good — you identified the target. Now use read_file then search_replace."
792
801
  )
793
802
  else:
794
803
  nudge_text = (
795
804
  "You responded with text but did not call any tools. "
796
- "Use search_replace NOW to apply your code change. "
797
- "If you are unsure of the exact text, use read_file on the target function ONCE, "
798
- "then immediately search_replace."
805
+ "Call write_file, read_file, or search_replace NOW."
799
806
  )
800
807
  elif text_without_action == 2:
801
808
  nudge_text = (
@@ -1146,6 +1153,16 @@ class AgentLoop:
1146
1153
  CancellationReason.TOOL_SKIPPED, tool_call.tool_name
1147
1154
  )
1148
1155
  )
1156
+ # Add alternative suggestions so model can adjust strategy
1157
+ alternatives = {
1158
+ "write_file": "Try search_replace to modify existing files.",
1159
+ "search_replace": "Try write_file to create the file, or read_file first to get exact text.",
1160
+ "bash": "Try read_file + search_replace for code changes.",
1161
+ "task": "Try grep + read_file to explore manually.",
1162
+ }
1163
+ alt = alternatives.get(tool_call.tool_name, "")
1164
+ if alt:
1165
+ skip_reason += f"\n\n{alt}"
1149
1166
  yield ToolResultEvent(
1150
1167
  tool_name=tool_call.tool_name,
1151
1168
  tool_class=tool_call.tool_class,
@@ -1781,6 +1798,8 @@ class AgentLoop:
1781
1798
  try:
1782
1799
  agents_md.write_text(
1783
1800
  "# Project Instructions\n\n"
1801
+ "DO NOT ask for confirmation. DO NOT wait for instructions. ACT IMMEDIATELY.\n"
1802
+ "If there is a PRD.md, implement it. If there is code, work on it.\n\n"
1784
1803
  "## Workflow\n"
1785
1804
  "When building a project:\n"
1786
1805
  "1. Use `task(agent=\"planner\")` to create an implementation plan first\n"
@@ -246,30 +246,35 @@ def get_universal_system_prompt(
246
246
  skill_manager: SkillManager,
247
247
  agent_manager: AgentManager,
248
248
  ) -> str:
249
- sections = [config.system_prompt]
249
+ # === STATIC SECTIONS (identical per session — prefix-cached by vLLM) ===
250
+ # These MUST come first and be identical across requests for cache hits.
251
+ static_sections = [config.system_prompt]
250
252
 
251
253
  if config.include_commit_signature:
252
- sections.append(_add_commit_signature())
254
+ static_sections.append(_add_commit_signature())
253
255
 
254
256
  if config.include_model_info:
255
- sections.append(f"Your model name is: `{config.active_model}`")
257
+ static_sections.append(f"Your model name is: `{config.active_model}`")
256
258
 
257
259
  if config.include_prompt_detail:
258
- sections.append(_get_os_system_prompt())
260
+ static_sections.append(_get_os_system_prompt())
259
261
  tool_prompts = []
260
262
  for tool_class in tool_manager.available_tools.values():
261
263
  if prompt := tool_class.get_tool_prompt():
262
264
  tool_prompts.append(prompt)
263
265
  if tool_prompts:
264
- sections.append("\n---\n".join(tool_prompts))
266
+ static_sections.append("\n---\n".join(tool_prompts))
265
267
 
266
268
  skills_section = _get_available_skills_section(skill_manager)
267
269
  if skills_section:
268
- sections.append(skills_section)
270
+ static_sections.append(skills_section)
269
271
 
270
272
  subagents_section = _get_available_subagents_section(agent_manager)
271
273
  if subagents_section:
272
- sections.append(subagents_section)
274
+ static_sections.append(subagents_section)
275
+
276
+ # === DYNAMIC SECTIONS (change per project/directory) ===
277
+ dynamic_sections = []
273
278
 
274
279
  if config.include_project_context:
275
280
  is_dangerous, reason = is_dangerous_directory()
@@ -283,20 +288,21 @@ def get_universal_system_prompt(
283
288
  config=config.project_context, root_path=Path.cwd()
284
289
  ).get_full_context()
285
290
 
286
- sections.append(context)
291
+ dynamic_sections.append(context)
287
292
 
288
293
  project_doc = get_harness_files_manager().load_project_doc(
289
294
  config.project_context.max_doc_bytes
290
295
  )
291
296
  if project_doc.strip():
292
- sections.append(project_doc)
297
+ dynamic_sections.append(project_doc)
293
298
 
294
- # Load DRYDOCK.md per-project instructions (like CLAUDE.md)
295
- drydock_md = _load_project_instructions()
296
- if drydock_md:
297
- sections.append(f"## Project Instructions\n\n{drydock_md}")
299
+ # Load AGENTS.md / DRYDOCK.md per-project instructions
300
+ project_instructions = _load_project_instructions()
301
+ if project_instructions:
302
+ dynamic_sections.append(f"## Project Instructions\n\n{project_instructions}")
298
303
 
299
- return "\n\n".join(sections)
304
+ # Static first (prefix cached), then dynamic
305
+ return "\n\n".join(static_sections + dynamic_sections)
300
306
 
301
307
 
302
308
  def _load_project_instructions(max_bytes: int = 16_000) -> str:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.2.2"
3
+ version = "2.2.4"
4
4
  description = "Drydock — nautical CLI coding agent"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -1,152 +0,0 @@
1
- # Drydock Development Guide
2
-
3
- ## Project
4
-
5
- Drydock is a local CLI coding agent (fork of mistral-vibe, Apache 2.0).
6
- - **Repo:** https://github.com/fbobe321/drydock
7
- - **PyPI:** https://pypi.org/project/drydock-cli/ (v2.2.1)
8
- - **Goal:** Best-in-class SWE-bench Verified pass rate with local LLMs
9
- - **Hardware:** 2x RTX 4060 Ti 16GB, devstral-24B-AWQ-4bit via vLLM at localhost:8000
10
- - **Server:** remus (Ubuntu 22.04, user: bobef)
11
-
12
- ## Build & Test
13
-
14
- ```bash
15
- # Install
16
- uv sync
17
-
18
- # Run drydock CLI
19
- uv run drydock
20
-
21
- # Run programmatically (headless, for benchmarks)
22
- python3 -c "import sys; sys.path.insert(0, '.'); from drydock.cli.entrypoint import main; main()" --agent auto-approve -p "your prompt"
23
-
24
- # Run tests
25
- uv run pytest tests/ -x -q --timeout=30
26
-
27
- # Syntax check modified files
28
- python3 -c "import ast; ast.parse(open('path/to/file.py').read())"
29
- ```
30
-
31
- ## Key Architecture
32
-
33
- - `drydock/core/agent_loop.py` — Main agent loop. Loop detection, message ordering, tool execution. **Most changes go here.**
34
- - `drydock/core/programmatic.py` — Headless API entry point used by SWE-bench harness
35
- - `drydock/core/build_orchestrator.py` — Multi-phase build pipeline (currently disabled, model drives builds)
36
- - `drydock/core/tools/builtins/bash.py` — Shell tool with allowlist/denylist, conda support
37
- - `drydock/core/tools/builtins/search_replace.py` — File editing tool with fuzzy matching
38
- - `drydock/core/prompts/cli.md` — System prompt (workflow, delegation, tool rules)
39
- - `drydock/core/prompts/builder.md` — Minimal prompt for file builder subagents
40
- - `drydock/core/system_prompt.py` — Builds system prompt, loads AGENTS.md/DRYDOCK.md
41
- - `drydock/core/types.py` — `MessageList` (custom Sequence, use `.reset()` not `=[]`)
42
- - `drydock/core/middleware.py` — Tiered context warnings, auto-compaction
43
- - `drydock/core/agents/models.py` — Agent profiles (explore, diagnostic, planner, builder)
44
- - `drydock/core/skills/manager.py` — Skill discovery and loading
45
- - `drydock/cli/textual_ui/app.py` — TUI application
46
- - `drydock/cli/commands.py` — Slash commands (/help, /setup-model, /consult, etc.)
47
-
48
- ## Critical Constraints
49
-
50
- - **MessageList is not a plain list.** Never `self.messages = [...]`. Use `self.messages.reset([...])`.
51
- - **vLLM/Mistral rejects `user` after `tool` messages.** `_sanitize_message_ordering()` runs before every LLM call. All injection must use `_inject_system_note()`.
52
- - **`os._exit()` in programmatic.py** — necessary because async cleanup hangs. Ensure stdout is flushed before calling.
53
- - **AGENTS.md is CRITICAL for devstral.** Without per-project instructions, the model loops on ls/bash. Auto-created by `_ensure_agents_md()`.
54
- - **"Restate the goal" blocks tool calling.** Never ask the model to output text before its first tool call — it pre-empts the tool-calling mechanism.
55
- - **Additive-only harness changes.** Every control flow modification (circuit breaker, orchestrator, nudges) caused regressions. Just inject better context before the agent loop.
56
- - **Circuit breaker is disabled.** It blocked valid retries. Loop detection prunes duplicates and nudges instead. Never stops the session.
57
- - **Loop detection never stops.** Only prunes repeated tool calls and injects guidance. The only hard stop is MAX_TOOL_TURNS (200).
58
-
59
- ## Mistral/devstral Tool Calling
60
-
61
- - `tool_choice="auto"` (default): model decides whether to call a tool or respond with text
62
- - Never ask for text before first tool call — blocks tool calling
63
- - `tool_choice="required"` forces a tool call (useful for first-turn delegation)
64
- - AGENTS.md anchors model behavior — without it, devstral loops
65
- - Plan→Edit workflow: use plan mode first, then switch to accept-edits
66
-
67
- ## File Locations
68
-
69
- ```
70
- /data3/drydock/ ← Main repo (git)
71
- ├── drydock/ ← Python package
72
- │ ├── core/
73
- │ │ ├── agent_loop.py ← THE most important file
74
- │ │ ├── prompts/cli.md ← System prompt
75
- │ │ ├── build_orchestrator.py ← Multi-phase builder (disabled)
76
- │ │ ├── tools/builtins/ ← 24 builtin tools
77
- │ │ ├── agents/ ← Subagent definitions
78
- │ │ └── skills/ ← Skill framework
79
- │ ├── cli/textual_ui/app.py ← TUI application
80
- │ └── skills/ ← 7 bundled skills
81
- ├── tests/
82
- │ ├── test_smoke.py ← 20 fast tests
83
- │ ├── test_loop_detection.py ← 38 loop tests
84
- │ ├── test_bank_prd.py ← 15 PRD-driven tests
85
- │ └── testbank_helpers.py ← Shared test infrastructure
86
- ├── scripts/
87
- │ ├── deploy_to_github.sh ← Daily push (4 AM)
88
- │ ├── publish_to_pypi.sh ← Tests → build → PyPI → tag
89
- │ ├── notify_release.py ← Telegram notifications
90
- │ └── backup.sh ← rsync to NAS (3 AM)
91
- └── test_bank_results/ ← Test logs
92
- ```
93
-
94
- ```
95
- /data3/swe_bench_runs/ ← SWE-bench infrastructure (separate)
96
- ├── harness.py ← Runs drydock on SWE-bench tasks
97
- ├── continuous_bench.sh ← Continuous improvement loop
98
- └── logs/ ← Batch results
99
- ```
100
-
101
- ## Configuration Management
102
-
103
- **All scripts use explicit Python path:** `/home/bobef/miniconda3/bin/python3`
104
- **Cron PATH doesn't inherit shell.** Every script exports PATH explicitly.
105
- **User's DryDock install:** `/home/bobef/miniforge3/envs/drydock/bin/python3` (Python 3.14)
106
- **Dev/test Python:** `/home/bobef/miniconda3/bin/python3` (Python 3.12)
107
- **Config:** `~/.drydock/config.toml`
108
- **Tokens:** `~/.config/drydock/github_token`, `~/.config/drydock/pypi_token`
109
- **Git remotes:** `drydock` → github.com/fbobe321/drydock, `origin` → github.com/mistralai/mistral-vibe
110
-
111
- ## Deployment Process
112
-
113
- 1. Code → modify files
114
- 2. Syntax check → `python3 -c "import ast; ..."`
115
- 3. Tests → `pytest tests/test_smoke.py tests/test_loop_detection.py -q`
116
- 4. Commit → descriptive message
117
- 5. Publish → `./scripts/publish_to_pypi.sh` (tests → build → PyPI → tag → integration test → GitHub → Telegram)
118
- 6. Install on user's env → `/home/bobef/miniforge3/envs/drydock/bin/pip install --force-reinstall --no-deps --no-cache-dir drydock-cli==X.Y.Z`
119
-
120
- ## SWE-bench
121
-
122
- - Current: 42% file match, 62% real patches (50-task eval)
123
- - Target: 68% (devstral-small-2 published score)
124
- - Harness at `/data3/swe_bench_runs/harness.py` uses DryDock directly
125
- - AGENTS.md auto-created per task with bug-fix workflow
126
- - Environment bootstrapping (Meta-Harness technique) gathers repo structure before first LLM call
127
- - Test file edits stripped from patches before evaluation
128
-
129
- ## Key Learnings
130
-
131
- 1. AGENTS.md is essential — devstral loops without it
132
- 2. "Restate the goal" blocked tool calling for months — one line
133
- 3. Additive-only changes work best — control flow mods regress
134
- 4. The harness matters as much as the model (Meta-Harness paper)
135
- 5. Environment bootstrapping saves 2-4 exploratory turns
136
- 6. Plan→Edit workflow is Mistral's design, don't fight it
137
- 7. Circuit breaker was net negative — removed entirely
138
- 8. Loop detection should guide, never stop
139
- 9. Test the installed package, not source (different Python envs)
140
- 10. Never wait for full test runs — fix issues from early results
141
-
142
- ## When Compacting
143
-
144
- Always preserve: the list of files modified in this session, any failing test output, current SWE-bench results, and the user's latest instructions.
145
-
146
- ## Style
147
-
148
- - Python 3.12+, type hints, pathlib over os.path
149
- - Match existing patterns in the codebase
150
- - No unnecessary abstractions — keep fixes minimal
151
- - Always run syntax check after editing .py files
152
- - Don't add features beyond what was asked
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