drydock-cli 2.2.1__tar.gz → 2.2.3__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 (518) hide show
  1. drydock_cli-2.2.3/CLAUDE.md +180 -0
  2. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/PKG-INFO +1 -1
  3. drydock_cli-2.2.3/PRD.md +81 -0
  4. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/app.py +3 -0
  5. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/agent_loop.py +53 -14
  6. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/config/harness_files/_harness_manager.py +5 -1
  7. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/system_prompt.py +20 -14
  8. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/pyproject.toml +1 -1
  9. drydock_cli-2.2.3/scripts/monitor_swebench.sh +40 -0
  10. drydock_cli-2.2.1/CLAUDE.md +0 -61
  11. drydock_cli-2.2.1/PRD.md +0 -594
  12. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.github/CODEOWNERS +0 -0
  13. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  14. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  15. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  16. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.github/workflows/build-and-upload.yml +0 -0
  17. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.github/workflows/ci.yml +0 -0
  18. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.github/workflows/issue-labeler.yml +0 -0
  19. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.github/workflows/release.yml +0 -0
  20. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.gitignore +0 -0
  21. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.pre-commit-config.yaml +0 -0
  22. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.python-version +0 -0
  23. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.typos.toml +0 -0
  24. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.vscode/extensions.json +0 -0
  25. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.vscode/launch.json +0 -0
  26. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.vscode/settings.json +0 -0
  27. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/AGENTS.md +0 -0
  28. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/CHANGELOG.md +0 -0
  29. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/CONTRIBUTING.md +0 -0
  30. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/Drydock_rebrand.md +0 -0
  31. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/LICENSE +0 -0
  32. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/NOTICE +0 -0
  33. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/README.md +0 -0
  34. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/action.yml +0 -0
  35. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/distribution/zed/LICENSE +0 -0
  36. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/distribution/zed/extension.toml +0 -0
  37. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/distribution/zed/icons/mistral_vibe.svg +0 -0
  38. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/docs/README.md +0 -0
  39. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/docs/acp-setup.md +0 -0
  40. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/docs/proxy-setup.md +0 -0
  41. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/__init__.py +0 -0
  42. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/__init__.py +0 -0
  43. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/acp_agent_loop.py +0 -0
  44. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/acp_logger.py +0 -0
  45. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/entrypoint.py +0 -0
  46. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/tools/__init__.py +0 -0
  47. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/tools/base.py +0 -0
  48. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/tools/builtins/bash.py +0 -0
  49. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/tools/builtins/read_file.py +0 -0
  50. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/tools/builtins/search_replace.py +0 -0
  51. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/tools/builtins/todo.py +0 -0
  52. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/tools/builtins/write_file.py +0 -0
  53. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/tools/session_update.py +0 -0
  54. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/utils.py +0 -0
  55. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/__init__.py +0 -0
  56. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/autocompletion/__init__.py +0 -0
  57. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/autocompletion/base.py +0 -0
  58. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/autocompletion/path_completion.py +0 -0
  59. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/autocompletion/slash_command.py +0 -0
  60. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/cli.py +0 -0
  61. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/clipboard.py +0 -0
  62. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/commands.py +0 -0
  63. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/entrypoint.py +0 -0
  64. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/history_manager.py +0 -0
  65. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  66. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  67. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  68. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/terminal_setup.py +0 -0
  69. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/__init__.py +0 -0
  70. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  71. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/app.tcss +0 -0
  72. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/external_editor.py +0 -0
  73. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  74. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  75. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  76. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  77. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  78. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  79. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  80. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  81. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  82. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  83. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  84. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  85. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  86. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  87. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  88. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  89. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  90. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  91. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  92. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  93. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  94. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  95. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  96. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  97. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  98. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  99. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  100. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  101. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  102. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  103. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  104. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  105. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  106. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  107. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  108. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  109. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/windowing/history.py +0 -0
  110. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  111. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/windowing/state.py +0 -0
  112. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/update_notifier/__init__.py +0 -0
  113. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  114. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  115. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  116. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  117. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  118. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/update_notifier/update.py +0 -0
  119. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/update_notifier/whats_new.py +0 -0
  120. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/__init__.py +0 -0
  121. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/agents/__init__.py +0 -0
  122. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/agents/manager.py +0 -0
  123. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/agents/models.py +0 -0
  124. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/auth/__init__.py +0 -0
  125. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/auth/crypto.py +0 -0
  126. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/auth/github.py +0 -0
  127. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/__init__.py +0 -0
  128. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/completers.py +0 -0
  129. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  130. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  131. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  132. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  133. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  134. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/fuzzy.py +0 -0
  135. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/path_prompt.py +0 -0
  136. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  137. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/build_orchestrator.py +0 -0
  138. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/config/__init__.py +0 -0
  139. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/config/_settings.py +0 -0
  140. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/config/harness_files/__init__.py +0 -0
  141. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/config/harness_files/_paths.py +0 -0
  142. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/consultant.py +0 -0
  143. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/drydock_states.py +0 -0
  144. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/hooks.py +0 -0
  145. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/__init__.py +0 -0
  146. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/backend/anthropic.py +0 -0
  147. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/backend/base.py +0 -0
  148. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/backend/factory.py +0 -0
  149. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/backend/generic.py +0 -0
  150. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/backend/mistral.py +0 -0
  151. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  152. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/backend/vertex.py +0 -0
  153. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/exceptions.py +0 -0
  154. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/format.py +0 -0
  155. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/message_utils.py +0 -0
  156. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/types.py +0 -0
  157. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/logger.py +0 -0
  158. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/middleware.py +0 -0
  159. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/output_formatters.py +0 -0
  160. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/paths/__init__.py +0 -0
  161. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/paths/_local_config_walk.py +0 -0
  162. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/paths/_vibe_home.py +0 -0
  163. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/paths/conventions.py +0 -0
  164. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/plan_session.py +0 -0
  165. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/plugins.py +0 -0
  166. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/programmatic.py +0 -0
  167. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/__init__.py +0 -0
  168. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/builder.md +0 -0
  169. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/cli.md +0 -0
  170. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/compact.md +0 -0
  171. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/dangerous_directory.md +0 -0
  172. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/diagnostic.md +0 -0
  173. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/explore.md +0 -0
  174. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/planner.md +0 -0
  175. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/project_context.md +0 -0
  176. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/tests.md +0 -0
  177. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/proxy_setup.py +0 -0
  178. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/session/agent_memory.py +0 -0
  179. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/session/checkpoints.py +0 -0
  180. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/session/session_loader.py +0 -0
  181. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/session/session_logger.py +0 -0
  182. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/session/session_migration.py +0 -0
  183. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/session/state_file.py +0 -0
  184. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/skills/__init__.py +0 -0
  185. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/skills/manager.py +0 -0
  186. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/skills/models.py +0 -0
  187. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/skills/parser.py +0 -0
  188. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/slug.py +0 -0
  189. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/telemetry/__init__.py +0 -0
  190. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/telemetry/send.py +0 -0
  191. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/teleport/errors.py +0 -0
  192. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/teleport/git.py +0 -0
  193. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/teleport/nuage.py +0 -0
  194. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/teleport/teleport.py +0 -0
  195. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/teleport/types.py +0 -0
  196. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/base.py +0 -0
  197. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  198. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/bash.py +0 -0
  199. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/cron.py +0 -0
  200. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  201. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/glob_tool.py +0 -0
  202. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/grep.py +0 -0
  203. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  204. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/lsp.py +0 -0
  205. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  206. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  207. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/powershell.py +0 -0
  208. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  209. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  210. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  211. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  212. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  213. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  214. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  215. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  216. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  217. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  218. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  219. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  220. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  221. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  222. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/task.md +0 -0
  223. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  224. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  225. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  226. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  227. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  228. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  229. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  230. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/read_file.py +0 -0
  231. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/search_replace.py +0 -0
  232. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/task.py +0 -0
  233. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/task_manager.py +0 -0
  234. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/todo.py +0 -0
  235. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/tool_search.py +0 -0
  236. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/webfetch.py +0 -0
  237. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/websearch.py +0 -0
  238. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/worktree.py +0 -0
  239. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/write_file.py +0 -0
  240. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/injection_guard.py +0 -0
  241. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/manager.py +0 -0
  242. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/mcp/__init__.py +0 -0
  243. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/mcp/registry.py +0 -0
  244. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/mcp/tools.py +0 -0
  245. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/mcp_sampling.py +0 -0
  246. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/ui.py +0 -0
  247. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/utils.py +0 -0
  248. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/trusted_folders.py +0 -0
  249. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/types.py +0 -0
  250. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/utils.py +0 -0
  251. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/setup/onboarding/__init__.py +0 -0
  252. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/setup/onboarding/base.py +0 -0
  253. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/setup/onboarding/onboarding.tcss +0 -0
  254. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/setup/onboarding/screens/__init__.py +0 -0
  255. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/setup/onboarding/screens/api_key.py +0 -0
  256. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/setup/onboarding/screens/welcome.py +0 -0
  257. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  258. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  259. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/skills/__init__.py +0 -0
  260. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/skills/batch/SKILL.md +0 -0
  261. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/skills/create-presentation/SKILL.md +0 -0
  262. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/skills/deep-research/SKILL.md +0 -0
  263. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/skills/investigate/SKILL.md +0 -0
  264. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/skills/review/SKILL.md +0 -0
  265. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/skills/ship/SKILL.md +0 -0
  266. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/skills/simplify/SKILL.md +0 -0
  267. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/whats_new.md +0 -0
  268. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock-acp.spec +0 -0
  269. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock_terms.md +0 -0
  270. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/flake.lock +0 -0
  271. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/flake.nix +0 -0
  272. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/README.md +0 -0
  273. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/auto_test_loop.sh +0 -0
  274. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/backup.sh +0 -0
  275. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/bump_version.py +0 -0
  276. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/deploy_to_github.sh +0 -0
  277. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/install.sh +0 -0
  278. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/monitor_test_battery.sh +0 -0
  279. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/notify_release.py +0 -0
  280. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/overnight_agents_test.sh +0 -0
  281. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/prepare_release.py +0 -0
  282. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/publish_to_pypi.sh +0 -0
  283. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/test_bank.sh +0 -0
  284. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/test_full.sh +0 -0
  285. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/test_smoke.sh +0 -0
  286. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/__init__.py +0 -0
  287. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/conftest.py +0 -0
  288. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_acp.py +0 -0
  289. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_agent_thought.py +0 -0
  290. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_bash.py +0 -0
  291. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_compact_session_updates.py +0 -0
  292. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_content.py +0 -0
  293. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_initialize.py +0 -0
  294. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_list_sessions.py +0 -0
  295. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_load_session.py +0 -0
  296. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_multi_session.py +0 -0
  297. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_new_session.py +0 -0
  298. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_proxy_setup_acp.py +0 -0
  299. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_read_file.py +0 -0
  300. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_search_replace.py +0 -0
  301. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_set_config_option.py +0 -0
  302. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_set_mode.py +0 -0
  303. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_set_model.py +0 -0
  304. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_tool_call_session_update.py +0 -0
  305. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_utils.py +0 -0
  306. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_write_file.py +0 -0
  307. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/autocompletion/test_file_indexer.py +0 -0
  308. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/autocompletion/test_fuzzy.py +0 -0
  309. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  310. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  311. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/autocompletion/test_path_completion_controller.py +0 -0
  312. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  313. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/autocompletion/test_slash_command_controller.py +0 -0
  314. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  315. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/backend/__init__.py +0 -0
  316. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/backend/data/__init__.py +0 -0
  317. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/backend/data/fireworks.py +0 -0
  318. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/backend/data/mistral.py +0 -0
  319. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/backend/test_anthropic_adapter.py +0 -0
  320. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/backend/test_backend.py +0 -0
  321. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/backend/test_reasoning_adapter.py +0 -0
  322. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  323. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  324. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  325. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  326. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_bell_notifications.py +0 -0
  327. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_braille_renderer.py +0 -0
  328. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_clipboard.py +0 -0
  329. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_commands.py +0 -0
  330. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_copy_shortcuts.py +0 -0
  331. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_external_editor.py +0 -0
  332. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_no_markup_static.py +0 -0
  333. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_question_app.py +0 -0
  334. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_spinner.py +0 -0
  335. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_switching_mode.py +0 -0
  336. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  337. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  338. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_ui_session_resume.py +0 -0
  339. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_ui_skill_dispatch.py +0 -0
  340. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/textual_ui/__init__.py +0 -0
  341. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/textual_ui/test_session_picker.py +0 -0
  342. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/conftest.py +0 -0
  343. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_agents.py +0 -0
  344. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_auth_crypto.py +0 -0
  345. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_auth_github.py +0 -0
  346. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_config_load_dotenv.py +0 -0
  347. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_config_paths.py +0 -0
  348. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_config_resolution.py +0 -0
  349. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_file_logging.py +0 -0
  350. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_plan_session.py +0 -0
  351. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_proxy_setup.py +0 -0
  352. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_slug.py +0 -0
  353. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_telemetry_send.py +0 -0
  354. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_teleport_git.py +0 -0
  355. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_teleport_nuage.py +0 -0
  356. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_teleport_service.py +0 -0
  357. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_trusted_folders.py +0 -0
  358. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_utils.py +0 -0
  359. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/e2e/common.py +0 -0
  360. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/e2e/conftest.py +0 -0
  361. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/e2e/mock_server.py +0 -0
  362. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  363. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/e2e/test_cli_tui_streaming.py +0 -0
  364. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  365. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/mock/__init__.py +0 -0
  366. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/mock/mock_backend_factory.py +0 -0
  367. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/mock/mock_entrypoint.py +0 -0
  368. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/mock/utils.py +0 -0
  369. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/onboarding/test_run_onboarding.py +0 -0
  370. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/onboarding/test_ui_onboarding.py +0 -0
  371. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/session/test_session_loader.py +0 -0
  372. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/session/test_session_logger.py +0 -0
  373. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/session/test_session_migration.py +0 -0
  374. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/skills/conftest.py +0 -0
  375. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/skills/test_manager.py +0 -0
  376. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/skills/test_models.py +0 -0
  377. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/skills/test_parser.py +0 -0
  378. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  379. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  380. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  381. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  382. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  383. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  384. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  385. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  386. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  387. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  388. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  389. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  390. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  391. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  392. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  393. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  394. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  395. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  396. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  397. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  398. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  399. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  400. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  401. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  402. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  403. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  404. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  405. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  406. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  407. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  408. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  409. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  410. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  411. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  412. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  413. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  414. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  415. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  416. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  417. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  418. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  419. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  420. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  421. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  422. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  423. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  424. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  425. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  426. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  427. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  428. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  429. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  430. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  431. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  432. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  433. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  434. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  435. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  436. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  437. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  438. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/base_snapshot_test_app.py +0 -0
  439. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/conftest.py +0 -0
  440. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/snap_compare.py +0 -0
  441. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  442. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  443. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  444. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  445. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  446. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  447. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  448. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  449. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  450. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  451. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  452. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  453. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  454. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  455. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/stubs/fake_backend.py +0 -0
  456. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/stubs/fake_client.py +0 -0
  457. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/stubs/fake_tool.py +0 -0
  458. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_agent_auto_compact.py +0 -0
  459. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_agent_backend.py +0 -0
  460. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_agent_observer_streaming.py +0 -0
  461. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_agent_stats.py +0 -0
  462. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_agent_tasks.py +0 -0
  463. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_agent_tool_call.py +0 -0
  464. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_agents.py +0 -0
  465. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_bank_build.py +0 -0
  466. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_bank_debug.py +0 -0
  467. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_bank_multiagent.py +0 -0
  468. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_bank_prd.py +0 -0
  469. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_bank_prd_extended.py +0 -0
  470. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_bank_tools.py +0 -0
  471. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_bank_update.py +0 -0
  472. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_build_projects.py +0 -0
  473. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_cli_programmatic_preload.py +0 -0
  474. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_current_bugs.py +0 -0
  475. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_drydock_regression.py +0 -0
  476. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_drydock_tasks.py +0 -0
  477. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_full_regression.py +0 -0
  478. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_history_manager.py +0 -0
  479. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_integration.py +0 -0
  480. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_loop_detection.py +0 -0
  481. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_message_id.py +0 -0
  482. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_message_merging.py +0 -0
  483. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_middleware.py +0 -0
  484. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_multi_agent.py +0 -0
  485. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_real_failures.py +0 -0
  486. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_real_issues.py +0 -0
  487. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_real_workflow.py +0 -0
  488. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_reasoning_content.py +0 -0
  489. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_smoke.py +0 -0
  490. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_system_prompt.py +0 -0
  491. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_tagged_text.py +0 -0
  492. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_ui_external_editor.py +0 -0
  493. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_ui_input_history.py +0 -0
  494. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_user_issues.py +0 -0
  495. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_workloads.py +0 -0
  496. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/testbank_helpers.py +0 -0
  497. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_ask_user_question.py +0 -0
  498. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_bash.py +0 -0
  499. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_exit_plan_mode.py +0 -0
  500. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_grep.py +0 -0
  501. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_invoke_context.py +0 -0
  502. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_manager_get_tool_config.py +0 -0
  503. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_mcp.py +0 -0
  504. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_mcp_sampling.py +0 -0
  505. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_task.py +0 -0
  506. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_ui_bash_execution.py +0 -0
  507. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_webfetch.py +0 -0
  508. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_websearch.py +0 -0
  509. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  510. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  511. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/update_notifier/test_do_update.py +0 -0
  512. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  513. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/update_notifier/test_github_update_gateway.py +0 -0
  514. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  515. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/update_notifier/test_ui_update_notification.py +0 -0
  516. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/update_notifier/test_update_use_case.py +0 -0
  517. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/update_notifier/test_whats_new.py +0 -0
  518. {drydock_cli-2.2.1 → drydock_cli-2.2.3}/uv.lock +0 -0
@@ -0,0 +1,180 @@
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
+
128
+ ## Improvement Backlog (from research papers + industry analysis)
129
+
130
+ **Meta-Harness (arXiv:2603.28052) — still TODO:**
131
+ - Execution trace logging (full prompts + tool calls per task for failure diagnosis)
132
+ - Repo-specific routing (different strategies per SWE-bench repo)
133
+ - Draft-then-verify (generate patch, verify against tests before committing)
134
+ - Contrastive examples (similar bugs with different fixes)
135
+ - Pareto frontier tracking (accuracy vs token cost)
136
+
137
+ **Industry design patterns — still TODO:**
138
+ - Parallel tool execution (multiple independent tool calls per turn)
139
+ - Background memory consolidation (clean context during idle time)
140
+ - Three-tier memory system (index + topics + archives)
141
+ - Frustration detection (regex-based, adjust approach when user is stuck)
142
+ - Extended reasoning allocation (detect complex tasks, give more compute)
143
+ - Git safety guards (stash before destructive ops)
144
+
145
+ **Implemented:**
146
+ - ✅ Static/dynamic prompt split (prefix caching)
147
+ - ✅ AGENTS.md auto-creation
148
+ - ✅ Environment bootstrapping
149
+ - ✅ Additive-only harness changes
150
+ - ✅ Permission denial feedback (suggest alternatives)
151
+ - ✅ "Task Completed" false claim detection
152
+ - ✅ Loop guidance (never stops, only redirects)
153
+ - ✅ Composable prompt (static first, dynamic after)
154
+
155
+ **Legal note:** All patterns are standard design concepts implemented from scratch. No proprietary code copied.
156
+
157
+ ## Key Learnings
158
+
159
+ 1. AGENTS.md is essential — devstral loops without it
160
+ 2. "Restate the goal" blocked tool calling for months — one line
161
+ 3. Additive-only changes work best — control flow mods regress
162
+ 4. The harness matters as much as the model (Meta-Harness paper)
163
+ 5. Environment bootstrapping saves 2-4 exploratory turns
164
+ 6. Plan→Edit workflow is Mistral's design, don't fight it
165
+ 7. Circuit breaker was net negative — removed entirely
166
+ 8. Loop detection should guide, never stop
167
+ 9. Test the installed package, not source (different Python envs)
168
+ 10. Never wait for full test runs — fix issues from early results
169
+
170
+ ## When Compacting
171
+
172
+ Always preserve: the list of files modified in this session, any failing test output, current SWE-bench results, and the user's latest instructions.
173
+
174
+ ## Style
175
+
176
+ - Python 3.12+, type hints, pathlib over os.path
177
+ - Match existing patterns in the codebase
178
+ - No unnecessary abstractions — keep fixes minimal
179
+ - Always run syntax check after editing .py files
180
+ - 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.1
3
+ Version: 2.2.3
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,81 @@
1
+ # DryDock — Local CLI Coding Agent
2
+
3
+ **Repository:** https://github.com/fbobe321/drydock
4
+ **PyPI:** https://pypi.org/project/drydock-cli/ (v2.2.1)
5
+ **License:** Apache 2.0 (fork of [mistralai/mistral-vibe](https://github.com/mistralai/mistral-vibe))
6
+
7
+ ## Vision
8
+
9
+ Best-in-class local coding agent. Build, debug, and ship software using local LLMs on consumer hardware.
10
+
11
+ ## Current Status
12
+
13
+ - **Model:** devstral-24B-AWQ-4bit on 2x RTX 4060 Ti 16GB
14
+ - **SWE-bench Verified:** 42% file match (target: 68%)
15
+ - **Version:** 2.2.1
16
+ - **Users can:** Build projects from PRDs, fix bugs, review code, refactor
17
+
18
+ ## Features
19
+
20
+ ### Core
21
+ - 24 builtin tools (bash, grep, read_file, write_file, search_replace, etc.)
22
+ - 7 bundled skills (/investigate, /review, /ship, /batch, /simplify, /deep-research, /create-presentation)
23
+ - Multi-agent delegation (explore, diagnostic, planner subagents)
24
+ - Plan→Edit workflow (Mistral's designed pattern)
25
+ - AGENTS.md support (cross-tool standard, auto-created)
26
+ - Textual TUI with wave spinner, message queuing
27
+
28
+ ### Local Model Support
29
+ - `/setup-model` command (vLLM, Ollama, LM Studio, custom)
30
+ - `--local` CLI flag for quick setup
31
+ - Auto-detect model name from server
32
+
33
+ ### Safety
34
+ - Tool permission system (always/ask/never per tool)
35
+ - Loop guidance (never stops, only redirects)
36
+ - API error auto-recovery (retry after 10s)
37
+
38
+ ## Install
39
+
40
+ ```bash
41
+ pip install drydock-cli
42
+ drydock --local http://localhost:8000/v1
43
+ ```
44
+
45
+ ## Per-Project Instructions
46
+
47
+ DryDock loads instructions from these files in the project root:
48
+ - **AGENTS.md** — Cross-tool standard (recommended)
49
+ - **DRYDOCK.md** — DryDock-specific
50
+ - **.drydock/rules/*.md** — Modular rules
51
+
52
+ Auto-created if none exist. Essential for devstral to use subagents properly.
53
+
54
+ ## Roadmap
55
+
56
+ ### Near-term
57
+ - Reach 68% on SWE-bench Verified (from 42%)
58
+ - Static/dynamic prompt split for prefix caching
59
+ - Layered context compaction (4 fallback layers)
60
+ - Composable prompt sections (task-type specific)
61
+ - Background resource preloading
62
+
63
+ ### Medium-term
64
+ - Real test execution in SWE-bench eval (not just file match)
65
+ - Repo-specific strategies (Django vs sympy vs sphinx)
66
+ - Draft-then-verify pattern for patches
67
+ - Windows Ctrl-C fix
68
+
69
+ ### Long-term
70
+ - Support larger models as hardware improves
71
+ - Plugin marketplace for custom tools/skills
72
+ - Web dashboard for monitoring long runs
73
+ - Multi-model routing (different models for different tasks)
74
+
75
+ ## Architecture Notes
76
+
77
+ See [CLAUDE.md](CLAUDE.md) for technical details, file locations, constraints, and development workflow.
78
+
79
+ ## Legal
80
+
81
+ All code is original or forked from Apache 2.0 mistral-vibe. Architecture improvements are standard design patterns implemented from scratch. No proprietary code copied.
@@ -1706,6 +1706,9 @@ class VibeApp(App): # noqa: PLR0904
1706
1706
  self.agent_loop.agent_profile
1707
1707
  )
1708
1708
  self._update_profile_widgets(new_profile)
1709
+ # Hide any active loading/spinner widget before switching mode
1710
+ # to prevent the old animation from showing behind the new spinner
1711
+ await self._remove_loading_widget()
1709
1712
  if self._chat_input_container:
1710
1713
  self._chat_input_container.switching_mode = True
1711
1714
 
@@ -762,22 +762,47 @@ class AgentLoop:
762
762
  text_without_action += 1
763
763
  # Always continue — don't let the agent exit without editing
764
764
  should_break_loop = False
765
- if text_without_action == 1:
766
- # Check if model already identified a TARGET in its text
767
- last_text = (last_message.content or "").upper()
768
- has_target = "TARGET:" in last_text or "FILE:" in last_text
769
- if has_target:
765
+
766
+ # Detect model claiming task is done without having edited anything
767
+ last_text_lower = (last_message.content or "").lower()
768
+ task_complete_phrases = [
769
+ "task completed", "task complete", "task is complete",
770
+ "task is done", "task has been completed",
771
+ "changes have been applied", "fix has been applied",
772
+ "the fix is complete", "issue is resolved",
773
+ ]
774
+ claims_complete = any(p in last_text_lower for p in task_complete_phrases)
775
+
776
+ if claims_complete:
777
+ nudge_text = (
778
+ "You said the task is complete but NO code was actually changed. "
779
+ "Your search_replace call either failed or was never made. "
780
+ "Use read_file to read the target file, then use search_replace "
781
+ "to make your edit. Do NOT say the task is done until search_replace succeeds."
782
+ )
783
+ elif text_without_action == 1:
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:
792
+ nudge_text = (
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():
770
799
  nudge_text = (
771
- "Good — you identified the target. Now proceed to PHASE 2: "
772
- "use read_file to read the target function, then search_replace to fix it. "
773
- "Do NOT describe the fix — apply it with search_replace."
800
+ "Good — you identified the target. Now use read_file then search_replace."
774
801
  )
775
802
  else:
776
803
  nudge_text = (
777
804
  "You responded with text but did not call any tools. "
778
- "Use search_replace NOW to apply your code change. "
779
- "If you are unsure of the exact text, use read_file on the target function ONCE, "
780
- "then immediately search_replace."
805
+ "Call write_file, read_file, or search_replace NOW."
781
806
  )
782
807
  elif text_without_action == 2:
783
808
  nudge_text = (
@@ -792,9 +817,11 @@ class AgentLoop:
792
817
  "Pick the most likely file and function, and make a minimal edit."
793
818
  )
794
819
  else:
795
- # Give up after 5 futile nudges the model can't/won't edit
796
- should_break_loop = True
797
- nudge_text = None
820
+ # Keep nudgingnever give up
821
+ nudge_text = (
822
+ "You MUST call a tool. Use grep to find the file, "
823
+ "read_file to read it, then search_replace to fix."
824
+ )
798
825
  if nudge_text:
799
826
  # Use _inject_system_note (appends to last tool/user message)
800
827
  # User messages cause 'tool after user' ordering violations
@@ -1126,6 +1153,16 @@ class AgentLoop:
1126
1153
  CancellationReason.TOOL_SKIPPED, tool_call.tool_name
1127
1154
  )
1128
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}"
1129
1166
  yield ToolResultEvent(
1130
1167
  tool_name=tool_call.tool_name,
1131
1168
  tool_class=tool_call.tool_class,
@@ -1761,6 +1798,8 @@ class AgentLoop:
1761
1798
  try:
1762
1799
  agents_md.write_text(
1763
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"
1764
1803
  "## Workflow\n"
1765
1804
  "When building a project:\n"
1766
1805
  "1. Use `task(agent=\"planner\")` to create an implementation plan first\n"
@@ -69,11 +69,15 @@ class HarnessFilesManager:
69
69
  project_skills = Path.cwd() / ".drydock" / "skills"
70
70
  if project_skills.is_dir():
71
71
  dirs.append(project_skills)
72
- # User skills in ~/.drydock/skills/
72
+ # User skills in ~/.drydock/skills/ (and ~/.vibe/skills/ for backward compat)
73
73
  if "user" in self.sources:
74
74
  d = GLOBAL_SKILLS_DIR.path
75
75
  if d.is_dir():
76
76
  dirs.append(d)
77
+ # Always check legacy ~/.vibe/skills/ in case migration didn't complete
78
+ legacy_skills = Path.home() / ".vibe" / "skills"
79
+ if legacy_skills.is_dir() and legacy_skills != d:
80
+ dirs.append(legacy_skills)
77
81
  # Plugin skills
78
82
  try:
79
83
  from drydock.core.plugins import get_plugin_skill_dirs
@@ -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.1"
3
+ version = "2.2.3"
4
4
  description = "Drydock — nautical CLI coding agent"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -0,0 +1,40 @@
1
+ #!/bin/bash
2
+ # Monitor SWE-bench runs, analyze early results, report via Telegram
3
+ # Cron: */10 * * * * /data3/drydock/scripts/monitor_swebench.sh
4
+
5
+ set -uo pipefail
6
+ export PATH="/home/bobef/miniconda3/bin:$PATH"
7
+ PYTHON="/home/bobef/miniconda3/bin/python3"
8
+ DRYDOCK="/data3/drydock"
9
+ SWEBENCH="/data3/swe_bench_runs"
10
+ LOG="$SWEBENCH/logs/monitor_swebench.log"
11
+
12
+ log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "$LOG"; }
13
+
14
+ # Find the latest running log
15
+ LATEST_LOG=$(ls -t $SWEBENCH/logs/v2*.log 2>/dev/null | head -1)
16
+ if [ -z "$LATEST_LOG" ]; then
17
+ exit 0
18
+ fi
19
+
20
+ # Count completed tasks
21
+ DONE=$(grep -c "Files match:" "$LATEST_LOG" 2>/dev/null || echo 0)
22
+ MATCHES=$(grep -c "Files match: True" "$LATEST_LOG" 2>/dev/null || echo 0)
23
+ PATCHES=$(grep "Patch:" "$LATEST_LOG" 2>/dev/null | grep -v "0L\|1L" | wc -l)
24
+ TOTAL=$(grep -c "^\[" "$LATEST_LOG" 2>/dev/null | head -1 || echo 0)
25
+
26
+ if [ "$DONE" -eq 0 ]; then
27
+ exit 0
28
+ fi
29
+
30
+ RATE=$((MATCHES * 100 / DONE))
31
+
32
+ log "Progress: $DONE done, $MATCHES matches ($RATE%), $PATCHES patches"
33
+
34
+ # Send Telegram update every 10 tasks
35
+ LAST_REPORTED=$(cat "$SWEBENCH/logs/.last_reported" 2>/dev/null || echo 0)
36
+ if [ "$DONE" -ge $((LAST_REPORTED + 10)) ]; then
37
+ $PYTHON "$DRYDOCK/scripts/notify_release.py" "swebench" "SWE-bench progress: $DONE tasks, $MATCHES file matches ($RATE%), $PATCHES patches. Log: $(basename $LATEST_LOG)"
38
+ echo "$DONE" > "$SWEBENCH/logs/.last_reported"
39
+ log "Sent Telegram update"
40
+ fi
@@ -1,61 +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
- - **Goal:** Best-in-class SWE-bench Verified pass rate with local LLMs
8
- - **Hardware:** 2x RTX 4060 Ti 16GB, devstral-24B-AWQ-4bit via vLLM at localhost:8000
9
-
10
- ## Build & Test
11
-
12
- ```bash
13
- # Install
14
- uv sync
15
-
16
- # Run drydock CLI
17
- uv run drydock
18
-
19
- # Run programmatically (headless, for benchmarks)
20
- python3 -c "import sys; sys.path.insert(0, '.'); from vibe.cli.entrypoint import main; main()" --agent auto-approve -p "your prompt"
21
-
22
- # Run tests (note: pytest from swe-bench worktrees can pollute; use -p no:conftest if needed)
23
- uv run pytest tests/ -x -q --timeout=30
24
-
25
- # Syntax check modified files
26
- python3 -c "import ast; ast.parse(open('path/to/file.py').read())"
27
- ```
28
-
29
- ## Key Architecture
30
-
31
- - `drydock/core/agent_loop.py` — Main agent loop. Loop detection, message ordering, tool execution. **Most changes go here.**
32
- - `drydock/core/programmatic.py` — Headless API entry point used by SWE-bench harness
33
- - `drydock/core/tools/builtins/bash.py` — Shell tool with allowlist/denylist, conda support
34
- - `drydock/core/tools/builtins/search_replace.py` — File editing tool with fuzzy matching
35
- - `drydock/core/prompts/cli.md` — System prompt (two-phase workflow, SWE-bench rules)
36
- - `drydock/core/types.py` — `MessageList` (custom Sequence, use `.reset()` not `=[]`)
37
-
38
- ## Critical Constraints
39
-
40
- - **MessageList is not a plain list.** Never `self.messages = [...]`. Use `self.messages.reset([...])`.
41
- - **vLLM/Mistral rejects `user` after `tool` messages.** `_sanitize_message_ordering()` runs before every LLM call as safety net. All injection should use `_inject_system_note()`.
42
- - **`os._exit()` in programmatic.py** — necessary because async cleanup hangs. Ensure stdout is flushed before calling.
43
- - **Tests may fail due to stale SWE-bench worktrees** poisoning pytest. Use `python3 -c "import ast; ..."` for syntax checks instead.
44
-
45
- ## SWE-bench Infrastructure
46
-
47
- Benchmarking scripts live at `/data3/swe_bench_runs/` (not in the drydock repo):
48
- - `harness.py` — Runs drydock on SWE-bench tasks, captures patches
49
- - `continuous_bench.sh` — Continuous improvement loop (cron @reboot + every 6h)
50
- - `deploy_to_github.sh` → `/data3/drydock/scripts/` — Daily push to GitHub
51
-
52
- ## When Compacting
53
-
54
- Always preserve: the list of files modified in this session, any failing test output, and the current task context from the PRD.
55
-
56
- ## Style
57
-
58
- - Python 3.12+, type hints, pathlib over os.path
59
- - Match existing patterns in the codebase
60
- - No unnecessary abstractions — keep fixes minimal
61
- - Always run syntax check after editing .py files