drydock-cli 2.6.85__tar.gz → 2.6.86__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 (598) hide show
  1. drydock_cli-2.6.86/.auto_release.lock +1 -0
  2. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/PKG-INFO +1 -1
  3. drydock_cli-2.6.86/PRD.md +413 -0
  4. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/agent_loop.py +21 -0
  5. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/pyproject.toml +1 -1
  6. drydock_cli-2.6.86/scripts/stress_prompts_tool_agent.txt +222 -0
  7. drydock_cli-2.6.86/scripts/stress_shakedown.py +279 -0
  8. drydock_cli-2.6.85/.auto_release.lock +0 -1
  9. drydock_cli-2.6.85/PRD.md +0 -216
  10. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.claude/scheduled_tasks.lock +0 -0
  11. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.github/CODEOWNERS +0 -0
  12. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  13. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  14. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  15. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.github/workflows/build-and-upload.yml +0 -0
  16. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.github/workflows/ci.yml +0 -0
  17. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.github/workflows/issue-labeler.yml +0 -0
  18. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.github/workflows/release.yml +0 -0
  19. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.gitignore +0 -0
  20. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.pre-commit-config.yaml +0 -0
  21. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.python-version +0 -0
  22. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.typos.toml +0 -0
  23. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.vscode/extensions.json +0 -0
  24. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.vscode/launch.json +0 -0
  25. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.vscode/settings.json +0 -0
  26. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/AGENTS.md +0 -0
  27. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/BASELINE_412.md +0 -0
  28. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/CHANGELOG.md +0 -0
  29. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/CLAUDE.md +0 -0
  30. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/CONTRIBUTING.md +0 -0
  31. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/Drydock_rebrand.md +0 -0
  32. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/LICENSE +0 -0
  33. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/MODEL_SHORTCOMINGS.md +0 -0
  34. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/NOTICE +0 -0
  35. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/OVERNIGHT_REPORT_2026_04_13.md +0 -0
  36. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/README.md +0 -0
  37. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/action.yml +0 -0
  38. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/README.md +0 -0
  39. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results1.tsv +0 -0
  40. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results13.tsv +0 -0
  41. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results14.tsv +0 -0
  42. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results15.tsv +0 -0
  43. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results16.tsv +0 -0
  44. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results17.tsv +0 -0
  45. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results18.tsv +0 -0
  46. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results19.tsv +0 -0
  47. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results2.tsv +0 -0
  48. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results20.tsv +0 -0
  49. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results3.tsv +0 -0
  50. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results4.tsv +0 -0
  51. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results5.tsv +0 -0
  52. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results6.tsv +0 -0
  53. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results7.tsv +0 -0
  54. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results8.tsv +0 -0
  55. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results9.tsv +0 -0
  56. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results_evolved_v1.tsv +0 -0
  57. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/distribution/zed/LICENSE +0 -0
  58. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/distribution/zed/extension.toml +0 -0
  59. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/distribution/zed/icons/mistral_vibe.svg +0 -0
  60. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/docs/README.md +0 -0
  61. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/docs/acp-setup.md +0 -0
  62. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/docs/proxy-setup.md +0 -0
  63. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/__init__.py +0 -0
  64. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/__init__.py +0 -0
  65. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/acp_agent_loop.py +0 -0
  66. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/acp_logger.py +0 -0
  67. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/entrypoint.py +0 -0
  68. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/tools/__init__.py +0 -0
  69. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/tools/base.py +0 -0
  70. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/tools/builtins/bash.py +0 -0
  71. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/tools/builtins/read_file.py +0 -0
  72. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/tools/builtins/search_replace.py +0 -0
  73. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/tools/builtins/todo.py +0 -0
  74. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/tools/builtins/write_file.py +0 -0
  75. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/tools/session_update.py +0 -0
  76. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/utils.py +0 -0
  77. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/__init__.py +0 -0
  78. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/autocompletion/__init__.py +0 -0
  79. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/autocompletion/base.py +0 -0
  80. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/autocompletion/path_completion.py +0 -0
  81. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/autocompletion/slash_command.py +0 -0
  82. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/cli.py +0 -0
  83. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/clipboard.py +0 -0
  84. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/commands.py +0 -0
  85. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/entrypoint.py +0 -0
  86. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/history_manager.py +0 -0
  87. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  88. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  89. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  90. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/terminal_setup.py +0 -0
  91. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/__init__.py +0 -0
  92. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  93. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/app.py +0 -0
  94. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/app.tcss +0 -0
  95. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/external_editor.py +0 -0
  96. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  97. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  98. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  99. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  100. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  101. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  102. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  103. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  104. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  105. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  106. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  107. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  108. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  109. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  110. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  111. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  112. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  113. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  114. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  115. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  116. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  117. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  118. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  119. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  120. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  121. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  122. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  123. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  124. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  125. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  126. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  127. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  128. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  129. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  130. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  131. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  132. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/windowing/history.py +0 -0
  133. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  134. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/windowing/state.py +0 -0
  135. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/update_notifier/__init__.py +0 -0
  136. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  137. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  138. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  139. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  140. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  141. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/update_notifier/update.py +0 -0
  142. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/update_notifier/whats_new.py +0 -0
  143. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/__init__.py +0 -0
  144. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/agents/__init__.py +0 -0
  145. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/agents/manager.py +0 -0
  146. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/agents/models.py +0 -0
  147. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/auth/__init__.py +0 -0
  148. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/auth/crypto.py +0 -0
  149. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/auth/github.py +0 -0
  150. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/__init__.py +0 -0
  151. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/completers.py +0 -0
  152. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  153. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  154. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  155. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  156. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  157. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/fuzzy.py +0 -0
  158. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/path_prompt.py +0 -0
  159. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  160. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/build_orchestrator.py +0 -0
  161. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/config/__init__.py +0 -0
  162. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/config/_settings.py +0 -0
  163. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/config/doctor.py +0 -0
  164. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/config/harness_files/__init__.py +0 -0
  165. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  166. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/config/harness_files/_paths.py +0 -0
  167. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/consultant.py +0 -0
  168. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/drydock_states.py +0 -0
  169. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/hooks.py +0 -0
  170. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/__init__.py +0 -0
  171. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/backend/anthropic.py +0 -0
  172. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/backend/base.py +0 -0
  173. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/backend/factory.py +0 -0
  174. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/backend/generic.py +0 -0
  175. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/backend/mistral.py +0 -0
  176. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  177. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/backend/vertex.py +0 -0
  178. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/exceptions.py +0 -0
  179. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/format.py +0 -0
  180. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/message_utils.py +0 -0
  181. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/types.py +0 -0
  182. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/logger.py +0 -0
  183. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/middleware.py +0 -0
  184. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/output_formatters.py +0 -0
  185. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/paths/__init__.py +0 -0
  186. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/paths/_local_config_walk.py +0 -0
  187. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/paths/_vibe_home.py +0 -0
  188. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/paths/conventions.py +0 -0
  189. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/plan_session.py +0 -0
  190. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/plugins.py +0 -0
  191. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/programmatic.py +0 -0
  192. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/__init__.py +0 -0
  193. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/builder.md +0 -0
  194. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/cli.md +0 -0
  195. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/compact.md +0 -0
  196. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/dangerous_directory.md +0 -0
  197. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/diagnostic.md +0 -0
  198. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/explore.md +0 -0
  199. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/gemma4.md +0 -0
  200. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/planner.md +0 -0
  201. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/project_context.md +0 -0
  202. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/tests.md +0 -0
  203. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/proxy_setup.py +0 -0
  204. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/session/agent_memory.py +0 -0
  205. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/session/checkpoints.py +0 -0
  206. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/session/session_loader.py +0 -0
  207. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/session/session_logger.py +0 -0
  208. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/session/session_migration.py +0 -0
  209. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/session/state_file.py +0 -0
  210. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/session_checker.py +0 -0
  211. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/skills/__init__.py +0 -0
  212. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/skills/manager.py +0 -0
  213. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/skills/models.py +0 -0
  214. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/skills/parser.py +0 -0
  215. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/slug.py +0 -0
  216. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/system_prompt.py +0 -0
  217. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/telemetry/__init__.py +0 -0
  218. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/telemetry/send.py +0 -0
  219. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/teleport/errors.py +0 -0
  220. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/teleport/git.py +0 -0
  221. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/teleport/nuage.py +0 -0
  222. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/teleport/teleport.py +0 -0
  223. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/teleport/types.py +0 -0
  224. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/base.py +0 -0
  225. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/_task_manager.py +0 -0
  226. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  227. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/bash.py +0 -0
  228. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/cron.py +0 -0
  229. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  230. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/glob_tool.py +0 -0
  231. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/grep.py +0 -0
  232. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  233. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/lsp.py +0 -0
  234. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  235. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  236. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/powershell.py +0 -0
  237. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  238. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  239. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  240. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  241. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  242. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  243. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  244. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  245. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  246. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  247. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  248. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  249. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  250. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  251. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/task.md +0 -0
  252. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  253. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  254. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  255. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  256. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  257. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  258. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  259. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/read_file.py +0 -0
  260. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/search_replace.py +0 -0
  261. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/task.py +0 -0
  262. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/todo.py +0 -0
  263. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/tool_search.py +0 -0
  264. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/webfetch.py +0 -0
  265. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/websearch.py +0 -0
  266. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/worktree.py +0 -0
  267. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/write_file.py +0 -0
  268. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/injection_guard.py +0 -0
  269. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/manager.py +0 -0
  270. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/mcp/__init__.py +0 -0
  271. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/mcp/registry.py +0 -0
  272. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/mcp/tools.py +0 -0
  273. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/mcp_sampling.py +0 -0
  274. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/ui.py +0 -0
  275. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/utils.py +0 -0
  276. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/trusted_folders.py +0 -0
  277. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/types.py +0 -0
  278. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/utils.py +0 -0
  279. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/setup/onboarding/__init__.py +0 -0
  280. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/setup/onboarding/base.py +0 -0
  281. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/setup/onboarding/onboarding.tcss +0 -0
  282. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/setup/onboarding/screens/__init__.py +0 -0
  283. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/setup/onboarding/screens/api_key.py +0 -0
  284. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/setup/onboarding/screens/welcome.py +0 -0
  285. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  286. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  287. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/__init__.py +0 -0
  288. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/api-design/SKILL.md +0 -0
  289. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/audit-tests/SKILL.md +0 -0
  290. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/batch/SKILL.md +0 -0
  291. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/commit-code/SKILL.md +0 -0
  292. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/context-summary/SKILL.md +0 -0
  293. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/create-presentation/SKILL.md +0 -0
  294. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/deep-research/SKILL.md +0 -0
  295. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/deploy/SKILL.md +0 -0
  296. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/diff-review/SKILL.md +0 -0
  297. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/doc-gen/SKILL.md +0 -0
  298. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/explain-code/SKILL.md +0 -0
  299. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/explore-code/SKILL.md +0 -0
  300. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/fix-issue/SKILL.md +0 -0
  301. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/git-ops/SKILL.md +0 -0
  302. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/init-project/SKILL.md +0 -0
  303. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/investigate/SKILL.md +0 -0
  304. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/loop/SKILL.md +0 -0
  305. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/migrate/SKILL.md +0 -0
  306. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/perf-analyze/SKILL.md +0 -0
  307. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/plan-impl/SKILL.md +0 -0
  308. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/pr-review/SKILL.md +0 -0
  309. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/refactor/SKILL.md +0 -0
  310. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/regex-help/SKILL.md +0 -0
  311. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/review/SKILL.md +0 -0
  312. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/security-review/SKILL.md +0 -0
  313. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/ship/SKILL.md +0 -0
  314. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/simplify/SKILL.md +0 -0
  315. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/strong-tests/SKILL.md +0 -0
  316. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/test-verify/SKILL.md +0 -0
  317. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/whats_new.md +0 -0
  318. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock-acp.spec +0 -0
  319. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock_terms.md +0 -0
  320. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/flake.lock +0 -0
  321. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/flake.nix +0 -0
  322. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/README.md +0 -0
  323. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/audit_sampler.py +0 -0
  324. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/auto_generate_tests.py +0 -0
  325. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/auto_release.sh +0 -0
  326. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/auto_test_loop.sh +0 -0
  327. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/backup.sh +0 -0
  328. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/bump_version.py +0 -0
  329. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/comprehensive_loop.py +0 -0
  330. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/deploy_to_github.sh +0 -0
  331. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/discover_cli_tools.sh +0 -0
  332. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/evolve_tests.py +0 -0
  333. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/install.sh +0 -0
  334. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/llm_balancer.py +0 -0
  335. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/mega_loop.py +0 -0
  336. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/meta_ralph_loop.py +0 -0
  337. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/monitor_swebench.sh +0 -0
  338. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/monitor_test_battery.sh +0 -0
  339. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/notify_release.py +0 -0
  340. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/oss_task_harness.py +0 -0
  341. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/overnight_agents_test.sh +0 -0
  342. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/port_task.py +0 -0
  343. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/prepare_release.py +0 -0
  344. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/publish_to_pypi.sh +0 -0
  345. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/ralph_loop.py +0 -0
  346. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/session_loop_audit.py +0 -0
  347. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/shakedown.py +0 -0
  348. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/shakedown_interactive.py +0 -0
  349. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/shakedown_regression.sh +0 -0
  350. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/shakedown_suite.sh +0 -0
  351. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/shakedown_variance.sh +0 -0
  352. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/telegram_bot.py +0 -0
  353. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/test_bank.sh +0 -0
  354. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/test_full.sh +0 -0
  355. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/test_smoke.sh +0 -0
  356. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/test_tui_path.py +0 -0
  357. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/tui_test.py +0 -0
  358. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/vllm_failover.sh +0 -0
  359. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/__init__.py +0 -0
  360. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/conftest.py +0 -0
  361. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_acp.py +0 -0
  362. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_agent_thought.py +0 -0
  363. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_bash.py +0 -0
  364. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_compact_session_updates.py +0 -0
  365. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_content.py +0 -0
  366. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_initialize.py +0 -0
  367. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_list_sessions.py +0 -0
  368. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_load_session.py +0 -0
  369. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_multi_session.py +0 -0
  370. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_new_session.py +0 -0
  371. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_proxy_setup_acp.py +0 -0
  372. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_read_file.py +0 -0
  373. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_search_replace.py +0 -0
  374. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_set_config_option.py +0 -0
  375. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_set_mode.py +0 -0
  376. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_set_model.py +0 -0
  377. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_tool_call_session_update.py +0 -0
  378. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_utils.py +0 -0
  379. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_write_file.py +0 -0
  380. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/autocompletion/test_file_indexer.py +0 -0
  381. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/autocompletion/test_fuzzy.py +0 -0
  382. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  383. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  384. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/autocompletion/test_path_completion_controller.py +0 -0
  385. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  386. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/autocompletion/test_slash_command_controller.py +0 -0
  387. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  388. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/backend/__init__.py +0 -0
  389. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/backend/data/__init__.py +0 -0
  390. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/backend/data/fireworks.py +0 -0
  391. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/backend/data/mistral.py +0 -0
  392. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/backend/test_anthropic_adapter.py +0 -0
  393. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/backend/test_backend.py +0 -0
  394. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/backend/test_reasoning_adapter.py +0 -0
  395. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  396. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  397. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  398. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  399. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_bell_notifications.py +0 -0
  400. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_braille_renderer.py +0 -0
  401. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_clipboard.py +0 -0
  402. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_commands.py +0 -0
  403. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_copy_shortcuts.py +0 -0
  404. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_external_editor.py +0 -0
  405. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_no_markup_static.py +0 -0
  406. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_question_app.py +0 -0
  407. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_spinner.py +0 -0
  408. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_switching_mode.py +0 -0
  409. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  410. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  411. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_ui_session_resume.py +0 -0
  412. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_ui_skill_dispatch.py +0 -0
  413. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/textual_ui/__init__.py +0 -0
  414. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/textual_ui/test_session_picker.py +0 -0
  415. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/conftest.py +0 -0
  416. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_agents.py +0 -0
  417. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_auth_crypto.py +0 -0
  418. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_auth_github.py +0 -0
  419. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_config_load_dotenv.py +0 -0
  420. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_config_paths.py +0 -0
  421. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_config_resolution.py +0 -0
  422. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_file_logging.py +0 -0
  423. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_plan_session.py +0 -0
  424. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_proxy_setup.py +0 -0
  425. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_slug.py +0 -0
  426. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_telemetry_send.py +0 -0
  427. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_teleport_git.py +0 -0
  428. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_teleport_nuage.py +0 -0
  429. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_teleport_service.py +0 -0
  430. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_trusted_folders.py +0 -0
  431. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_utils.py +0 -0
  432. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/e2e/common.py +0 -0
  433. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/e2e/conftest.py +0 -0
  434. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/e2e/mock_server.py +0 -0
  435. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  436. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/e2e/test_cli_tui_streaming.py +0 -0
  437. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  438. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/fixtures/doc_qa_system_prd.md +0 -0
  439. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/mock/__init__.py +0 -0
  440. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/mock/mock_backend_factory.py +0 -0
  441. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/mock/mock_entrypoint.py +0 -0
  442. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/mock/utils.py +0 -0
  443. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/onboarding/test_run_onboarding.py +0 -0
  444. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/onboarding/test_ui_onboarding.py +0 -0
  445. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/session/test_session_loader.py +0 -0
  446. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/session/test_session_logger.py +0 -0
  447. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/session/test_session_migration.py +0 -0
  448. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/skills/conftest.py +0 -0
  449. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/skills/test_manager.py +0 -0
  450. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/skills/test_models.py +0 -0
  451. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/skills/test_parser.py +0 -0
  452. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  453. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  454. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  455. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  456. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  457. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  458. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  459. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  460. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  461. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  462. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  463. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  464. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  465. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  466. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  467. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  468. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  469. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  470. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  471. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  472. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  473. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  474. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  475. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  476. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  477. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  478. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  479. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  480. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  481. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  482. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  483. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  484. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  485. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  486. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  487. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  488. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  489. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  490. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  491. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  492. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  493. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  494. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  495. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  496. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  497. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  498. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  499. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  500. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  501. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  502. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  503. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  504. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  505. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  506. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  507. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  508. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  509. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  510. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  511. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  512. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/base_snapshot_test_app.py +0 -0
  513. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/conftest.py +0 -0
  514. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/snap_compare.py +0 -0
  515. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  516. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  517. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  518. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  519. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  520. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  521. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  522. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  523. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  524. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  525. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  526. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  527. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  528. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  529. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/stubs/fake_backend.py +0 -0
  530. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/stubs/fake_client.py +0 -0
  531. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/stubs/fake_tool.py +0 -0
  532. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_agent_auto_compact.py +0 -0
  533. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_agent_backend.py +0 -0
  534. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_agent_observer_streaming.py +0 -0
  535. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_agent_stats.py +0 -0
  536. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_agent_tasks.py +0 -0
  537. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_agent_tool_call.py +0 -0
  538. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_agents.py +0 -0
  539. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_bank_build.py +0 -0
  540. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_bank_debug.py +0 -0
  541. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_bank_multiagent.py +0 -0
  542. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_bank_prd.py +0 -0
  543. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_bank_prd_extended.py +0 -0
  544. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_bank_tools.py +0 -0
  545. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_bank_update.py +0 -0
  546. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_build_projects.py +0 -0
  547. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_cli_programmatic_preload.py +0 -0
  548. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_current_bugs.py +0 -0
  549. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_drydock_regression.py +0 -0
  550. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_drydock_tasks.py +0 -0
  551. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_full_regression.py +0 -0
  552. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_history_manager.py +0 -0
  553. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_integration.py +0 -0
  554. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_loop_detection.py +0 -0
  555. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_message_id.py +0 -0
  556. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_message_merging.py +0 -0
  557. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_middleware.py +0 -0
  558. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_multi_agent.py +0 -0
  559. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_real_failures.py +0 -0
  560. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_real_issues.py +0 -0
  561. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_real_workflow.py +0 -0
  562. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_reasoning_content.py +0 -0
  563. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_smoke.py +0 -0
  564. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_system_prompt.py +0 -0
  565. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_tagged_text.py +0 -0
  566. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_tool_args.py +0 -0
  567. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_ui_external_editor.py +0 -0
  568. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_ui_input_history.py +0 -0
  569. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_user_issues.py +0 -0
  570. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_workloads.py +0 -0
  571. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/testbank_helpers.py +0 -0
  572. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_ask_user_question.py +0 -0
  573. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_bash.py +0 -0
  574. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_exit_plan_mode.py +0 -0
  575. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_grep.py +0 -0
  576. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_invoke_context.py +0 -0
  577. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_manager_get_tool_config.py +0 -0
  578. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_mcp.py +0 -0
  579. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_mcp_sampling.py +0 -0
  580. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_task.py +0 -0
  581. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_ui_bash_execution.py +0 -0
  582. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_webfetch.py +0 -0
  583. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_websearch.py +0 -0
  584. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  585. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  586. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/update_notifier/test_do_update.py +0 -0
  587. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  588. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/update_notifier/test_github_update_gateway.py +0 -0
  589. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  590. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/update_notifier/test_ui_update_notification.py +0 -0
  591. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/update_notifier/test_update_use_case.py +0 -0
  592. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/update_notifier/test_whats_new.py +0 -0
  593. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/uv.lock +0 -0
  594. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/worked_examples/README.md +0 -0
  595. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/worked_examples/cli_subcommand_dispatch.py +0 -0
  596. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/worked_examples/lookup.json +0 -0
  597. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/worked_examples/sql_parser.py +0 -0
  598. {drydock_cli-2.6.85 → drydock_cli-2.6.86}/worked_examples/tree_walking_interpreter.py +0 -0
@@ -0,0 +1 @@
1
+ 1454502
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.6.85
3
+ Version: 2.6.86
4
4
  Summary: Local-first CLI coding agent — tested with Gemma 4 26B via vLLM
5
5
  Project-URL: Homepage, https://github.com/fbobe321/drydock
6
6
  Project-URL: Repository, https://github.com/fbobe321/drydock
@@ -0,0 +1,413 @@
1
+ # DryDock — Local CLI Coding Agent
2
+
3
+ **Repository:** https://github.com/fbobe321/drydock
4
+ **PyPI:** https://pypi.org/project/drydock-cli/ (v2.6.85)
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.85 on PyPI. Major refactor wave (v2.6.79 → v2.6.85)
18
+ moved the loop-prevention model from hard `ToolError` blocks to
19
+ advisory-result + structural prevention (read-before-write, read dedup,
20
+ terse results, token sanitization, system-reminder framing). Most of
21
+ this is borrowed wholesale from a reading of the Claude Code source
22
+ tree — ideas, not code.
23
+ - **Users can:** build projects from PRDs, fix bugs, review code, refactor
24
+ — through the TUI only (headless mode is gone)
25
+
26
+ ## How drydock is tested now
27
+
28
+ The `scripts/tui_test.py` and `core_tests_real.sh` harnesses count tool
29
+ calls and `--help` exit codes. They reported 80% pass rates while real
30
+ users saw drydock loop, hang, and produce broken code. **Both are
31
+ deprecated** in favour of `scripts/shakedown.py`, which:
32
+
33
+ - Drives the real `drydock` TUI via pexpect (no headless code paths)
34
+ - Polls the live `~/.vibe/logs/session/session_<id>/messages.jsonl` in
35
+ parallel to see what the model is actually doing
36
+ - Watches for **write loops** (≥3 identical-content writes to a path),
37
+ **hallucinated tool names** that hang the session, **search_replace
38
+ failure cascades**, and **dead silence** (no new messages of any kind
39
+ for 120 seconds)
40
+ - Types simulated `STOP` interrupts when it detects loops and tracks
41
+ whether the model OBEYS them
42
+ - Distinguishes three end-states: active turn, model declared done
43
+ (text response with no tool call), and dead silence
44
+ - Resets the cwd between runs (restores `PRD.md` from `PRD.master.md`,
45
+ wipes the package dir and stale data dirs) so contamination from one
46
+ run can't poison the next
47
+ - Auto-handles the "Trust this folder?" dialog drydock pops on new
48
+ directories
49
+ - **Pass criteria are user-perceptible**: no loops, no ignored
50
+ interrupts, no search_replace cascades, the package must actually
51
+ execute, session must finish under the time budget
52
+
53
+ Run a single project:
54
+
55
+ ```bash
56
+ PYTHONUNBUFFERED=1 python3 -u scripts/shakedown.py \
57
+ --cwd /data3/test_drydock \
58
+ --prompt "review the PRD and get started" \
59
+ --pkg doc_qa_system
60
+ ```
61
+
62
+ Run the 10-project core suite (or 3-run variance suite for stability):
63
+
64
+ ```bash
65
+ bash scripts/shakedown_suite.sh # one run, ~25 min
66
+ bash scripts/shakedown_variance.sh 3 # three runs, ~75 min
67
+ ```
68
+
69
+ For longer-form regression (what the single-prompt suite cannot catch):
70
+
71
+ ```bash
72
+ # 24-step interactive conversation per medium-hard PRD (30+ min each)
73
+ python3 scripts/shakedown_interactive.py \
74
+ --cwd /data3/drydock_test_projects/403_tool_agent \
75
+ --pkg tool_agent
76
+ ```
77
+
78
+ The single-prompt suite catches block-loops, hallucinated tools, and
79
+ first-turn dead silence. Interactive shakedown exposes slow-drift
80
+ oscillation, thinking-stall between file writes, search_replace
81
+ cascades that only appear after several edits, and the cost of
82
+ echoing back content the model already wrote. Both are needed.
83
+
84
+ ## Features
85
+
86
+ ### Core
87
+ - 24 builtin tools (bash, grep, read_file, write_file, search_replace,
88
+ glob, todo, ask_user_question, invoke_skill, worktree, etc.)
89
+ - 7 bundled skills (/investigate, /review, /ship, /batch, /simplify,
90
+ /deep-research, /create-presentation)
91
+ - Multi-agent delegation (explore, diagnostic, planner subagents)
92
+ - Plan→Edit workflow (Mistral's designed pattern)
93
+ - AGENTS.md support (cross-tool standard, auto-created — same file works
94
+ with Claude Code, opencode, drydock, Aider)
95
+ - Textual TUI with wave spinner, message queuing
96
+
97
+ ### Local Model Support
98
+ - `/setup-model` command (vLLM, Ollama, LM Studio, custom)
99
+ - `--local` CLI flag for quick setup
100
+ - Auto-detect model name from server
101
+ - **`slim_system_prompt`** config knob — drops the ~10K-token inlined
102
+ tool prompt files + skills + subagents lists for local models that
103
+ pay 7-12 ms per prefill token. Verified on Gemma 4: takes
104
+ first-turn latency from 60-120 s to 10-20 s on the dead-silence cases.
105
+
106
+ ### Safety — advisory only, never blocks the TUI
107
+ After a regression in v2.6.79/v2.6.80 where hard `ToolError` blocks
108
+ caused the tool to refuse legitimate retries and spin the TUI in its
109
+ own block-loop, all loop-breakers are now structured returns with
110
+ guidance messages. Nothing here can stop the session. The full rule
111
+ is codified in memory as
112
+ `feedback_no_tool_errors_for_loop_detection.md`.
113
+
114
+ - Tool permission system (always/ask/never per tool)
115
+ - Loop detection wired into `_handle_tool_response()` — injects an
116
+ advisory nudge when the same tool call repeats, never stops the
117
+ session
118
+ - **Read-before-Write / Read-before-Edit** (Claude Code tool contract).
119
+ `write_file` and `search_replace` on an existing file the model has
120
+ NOT read this session return a structured no-op with a
121
+ `<system-reminder>` telling it to `read_file` first. After a
122
+ successful write or read, the session's `read_file_state` dict is
123
+ updated so chained operations pass without a re-read. mtime-based
124
+ staleness check also triggers the advisory when the file changed
125
+ on disk between the read and the write.
126
+ - **Read dedup stub** — `read_file` on a path+offset+limit with
127
+ unchanged mtime since the earlier read in this session returns a
128
+ `<system-reminder>` pointing to the earlier tool_result instead of
129
+ burning context re-reading.
130
+ - **Dedup advisories** on `write_file` — escalating text if the model
131
+ sends identical content to an existing file, including directory
132
+ listing and per-path write count. All advisory, no ToolError.
133
+ - **Syntax-error context** — when a Python write fails `ast.parse`, the
134
+ warning embeds ±3 surrounding source lines so the model can see the
135
+ structural mistake, not just the error message. Consecutive-error
136
+ counter escalates guidance at 2+ and 3+ but never blocks.
137
+ - **`<system-reminder>` framing** on every high-signal advisory — the
138
+ model attends to these more consistently than plain result text.
139
+ - **Centralized `safe_parse_tool_args`** — handles Gemma-4 leaked
140
+ thinking-token markers (`<|channel>...`, `<|tool_call>...`, orphan
141
+ `\Fix`-style escapes that abort the stdlib JSON decoder). Used at
142
+ every tool-arg JSON decode site so no call path can crash on leaked
143
+ escapes. Falls through to `{"_parse_error": "..."}` as the last
144
+ resort.
145
+ - **Terse tool results** (Claude Code pattern). `write_file` returns
146
+ just `"File X updated successfully (N bytes)."` — no echo of
147
+ `args.content`. A 3KB write no longer adds 3KB of redundant context.
148
+ Prevents the "model re-reads what it just wrote" class of loops.
149
+ - **Token-level loop-breaker** in agent_loop — temperature bump +
150
+ `frequency_penalty` + `presence_penalty` + fresh seed when
151
+ `_check_tool_call_repetition()` detects repeat signatures. Heavier
152
+ bumps at FORCE_STOP threshold.
153
+ - **Gemma-4 auto-disabled tools** — `task` (subagent delegation),
154
+ `task_create`, `task_update`, `task_list`, `ask_user_question`,
155
+ `invoke_skill`, `tool_search`. Model mixed `task` up with `todo`
156
+ and the subagent response leaked raw thinking tokens that hung the
157
+ parent session. Filtered out in `ToolManager.available_tools` when
158
+ the active model name contains "gemma".
159
+ - **`_check_main_module_entry()`** catches `__main__.py` files that
160
+ import `main` but never call it (the codec silent-exit bug)
161
+ - **`_check_missing_sibling_imports()`** catches `from .x import Y`
162
+ when `x.py` doesn't exist on disk yet (the minivc unimportable-
163
+ package bug)
164
+ - **`_check_stub_classes()`** catches the lang_interp anti-pattern
165
+ where the model writes `class Interpreter: pass` inline in cli.py
166
+ to silence ModuleNotFoundError instead of writing the real module
167
+ - **`_check_bare_raise_outside_except()`** — surfaces bare `raise`
168
+ in function bodies outside an except handler (real bug from the
169
+ ACE v2 build)
170
+ - API error auto-recovery (retry after 10s)
171
+ - `auto_release.sh` and `watchdog.sh` cron jobs respect pause flags
172
+ at `.pause_auto_release` and `.pause_watchdog` for manual debugging
173
+
174
+ ### Read-only bash auto-accept
175
+ The bash tool's default allowlist now covers most read-only commands
176
+ without requiring per-user configuration:
177
+
178
+ - File/dir inspection: `ls`, `cat`, `head`, `tail`, `wc`, `file`,
179
+ `stat`, `pwd`, `which`, `basename`, `dirname`, `realpath`, `readlink`
180
+ - Search: `grep`, `rg`, `fd`, `fdfind`, `ag`, `find`, `tree`
181
+ - Text processing: `diff`, `cmp`, `sort`, `uniq`, `awk`, `cut`, `tr`
182
+ - Git read-only: `git diff`, `git log`, `git status`, `git show`,
183
+ `git branch`, `git ls-files`, `git grep`, `git remote`,
184
+ `git rev-parse`, `git blame`, `git config --get`, `git tag`,
185
+ `git stash list`
186
+ - System info: `date`, `id`, `hostname`, `env`, `printenv`, `du`,
187
+ `df`, `ps`, `free`, `uptime`, `uname`, `whoami`
188
+ - Python dev: `pip install/list/show/freeze/check`, `conda
189
+ list/info/env list`, `python -c`, `python -m pip`, `pytest`, `make`,
190
+ `tox`
191
+
192
+ Bash commands are AST-split so pipes/chains are each checked
193
+ individually — `ls | rm` still blocks on the `rm`.
194
+
195
+ ### Config debt management
196
+ Package defaults ship in code, but user `~/.drydock/config.toml` is
197
+ mutable. When `pip install -U drydock-cli` adds new defaults (new
198
+ allowlist entries, etc.), users who'd customized the field previously
199
+ lost the new additions. Fixed two ways:
200
+
201
+ - **Option A — auto-merge** (`bash.allowlist`, `bash.denylist`,
202
+ `bash.denylist_standalone`): user values are UNIONED with package
203
+ defaults at load time, so new package defaults auto-propagate.
204
+ Escape hatch: include `"__override__"` in the list to use it
205
+ verbatim and skip defaults.
206
+ - **Option C — `drydock --doctor`** command shows drift vs. current
207
+ defaults in a rich table. `drydock --doctor --fix` rewrites
208
+ `config.toml` to union missing defaults with a `.bak` backup.
209
+ Verified end-to-end on the project maintainer's config: 51 missing
210
+ defaults detected, applied, re-run reports clean.
211
+
212
+ ## Install
213
+
214
+ ```bash
215
+ pip install drydock-cli
216
+ drydock --local http://localhost:8000/v1
217
+ ```
218
+
219
+ For Gemma 4 / vLLM users, add this to `~/.drydock/config.toml` to drop
220
+ the system prompt bloat:
221
+
222
+ ```toml
223
+ slim_system_prompt = true
224
+ ```
225
+
226
+ ## Per-Project Instructions
227
+
228
+ DryDock loads instructions from these files in the project root, in
229
+ order:
230
+
231
+ - **AGENTS.md** — Cross-tool standard (recommended). Same file works
232
+ with Claude Code, opencode, drydock, Aider, and other coding agents.
233
+ - **DRYDOCK.md** — Legacy / drydock-only. Kept for backward compat;
234
+ prefer AGENTS.md for new projects.
235
+ - **.drydock/rules/*.md** — Modular rules
236
+
237
+ Auto-created if none exist. AGENTS.md is essential for devstral
238
+ (it loops without one) but Gemma 4 works without it.
239
+
240
+ ## Recent fixes (April 13–14, 2026)
241
+
242
+ ### v2.6.79 (April 13) — syntax-thrash loop-breaker
243
+ Added ToolError on 3rd consecutive syntax-error write to same file.
244
+ Caught color_converter's 38-consecutive-bad-writes case in a single
245
+ shakedown run.
246
+
247
+ ### v2.6.80 (April 14) — cumulative path-write gate
248
+ Added ToolError at 5 writes to the same path regardless of content,
249
+ to catch the write_file ↔ search_replace ping-pong pattern in minivc
250
+ (model wrote `commands/__init__.py` 11 times, each clobbering a
251
+ search_replace fix).
252
+
253
+ ### v2.6.81 (April 14) — Gemma 4 auto-disable + leak-token stripping
254
+ - `ToolManager.available_tools` now filters `task`/`todo`-family tools
255
+ when the active model name matches "gemma" — Gemma 4 confuses
256
+ `task` (subagent) with `todo` and the subagent response leaks raw
257
+ `<|tool_call>` markers that hang the parent session.
258
+ - Broadened thinking-token stripping in `process_api_response_message`:
259
+ handles bare `<|tool_call>...<tool_call|>`, stray `<|"|>`, unpaired
260
+ `<|...|>` from stream truncation, and nukes content to `None` when
261
+ the residue is just `call:toolname{...}` garbage so the agent
262
+ loop's empty-content nudge can fire.
263
+
264
+ ### v2.6.82 (April 14) — REVERT all hard blocks to advisory
265
+ User reported: "it is trying to write a file or update something,
266
+ blocked... these loops make the tool unusable... little short tasks
267
+ you don't see it. Do anything that takes a while, many steps, and
268
+ it can't get through it."
269
+
270
+ The v2.6.79/v2.6.80 ToolErrors were making long tasks worse — model
271
+ got BLOCKED on one write, panicked, retried the same write, got
272
+ BLOCKED again, spun until timeout. Per the existing CLAUDE.md rule
273
+ "safety mechanisms must be advisory not blocking," reverted all
274
+ loop-breaker ToolErrors to structured WriteFileResult /
275
+ SearchReplaceResult / BashResult with strong guidance text. Memory
276
+ updated: `feedback_no_tool_errors_for_loop_detection.md`.
277
+
278
+ Also shipped in v2.6.82:
279
+ - `safe_parse_tool_args` sanitizer for `tool_call.arguments` —
280
+ Gemma-4 leak tokens inside JSON strings (e.g. `"<|\Fix"`) make
281
+ `\F` an invalid JSON escape and crash the decoder.
282
+ - TUI reasoning widget no longer finalizes on `ToolCallEvent` — a
283
+ turn with N tool calls was producing N stacked "Thought" widgets.
284
+ Now one "Thought" spans the full turn.
285
+
286
+ ### v2.6.83 (April 14) — Claude Code tool contract
287
+ Second review of `/data3/claude-code/src` produced the real loop
288
+ fixes. Borrowed patterns (ideas only, no code copied):
289
+
290
+ - `read_file_state` dict on `AgentLoop`, passed through `InvokeContext`
291
+ to every tool. Session-scoped map of path → `{content, timestamp,
292
+ offset, limit}`.
293
+ - Read-before-Write in `write_file`: overwriting an existing unread
294
+ file yields a structured no-op with a `<system-reminder>` telling
295
+ the model to `read_file` first.
296
+ - Read-before-Edit in `search_replace`: same contract for SR.
297
+ - Read dedup stub in `read_file`: same path+offset+limit with
298
+ unchanged mtime returns `<system-reminder>` pointing to earlier
299
+ tool_result instead of re-reading.
300
+ - `<system-reminder>` framing on dedup/syntax/oscillation advisories.
301
+ - Read-only bash auto-accept: 30+ new safe commands in the default
302
+ allowlist (`rg`, `grep`, `fd`, `git show`/`branch`/`ls-files`, etc.).
303
+ - Config A + C: `bash.allowlist`/`denylist` auto-merge user values
304
+ with package defaults on load; `drydock --doctor [--fix]` command
305
+ reports and repairs config drift.
306
+
307
+ ### v2.6.84 (April 14) — entrypoint hotfix
308
+ My duplicate `from ... import init_harness_files_manager` inside the
309
+ `--doctor` branch in `entrypoint.py` shadowed the module-level import
310
+ as a local variable, triggering `UnboundLocalError` on every
311
+ non-doctor drydock invocation. Broke v2.6.83 completely. Fixed by
312
+ dropping the redundant import.
313
+
314
+ The tail-end of the v2.6.83 shakedown suite (`csv_sorter`,
315
+ `makefile_gen`, `json_pipeline`) all showed 7-second 0-message
316
+ sessions — all of those were this crash, not real loop regressions.
317
+
318
+ ### v2.6.85 (April 14) — terse results + centralized sanitizer
319
+ Second claude-code pass produced two more wins:
320
+
321
+ - Centralized `safe_parse_tool_args` helper — used in
322
+ `format.parse_message` AND `anthropic._convert_tool_call` (the
323
+ Anthropic backend previously had bare `json.loads` that could
324
+ crash on the same leak-token class of bugs).
325
+ - Terse tool-result content: `write_file` used to echo the full
326
+ `args.content` back in `result.content` — every successful 3KB
327
+ write added 3KB of redundant context, and the model re-reading
328
+ that blob was a documented oscillation trigger. Now returns
329
+ `"File X updated successfully (N bytes)."` Similar for
330
+ `search_replace`.
331
+
332
+ ### Earlier (v2.5.x–v2.6.78)
333
+ - `slim_system_prompt` config knob — dropped first-turn latency on
334
+ Gemma 4 from 60-120s to 10-20s
335
+ - Trust dialog auto-dismissal in shakedown.py
336
+ - PRD reset between shakedown runs with PRD.master.md canary
337
+ - `_task_manager.py` rename (underscore prefix excludes from tool
338
+ discovery)
339
+ - `auto_release.sh` fail-loud on token errors
340
+ - `_check_tool_call_repetition` wired into `_handle_tool_response`
341
+ - `_truncate_old_tool_results` proactive shrinkage
342
+
343
+ ## Roadmap
344
+
345
+ ### Near-term (loop-prevention backlog)
346
+ Ideas catalogued after the 2nd Claude Code source review. All shipped
347
+ ideas are in "Safety" above; the list below is what's next, ordered
348
+ by bang-for-buck:
349
+
350
+ 1. **Stop-sequences for leak tokens** — add `<|channel>`,
351
+ `<|tool_call>`, `<|"|>` as vLLM stop-sequences so generation halts
352
+ before a leaked marker lands in the stream. Kills a class of
353
+ JSON-decode + rendering issues at the tokenizer.
354
+ 2. **Ping-pong detection** — `write(X) → search_replace(X) → write(X)`
355
+ within K turns injects "Pick ONE approach: full rewrite or surgical
356
+ edit." Addresses the exact minivc case that v2.6.80 tried to fix
357
+ with a hard block.
358
+ 3. **Read-after-write stub** — if `read_file(X)` comes within K turns
359
+ of `write_file(X)` with mtime unchanged, return stub instead of
360
+ the file body.
361
+ 4. **Per-turn status `<system-reminder>`** — "tool calls: 47/200 |
362
+ writes-per-file: cli.py=6 | recent SR fail: cli.py". Injected
363
+ every N turns to give the model raw awareness.
364
+ 5. **Auto-prepend `read_file` when path is hot** — if `write_file(X)`
365
+ is called and `path_writes[X] >= 3` without an intervening read,
366
+ auto-run `read_file` first and include the result.
367
+ 6. **Time-based microcompact** — replace old `tool_result` content
368
+ with a stub like `[Old tool result content cleared]` after N
369
+ minutes/turns. Claude Code pattern; drydock has per-call truncation
370
+ but not time-based aging.
371
+ 7. **ruff inline on writes** — run `ruff check` on every Python write
372
+ and feed errors back as `<system-reminder>` warnings (cheaper than
373
+ full LSP).
374
+ 8. **Grammar-constrained tool args** via vLLM's lm-format-enforcer —
375
+ JSON schema per tool; tokenizer can't emit invalid JSON. Kills the
376
+ `\Fix`-class of bugs entirely at the generation level.
377
+ 9. **LSP integration** (pyright/ruff) — real diagnostics after every
378
+ write. Large lift but highest feedback quality.
379
+ 10. **Per-model `auto_compact_threshold`** — current default of
380
+ 200K never fires for Gemma 4 (131K max context).
381
+
382
+ ### Medium-term
383
+ - **Second deployment target** so PyPI failures don't lose history
384
+ - **Replace `tui_test.py` and `core_tests_real.sh` entirely** —
385
+ `shakedown.py` + `shakedown_interactive.py` are the only honest
386
+ tests
387
+ - **Token cost dashboard** so first-turn prefill regressions catch
388
+ before they hit users
389
+ - **Consultant escalation** — partly wired in `agent_loop.py`; finish
390
+ the hook so on loop-depth ≥ N a bigger model gets ONE turn of
391
+ advice and returns control to Gemma
392
+
393
+ ### Long-term
394
+ - Support larger models as hardware improves
395
+ - Plugin marketplace for custom tools/skills
396
+ - Web dashboard for monitoring long runs
397
+ - Multi-model routing (different models for different tasks)
398
+ - Fine-tune Gemma 4 on bail-out traces (sessions where drydock
399
+ recovered from a loop). Pairs naturally with the user's "Deep Noir"
400
+ research direction.
401
+
402
+ ## Architecture Notes
403
+
404
+ See [CLAUDE.md](CLAUDE.md) for technical details, file locations,
405
+ constraints, lessons learned, and the development workflow including
406
+ the `.pause_auto_release` / `.pause_watchdog` flags you'll want during
407
+ manual debugging.
408
+
409
+ ## Legal
410
+
411
+ All code is original or forked from Apache 2.0 mistral-vibe.
412
+ Architecture improvements are standard design patterns implemented from
413
+ scratch. No proprietary code copied.
@@ -1444,6 +1444,27 @@ class AgentLoop:
1444
1444
 
1445
1445
  available_tools = self.format_handler.get_available_tools(self.tool_manager)
1446
1446
  tool_choice = self.format_handler.get_tool_choice()
1447
+
1448
+ # Loop-break via tool_choice="none" — when repetition is severe
1449
+ # (FORCE_STOP signal), force the model to emit TEXT next turn.
1450
+ # Cannot call a tool on this turn. Forces reflection/replan via
1451
+ # natural language, then tool_choice returns to "auto" on the
1452
+ # following turn. This breaks attractor loops where the model
1453
+ # keeps firing identical tool calls despite advisories (144x
1454
+ # write_file, 13x read_file observed in stress session
1455
+ # 20260415_021415_ac6bd91f).
1456
+ # Ratelimit: only force tool_choice=none once per N turns so we
1457
+ # don't ping-pong between "none" and "auto" forever.
1458
+ if getattr(self, "_loop_detected", False) and getattr(self, "_loop_signal", "") == "FORCE_STOP":
1459
+ last_forced = getattr(self, "_last_tool_choice_none_turn", -999)
1460
+ current_turn = len(self.messages)
1461
+ if current_turn - last_forced >= 4:
1462
+ tool_choice = "none"
1463
+ self._last_tool_choice_none_turn = current_turn
1464
+ logger.info(
1465
+ "[LOOP-BREAK] FORCE_STOP signal → tool_choice=none "
1466
+ "for this turn (forces text response, breaks attractor)"
1467
+ )
1447
1468
  _t2 = time.perf_counter()
1448
1469
 
1449
1470
  n_msgs = len(self.messages)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.6.85"
3
+ version = "2.6.86"
4
4
  description = "Local-first CLI coding agent — tested with Gemma 4 26B via vLLM"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"