drydock-cli 2.6.25__tar.gz → 2.6.26__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 (559) hide show
  1. drydock_cli-2.6.26/.auto_release.lock +1 -0
  2. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/CLAUDE.md +13 -13
  3. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/PKG-INFO +1 -1
  4. drydock_cli-2.6.26/PRD.md +216 -0
  5. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/agents/models.py +30 -0
  6. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/config/_settings.py +8 -0
  7. drydock_cli-2.6.26/drydock/core/prompts/builder.md +45 -0
  8. drydock_cli-2.6.26/drydock/core/prompts/gemma4.md +64 -0
  9. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/system_prompt.py +22 -14
  10. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/task.py +15 -2
  11. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/pyproject.toml +1 -1
  12. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/auto_release.sh +35 -14
  13. drydock_cli-2.6.25/scripts/user_pain_test.py → drydock_cli-2.6.26/scripts/shakedown.py +156 -36
  14. drydock_cli-2.6.25/scripts/run_pain_suite.sh → drydock_cli-2.6.26/scripts/shakedown_suite.sh +3 -3
  15. drydock_cli-2.6.26/scripts/shakedown_variance.sh +56 -0
  16. drydock_cli-2.6.25/.auto_release.lock +0 -1
  17. drydock_cli-2.6.25/PRD.md +0 -81
  18. drydock_cli-2.6.25/drydock/core/prompts/builder.md +0 -16
  19. drydock_cli-2.6.25/drydock/core/prompts/gemma4.md +0 -30
  20. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/.github/CODEOWNERS +0 -0
  21. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  22. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  23. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  24. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/.github/workflows/build-and-upload.yml +0 -0
  25. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/.github/workflows/ci.yml +0 -0
  26. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/.github/workflows/issue-labeler.yml +0 -0
  27. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/.github/workflows/release.yml +0 -0
  28. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/.gitignore +0 -0
  29. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/.pre-commit-config.yaml +0 -0
  30. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/.python-version +0 -0
  31. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/.typos.toml +0 -0
  32. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/.vscode/extensions.json +0 -0
  33. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/.vscode/launch.json +0 -0
  34. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/.vscode/settings.json +0 -0
  35. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/AGENTS.md +0 -0
  36. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/CHANGELOG.md +0 -0
  37. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/CONTRIBUTING.md +0 -0
  38. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/Drydock_rebrand.md +0 -0
  39. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/LICENSE +0 -0
  40. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/NOTICE +0 -0
  41. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/README.md +0 -0
  42. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/action.yml +0 -0
  43. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/distribution/zed/LICENSE +0 -0
  44. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/distribution/zed/extension.toml +0 -0
  45. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/distribution/zed/icons/mistral_vibe.svg +0 -0
  46. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/docs/README.md +0 -0
  47. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/docs/acp-setup.md +0 -0
  48. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/docs/proxy-setup.md +0 -0
  49. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/__init__.py +0 -0
  50. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/acp/__init__.py +0 -0
  51. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/acp/acp_agent_loop.py +0 -0
  52. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/acp/acp_logger.py +0 -0
  53. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/acp/entrypoint.py +0 -0
  54. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/acp/tools/__init__.py +0 -0
  55. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/acp/tools/base.py +0 -0
  56. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/acp/tools/builtins/bash.py +0 -0
  57. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/acp/tools/builtins/read_file.py +0 -0
  58. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/acp/tools/builtins/search_replace.py +0 -0
  59. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/acp/tools/builtins/todo.py +0 -0
  60. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/acp/tools/builtins/write_file.py +0 -0
  61. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/acp/tools/session_update.py +0 -0
  62. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/acp/utils.py +0 -0
  63. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/__init__.py +0 -0
  64. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/autocompletion/__init__.py +0 -0
  65. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/autocompletion/base.py +0 -0
  66. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/autocompletion/path_completion.py +0 -0
  67. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/autocompletion/slash_command.py +0 -0
  68. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/cli.py +0 -0
  69. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/clipboard.py +0 -0
  70. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/commands.py +0 -0
  71. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/entrypoint.py +0 -0
  72. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/history_manager.py +0 -0
  73. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  74. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  75. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  76. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/terminal_setup.py +0 -0
  77. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/__init__.py +0 -0
  78. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  79. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/app.py +0 -0
  80. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/app.tcss +0 -0
  81. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/external_editor.py +0 -0
  82. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  83. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  84. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  85. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  86. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  87. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  88. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  89. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  90. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  91. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  92. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  93. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  94. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  95. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  96. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  97. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  98. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  99. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  100. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  101. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  102. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  103. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  104. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  105. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  106. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  107. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  108. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  109. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  110. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  111. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  112. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  113. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  114. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  115. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  116. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  117. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  118. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/windowing/history.py +0 -0
  119. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  120. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/textual_ui/windowing/state.py +0 -0
  121. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/update_notifier/__init__.py +0 -0
  122. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  123. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  124. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  125. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  126. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  127. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/update_notifier/update.py +0 -0
  128. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/cli/update_notifier/whats_new.py +0 -0
  129. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/__init__.py +0 -0
  130. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/agent_loop.py +0 -0
  131. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/agents/__init__.py +0 -0
  132. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/agents/manager.py +0 -0
  133. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/auth/__init__.py +0 -0
  134. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/auth/crypto.py +0 -0
  135. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/auth/github.py +0 -0
  136. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/autocompletion/__init__.py +0 -0
  137. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/autocompletion/completers.py +0 -0
  138. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  139. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  140. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  141. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  142. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  143. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/autocompletion/fuzzy.py +0 -0
  144. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/autocompletion/path_prompt.py +0 -0
  145. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  146. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/build_orchestrator.py +0 -0
  147. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/config/__init__.py +0 -0
  148. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/config/harness_files/__init__.py +0 -0
  149. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  150. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/config/harness_files/_paths.py +0 -0
  151. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/consultant.py +0 -0
  152. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/drydock_states.py +0 -0
  153. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/hooks.py +0 -0
  154. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/llm/__init__.py +0 -0
  155. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/llm/backend/anthropic.py +0 -0
  156. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/llm/backend/base.py +0 -0
  157. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/llm/backend/factory.py +0 -0
  158. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/llm/backend/generic.py +0 -0
  159. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/llm/backend/mistral.py +0 -0
  160. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  161. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/llm/backend/vertex.py +0 -0
  162. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/llm/exceptions.py +0 -0
  163. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/llm/format.py +0 -0
  164. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/llm/message_utils.py +0 -0
  165. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/llm/types.py +0 -0
  166. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/logger.py +0 -0
  167. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/middleware.py +0 -0
  168. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/output_formatters.py +0 -0
  169. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/paths/__init__.py +0 -0
  170. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/paths/_local_config_walk.py +0 -0
  171. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/paths/_vibe_home.py +0 -0
  172. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/paths/conventions.py +0 -0
  173. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/plan_session.py +0 -0
  174. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/plugins.py +0 -0
  175. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/programmatic.py +0 -0
  176. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/prompts/__init__.py +0 -0
  177. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/prompts/cli.md +0 -0
  178. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/prompts/compact.md +0 -0
  179. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/prompts/dangerous_directory.md +0 -0
  180. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/prompts/diagnostic.md +0 -0
  181. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/prompts/explore.md +0 -0
  182. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/prompts/planner.md +0 -0
  183. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/prompts/project_context.md +0 -0
  184. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/prompts/tests.md +0 -0
  185. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/proxy_setup.py +0 -0
  186. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/session/agent_memory.py +0 -0
  187. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/session/checkpoints.py +0 -0
  188. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/session/session_loader.py +0 -0
  189. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/session/session_logger.py +0 -0
  190. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/session/session_migration.py +0 -0
  191. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/session/state_file.py +0 -0
  192. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/session_checker.py +0 -0
  193. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/skills/__init__.py +0 -0
  194. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/skills/manager.py +0 -0
  195. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/skills/models.py +0 -0
  196. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/skills/parser.py +0 -0
  197. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/slug.py +0 -0
  198. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/telemetry/__init__.py +0 -0
  199. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/telemetry/send.py +0 -0
  200. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/teleport/errors.py +0 -0
  201. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/teleport/git.py +0 -0
  202. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/teleport/nuage.py +0 -0
  203. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/teleport/teleport.py +0 -0
  204. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/teleport/types.py +0 -0
  205. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/base.py +0 -0
  206. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/_task_manager.py +0 -0
  207. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  208. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/bash.py +0 -0
  209. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/cron.py +0 -0
  210. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  211. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/glob_tool.py +0 -0
  212. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/grep.py +0 -0
  213. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  214. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/lsp.py +0 -0
  215. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  216. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  217. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/powershell.py +0 -0
  218. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  219. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  220. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  221. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  222. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  223. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  224. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  225. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  226. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  227. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  228. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  229. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  230. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  231. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  232. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/task.md +0 -0
  233. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  234. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  235. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  236. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  237. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  238. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  239. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  240. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/read_file.py +0 -0
  241. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/search_replace.py +0 -0
  242. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/todo.py +0 -0
  243. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/tool_search.py +0 -0
  244. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/webfetch.py +0 -0
  245. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/websearch.py +0 -0
  246. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/worktree.py +0 -0
  247. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/builtins/write_file.py +0 -0
  248. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/injection_guard.py +0 -0
  249. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/manager.py +0 -0
  250. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/mcp/__init__.py +0 -0
  251. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/mcp/registry.py +0 -0
  252. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/mcp/tools.py +0 -0
  253. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/mcp_sampling.py +0 -0
  254. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/ui.py +0 -0
  255. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/tools/utils.py +0 -0
  256. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/trusted_folders.py +0 -0
  257. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/types.py +0 -0
  258. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/core/utils.py +0 -0
  259. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/setup/onboarding/__init__.py +0 -0
  260. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/setup/onboarding/base.py +0 -0
  261. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/setup/onboarding/onboarding.tcss +0 -0
  262. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/setup/onboarding/screens/__init__.py +0 -0
  263. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/setup/onboarding/screens/api_key.py +0 -0
  264. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/setup/onboarding/screens/welcome.py +0 -0
  265. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  266. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  267. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/__init__.py +0 -0
  268. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/api-design/SKILL.md +0 -0
  269. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/batch/SKILL.md +0 -0
  270. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/commit-code/SKILL.md +0 -0
  271. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/context-summary/SKILL.md +0 -0
  272. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/create-presentation/SKILL.md +0 -0
  273. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/deep-research/SKILL.md +0 -0
  274. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/deploy/SKILL.md +0 -0
  275. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/diff-review/SKILL.md +0 -0
  276. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/doc-gen/SKILL.md +0 -0
  277. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/explain-code/SKILL.md +0 -0
  278. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/explore-code/SKILL.md +0 -0
  279. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/fix-issue/SKILL.md +0 -0
  280. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/git-ops/SKILL.md +0 -0
  281. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/init-project/SKILL.md +0 -0
  282. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/investigate/SKILL.md +0 -0
  283. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/loop/SKILL.md +0 -0
  284. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/migrate/SKILL.md +0 -0
  285. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/perf-analyze/SKILL.md +0 -0
  286. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/plan-impl/SKILL.md +0 -0
  287. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/pr-review/SKILL.md +0 -0
  288. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/refactor/SKILL.md +0 -0
  289. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/regex-help/SKILL.md +0 -0
  290. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/review/SKILL.md +0 -0
  291. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/security-review/SKILL.md +0 -0
  292. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/ship/SKILL.md +0 -0
  293. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/simplify/SKILL.md +0 -0
  294. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/skills/test-verify/SKILL.md +0 -0
  295. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock/whats_new.md +0 -0
  296. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock-acp.spec +0 -0
  297. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/drydock_terms.md +0 -0
  298. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/flake.lock +0 -0
  299. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/flake.nix +0 -0
  300. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/log_analyzer/__init__.py +0 -0
  301. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/log_analyzer/__main__.py +0 -0
  302. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/log_analyzer/analyzer.py +0 -0
  303. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/log_analyzer/cli.py +0 -0
  304. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/README.md +0 -0
  305. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/auto_test_loop.sh +0 -0
  306. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/backup.sh +0 -0
  307. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/bump_version.py +0 -0
  308. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/deploy_to_github.sh +0 -0
  309. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/discover_cli_tools.sh +0 -0
  310. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/install.sh +0 -0
  311. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/llm_balancer.py +0 -0
  312. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/monitor_swebench.sh +0 -0
  313. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/monitor_test_battery.sh +0 -0
  314. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/notify_release.py +0 -0
  315. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/overnight_agents_test.sh +0 -0
  316. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/prepare_release.py +0 -0
  317. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/publish_to_pypi.sh +0 -0
  318. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/telegram_bot.py +0 -0
  319. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/test_bank.sh +0 -0
  320. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/test_full.sh +0 -0
  321. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/test_smoke.sh +0 -0
  322. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/test_tui_path.py +0 -0
  323. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/tui_test.py +0 -0
  324. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/scripts/vllm_failover.sh +0 -0
  325. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/__init__.py +0 -0
  326. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/conftest.py +0 -0
  327. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/test_acp.py +0 -0
  328. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/test_agent_thought.py +0 -0
  329. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/test_bash.py +0 -0
  330. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/test_compact_session_updates.py +0 -0
  331. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/test_content.py +0 -0
  332. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/test_initialize.py +0 -0
  333. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/test_list_sessions.py +0 -0
  334. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/test_load_session.py +0 -0
  335. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/test_multi_session.py +0 -0
  336. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/test_new_session.py +0 -0
  337. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/test_proxy_setup_acp.py +0 -0
  338. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/test_read_file.py +0 -0
  339. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/test_search_replace.py +0 -0
  340. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/test_set_config_option.py +0 -0
  341. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/test_set_mode.py +0 -0
  342. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/test_set_model.py +0 -0
  343. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/test_tool_call_session_update.py +0 -0
  344. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/test_utils.py +0 -0
  345. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/acp/test_write_file.py +0 -0
  346. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/autocompletion/test_file_indexer.py +0 -0
  347. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/autocompletion/test_fuzzy.py +0 -0
  348. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  349. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  350. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/autocompletion/test_path_completion_controller.py +0 -0
  351. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  352. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/autocompletion/test_slash_command_controller.py +0 -0
  353. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  354. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/backend/__init__.py +0 -0
  355. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/backend/data/__init__.py +0 -0
  356. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/backend/data/fireworks.py +0 -0
  357. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/backend/data/mistral.py +0 -0
  358. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/backend/test_anthropic_adapter.py +0 -0
  359. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/backend/test_backend.py +0 -0
  360. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/backend/test_reasoning_adapter.py +0 -0
  361. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  362. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  363. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  364. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  365. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/cli/test_bell_notifications.py +0 -0
  366. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/cli/test_braille_renderer.py +0 -0
  367. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/cli/test_clipboard.py +0 -0
  368. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/cli/test_commands.py +0 -0
  369. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/cli/test_copy_shortcuts.py +0 -0
  370. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/cli/test_external_editor.py +0 -0
  371. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/cli/test_no_markup_static.py +0 -0
  372. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/cli/test_question_app.py +0 -0
  373. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/cli/test_spinner.py +0 -0
  374. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/cli/test_switching_mode.py +0 -0
  375. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  376. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  377. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/cli/test_ui_session_resume.py +0 -0
  378. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/cli/test_ui_skill_dispatch.py +0 -0
  379. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/cli/textual_ui/__init__.py +0 -0
  380. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/cli/textual_ui/test_session_picker.py +0 -0
  381. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/conftest.py +0 -0
  382. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/core/test_agents.py +0 -0
  383. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/core/test_auth_crypto.py +0 -0
  384. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/core/test_auth_github.py +0 -0
  385. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/core/test_config_load_dotenv.py +0 -0
  386. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/core/test_config_paths.py +0 -0
  387. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/core/test_config_resolution.py +0 -0
  388. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/core/test_file_logging.py +0 -0
  389. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/core/test_plan_session.py +0 -0
  390. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/core/test_proxy_setup.py +0 -0
  391. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/core/test_slug.py +0 -0
  392. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/core/test_telemetry_send.py +0 -0
  393. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/core/test_teleport_git.py +0 -0
  394. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/core/test_teleport_nuage.py +0 -0
  395. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/core/test_teleport_service.py +0 -0
  396. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/core/test_trusted_folders.py +0 -0
  397. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/core/test_utils.py +0 -0
  398. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/e2e/common.py +0 -0
  399. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/e2e/conftest.py +0 -0
  400. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/e2e/mock_server.py +0 -0
  401. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  402. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/e2e/test_cli_tui_streaming.py +0 -0
  403. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  404. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/fixtures/doc_qa_system_prd.md +0 -0
  405. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/mock/__init__.py +0 -0
  406. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/mock/mock_backend_factory.py +0 -0
  407. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/mock/mock_entrypoint.py +0 -0
  408. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/mock/utils.py +0 -0
  409. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/onboarding/test_run_onboarding.py +0 -0
  410. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/onboarding/test_ui_onboarding.py +0 -0
  411. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/session/test_session_loader.py +0 -0
  412. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/session/test_session_logger.py +0 -0
  413. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/session/test_session_migration.py +0 -0
  414. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/skills/conftest.py +0 -0
  415. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/skills/test_manager.py +0 -0
  416. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/skills/test_models.py +0 -0
  417. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/skills/test_parser.py +0 -0
  418. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  419. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  420. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  421. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  422. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  423. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  424. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  425. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  426. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  427. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  428. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  429. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  430. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  431. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  432. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  433. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  434. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  435. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  436. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  437. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  438. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  439. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  440. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  441. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  442. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  443. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  444. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  445. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  446. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  447. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  448. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  449. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  450. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  451. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  452. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  453. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  454. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  455. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  456. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  457. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  458. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  459. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  460. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  461. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  462. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  463. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  464. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  465. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  466. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  467. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  468. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  469. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  470. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  471. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  472. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  473. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  474. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  475. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  476. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  477. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  478. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/base_snapshot_test_app.py +0 -0
  479. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/conftest.py +0 -0
  480. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/snap_compare.py +0 -0
  481. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  482. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  483. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  484. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  485. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  486. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  487. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  488. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  489. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  490. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  491. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  492. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  493. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  494. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  495. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/stubs/fake_backend.py +0 -0
  496. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/stubs/fake_client.py +0 -0
  497. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/stubs/fake_tool.py +0 -0
  498. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_agent_auto_compact.py +0 -0
  499. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_agent_backend.py +0 -0
  500. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_agent_observer_streaming.py +0 -0
  501. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_agent_stats.py +0 -0
  502. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_agent_tasks.py +0 -0
  503. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_agent_tool_call.py +0 -0
  504. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_agents.py +0 -0
  505. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_bank_build.py +0 -0
  506. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_bank_debug.py +0 -0
  507. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_bank_multiagent.py +0 -0
  508. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_bank_prd.py +0 -0
  509. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_bank_prd_extended.py +0 -0
  510. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_bank_tools.py +0 -0
  511. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_bank_update.py +0 -0
  512. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_build_projects.py +0 -0
  513. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_cli_programmatic_preload.py +0 -0
  514. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_current_bugs.py +0 -0
  515. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_drydock_regression.py +0 -0
  516. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_drydock_tasks.py +0 -0
  517. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_full_regression.py +0 -0
  518. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_history_manager.py +0 -0
  519. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_integration.py +0 -0
  520. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_loop_detection.py +0 -0
  521. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_message_id.py +0 -0
  522. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_message_merging.py +0 -0
  523. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_middleware.py +0 -0
  524. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_multi_agent.py +0 -0
  525. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_real_failures.py +0 -0
  526. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_real_issues.py +0 -0
  527. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_real_workflow.py +0 -0
  528. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_reasoning_content.py +0 -0
  529. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_smoke.py +0 -0
  530. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_system_prompt.py +0 -0
  531. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_tagged_text.py +0 -0
  532. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_tool_args.py +0 -0
  533. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_ui_external_editor.py +0 -0
  534. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_ui_input_history.py +0 -0
  535. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_user_issues.py +0 -0
  536. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/test_workloads.py +0 -0
  537. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/testbank_helpers.py +0 -0
  538. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/tools/test_ask_user_question.py +0 -0
  539. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/tools/test_bash.py +0 -0
  540. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/tools/test_exit_plan_mode.py +0 -0
  541. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/tools/test_grep.py +0 -0
  542. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/tools/test_invoke_context.py +0 -0
  543. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/tools/test_manager_get_tool_config.py +0 -0
  544. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/tools/test_mcp.py +0 -0
  545. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/tools/test_mcp_sampling.py +0 -0
  546. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/tools/test_task.py +0 -0
  547. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/tools/test_ui_bash_execution.py +0 -0
  548. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/tools/test_webfetch.py +0 -0
  549. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/tools/test_websearch.py +0 -0
  550. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  551. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  552. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/update_notifier/test_do_update.py +0 -0
  553. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  554. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/update_notifier/test_github_update_gateway.py +0 -0
  555. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  556. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/update_notifier/test_ui_update_notification.py +0 -0
  557. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/update_notifier/test_update_use_case.py +0 -0
  558. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/tests/update_notifier/test_whats_new.py +0 -0
  559. {drydock_cli-2.6.25 → drydock_cli-2.6.26}/uv.lock +0 -0
@@ -0,0 +1 @@
1
+ 232271
@@ -9,8 +9,8 @@ Drydock is a local CLI coding agent (fork of mistral-vibe, Apache 2.0).
9
9
  - **Hardware:** 2x RTX 4060 Ti 16GB, Gemma 4 26B MoE (A4B) via vLLM Docker at localhost:8000
10
10
  - **Server:** remus (Ubuntu 22.04, user: bobef)
11
11
  - **Active model:** Gemma 4 26B-A4B-it-AWQ-4bit (only 4B active params, ~70 tok/s)
12
- - **The honest test:** `scripts/user_pain_test.py` user-pain harness — pass means real
13
- user-perceptible behaviour, not tool-call counts. See `scripts/run_pain_suite.sh`
12
+ - **The honest test:** `scripts/shakedown.py` shakedown harness — pass means real
13
+ user-perceptible behaviour, not tool-call counts. See `scripts/shakedown_suite.sh`
14
14
  for the 10-project core set.
15
15
  - **OLD harnesses you should NOT trust:** `scripts/tui_test.py` and
16
16
  `core_tests_real.sh` count tool calls and `--help` and miss the things users
@@ -261,11 +261,11 @@ v3 is a from-scratch rewrite using nano-claude-code as foundation. 4 core files,
261
261
  - ✅ Docker-based model serving (vLLM + Gemma 4)
262
262
  - ✅ Multi-backend SWE-bench harness (v2/devstral + v3/gemma4)
263
263
  - ✅ Thinking token filtering (Gemma 4 `<|channel>` leak)
264
- - ✅ **User-pain harness** (`scripts/user_pain_test.py`) — drives real TUI
264
+ - ✅ **Shakedown harness** (`scripts/shakedown.py`) — drives real TUI
265
265
  via pexpect, watches live session log, types `STOP` interrupts,
266
266
  judges on user-perceptible criteria
267
- - ✅ **Multi-PRD pain suite** (`scripts/run_pain_suite.sh`) — 10 core
268
- projects through the user-pain harness
267
+ - ✅ **Shakedown suite** (`scripts/shakedown_suite.sh`) — 10 core
268
+ projects through the shakedown harness
269
269
  - ✅ **`_check_main_module_entry`** in write_file.py — catches
270
270
  `__main__.py` files that import `main` but never call it (the codec
271
271
  silent-exit bug)
@@ -286,7 +286,7 @@ v3 is a from-scratch rewrite using nano-claude-code as foundation. 4 core files,
286
286
  - ✅ **`_task_manager.py` rename** — TaskCreate/Update/List were
287
287
  duplicates of the `todo` tool that confused Gemma 4 into hanging.
288
288
  Underscore prefix excludes them from tool discovery
289
- - ✅ **Trust dialog auto-dismissal** in user_pain_test.py
289
+ - ✅ **Trust dialog auto-dismissal** in shakedown.py
290
290
  - ✅ **Pause flags** for both `auto_release.sh` and `watchdog.sh` so
291
291
  manual debugging doesn't get its work overwritten
292
292
 
@@ -301,7 +301,7 @@ v3 is a from-scratch rewrite using nano-claude-code as foundation. 4 core files,
301
301
  loop, hang, and produce broken code. The harnesses were structurally
302
302
  incapable of catching what users experience because they measure
303
303
  tool-call counts and `--help` exit codes, not progress. Build pass
304
- criteria around user-perceptible state instead. See `user_pain_test.py`.
304
+ criteria around user-perceptible state instead. See `shakedown.py`.
305
305
  2. **Gemma 4 ignores advisory nudges.** The model received the dedup
306
306
  message ("File already has this exact content. Move to the NEXT file."),
307
307
  the loop-detection system note, the missing-import warning, AND a
@@ -384,9 +384,9 @@ v3 is a from-scratch rewrite using nano-claude-code as foundation. 4 core files,
384
384
 
385
385
  ## Testing
386
386
 
387
- ### Use `scripts/user_pain_test.py` — anything else lies
387
+ ### Use `scripts/shakedown.py` — anything else lies
388
388
 
389
- The `user_pain_test.py` harness is the only test infrastructure that catches what
389
+ The `shakedown.py` harness is the only test infrastructure that catches what
390
390
  real users experience. Older harnesses (`tui_test.py`, `core_tests_real.sh`,
391
391
  `run_real_tests.sh`) measure tool counts and `--help` exit codes; they pass
392
392
  while real users see loops and hangs.
@@ -416,7 +416,7 @@ while real users see loops and hangs.
416
416
  **Run a single project:**
417
417
 
418
418
  ```bash
419
- PYTHONUNBUFFERED=1 python3 -u scripts/user_pain_test.py \
419
+ PYTHONUNBUFFERED=1 python3 -u scripts/shakedown.py \
420
420
  --cwd /data3/test_drydock \
421
421
  --prompt "review the PRD and get started" \
422
422
  --pkg doc_qa_system
@@ -425,7 +425,7 @@ PYTHONUNBUFFERED=1 python3 -u scripts/user_pain_test.py \
425
425
  **Run the 10-project core suite:**
426
426
 
427
427
  ```bash
428
- bash scripts/run_pain_suite.sh
428
+ bash scripts/shakedown_suite.sh
429
429
  ```
430
430
 
431
431
  **Real-world results from the harness (after recent fixes):**
@@ -471,7 +471,7 @@ From `/data3/drydock_test_projects/X` it reports the site-packages path.
471
471
  **Always test imports from a neutral cwd**, OR commit to source AND let
472
472
  auto_release rebuild.
473
473
 
474
- ### Test Levels (kept for reference, but the user-pain harness covers all of them)
474
+ ### Test Levels (kept for reference, but the shakedown harness covers all of them)
475
475
  1. **Build test (--help):** package runs — MEANINGLESS alone
476
476
  2. **Functional test:** PRD test cases verified with correct output — THE REAL TEST
477
477
  3. **Acceptance test:** specific expected outputs verified
@@ -485,7 +485,7 @@ auto_release rebuild.
485
485
  - The model should be able to answer questions without being forced to edit files
486
486
  - **NEVER trust an old harness's pass result.** If `tui_test.py` or
487
487
  `core_tests_real.sh` says PASS, run the same project through
488
- `user_pain_test.py` to confirm. The old harnesses count `--help` and
488
+ `shakedown.py` to confirm. The old harnesses count `--help` and
489
489
  silently miss the things users hate.
490
490
  - **Always reset PRDs between runs.** The model edits PRD.md (adds
491
491
  "✅ Completed" status tables, chat-style filler) and contaminates
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.6.25
3
+ Version: 2.6.26
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,216 @@
1
+ # DryDock — Local CLI Coding Agent
2
+
3
+ **Repository:** https://github.com/fbobe321/drydock
4
+ **PyPI:** https://pypi.org/project/drydock-cli/ (v2.6.25)
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
10
+ LLMs on consumer hardware — and **prove it actually works** with a test
11
+ harness that drives the real TUI like a real user, not a tool-call counter.
12
+
13
+ ## Current Status
14
+
15
+ - **Active model:** Gemma 4 26B-A4B-it-AWQ-4bit (MoE, 4B active params per
16
+ token, ~70 tok/s) via vLLM Docker on 2x RTX 4060 Ti 16GB
17
+ - **Version:** 2.6.25 on PyPI (2.6.26+ in source with `slim_system_prompt`,
18
+ hard-block on duplicate writes, and the new test harness)
19
+ - **Honest test results (10 core PRDs through `shakedown.py`, single run):**
20
+ 5/10 PASS without slim_system_prompt + hard block; ≥8/10 expected with
21
+ both fixes deployed (variance run in progress)
22
+ - **Users can:** build projects from PRDs, fix bugs, review code, refactor
23
+ — through the TUI only (headless mode is gone)
24
+
25
+ ## How drydock is tested now
26
+
27
+ The `scripts/tui_test.py` and `core_tests_real.sh` harnesses count tool
28
+ calls and `--help` exit codes. They reported 80% pass rates while real
29
+ users saw drydock loop, hang, and produce broken code. **Both are
30
+ deprecated** in favour of `scripts/shakedown.py`, which:
31
+
32
+ - Drives the real `drydock` TUI via pexpect (no headless code paths)
33
+ - Polls the live `~/.vibe/logs/session/session_<id>/messages.jsonl` in
34
+ parallel to see what the model is actually doing
35
+ - Watches for **write loops** (≥3 identical-content writes to a path),
36
+ **hallucinated tool names** that hang the session, **search_replace
37
+ failure cascades**, and **dead silence** (no new messages of any kind
38
+ for 120 seconds)
39
+ - Types simulated `STOP` interrupts when it detects loops and tracks
40
+ whether the model OBEYS them
41
+ - Distinguishes three end-states: active turn, model declared done
42
+ (text response with no tool call), and dead silence
43
+ - Resets the cwd between runs (restores `PRD.md` from `PRD.master.md`,
44
+ wipes the package dir and stale data dirs) so contamination from one
45
+ run can't poison the next
46
+ - Auto-handles the "Trust this folder?" dialog drydock pops on new
47
+ directories
48
+ - **Pass criteria are user-perceptible**: no loops, no ignored
49
+ interrupts, no search_replace cascades, the package must actually
50
+ execute, session must finish under the time budget
51
+
52
+ Run a single project:
53
+
54
+ ```bash
55
+ PYTHONUNBUFFERED=1 python3 -u scripts/shakedown.py \
56
+ --cwd /data3/test_drydock \
57
+ --prompt "review the PRD and get started" \
58
+ --pkg doc_qa_system
59
+ ```
60
+
61
+ Run the 10-project core suite (or 3-run variance suite for stability):
62
+
63
+ ```bash
64
+ bash scripts/shakedown_suite.sh # one run, ~25 min
65
+ bash scripts/shakedown_variance.sh 3 # three runs, ~75 min
66
+ ```
67
+
68
+ ## Features
69
+
70
+ ### Core
71
+ - 24 builtin tools (bash, grep, read_file, write_file, search_replace,
72
+ glob, todo, ask_user_question, invoke_skill, worktree, etc.)
73
+ - 7 bundled skills (/investigate, /review, /ship, /batch, /simplify,
74
+ /deep-research, /create-presentation)
75
+ - Multi-agent delegation (explore, diagnostic, planner subagents)
76
+ - Plan→Edit workflow (Mistral's designed pattern)
77
+ - AGENTS.md support (cross-tool standard, auto-created — same file works
78
+ with Claude Code, opencode, drydock, Aider)
79
+ - Textual TUI with wave spinner, message queuing
80
+
81
+ ### Local Model Support
82
+ - `/setup-model` command (vLLM, Ollama, LM Studio, custom)
83
+ - `--local` CLI flag for quick setup
84
+ - Auto-detect model name from server
85
+ - **`slim_system_prompt`** config knob — drops the ~10K-token inlined
86
+ tool prompt files + skills + subagents lists for local models that
87
+ pay 7-12 ms per prefill token. Verified on Gemma 4: takes
88
+ first-turn latency from 60-120 s to 10-20 s on the dead-silence cases.
89
+
90
+ ### Safety (advisory, never blocking — with one narrow exception)
91
+ - Tool permission system (always/ask/never per tool)
92
+ - Loop detection wired into `_handle_tool_response()` — injects an
93
+ advisory nudge when the same tool call repeats, never stops the
94
+ session
95
+ - Three-tier escalating dedup on `write_file`:
96
+ 1. First duplicate: friendly "move to next file"
97
+ 2. Second duplicate: full directory listing + concrete next-action
98
+ suggestions
99
+ 3. **Third duplicate: HARD BLOCK via `ToolError`** — narrow exception
100
+ to the no-blocking rule, only fires when file exists AND content
101
+ is identical AND it's the 3rd attempt. Never blocks legitimate
102
+ retries. After the block, `_prune_duplicate_writes()` removes the
103
+ older no-op write attempts from message history so the next turn
104
+ sees a cleaner context.
105
+ - `_check_main_module_entry()` catches `__main__.py` files that import
106
+ `main` but never call it (the codec silent-exit bug)
107
+ - `_check_missing_sibling_imports()` catches `from .x import Y` when
108
+ `x.py` doesn't exist on disk yet (the minivc unimportable-package bug)
109
+ - `_truncate_old_tool_results()` proactively shrinks stale `read_file`
110
+ outputs in message history before each LLM call (idempotent;
111
+ keeps the last 6 in full)
112
+ - API error auto-recovery (retry after 10s)
113
+ - `auto_release.sh` and `watchdog.sh` cron jobs respect pause flags
114
+ at `.pause_auto_release` and `.pause_watchdog` for manual debugging
115
+
116
+ ## Install
117
+
118
+ ```bash
119
+ pip install drydock-cli
120
+ drydock --local http://localhost:8000/v1
121
+ ```
122
+
123
+ For Gemma 4 / vLLM users, add this to `~/.drydock/config.toml` to drop
124
+ the system prompt bloat:
125
+
126
+ ```toml
127
+ slim_system_prompt = true
128
+ ```
129
+
130
+ ## Per-Project Instructions
131
+
132
+ DryDock loads instructions from these files in the project root, in
133
+ order:
134
+
135
+ - **AGENTS.md** — Cross-tool standard (recommended). Same file works
136
+ with Claude Code, opencode, drydock, Aider, and other coding agents.
137
+ - **DRYDOCK.md** — Legacy / drydock-only. Kept for backward compat;
138
+ prefer AGENTS.md for new projects.
139
+ - **.drydock/rules/*.md** — Modular rules
140
+
141
+ Auto-created if none exist. AGENTS.md is essential for devstral
142
+ (it loops without one) but Gemma 4 works without it.
143
+
144
+ ## Recent fixes (April 2026)
145
+
146
+ The user-pain debugging arc surfaced a string of issues that the old
147
+ test harnesses couldn't catch. All committed in source and live in
148
+ PyPI v2.6.25 (or queued for v2.6.26):
149
+
150
+ - **Hard-block duplicate writes after 3 attempts** — narrow exception
151
+ to "no blocking" for pure no-op work. Verified: codec went from
152
+ FAIL (4× `__init__.py` loop, ignored STOP interrupt, broken --help)
153
+ → PASS (131 s, 10 writes, no loops, --help works).
154
+ - **`slim_system_prompt`** — drops the inlined tool prompt files +
155
+ skills + subagents lists from the system prompt (~10K → ~3K tokens
156
+ for Gemma 4). Fixed the dead-silence-on-first-turn issue. Verified:
157
+ todo_list FAIL (0 messages in 121 s) → PASS (38 messages in 115 s).
158
+ - **Trust dialog auto-dismissal in shakedown.py** — drydock pops a
159
+ blocking "Trust this folder?" modal on unfamiliar directories. The
160
+ harness now detects and answers it.
161
+ - **PRD reset between runs** — the model edits PRD.md across sessions
162
+ (adds "✅ Completed" tables, chat-style filler). The harness restores
163
+ from `PRD.master.md` automatically, with the canary fixture at
164
+ `tests/fixtures/doc_qa_system_prd.md`.
165
+ - **`_task_manager.py` rename** — TaskCreate/Update/List were a duplicate
166
+ task system that confused Gemma 4 into hanging. Underscore prefix
167
+ excludes them from tool discovery.
168
+ - **`auto_release.sh` fail-loud on token errors** — the GitHub deploy
169
+ step was using `2>/dev/null` so an expired token silently skipped the
170
+ push. The remote was 287 commits behind for ~2 days before anyone
171
+ noticed.
172
+ - **Loop detection wired up** — `_check_tool_call_repetition()` was
173
+ defined but never actually called from anywhere. Now fires from
174
+ `_handle_tool_response()` and injects an advisory nudge.
175
+ - **`_truncate_old_tool_results()`** — proactive shrinkage of stale
176
+ `read_file` outputs to keep context small as sessions grow.
177
+
178
+ ## Roadmap
179
+
180
+ ### Near-term
181
+ - Confirm 8-10/10 stable pass rate on the 10-project shakedown suite
182
+ with `slim_system_prompt` + hard block (variance run in progress)
183
+ - Per-model `auto_compact_threshold` (current default of 200K is
184
+ higher than Gemma 4's 131K max context, so it never fires)
185
+ - Streamline the system prompt further: drop the universal sections
186
+ that don't apply to local-model agents
187
+ - Investigate why some test_projects PRDs pass on one run and loop on
188
+ the next — variance is the rule with Gemma 4
189
+
190
+ ### Medium-term
191
+ - Per-model knobs: `slim_system_prompt`, `thinking`, tool exclusion
192
+ list, `auto_compact_threshold`
193
+ - A second deployment target so PyPI failures don't lose history
194
+ - Replace the old `tui_test.py` and `core_tests_real.sh` entirely;
195
+ shakedown.py is the only honest test
196
+ - Token cost dashboard so first-turn prefill regressions are caught
197
+ before they hit users
198
+
199
+ ### Long-term
200
+ - Support larger models as hardware improves
201
+ - Plugin marketplace for custom tools/skills
202
+ - Web dashboard for monitoring long runs
203
+ - Multi-model routing (different models for different tasks)
204
+
205
+ ## Architecture Notes
206
+
207
+ See [CLAUDE.md](CLAUDE.md) for technical details, file locations,
208
+ constraints, lessons learned, and the development workflow including
209
+ the `.pause_auto_release` / `.pause_watchdog` flags you'll want during
210
+ manual debugging.
211
+
212
+ ## Legal
213
+
214
+ All code is original or forked from Apache 2.0 mistral-vibe.
215
+ Architecture improvements are standard design patterns implemented from
216
+ scratch. No proprietary code copied.
@@ -43,6 +43,7 @@ class BuiltinAgentName(StrEnum):
43
43
  EXPLORE = "explore"
44
44
  DIAGNOSTIC = "diagnostic"
45
45
  PLANNER = "planner"
46
+ BUILDER = "builder"
46
47
 
47
48
 
48
49
  @dataclass(frozen=True)
@@ -223,6 +224,34 @@ PLANNER = AgentProfile(
223
224
  },
224
225
  )
225
226
 
227
+ BUILDER = AgentProfile(
228
+ name=BuiltinAgentName.BUILDER,
229
+ display_name="Builder",
230
+ description=(
231
+ "Subagent that creates an entire Python package from a PRD. Use this "
232
+ "when the user gives you a PRD with 4+ files to write — delegating "
233
+ "keeps the main agent's context small and lets the builder iterate "
234
+ "in its own scratch space. Has read_file, write_file, search_replace, "
235
+ "glob, and bash. Returns a short summary listing the files created "
236
+ "and whether `python3 -m <pkg> --help` worked. Up to 40 turns."
237
+ ),
238
+ safety=AgentSafety.DESTRUCTIVE,
239
+ agent_type=AgentType.SUBAGENT,
240
+ max_turns=40,
241
+ overrides={
242
+ "enabled_tools": [
243
+ "read_file", "write_file", "search_replace",
244
+ "glob", "grep", "bash",
245
+ ],
246
+ "system_prompt_id": "builder",
247
+ "tools": {
248
+ "write_file": {"permission": "always"},
249
+ "search_replace": {"permission": "always"},
250
+ "bash": {"permission": "always"},
251
+ },
252
+ },
253
+ )
254
+
226
255
  BUILTIN_AGENTS: dict[str, AgentProfile] = {
227
256
  BuiltinAgentName.DEFAULT: DEFAULT,
228
257
  BuiltinAgentName.PLAN: PLAN,
@@ -231,4 +260,5 @@ BUILTIN_AGENTS: dict[str, AgentProfile] = {
231
260
  BuiltinAgentName.EXPLORE: EXPLORE,
232
261
  BuiltinAgentName.DIAGNOSTIC: DIAGNOSTIC,
233
262
  BuiltinAgentName.PLANNER: PLANNER,
263
+ BuiltinAgentName.BUILDER: BUILDER,
234
264
  }
@@ -305,6 +305,14 @@ class VibeConfig(BaseSettings):
305
305
  include_model_info: bool = True
306
306
  include_project_context: bool = True
307
307
  include_prompt_detail: bool = True
308
+ # When True, the system prompt drops the inlined per-tool prompt files
309
+ # (~6500 tokens for the 24 builtin tools) AND the available skills /
310
+ # subagents listings. The model still receives the OpenAI tool function
311
+ # schemas via the `tools` field of the API call. Recommended for local
312
+ # models like Gemma 4 where every prefill token costs ~7-12 ms and the
313
+ # bloated default system prompt (~10K tokens) causes 60-120s first-turn
314
+ # latency. Defaults False for backward compatibility.
315
+ slim_system_prompt: bool = False
308
316
  enable_update_checks: bool = True
309
317
  enable_auto_update: bool = True
310
318
  enable_notifications: bool = True
@@ -0,0 +1,45 @@
1
+ You are the Builder subagent. Your job is to build an entire Python package
2
+ from a PRD with NO further input from the user.
3
+
4
+ You have these tools and nothing else:
5
+ read_file, write_file, search_replace, glob, grep, bash
6
+
7
+ Workflow
8
+
9
+ 1. Read PRD.md (or the spec file you were pointed at).
10
+ 2. Create EVERY file the PRD lists. Start with __init__.py and __main__.py,
11
+ then the modules they import from. Use write_file once per file with the
12
+ COMPLETE contents. Use ABSOLUTE imports: `from package_name.module import X`,
13
+ never relative imports.
14
+ 3. After writing all files, run `python3 -m <package_name> --help` once.
15
+ 4. If --help fails, read the traceback, identify the file/line, fix it with
16
+ search_replace, then re-run `--help`.
17
+ 5. If a subcommand from the PRD is mentioned, run it once to verify it works.
18
+ 6. STOP after the package executes cleanly. Do not test edge cases the PRD
19
+ does not require. Do not refactor.
20
+
21
+ Hard rules
22
+
23
+ - One write_file per file. Never write the same file twice unless you're
24
+ fixing a verified bug. The framework will hard-block a third identical
25
+ no-op write — if you see "BLOCKED:" in a tool result, write a different
26
+ file or run bash, never the same one again.
27
+ - Every file you `import .X` from MUST be created. The framework will warn
28
+ you if `__init__.py` references a module that doesn't exist on disk.
29
+ - `__main__.py` MUST actually CALL the entry function:
30
+ from package.cli import main
31
+ if __name__ == "__main__":
32
+ main()
33
+ Importing `main` without calling it produces a silent-exit package.
34
+ - Never read a file you wrote yourself in this session — you already know
35
+ what's in it. Reading wastes context.
36
+ - Never run `pytest` or write tests unless the PRD explicitly asks for tests.
37
+ - Never `pip install` anything unless the PRD names a third-party dependency
38
+ AND you've verified it isn't already importable.
39
+
40
+ Result
41
+
42
+ When you stop, your final tool call should be a `bash` that ran
43
+ `python3 -m <pkg> --help` and exited 0. The framework summarizes your run
44
+ back to the main agent automatically — you do NOT need to write a summary
45
+ yourself.
@@ -0,0 +1,64 @@
1
+ You are DryDock, a CLI coding agent. You write code, fix bugs, and build projects.
2
+
3
+ ACT IMMEDIATELY. Your FIRST response must be a tool call — not text. Do NOT explain, plan, or ask. Call a tool NOW.
4
+
5
+ Your tools: read_file, write_file, search_replace, grep, glob, bash, task.
6
+
7
+ DELEGATION (only for genuinely large tasks)
8
+
9
+ For tasks that need you to write 6+ source files OR have subdirectories
10
+ (e.g. "build the X package from PRD.md" with multiple subpackages),
11
+ DELEGATE the build to a subagent so the main agent's context stays small.
12
+ The Gemma 4 main loop slows down with bigger context — subagents work in
13
+ their own scratch space.
14
+
15
+ task(agent="builder", task="Read PRD.md and build the entire <pkg> package. "
16
+ "Write every file the PRD lists. Verify "
17
+ "python3 -m <pkg> --help works. Stop when "
18
+ "the package executes cleanly.")
19
+
20
+ For codebase exploration on an existing repo:
21
+ task(agent="explore", task="Find where <function> is defined")
22
+
23
+ For debugging a test failure or traceback:
24
+ task(agent="diagnostic", task="A bash command failed with this traceback: ... "
25
+ "Find the bug and report the file:line.")
26
+
27
+ For multi-module changes that need a plan first:
28
+ task(agent="planner", task="Plan the change: ...")
29
+
30
+ DO NOT delegate trivial work. Most PRDs are small — build them directly.
31
+ Rules of thumb:
32
+ - 1-5 files, no subdirs → BUILD INLINE. Do not call task.
33
+ - 6+ files OR subdirectories OR multiple subpackages → DELEGATE to builder.
34
+ - Editing an existing file or fixing a known bug → BUILD INLINE.
35
+ - "Where does function X live?" → DELEGATE to explore.
36
+
37
+ When in doubt, build inline. A wasted delegation costs 60-90 seconds of
38
+ extra context loading.
39
+
40
+ Workflow for building from a PRD or spec (when NOT delegating):
41
+ 1. Read the spec file
42
+ 2. Create each file with write_file — start with __init__.py and __main__.py
43
+ 3. After all files, verify with bash: ls package_name/ to confirm all files exist
44
+ 4. Test with bash: python3 -m package_name --help
45
+ 5. Test each subcommand from the PRD to verify it works
46
+ 6. Fix any errors
47
+
48
+ Workflow for fixing bugs:
49
+ 1. Grep for the function/class mentioned
50
+ 2. Read the source file
51
+ 3. Fix with search_replace
52
+ 4. Verify the fix
53
+
54
+ Rules:
55
+ - Create files immediately. Do not plan or discuss — write code.
56
+ - Use absolute imports for Python packages
57
+ - Always create __init__.py and __main__.py for packages
58
+ - Keep responses under 50 words. Code speaks for itself.
59
+ - NEVER ask "would you like me to proceed" or "shall I continue" — JUST DO IT.
60
+ - After creating/editing a file, move to the next one. Do not stop.
61
+ - Follow the EXACT CLI interface specified in the PRD. Match argument names, subcommands, and flags exactly.
62
+ - Every subcommand in the PRD must have a working handler — not just argparse registration.
63
+ - After creating files, run python3 -m package_name [subcommand] to verify each one works.
64
+ - If a write_file result says "BLOCKED:" you've called it 3+ times with identical content. STOP that path. Write a DIFFERENT file or run bash. Never retry the blocked write.
@@ -258,20 +258,28 @@ def get_universal_system_prompt(
258
258
 
259
259
  if config.include_prompt_detail:
260
260
  static_sections.append(_get_os_system_prompt())
261
- tool_prompts = []
262
- for tool_class in tool_manager.available_tools.values():
263
- if prompt := tool_class.get_tool_prompt():
264
- tool_prompts.append(prompt)
265
- if tool_prompts:
266
- static_sections.append("\n---\n".join(tool_prompts))
267
-
268
- skills_section = _get_available_skills_section(skill_manager)
269
- if skills_section:
270
- static_sections.append(skills_section)
271
-
272
- subagents_section = _get_available_subagents_section(agent_manager)
273
- if subagents_section:
274
- static_sections.append(subagents_section)
261
+
262
+ # slim_system_prompt drops the heaviest static sections — tool
263
+ # prompt files, skills list, subagents list — that bloat the prompt
264
+ # to ~10K tokens for local models. The OpenAI tool function schemas
265
+ # still go to the model via the API `tools` field, so capability
266
+ # is preserved; only the inlined examples and best-practices docs
267
+ # are skipped.
268
+ if not getattr(config, "slim_system_prompt", False):
269
+ tool_prompts = []
270
+ for tool_class in tool_manager.available_tools.values():
271
+ if prompt := tool_class.get_tool_prompt():
272
+ tool_prompts.append(prompt)
273
+ if tool_prompts:
274
+ static_sections.append("\n---\n".join(tool_prompts))
275
+
276
+ skills_section = _get_available_skills_section(skill_manager)
277
+ if skills_section:
278
+ static_sections.append(skills_section)
279
+
280
+ subagents_section = _get_available_subagents_section(agent_manager)
281
+ if subagents_section:
282
+ static_sections.append(subagents_section)
275
283
 
276
284
  # === DYNAMIC SECTIONS (change per project/directory) ===
277
285
  dynamic_sections = []
@@ -51,8 +51,21 @@ class TaskResult(BaseModel):
51
51
 
52
52
 
53
53
  class TaskToolConfig(BaseToolConfig):
54
- permission: ToolPermission = ToolPermission.ASK
55
- allowlist: list[str] = Field(default=[BuiltinAgentName.EXPLORE, BuiltinAgentName.DIAGNOSTIC, BuiltinAgentName.PLANNER])
54
+ # ALWAYS instead of ASK because the subagent is itself sandboxed by
55
+ # its own per-tool permissions (see e.g. BUILDER's overrides). Asking
56
+ # the user to approve every delegation defeats the purpose of subagents
57
+ # — the model can't iterate without blocking on a TUI dialog the
58
+ # automated harness can't dismiss. Per-subagent profiles are the right
59
+ # place to control which tools they're allowed to call.
60
+ permission: ToolPermission = ToolPermission.ALWAYS
61
+ allowlist: list[str] = Field(
62
+ default=[
63
+ BuiltinAgentName.EXPLORE,
64
+ BuiltinAgentName.DIAGNOSTIC,
65
+ BuiltinAgentName.PLANNER,
66
+ BuiltinAgentName.BUILDER,
67
+ ]
68
+ )
56
69
 
57
70
 
58
71
  class Task(
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.6.25"
3
+ version = "2.6.26"
4
4
  description = "Drydock — nautical CLI coding agent"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -78,21 +78,42 @@ $PYTHON -m build 2>/dev/null
78
78
  PYPI_TOKEN=$(cat ~/.config/drydock/pypi_token)
79
79
  $PYTHON -m twine upload dist/drydock_cli-${NEW_VERSION}* -u __token__ -p "$PYPI_TOKEN" 2>/dev/null
80
80
 
81
- # Deploy to GitHub
81
+ # Deploy to GitHub — NOT silent. If the token is invalid this should scream.
82
82
  TMPDIR=$(mktemp -d)
83
- GITHUB_TOKEN=$(cat ~/.config/drydock/github_token)
84
- git clone --depth 1 "https://${GITHUB_TOKEN}@github.com/fbobe321/drydock.git" "$TMPDIR/repo" 2>/dev/null
85
- rsync -a --delete \
86
- --exclude='.git' --exclude='.github/workflows' --exclude='logs/' \
87
- --exclude='__pycache__/' --exclude='*.pyc' --exclude='.pytest_cache/' \
88
- --exclude='*.egg-info/' --exclude='dist/' \
89
- "$DRYDOCK/" "$TMPDIR/repo/"
90
- cd "$TMPDIR/repo"
91
- git add -A
92
- git -c user.name="Drydock Deploy" -c user.email="deploy@drydock" \
93
- commit -m "v$NEW_VERSION: Auto-release" 2>/dev/null
94
- git push 2>/dev/null
95
- rm -rf "$TMPDIR"
83
+ GITHUB_TOKEN=$(tr -d '\n' < ~/.config/drydock/github_token)
84
+ if ! curl -s -m 10 -o /dev/null -w "%{http_code}" \
85
+ -H "Authorization: token ${GITHUB_TOKEN}" \
86
+ https://api.github.com/user | grep -q "^200$"; then
87
+ echo "[$(date)] ERROR: GitHub token at ~/.config/drydock/github_token is INVALID" >&2
88
+ echo "[$(date)] Skipping GitHub push. Rotate the token to resume deployment." >&2
89
+ rm -rf "$TMPDIR"
90
+ else
91
+ if git clone --depth 1 "https://${GITHUB_TOKEN}@github.com/fbobe321/drydock.git" "$TMPDIR/repo" 2>&1; then
92
+ rsync -a --delete \
93
+ --exclude='.git' --exclude='.github/workflows' --exclude='logs/' \
94
+ --exclude='__pycache__/' --exclude='*.pyc' --exclude='.pytest_cache/' \
95
+ --exclude='*.egg-info/' --exclude='dist/' \
96
+ --exclude='.pause_auto_release' --exclude='log_analyzer/' \
97
+ "$DRYDOCK/" "$TMPDIR/repo/"
98
+ cd "$TMPDIR/repo"
99
+ git remote set-url origin "https://${GITHUB_TOKEN}@github.com/fbobe321/drydock.git"
100
+ git add -A
101
+ if git -c user.name="Drydock Deploy" -c user.email="deploy@drydock" \
102
+ commit -m "v$NEW_VERSION: Auto-release"; then
103
+ if git push origin main; then
104
+ echo "[$(date)] GitHub push: OK"
105
+ else
106
+ echo "[$(date)] ERROR: GitHub push FAILED (token may lack write scope)" >&2
107
+ fi
108
+ else
109
+ echo "[$(date)] GitHub commit: no changes (already in sync)"
110
+ fi
111
+ rm -rf "$TMPDIR"
112
+ else
113
+ echo "[$(date)] ERROR: GitHub clone FAILED" >&2
114
+ rm -rf "$TMPDIR"
115
+ fi
116
+ fi
96
117
  cd "$DRYDOCK"
97
118
 
98
119
  # Install on user's env (retry PyPI propagation)