drydock-cli 2.6.70__tar.gz → 2.6.74__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 (563) hide show
  1. drydock_cli-2.6.74/.auto_release.lock +1 -0
  2. drydock_cli-2.6.74/MODEL_SHORTCOMINGS.md +224 -0
  3. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/PKG-INFO +1 -1
  4. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/agents/models.py +7 -1
  5. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/llm/format.py +7 -1
  6. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/prompts/gemma4.md +7 -1
  7. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/pyproject.toml +1 -1
  8. drydock_cli-2.6.74/scripts/meta_ralph_loop.py +376 -0
  9. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/ralph_loop.py +12 -1
  10. drydock_cli-2.6.74/worked_examples/README.md +21 -0
  11. drydock_cli-2.6.74/worked_examples/lookup.json +10 -0
  12. drydock_cli-2.6.74/worked_examples/sql_parser.py +358 -0
  13. drydock_cli-2.6.70/.auto_release.lock +0 -1
  14. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/.claude/scheduled_tasks.lock +0 -0
  15. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/.github/CODEOWNERS +0 -0
  16. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
  17. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  18. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  19. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/.github/workflows/build-and-upload.yml +0 -0
  20. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/.github/workflows/ci.yml +0 -0
  21. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/.github/workflows/issue-labeler.yml +0 -0
  22. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/.github/workflows/release.yml +0 -0
  23. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/.gitignore +0 -0
  24. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/.pre-commit-config.yaml +0 -0
  25. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/.python-version +0 -0
  26. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/.typos.toml +0 -0
  27. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/.vscode/extensions.json +0 -0
  28. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/.vscode/launch.json +0 -0
  29. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/.vscode/settings.json +0 -0
  30. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/AGENTS.md +0 -0
  31. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/CHANGELOG.md +0 -0
  32. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/CLAUDE.md +0 -0
  33. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/CONTRIBUTING.md +0 -0
  34. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/Drydock_rebrand.md +0 -0
  35. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/LICENSE +0 -0
  36. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/NOTICE +0 -0
  37. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/PRD.md +0 -0
  38. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/README.md +0 -0
  39. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/action.yml +0 -0
  40. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/distribution/zed/LICENSE +0 -0
  41. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/distribution/zed/extension.toml +0 -0
  42. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/distribution/zed/icons/mistral_vibe.svg +0 -0
  43. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/docs/README.md +0 -0
  44. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/docs/acp-setup.md +0 -0
  45. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/docs/proxy-setup.md +0 -0
  46. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/__init__.py +0 -0
  47. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/acp/__init__.py +0 -0
  48. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/acp/acp_agent_loop.py +0 -0
  49. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/acp/acp_logger.py +0 -0
  50. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/acp/entrypoint.py +0 -0
  51. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/acp/tools/__init__.py +0 -0
  52. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/acp/tools/base.py +0 -0
  53. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/acp/tools/builtins/bash.py +0 -0
  54. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/acp/tools/builtins/read_file.py +0 -0
  55. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/acp/tools/builtins/search_replace.py +0 -0
  56. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/acp/tools/builtins/todo.py +0 -0
  57. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/acp/tools/builtins/write_file.py +0 -0
  58. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/acp/tools/session_update.py +0 -0
  59. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/acp/utils.py +0 -0
  60. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/__init__.py +0 -0
  61. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/autocompletion/__init__.py +0 -0
  62. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/autocompletion/base.py +0 -0
  63. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/autocompletion/path_completion.py +0 -0
  64. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/autocompletion/slash_command.py +0 -0
  65. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/cli.py +0 -0
  66. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/clipboard.py +0 -0
  67. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/commands.py +0 -0
  68. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/entrypoint.py +0 -0
  69. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/history_manager.py +0 -0
  70. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  71. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  72. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  73. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/terminal_setup.py +0 -0
  74. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/__init__.py +0 -0
  75. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  76. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/app.py +0 -0
  77. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/app.tcss +0 -0
  78. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/external_editor.py +0 -0
  79. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  80. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  81. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  82. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  83. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  84. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  85. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  86. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  87. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  88. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  89. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  90. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  91. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  92. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  93. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  94. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  95. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  96. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  97. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  98. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  99. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  100. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  101. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  102. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  103. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  104. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  105. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  106. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  107. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  108. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  109. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  110. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  111. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  112. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  113. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  114. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  115. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/windowing/history.py +0 -0
  116. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  117. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/textual_ui/windowing/state.py +0 -0
  118. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/update_notifier/__init__.py +0 -0
  119. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  120. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  121. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  122. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  123. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  124. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/update_notifier/update.py +0 -0
  125. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/cli/update_notifier/whats_new.py +0 -0
  126. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/__init__.py +0 -0
  127. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/agent_loop.py +0 -0
  128. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/agents/__init__.py +0 -0
  129. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/agents/manager.py +0 -0
  130. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/auth/__init__.py +0 -0
  131. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/auth/crypto.py +0 -0
  132. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/auth/github.py +0 -0
  133. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/autocompletion/__init__.py +0 -0
  134. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/autocompletion/completers.py +0 -0
  135. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  136. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  137. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  138. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  139. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  140. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/autocompletion/fuzzy.py +0 -0
  141. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/autocompletion/path_prompt.py +0 -0
  142. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  143. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/build_orchestrator.py +0 -0
  144. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/config/__init__.py +0 -0
  145. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/config/_settings.py +0 -0
  146. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/config/harness_files/__init__.py +0 -0
  147. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  148. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/config/harness_files/_paths.py +0 -0
  149. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/consultant.py +0 -0
  150. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/drydock_states.py +0 -0
  151. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/hooks.py +0 -0
  152. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/llm/__init__.py +0 -0
  153. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/llm/backend/anthropic.py +0 -0
  154. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/llm/backend/base.py +0 -0
  155. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/llm/backend/factory.py +0 -0
  156. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/llm/backend/generic.py +0 -0
  157. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/llm/backend/mistral.py +0 -0
  158. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  159. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/llm/backend/vertex.py +0 -0
  160. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/llm/exceptions.py +0 -0
  161. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/llm/message_utils.py +0 -0
  162. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/llm/types.py +0 -0
  163. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/logger.py +0 -0
  164. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/middleware.py +0 -0
  165. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/output_formatters.py +0 -0
  166. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/paths/__init__.py +0 -0
  167. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/paths/_local_config_walk.py +0 -0
  168. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/paths/_vibe_home.py +0 -0
  169. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/paths/conventions.py +0 -0
  170. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/plan_session.py +0 -0
  171. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/plugins.py +0 -0
  172. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/programmatic.py +0 -0
  173. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/prompts/__init__.py +0 -0
  174. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/prompts/builder.md +0 -0
  175. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/prompts/cli.md +0 -0
  176. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/prompts/compact.md +0 -0
  177. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/prompts/dangerous_directory.md +0 -0
  178. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/prompts/diagnostic.md +0 -0
  179. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/prompts/explore.md +0 -0
  180. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/prompts/planner.md +0 -0
  181. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/prompts/project_context.md +0 -0
  182. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/prompts/tests.md +0 -0
  183. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/proxy_setup.py +0 -0
  184. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/session/agent_memory.py +0 -0
  185. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/session/checkpoints.py +0 -0
  186. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/session/session_loader.py +0 -0
  187. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/session/session_logger.py +0 -0
  188. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/session/session_migration.py +0 -0
  189. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/session/state_file.py +0 -0
  190. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/session_checker.py +0 -0
  191. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/skills/__init__.py +0 -0
  192. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/skills/manager.py +0 -0
  193. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/skills/models.py +0 -0
  194. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/skills/parser.py +0 -0
  195. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/slug.py +0 -0
  196. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/system_prompt.py +0 -0
  197. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/telemetry/__init__.py +0 -0
  198. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/telemetry/send.py +0 -0
  199. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/teleport/errors.py +0 -0
  200. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/teleport/git.py +0 -0
  201. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/teleport/nuage.py +0 -0
  202. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/teleport/teleport.py +0 -0
  203. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/teleport/types.py +0 -0
  204. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/base.py +0 -0
  205. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/_task_manager.py +0 -0
  206. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  207. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/bash.py +0 -0
  208. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/cron.py +0 -0
  209. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  210. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/glob_tool.py +0 -0
  211. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/grep.py +0 -0
  212. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  213. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/lsp.py +0 -0
  214. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  215. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  216. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/powershell.py +0 -0
  217. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  218. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  219. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  220. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  221. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  222. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  223. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  224. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  225. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  226. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  227. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  228. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  229. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  230. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  231. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/task.md +0 -0
  232. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  233. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  234. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  235. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  236. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  237. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  238. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  239. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/read_file.py +0 -0
  240. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/search_replace.py +0 -0
  241. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/task.py +0 -0
  242. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/todo.py +0 -0
  243. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/tool_search.py +0 -0
  244. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/webfetch.py +0 -0
  245. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/websearch.py +0 -0
  246. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/worktree.py +0 -0
  247. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/builtins/write_file.py +0 -0
  248. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/injection_guard.py +0 -0
  249. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/manager.py +0 -0
  250. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/mcp/__init__.py +0 -0
  251. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/mcp/registry.py +0 -0
  252. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/mcp/tools.py +0 -0
  253. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/mcp_sampling.py +0 -0
  254. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/ui.py +0 -0
  255. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/tools/utils.py +0 -0
  256. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/trusted_folders.py +0 -0
  257. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/types.py +0 -0
  258. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/core/utils.py +0 -0
  259. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/setup/onboarding/__init__.py +0 -0
  260. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/setup/onboarding/base.py +0 -0
  261. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/setup/onboarding/onboarding.tcss +0 -0
  262. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/setup/onboarding/screens/__init__.py +0 -0
  263. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/setup/onboarding/screens/api_key.py +0 -0
  264. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/setup/onboarding/screens/welcome.py +0 -0
  265. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  266. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  267. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/__init__.py +0 -0
  268. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/api-design/SKILL.md +0 -0
  269. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/batch/SKILL.md +0 -0
  270. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/commit-code/SKILL.md +0 -0
  271. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/context-summary/SKILL.md +0 -0
  272. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/create-presentation/SKILL.md +0 -0
  273. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/deep-research/SKILL.md +0 -0
  274. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/deploy/SKILL.md +0 -0
  275. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/diff-review/SKILL.md +0 -0
  276. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/doc-gen/SKILL.md +0 -0
  277. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/explain-code/SKILL.md +0 -0
  278. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/explore-code/SKILL.md +0 -0
  279. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/fix-issue/SKILL.md +0 -0
  280. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/git-ops/SKILL.md +0 -0
  281. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/init-project/SKILL.md +0 -0
  282. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/investigate/SKILL.md +0 -0
  283. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/loop/SKILL.md +0 -0
  284. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/migrate/SKILL.md +0 -0
  285. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/perf-analyze/SKILL.md +0 -0
  286. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/plan-impl/SKILL.md +0 -0
  287. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/pr-review/SKILL.md +0 -0
  288. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/refactor/SKILL.md +0 -0
  289. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/regex-help/SKILL.md +0 -0
  290. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/review/SKILL.md +0 -0
  291. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/security-review/SKILL.md +0 -0
  292. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/ship/SKILL.md +0 -0
  293. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/simplify/SKILL.md +0 -0
  294. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/skills/test-verify/SKILL.md +0 -0
  295. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock/whats_new.md +0 -0
  296. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock-acp.spec +0 -0
  297. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/drydock_terms.md +0 -0
  298. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/flake.lock +0 -0
  299. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/flake.nix +0 -0
  300. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/README.md +0 -0
  301. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/auto_release.sh +0 -0
  302. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/auto_test_loop.sh +0 -0
  303. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/backup.sh +0 -0
  304. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/bump_version.py +0 -0
  305. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/comprehensive_loop.py +0 -0
  306. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/deploy_to_github.sh +0 -0
  307. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/discover_cli_tools.sh +0 -0
  308. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/install.sh +0 -0
  309. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/llm_balancer.py +0 -0
  310. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/monitor_swebench.sh +0 -0
  311. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/monitor_test_battery.sh +0 -0
  312. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/notify_release.py +0 -0
  313. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/oss_task_harness.py +0 -0
  314. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/overnight_agents_test.sh +0 -0
  315. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/prepare_release.py +0 -0
  316. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/publish_to_pypi.sh +0 -0
  317. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/shakedown.py +0 -0
  318. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/shakedown_interactive.py +0 -0
  319. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/shakedown_regression.sh +0 -0
  320. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/shakedown_suite.sh +0 -0
  321. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/shakedown_variance.sh +0 -0
  322. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/telegram_bot.py +0 -0
  323. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/test_bank.sh +0 -0
  324. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/test_full.sh +0 -0
  325. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/test_smoke.sh +0 -0
  326. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/test_tui_path.py +0 -0
  327. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/tui_test.py +0 -0
  328. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/scripts/vllm_failover.sh +0 -0
  329. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/__init__.py +0 -0
  330. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/conftest.py +0 -0
  331. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/test_acp.py +0 -0
  332. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/test_agent_thought.py +0 -0
  333. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/test_bash.py +0 -0
  334. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/test_compact_session_updates.py +0 -0
  335. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/test_content.py +0 -0
  336. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/test_initialize.py +0 -0
  337. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/test_list_sessions.py +0 -0
  338. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/test_load_session.py +0 -0
  339. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/test_multi_session.py +0 -0
  340. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/test_new_session.py +0 -0
  341. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/test_proxy_setup_acp.py +0 -0
  342. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/test_read_file.py +0 -0
  343. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/test_search_replace.py +0 -0
  344. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/test_set_config_option.py +0 -0
  345. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/test_set_mode.py +0 -0
  346. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/test_set_model.py +0 -0
  347. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/test_tool_call_session_update.py +0 -0
  348. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/test_utils.py +0 -0
  349. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/acp/test_write_file.py +0 -0
  350. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/autocompletion/test_file_indexer.py +0 -0
  351. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/autocompletion/test_fuzzy.py +0 -0
  352. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  353. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  354. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/autocompletion/test_path_completion_controller.py +0 -0
  355. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  356. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/autocompletion/test_slash_command_controller.py +0 -0
  357. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  358. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/backend/__init__.py +0 -0
  359. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/backend/data/__init__.py +0 -0
  360. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/backend/data/fireworks.py +0 -0
  361. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/backend/data/mistral.py +0 -0
  362. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/backend/test_anthropic_adapter.py +0 -0
  363. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/backend/test_backend.py +0 -0
  364. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/backend/test_reasoning_adapter.py +0 -0
  365. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  366. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  367. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  368. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  369. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/cli/test_bell_notifications.py +0 -0
  370. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/cli/test_braille_renderer.py +0 -0
  371. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/cli/test_clipboard.py +0 -0
  372. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/cli/test_commands.py +0 -0
  373. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/cli/test_copy_shortcuts.py +0 -0
  374. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/cli/test_external_editor.py +0 -0
  375. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/cli/test_no_markup_static.py +0 -0
  376. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/cli/test_question_app.py +0 -0
  377. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/cli/test_spinner.py +0 -0
  378. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/cli/test_switching_mode.py +0 -0
  379. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  380. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  381. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/cli/test_ui_session_resume.py +0 -0
  382. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/cli/test_ui_skill_dispatch.py +0 -0
  383. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/cli/textual_ui/__init__.py +0 -0
  384. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/cli/textual_ui/test_session_picker.py +0 -0
  385. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/conftest.py +0 -0
  386. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/core/test_agents.py +0 -0
  387. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/core/test_auth_crypto.py +0 -0
  388. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/core/test_auth_github.py +0 -0
  389. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/core/test_config_load_dotenv.py +0 -0
  390. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/core/test_config_paths.py +0 -0
  391. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/core/test_config_resolution.py +0 -0
  392. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/core/test_file_logging.py +0 -0
  393. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/core/test_plan_session.py +0 -0
  394. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/core/test_proxy_setup.py +0 -0
  395. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/core/test_slug.py +0 -0
  396. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/core/test_telemetry_send.py +0 -0
  397. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/core/test_teleport_git.py +0 -0
  398. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/core/test_teleport_nuage.py +0 -0
  399. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/core/test_teleport_service.py +0 -0
  400. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/core/test_trusted_folders.py +0 -0
  401. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/core/test_utils.py +0 -0
  402. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/e2e/common.py +0 -0
  403. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/e2e/conftest.py +0 -0
  404. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/e2e/mock_server.py +0 -0
  405. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  406. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/e2e/test_cli_tui_streaming.py +0 -0
  407. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  408. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/fixtures/doc_qa_system_prd.md +0 -0
  409. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/mock/__init__.py +0 -0
  410. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/mock/mock_backend_factory.py +0 -0
  411. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/mock/mock_entrypoint.py +0 -0
  412. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/mock/utils.py +0 -0
  413. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/onboarding/test_run_onboarding.py +0 -0
  414. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/onboarding/test_ui_onboarding.py +0 -0
  415. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/session/test_session_loader.py +0 -0
  416. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/session/test_session_logger.py +0 -0
  417. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/session/test_session_migration.py +0 -0
  418. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/skills/conftest.py +0 -0
  419. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/skills/test_manager.py +0 -0
  420. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/skills/test_models.py +0 -0
  421. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/skills/test_parser.py +0 -0
  422. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  423. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  424. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  425. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  426. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  427. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  428. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  429. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  430. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  431. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  432. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  433. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  434. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  435. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  436. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  437. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  438. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  439. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  440. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  441. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  442. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  443. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  444. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  445. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  446. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  447. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  448. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  449. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  450. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  451. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  452. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  453. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  454. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  455. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  456. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  457. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  458. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  459. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  460. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  461. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  462. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  463. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  464. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  465. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  466. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  467. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  468. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  469. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  470. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  471. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  472. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  473. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  474. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  475. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  476. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  477. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  478. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  479. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  480. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  481. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  482. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/base_snapshot_test_app.py +0 -0
  483. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/conftest.py +0 -0
  484. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/snap_compare.py +0 -0
  485. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  486. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  487. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  488. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  489. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  490. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  491. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  492. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  493. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  494. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  495. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  496. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  497. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  498. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  499. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/stubs/fake_backend.py +0 -0
  500. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/stubs/fake_client.py +0 -0
  501. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/stubs/fake_tool.py +0 -0
  502. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_agent_auto_compact.py +0 -0
  503. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_agent_backend.py +0 -0
  504. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_agent_observer_streaming.py +0 -0
  505. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_agent_stats.py +0 -0
  506. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_agent_tasks.py +0 -0
  507. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_agent_tool_call.py +0 -0
  508. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_agents.py +0 -0
  509. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_bank_build.py +0 -0
  510. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_bank_debug.py +0 -0
  511. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_bank_multiagent.py +0 -0
  512. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_bank_prd.py +0 -0
  513. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_bank_prd_extended.py +0 -0
  514. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_bank_tools.py +0 -0
  515. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_bank_update.py +0 -0
  516. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_build_projects.py +0 -0
  517. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_cli_programmatic_preload.py +0 -0
  518. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_current_bugs.py +0 -0
  519. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_drydock_regression.py +0 -0
  520. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_drydock_tasks.py +0 -0
  521. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_full_regression.py +0 -0
  522. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_history_manager.py +0 -0
  523. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_integration.py +0 -0
  524. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_loop_detection.py +0 -0
  525. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_message_id.py +0 -0
  526. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_message_merging.py +0 -0
  527. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_middleware.py +0 -0
  528. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_multi_agent.py +0 -0
  529. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_real_failures.py +0 -0
  530. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_real_issues.py +0 -0
  531. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_real_workflow.py +0 -0
  532. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_reasoning_content.py +0 -0
  533. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_smoke.py +0 -0
  534. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_system_prompt.py +0 -0
  535. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_tagged_text.py +0 -0
  536. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_tool_args.py +0 -0
  537. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_ui_external_editor.py +0 -0
  538. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_ui_input_history.py +0 -0
  539. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_user_issues.py +0 -0
  540. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/test_workloads.py +0 -0
  541. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/testbank_helpers.py +0 -0
  542. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/tools/test_ask_user_question.py +0 -0
  543. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/tools/test_bash.py +0 -0
  544. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/tools/test_exit_plan_mode.py +0 -0
  545. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/tools/test_grep.py +0 -0
  546. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/tools/test_invoke_context.py +0 -0
  547. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/tools/test_manager_get_tool_config.py +0 -0
  548. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/tools/test_mcp.py +0 -0
  549. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/tools/test_mcp_sampling.py +0 -0
  550. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/tools/test_task.py +0 -0
  551. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/tools/test_ui_bash_execution.py +0 -0
  552. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/tools/test_webfetch.py +0 -0
  553. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/tools/test_websearch.py +0 -0
  554. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  555. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  556. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/update_notifier/test_do_update.py +0 -0
  557. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  558. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/update_notifier/test_github_update_gateway.py +0 -0
  559. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  560. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/update_notifier/test_ui_update_notification.py +0 -0
  561. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/update_notifier/test_update_use_case.py +0 -0
  562. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/tests/update_notifier/test_whats_new.py +0 -0
  563. {drydock_cli-2.6.70 → drydock_cli-2.6.74}/uv.lock +0 -0
@@ -0,0 +1 @@
1
+ 962444
@@ -0,0 +1,224 @@
1
+ # Gemma 4 26B-A4B Shortcomings Log
2
+
3
+ Running list of model-level limitations observed in real drydock use, with
4
+ concrete evidence. Intent: inform future LoRA fine-tuning + Deep Noir
5
+ steering datasets. Each entry is a pattern, NOT a one-off bug.
6
+
7
+ Last updated: 2026-04-12
8
+
9
+ ---
10
+
11
+ ## 1. Catastrophic tool-arg malformation → destructive side effects
12
+
13
+ **Pattern:** Model sends `search_replace` with `content` + `new_string` keys
14
+ but no `search` / `old_string`. Drydock's raw-code-fallback (before my fix)
15
+ overwrote entire files with fragments.
16
+
17
+ **Evidence:** ACE v1 cli.py nuked from 5171 chars → 16-char fragment. Session
18
+ `20260412_162052_ee34fefb` msg #61. Lost 120 lines of working code.
19
+
20
+ **Candidate training signal:**
21
+ - Positive: model sends `{search: "...", replace: "..."}` or proper
22
+ `<<<<<<< SEARCH` blocks.
23
+ - Negative: model sends raw code in `content` expecting a file overwrite.
24
+
25
+ **Harness mitigation already in place:** refuse overwrites that shrink file
26
+ by >50%. Still, the model should learn to format tool calls correctly.
27
+
28
+ ---
29
+
30
+ ## 2. Scaffolding without wiring
31
+
32
+ **Pattern:** Model adds a new parameter to a public function's signature +
33
+ adds the implementation in the callee, but doesn't update the intermediate
34
+ call site that connects them. Tests pass for surface checks (signature
35
+ inspection) but the feature is non-functional at runtime.
36
+
37
+ **Evidence:**
38
+ - tabulate `row_count_in_header`: added to `tabulate()` signature and to
39
+ `_format_table()` logic, but `tabulate()` never passes the new arg to
40
+ `_format_table()`. Feature non-functional; tests pass because the test
41
+ just checked the signature.
42
+ - Session: `session_20260412_105528_30d43609`.
43
+
44
+ **Root cause hypothesis:** Model doesn't trace execution path end-to-end.
45
+ Treats each file as independent.
46
+
47
+ **Candidate training signal:** Traces where model correctly chases a
48
+ parameter through the full call graph vs traces where it stops at surface.
49
+
50
+ ---
51
+
52
+ ## 3. Subtle logic bugs undiagnosed after N iterations
53
+
54
+ **Pattern:** Model produces plausible-looking code with a subtle bug.
55
+ Running tests fails. Model tries rewriting the whole file rather than
56
+ tracing the specific failure.
57
+
58
+ **Evidence:**
59
+ - **mini_db parser**: `_parse_select_body()` consumed `WHERE` as a table
60
+ alias because alias detection only excluded `JOIN` from the list of
61
+ SQL keywords. Fix was one line. Model made 4 iterations (~20 min)
62
+ without finding it.
63
+ - **tool_agent log whitelist**: `if self.verbose or level in ["THINK",
64
+ "PLAN", "TOOL"]:` — missing `"ANSWER"`. One-character fix. Model ran
65
+ 3 iterations without finding it.
66
+
67
+ **Common trait:** Bug is in a data structure / enum / list that the model
68
+ didn't reason about. It could SEE the line but didn't mentally trace
69
+ which levels were allowed.
70
+
71
+ **Candidate training signal:** Worked examples of "run the failing test,
72
+ identify the exact line that produces wrong output, trace the data flow,
73
+ fix only that line."
74
+
75
+ ---
76
+
77
+ ## 4. Inheritance blindness across packages
78
+
79
+ **Pattern:** When a class inherits from a parent in a different package,
80
+ the model looks for attributes/methods in the child class's file. Doesn't
81
+ think to follow the inheritance chain to the parent package.
82
+
83
+ **Evidence:**
84
+ - **Flask `request.is_xml`**: Model read `src/flask/wrappers.py` 13 times
85
+ looking for `is_json` to pattern-match from. But `is_json` is in
86
+ werkzeug's `Request` (parent class). Model gave up without writing
87
+ anything. With an explicit hint in the task ("is_json is in werkzeug"),
88
+ model solved it in 61s.
89
+
90
+ **Candidate training signal:** Traces where model correctly uses grep to
91
+ find a name in parent-class packages (`grep -r "def is_json" site-packages/`)
92
+ vs traces where it re-reads the same file.
93
+
94
+ ---
95
+
96
+ ## 5. Regression during targeted fixes
97
+
98
+ **Pattern:** Asked to fix failure X, model rewrites unrelated passing code
99
+ and breaks it. Advisory "don't break passing tests" in prompt doesn't help.
100
+
101
+ **Evidence:**
102
+ - **site_gen**: 4/5 tests passing. Asked to fix the 5th (title render).
103
+ Model rewrote the template engine from scratch, lost 4 passing tests
104
+ → 0/5. Required manual rollback.
105
+ - This happened repeatedly until I added rollback to ralph_loop.
106
+
107
+ **Harness mitigation:** Auto-rollback on score regression (snapshot before,
108
+ restore if tests go down). Critical safety net.
109
+
110
+ **Candidate training signal:** Traces with minimal targeted patches
111
+ (`search_replace` with 3-line blocks) vs traces with full-file rewrites.
112
+
113
+ ---
114
+
115
+ ## 6. Blindness to own stuckness
116
+
117
+ **Pattern:** Model rewrites the same file multiple times identically when
118
+ tests fail. Doesn't recognize the rewrites aren't helping; doesn't try a
119
+ different approach. When dedup block fires after 3 identical writes,
120
+ sometimes workaround by renaming the file (e.g. `feedback_new.py`).
121
+
122
+ **Evidence:**
123
+ - ACE v1 session msg #23, #25, #27: three identical writes of `feedback.py`.
124
+ Then msg #29: renamed to `feedback_new.py` to bypass dedup.
125
+ - mini_db: 100 search_replace calls, 65 failed. Model kept trying the
126
+ same pattern instead of switching approaches.
127
+
128
+ **Candidate training signal:** Traces where model after N failed attempts
129
+ tries: `bash` to run the failing command, `web_search` for the error,
130
+ `read_file` on a different related file, or explicitly changes approach.
131
+
132
+ ---
133
+
134
+ ## 7. Doesn't use web_search even when enabled
135
+
136
+ **Pattern:** Model has `web_search` tool available but doesn't reach for
137
+ it when stuck, even for standard errors that have obvious online solutions.
138
+
139
+ **Evidence:**
140
+ - mini_db session (after web tools were enabled): 100 search_replace fails,
141
+ 0 web_search calls. Model stayed in local-only failure loop.
142
+
143
+ **Mitigation attempted:** `gemma4.md` prompt now explicitly says "use
144
+ web_search when stuck 2+ iterations on same error." Need to verify it
145
+ actually happens in practice.
146
+
147
+ **Candidate training signal:** Strong — positive examples of "tried X,
148
+ failed, googled error, found answer, fixed" vs "tried X 5x, never googled."
149
+
150
+ ---
151
+
152
+ ## 8. Hallucinated tool names
153
+
154
+ **Pattern:** Model calls tool names that don't exist, e.g.
155
+ `ralph_repo_index`, `list_mcp_resources`, `repo_index`.
156
+
157
+ **Evidence:** mini_db v1 session called `ralph_repo_index` 5 times. Each
158
+ returned "Unknown tool" error. Model kept trying.
159
+
160
+ **Harness mitigation:** `_IGNORE_TOOLS` list silently drops known
161
+ hallucinations to reduce error spam.
162
+
163
+ **Candidate training signal:** Ground all tool calls to only names that
164
+ exist in the current tool list.
165
+
166
+ ---
167
+
168
+ ## 9. Empty response / thinking stall
169
+
170
+ **Pattern:** After a tool result, model generates `[thinking]` tokens but
171
+ no `content` or `tool_calls` — returns an empty assistant message. Appears
172
+ idle to the harness.
173
+
174
+ **Evidence:** ACE v2 iter 5 "idle" status at 966s with no message activity.
175
+ Also observed in earlier 5-min tier runs pre-fix.
176
+
177
+ **Harness mitigation:** `_truncate_old_tool_results` in agent_loop +
178
+ thinking-stall nudge. Partial fix — still observed in harder PRDs.
179
+
180
+ **Candidate training signal:** Eliminate empty assistant responses. Every
181
+ response should either have `content` or `tool_calls`.
182
+
183
+ ---
184
+
185
+ ## 10. Weak reasoning about performance / abstract tasks
186
+
187
+ **Pattern:** Optimization phase of comprehensive_loop consistently fails
188
+ ("idle" status). Code review phase also struggles. These phases require
189
+ abstract reasoning about hotspots, trade-offs, priorities.
190
+
191
+ **Evidence:** comp_loop across 3 packages:
192
+ - doc_qa: 9/9 phases passed (including optimize — simple PRD)
193
+ - stock_screener: 8/9 (optimize failed — went idle)
194
+ - tool_agent: 5/9 (multiple phases failed, optimize was one)
195
+
196
+ **Candidate training signal:** Traces of optimization reasoning:
197
+ "Profile showed X is hot; it's O(n²); rewrite as O(n log n); measure."
198
+ Currently the model treats "optimize" as too vague.
199
+
200
+ ---
201
+
202
+ ## Harness / tooling shortcomings (non-model, but relevant)
203
+
204
+ These are harness bugs I found — fixing them made the model LOOK better:
205
+
206
+ - A. `search_replace` destructive overwrite (FIXED v2.6.67)
207
+ - B. `write_file` didn't catch bare `raise` (FIXED v2.6.69)
208
+ - C. `builder` subagent missing `web_search`/`web_fetch` (FIXED v2.6.71)
209
+ - D. `_IGNORE_TOOLS` missing common hallucinations (FIXED v2.6.71)
210
+ - E. ralph_loop false-positive baseline → wrong prompt (FIXED v2.6.71)
211
+
212
+ ---
213
+
214
+ ## Scoring suggested for training dataset
215
+
216
+ Label each trace-step with outcome:
217
+ - `good`: tool call succeeded + moved toward passing tests
218
+ - `regression`: broke a previously-passing test
219
+ - `wasted`: no progress on pass rate
220
+ - `stuck`: repeated same action N times with no change
221
+ - `recovered`: was stuck, used web_search/web_fetch/read_file to unblock
222
+
223
+ Fine-tune on `good` and `recovered`. Filter out `wasted` and the parts of
224
+ traces after a `regression` or `stuck` episode.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.6.70
3
+ Version: 2.6.74
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
@@ -202,7 +202,8 @@ DIAGNOSTIC = AgentProfile(
202
202
  agent_type=AgentType.SUBAGENT,
203
203
  max_turns=80,
204
204
  overrides={
205
- "enabled_tools": ["grep", "read_file", "bash", "glob"],
205
+ "enabled_tools": ["grep", "read_file", "bash", "glob",
206
+ "web_search", "web_fetch"],
206
207
  "system_prompt_id": "diagnostic",
207
208
  },
208
209
  )
@@ -242,12 +243,17 @@ BUILDER = AgentProfile(
242
243
  "enabled_tools": [
243
244
  "read_file", "write_file", "search_replace",
244
245
  "glob", "grep", "bash",
246
+ # web tools — when stuck on a difficult problem, the model can
247
+ # google for examples, error-message solutions, or API docs.
248
+ "web_search", "web_fetch",
245
249
  ],
246
250
  "system_prompt_id": "builder",
247
251
  "tools": {
248
252
  "write_file": {"permission": "always"},
249
253
  "search_replace": {"permission": "always"},
250
254
  "bash": {"permission": "always"},
255
+ "web_search": {"permission": "always"},
256
+ "web_fetch": {"permission": "always"},
251
257
  },
252
258
  },
253
259
  )
@@ -174,7 +174,13 @@ class APIToolFormatHandler:
174
174
 
175
175
  # Tools the model hallucinates that should be silently ignored
176
176
  # rather than generating a visible error that confuses the user.
177
- _IGNORE_TOOLS = {"exit_plan_mode", "enter_plan_mode", "plan_mode"}
177
+ _IGNORE_TOOLS = {
178
+ "exit_plan_mode", "enter_plan_mode", "plan_mode",
179
+ # Gemma 4 confabulated tools — observed in user sessions and
180
+ # mini_db fresh build (called ralph_repo_index 5 times).
181
+ "ralph_repo_index", "repo_index", "index_repo",
182
+ "list_mcp_resources", "list_resources", "search_resources",
183
+ }
178
184
 
179
185
  for parsed_call in parsed.tool_calls:
180
186
  tool_class = active_tools.get(parsed_call.tool_name)
@@ -2,7 +2,13 @@ You are DryDock, a CLI coding agent. You write code, fix bugs, and build project
2
2
 
3
3
  ACT IMMEDIATELY. Your FIRST response must be a tool call — not text. Do NOT explain, plan, or ask. Call a tool NOW.
4
4
 
5
- Your tools: read_file, write_file, search_replace, grep, glob, bash, task.
5
+ Your tools: read_file, write_file, search_replace, grep, glob, bash, task, web_search, web_fetch.
6
+
7
+ WHEN TO USE WEB TOOLS (use sparingly, NOT for every task):
8
+ - Stuck on an error you've tried to fix 2+ times without progress: `web_search` for the exact error message
9
+ - Need an API example you don't remember (e.g. "how do I parse TOML with stdlib?"): `web_search`
10
+ - Found a URL to a relevant SO post or doc page: `web_fetch` to read it
11
+ - DO NOT web-search for things you already know how to do. Write the code first.
6
12
 
7
13
  DELEGATION (only for genuinely large tasks)
8
14
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.6.70"
3
+ version = "2.6.74"
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"
@@ -0,0 +1,376 @@
1
+ #!/usr/bin/env python3
2
+ """Meta-RALPH loop — escalating sample+retry with stuck detection.
3
+
4
+ Wraps ralph_loop's iteration logic with three escalation stages:
5
+
6
+ Stage 1 Standard iteration (one sample per fix prompt).
7
+ Stage 2 Best-of-3 sampling when progress stalls. Each sample runs
8
+ from a clean snapshot of the last good state; fastest winner
9
+ wins (first sample that improves tests is kept, others
10
+ discarded).
11
+ Stage 3 Stuck mode: inject a system note telling the TUI to:
12
+ - web_search the specific error
13
+ - consult worked_examples/ for the relevant pattern
14
+ - try a fundamentally different approach, not another rewrite
15
+
16
+ Key difference from ralph_loop: when a fix iteration doesn't improve
17
+ tests, we don't just roll back — we respawn the drydock TUI fresh and
18
+ try again. Each new session re-reads the PRD and functional_tests from
19
+ scratch, getting a different response trajectory (the model is
20
+ stochastic enough that a fresh session produces different code).
21
+
22
+ Usage:
23
+ python3 scripts/meta_ralph_loop.py \\
24
+ --cwd /data3/drydock_test_projects/406_mini_db \\
25
+ --pkg mini_db \\
26
+ --max-stages 3 \\
27
+ --samples-per-stage 3
28
+ """
29
+ from __future__ import annotations
30
+
31
+ import argparse
32
+ import json
33
+ import os
34
+ import re
35
+ import shutil
36
+ import subprocess
37
+ import sys
38
+ import time
39
+ from pathlib import Path
40
+
41
+ import pexpect
42
+
43
+ DRYDOCK_BIN = "/home/bobef/miniforge3/envs/drydock/bin/drydock"
44
+ SESSION_ROOT = Path.home() / ".vibe" / "logs" / "session"
45
+ WORKED_EXAMPLES_DIR = Path("/data3/drydock/worked_examples")
46
+
47
+
48
+ # ── Reuse the SessionWatcher and helpers from ralph_loop ──
49
+ sys.path.insert(0, str(Path(__file__).resolve().parent))
50
+ from ralph_loop import ( # type: ignore
51
+ SessionWatcher, type_prompt, drain_pty,
52
+ wait_for_prompt_landing, wait_for_completion,
53
+ run_functional_tests, snapshot_package, restore_snapshot,
54
+ )
55
+
56
+
57
+ def find_worked_example(cwd: Path, pkg: str, failure_output: str) -> tuple[str, str] | None:
58
+ """Find the best-matching worked example for the current task.
59
+
60
+ Returns (file_path, summary) or None. Keyword-matches against the
61
+ PRD text + last failure output.
62
+ """
63
+ lookup = WORKED_EXAMPLES_DIR / "lookup.json"
64
+ if not lookup.exists():
65
+ return None
66
+ try:
67
+ data = json.loads(lookup.read_text())
68
+ except Exception:
69
+ return None
70
+
71
+ # Collect search corpus: PRD + failure output + package name
72
+ corpus_parts = [pkg]
73
+ for fn in ("PRD.md", "PRD.master.md"):
74
+ p = cwd / fn
75
+ if p.exists():
76
+ corpus_parts.append(p.read_text(errors="ignore"))
77
+ if failure_output:
78
+ corpus_parts.append(failure_output)
79
+ corpus = " ".join(corpus_parts).lower()
80
+
81
+ best = None
82
+ best_score = 0
83
+ for entry in data.get("examples", []):
84
+ score = sum(1 for kw in entry.get("keywords", [])
85
+ if kw.lower() in corpus)
86
+ if score > best_score:
87
+ best = entry
88
+ best_score = score
89
+
90
+ if not best or best_score < 2:
91
+ return None
92
+
93
+ fp = WORKED_EXAMPLES_DIR / best["file"]
94
+ if not fp.exists():
95
+ return None
96
+ return str(fp), best.get("summary", "")
97
+
98
+
99
+ def spawn_drydock(cwd: Path, log_path: Path) -> pexpect.spawn:
100
+ env = {**os.environ, "TERM": "xterm-256color", "COLUMNS": "120", "LINES": "30"}
101
+ child = pexpect.spawn(DRYDOCK_BIN, encoding="utf-8", timeout=5,
102
+ maxread=100000, env=env, cwd=str(cwd))
103
+ child.logfile_read = open(log_path, "w")
104
+ try:
105
+ child.expect([r">", r"Drydock", r"┌"], timeout=30)
106
+ except Exception:
107
+ pass
108
+ time.sleep(3)
109
+ try:
110
+ if "Trust this folder" in (child.before or ""):
111
+ child.send("\x1b[D")
112
+ time.sleep(0.2)
113
+ child.send("\r")
114
+ time.sleep(2)
115
+ except Exception:
116
+ pass
117
+ return child
118
+
119
+
120
+ def terminate_drydock(child: pexpect.spawn) -> None:
121
+ try:
122
+ child.sendcontrol("c")
123
+ time.sleep(0.5)
124
+ child.terminate(force=True)
125
+ except Exception:
126
+ pass
127
+
128
+
129
+ def run_single_session(cwd: Path, pkg: str, prompt: str,
130
+ max_wait: int = 1200,
131
+ idle_threshold: int = 180) -> tuple[int, int, str]:
132
+ """Spawn drydock, send ONE prompt, wait for it to finish,
133
+ return (test_pass, test_fail, output_tail)."""
134
+ log_path = Path(f"/tmp/meta_ralph_{pkg}_{int(time.time())}.log")
135
+ start_time = time.time()
136
+ child = spawn_drydock(cwd, log_path)
137
+ watcher = SessionWatcher(cwd, since=start_time)
138
+
139
+ try:
140
+ type_prompt(child, prompt)
141
+
142
+ # Wait for session to appear
143
+ for i in range(300):
144
+ drain_pty(child, 1.0)
145
+ if watcher.find_session():
146
+ break
147
+ if i > 0 and i % 60 == 0:
148
+ time.sleep(2)
149
+ type_prompt(child, prompt)
150
+ if not watcher.find_session():
151
+ return 0, 999, "session never appeared"
152
+
153
+ # Wait for prompt to land
154
+ if not wait_for_prompt_landing(child, watcher, 0, timeout=90):
155
+ time.sleep(5)
156
+ type_prompt(child, prompt)
157
+ if not wait_for_prompt_landing(child, watcher, 0, timeout=90):
158
+ return 0, 999, "prompt did not land"
159
+
160
+ # Wait for drydock to finish responding
161
+ wait_for_completion(child, watcher, max_wait=max_wait,
162
+ idle_threshold=idle_threshold)
163
+ finally:
164
+ terminate_drydock(child)
165
+
166
+ p, f, out = run_functional_tests(cwd)
167
+ return p, f, out
168
+
169
+
170
+ def best_of_n(cwd: Path, pkg: str, base_prompt: str, n: int,
171
+ current_best_pass: int, current_best_fail: int,
172
+ current_best_out: str,
173
+ snap: Path) -> tuple[int, int, str, Path]:
174
+ """Try the prompt N times, keeping the best result.
175
+
176
+ Between samples, restore the package from `snap`. If any sample
177
+ strictly improves test_pass count, return immediately (fastest win).
178
+
179
+ Returns (best_pass, best_fail, best_output, best_snap). If no sample
180
+ improves, returns the input values unchanged (callers can still
181
+ distinguish 'no progress' from 'all tests pass').
182
+ """
183
+ for i in range(n):
184
+ print(f" [sample {i+1}/{n}]")
185
+ # Restore package from snapshot so each sample starts clean
186
+ restore_snapshot(cwd, pkg, snap)
187
+
188
+ p, f, out = run_single_session(cwd, pkg, base_prompt,
189
+ max_wait=1200,
190
+ idle_threshold=180)
191
+ print(f" → {p}/{p+f} tests pass")
192
+
193
+ if p > current_best_pass:
194
+ # Win! Snapshot this state and return immediately.
195
+ new_snap = snapshot_package(cwd, pkg)
196
+ print(f" [new best: {p}, keeping]")
197
+ return p, f, out, new_snap
198
+
199
+ # No sample beat current best — restore snap and return UNCHANGED
200
+ restore_snapshot(cwd, pkg, snap)
201
+ return current_best_pass, current_best_fail, current_best_out, snap
202
+
203
+
204
+ def make_stuck_prompt(pkg: str, cwd: Path, failure_output: str) -> str:
205
+ """Build the stage-3 'stuck' prompt with web_search + worked-example hints."""
206
+ # Extract FAIL lines
207
+ fail_lines = [ln for ln in (failure_output or "").split("\n")
208
+ if ln.startswith("FAIL:")][:5]
209
+ fail_text = "\n".join(fail_lines)
210
+
211
+ # Look up a worked example
212
+ example_path = None
213
+ example_summary = ""
214
+ matched = find_worked_example(cwd, pkg, failure_output)
215
+ if matched:
216
+ example_path, example_summary = matched
217
+
218
+ prompt = (
219
+ f"You've tried fixing the failures multiple times without progress. "
220
+ f"Current failures:\n\n{fail_text}\n\n"
221
+ f"DO SOMETHING DIFFERENT. Ideas:\n"
222
+ f"- Use `web_search` to look up the exact error message or the "
223
+ f"technique you're trying (e.g. 'python sql tokenizer example').\n"
224
+ f"- Use `web_fetch` to read a Stack Overflow answer or docs page.\n"
225
+ f"- Read a DIFFERENT source file than the one you've been rewriting — "
226
+ f"the bug may be upstream.\n"
227
+ )
228
+ if example_path:
229
+ prompt += (
230
+ f"\nA WORKED EXAMPLE is available at {example_path}\n"
231
+ f"Summary: {example_summary}\n"
232
+ f"Read it with read_file and use the STRUCTURE (not the exact "
233
+ f"code) to guide your fix.\n"
234
+ )
235
+ prompt += (
236
+ f"\nThen apply ONE targeted search_replace to fix ONE failure at a "
237
+ f"time. Do NOT rewrite whole files. Do NOT ask me for confirmation."
238
+ )
239
+ return prompt
240
+
241
+
242
+ def meta_ralph(cwd: Path, pkg: str, max_stages: int = 3,
243
+ samples_per_stage: int = 3) -> dict:
244
+ """Main meta-RALPH loop."""
245
+ print(f"\n{'='*60}")
246
+ print(f" META-RALPH: {pkg}")
247
+ print(f" cwd: {cwd}")
248
+ print(f" max stages: {max_stages}, samples/stage: {samples_per_stage}")
249
+ print(f"{'='*60}\n")
250
+
251
+ # Restore PRD.md
252
+ master = cwd / "PRD.master.md"
253
+ if master.exists():
254
+ shutil.copy2(master, cwd / "PRD.md")
255
+
256
+ start_time = time.time()
257
+ stages_log = []
258
+
259
+ # ── STAGE 1: Initial build (single sample, standard prompt) ──
260
+ print(f"─── STAGE 1: Initial build ───")
261
+ pkg_init = cwd / pkg / "__init__.py"
262
+ if pkg_init.exists():
263
+ initial_prompt = (
264
+ f"Look at the existing {pkg}/ directory and functional_tests.sh. "
265
+ f"Fix any failing tests with targeted search_replace patches."
266
+ )
267
+ else:
268
+ initial_prompt = (
269
+ f"Read PRD.md AND functional_tests.sh. Build the {pkg} package. "
270
+ f"Your CLI must conform to functional_tests.sh exactly. "
271
+ f"Create ALL files from the PRD. Write __init__.py, cli.py, "
272
+ f"__main__.py FIRST."
273
+ )
274
+
275
+ p, f, out = run_single_session(cwd, pkg, initial_prompt,
276
+ max_wait=1500, idle_threshold=180)
277
+ print(f" Stage 1 result: {p}/{p+f} tests pass")
278
+ best_pass = p
279
+ best_fail = f
280
+ best_out = out
281
+ best_snap = snapshot_package(cwd, pkg)
282
+ stages_log.append({"stage": 1, "pass": p, "fail": f, "strategy": "single_build"})
283
+
284
+ # Early exit if perfect
285
+ if best_fail == 0 and best_pass > 0:
286
+ print(f"\n ✓ All tests pass! Done at stage 1.")
287
+ return _report(cwd, pkg, start_time, stages_log, best_pass, best_fail)
288
+
289
+ # ── STAGE 2: best-of-N sampling ──
290
+ if max_stages >= 2:
291
+ print(f"\n─── STAGE 2: best-of-{samples_per_stage} sampling ───")
292
+ fail_lines = "\n".join(ln for ln in out.split("\n")
293
+ if ln.startswith("FAIL:"))[:1500]
294
+ fix_prompt = (
295
+ f"Tests are failing:\n{fail_lines}\n\n"
296
+ f"Make TARGETED search_replace patches. Do not rewrite working files. "
297
+ f"Do not break currently-passing tests. Run bash functional_tests.sh "
298
+ f"when you think you're done."
299
+ )
300
+ p, f, out, best_snap = best_of_n(
301
+ cwd, pkg, fix_prompt, samples_per_stage,
302
+ best_pass, best_fail, best_out, best_snap,
303
+ )
304
+ print(f" Stage 2 result: {p}/{p+f} tests pass")
305
+ best_pass, best_fail, best_out = p, f, out
306
+ stages_log.append({
307
+ "stage": 2, "pass": p, "fail": f,
308
+ "strategy": f"best_of_{samples_per_stage}",
309
+ })
310
+ if best_fail == 0 and best_pass > 0:
311
+ print(f"\n ✓ All tests pass! Done at stage 2.")
312
+ return _report(cwd, pkg, start_time, stages_log, best_pass, best_fail)
313
+
314
+ # ── STAGE 3: stuck mode with web_search + worked example ──
315
+ if max_stages >= 3:
316
+ print(f"\n─── STAGE 3: stuck mode (web_search + worked example) ───")
317
+ stuck_prompt = make_stuck_prompt(pkg, cwd, best_out)
318
+ # One sample at a time; don't rollback — the stuck mode is a
319
+ # last-ditch effort, any improvement is worth keeping.
320
+ p, f, out = run_single_session(cwd, pkg, stuck_prompt,
321
+ max_wait=1800, idle_threshold=240)
322
+ print(f" Stage 3 result: {p}/{p+f} tests pass")
323
+ if p > best_pass:
324
+ best_pass, best_fail, best_out = p, f, out
325
+ best_snap = snapshot_package(cwd, pkg)
326
+ else:
327
+ restore_snapshot(cwd, pkg, best_snap)
328
+ stages_log.append({
329
+ "stage": 3, "pass": p, "fail": f, "strategy": "stuck_mode",
330
+ })
331
+
332
+ return _report(cwd, pkg, start_time, stages_log, best_pass, best_fail)
333
+
334
+
335
+ def _report(cwd: Path, pkg: str, start_time: float, stages_log: list,
336
+ best_pass: int, best_fail: int) -> dict:
337
+ total = int(time.time() - start_time)
338
+ print(f"\n{'='*60}")
339
+ print(f" META-RALPH RESULTS: {pkg}")
340
+ print(f" Total time: {total}s ({total/60:.1f}m)")
341
+ for s in stages_log:
342
+ print(f" stage {s['stage']}: {s['pass']}/{s['pass']+s['fail']} "
343
+ f"({s['strategy']})")
344
+ print(f"\n FINAL: {best_pass}/{best_pass+best_fail} tests pass")
345
+ print(f"{'='*60}\n")
346
+
347
+ report = {
348
+ "pkg": pkg,
349
+ "total_seconds": total,
350
+ "stages": stages_log,
351
+ "final_pass": best_pass,
352
+ "final_fail": best_fail,
353
+ }
354
+ out_path = Path(f"/tmp/meta_ralph_{pkg}_results.json")
355
+ with open(out_path, "w") as f:
356
+ json.dump(report, f, indent=2)
357
+ print(f" Report: {out_path}")
358
+ return report
359
+
360
+
361
+ def main() -> int:
362
+ parser = argparse.ArgumentParser()
363
+ parser.add_argument("--cwd", required=True)
364
+ parser.add_argument("--pkg", required=True)
365
+ parser.add_argument("--max-stages", type=int, default=3)
366
+ parser.add_argument("--samples-per-stage", type=int, default=3)
367
+ args = parser.parse_args()
368
+ report = meta_ralph(
369
+ Path(args.cwd).resolve(), args.pkg,
370
+ args.max_stages, args.samples_per_stage,
371
+ )
372
+ return 0 if report["final_fail"] == 0 else 1
373
+
374
+
375
+ if __name__ == "__main__":
376
+ sys.exit(main())