drydock-cli 2.9.87__tar.gz → 2.9.91__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 (715) hide show
  1. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/PKG-INFO +1 -1
  2. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/agent_loop.py +18 -4
  3. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/grammar/policy.py +10 -1
  4. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/grammar/policy_union.py +62 -0
  5. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/bash.py +2 -2
  6. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/pyproject.toml +1 -1
  7. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_config_paths.py +14 -3
  8. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_config_resolution.py +3 -1
  9. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_grammar.py +88 -1
  10. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/uv.lock +1 -1
  11. drydock_cli-2.9.87/tests/core/test_circuit_breaker_count_escalation.py +0 -94
  12. drydock_cli-2.9.87/tests/core/test_circuit_breaker_readonly_threshold.py +0 -93
  13. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/.gitignore +0 -0
  14. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/LICENSE +0 -0
  15. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/NOTICE +0 -0
  16. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/README.md +0 -0
  17. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/distribution/zed/LICENSE +0 -0
  18. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/docs/README.md +0 -0
  19. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/__init__.py +0 -0
  20. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/__main__.py +0 -0
  21. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/__init__.py +0 -0
  22. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/acp_agent_loop.py +0 -0
  23. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/acp_logger.py +0 -0
  24. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/entrypoint.py +0 -0
  25. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/tools/__init__.py +0 -0
  26. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/tools/base.py +0 -0
  27. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/tools/builtins/bash.py +0 -0
  28. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/tools/builtins/read_file.py +0 -0
  29. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/tools/builtins/search_replace.py +0 -0
  30. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/tools/builtins/todo.py +0 -0
  31. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/tools/builtins/write_file.py +0 -0
  32. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/tools/session_update.py +0 -0
  33. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/acp/utils.py +0 -0
  34. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/__init__.py +0 -0
  35. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/detectors.py +0 -0
  36. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/detectors_proposed.py +0 -0
  37. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/history.py +0 -0
  38. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/interventions.py +0 -0
  39. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/llm_analyzer.py +0 -0
  40. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/metrics.py +0 -0
  41. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/opus_escalator.py +0 -0
  42. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/persistence.py +0 -0
  43. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/policy.py +0 -0
  44. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/proposer.py +0 -0
  45. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/stager.py +0 -0
  46. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/task_classifier.py +0 -0
  47. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/tuning.py +0 -0
  48. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/validator.py +0 -0
  49. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/admiral/worker.py +0 -0
  50. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/__init__.py +0 -0
  51. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/autocompletion/__init__.py +0 -0
  52. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/autocompletion/base.py +0 -0
  53. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/autocompletion/path_completion.py +0 -0
  54. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/autocompletion/slash_command.py +0 -0
  55. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/cli.py +0 -0
  56. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/clipboard.py +0 -0
  57. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/commands.py +0 -0
  58. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/entrypoint.py +0 -0
  59. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/fix_windows_path.py +0 -0
  60. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/history_manager.py +0 -0
  61. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  62. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  63. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  64. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/terminal_setup.py +0 -0
  65. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/__init__.py +0 -0
  66. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  67. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/app.py +0 -0
  68. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/app.tcss +0 -0
  69. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/external_editor.py +0 -0
  70. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  71. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  72. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  73. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  74. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  75. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  76. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  77. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  78. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  79. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  80. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  81. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  82. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  83. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  84. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  85. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  86. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  87. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  88. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  89. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  90. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  91. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  92. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  93. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  94. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  95. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  96. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  97. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  98. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  99. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  100. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  101. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  102. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  103. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  104. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  105. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  106. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  107. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/windowing/history.py +0 -0
  108. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  109. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/textual_ui/windowing/state.py +0 -0
  110. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/update_notifier/__init__.py +0 -0
  111. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  112. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  113. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  114. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  115. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  116. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/update_notifier/update.py +0 -0
  117. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/cli/update_notifier/whats_new.py +0 -0
  118. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/__init__.py +0 -0
  119. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/agents/__init__.py +0 -0
  120. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/agents/manager.py +0 -0
  121. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/agents/models.py +0 -0
  122. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/auth/__init__.py +0 -0
  123. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/auth/crypto.py +0 -0
  124. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/auth/github.py +0 -0
  125. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/auto_solve.py +0 -0
  126. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/__init__.py +0 -0
  127. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/completers.py +0 -0
  128. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  129. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  130. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  131. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  132. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  133. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/fuzzy.py +0 -0
  134. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/path_prompt.py +0 -0
  135. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  136. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/build_orchestrator.py +0 -0
  137. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/checkpoint.py +0 -0
  138. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/classifier/__init__.py +0 -0
  139. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/classifier/__main__.py +0 -0
  140. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/classifier/classifier.py +0 -0
  141. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/classifier/dispatcher.py +0 -0
  142. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/classifier/rules.py +0 -0
  143. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/classifier/signal.py +0 -0
  144. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/config/__init__.py +0 -0
  145. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/config/_dotenv.py +0 -0
  146. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/config/_settings.py +0 -0
  147. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/config/doctor.py +0 -0
  148. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/config/harness_files/__init__.py +0 -0
  149. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  150. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/config/harness_files/_paths.py +0 -0
  151. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/config/local_detect.py +0 -0
  152. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/config/migrate.py +0 -0
  153. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/constraint_extract.py +0 -0
  154. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/constraint_hint.py +0 -0
  155. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/consultant.py +0 -0
  156. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/context_recovery.py +0 -0
  157. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/drydock_states.py +0 -0
  158. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/goal.py +0 -0
  159. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/hooks.py +0 -0
  160. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/__init__.py +0 -0
  161. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/backend/anthropic.py +0 -0
  162. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/backend/base.py +0 -0
  163. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/backend/factory.py +0 -0
  164. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/backend/generic.py +0 -0
  165. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/backend/mistral.py +0 -0
  166. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  167. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/backend/vertex.py +0 -0
  168. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/exceptions.py +0 -0
  169. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/format.py +0 -0
  170. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/grammar/__init__.py +0 -0
  171. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/grammar/_llamacpp_converter.py +0 -0
  172. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/message_utils.py +0 -0
  173. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/llm/types.py +0 -0
  174. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/logger.py +0 -0
  175. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/middleware.py +0 -0
  176. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/output_formatters.py +0 -0
  177. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/paths/__init__.py +0 -0
  178. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/paths/_drydock_home.py +0 -0
  179. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/paths/_local_config_walk.py +0 -0
  180. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/paths/conventions.py +0 -0
  181. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/plan_session.py +0 -0
  182. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/plugins.py +0 -0
  183. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/programmatic.py +0 -0
  184. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/__init__.py +0 -0
  185. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/builder.md +0 -0
  186. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/cli.md +0 -0
  187. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/compact.md +0 -0
  188. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/dangerous_directory.md +0 -0
  189. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/diagnostic.md +0 -0
  190. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/explore.md +0 -0
  191. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/gemma4.md +0 -0
  192. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/gemma4_math.md +0 -0
  193. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/gemma4_slim.md +0 -0
  194. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/planner.md +0 -0
  195. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/project_context.md +0 -0
  196. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/prompts/tests.md +0 -0
  197. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/proxy_setup.py +0 -0
  198. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/session/agent_memory.py +0 -0
  199. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/session/checkpoints.py +0 -0
  200. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/session/session_loader.py +0 -0
  201. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/session/session_logger.py +0 -0
  202. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/session/session_migration.py +0 -0
  203. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/session/state_file.py +0 -0
  204. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/session_checker.py +0 -0
  205. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/skills/__init__.py +0 -0
  206. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/skills/manager.py +0 -0
  207. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/skills/models.py +0 -0
  208. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/skills/parser.py +0 -0
  209. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/slug.py +0 -0
  210. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/spec_check.py +0 -0
  211. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/steering_hook.py +0 -0
  212. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/system_prompt.py +0 -0
  213. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/telemetry/__init__.py +0 -0
  214. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/telemetry/send.py +0 -0
  215. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/teleport/errors.py +0 -0
  216. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/teleport/git.py +0 -0
  217. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/teleport/nuage.py +0 -0
  218. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/teleport/teleport.py +0 -0
  219. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/teleport/types.py +0 -0
  220. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/base.py +0 -0
  221. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/_task_manager.py +0 -0
  222. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/algebra_tool.py +0 -0
  223. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  224. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/chemistry_tool.py +0 -0
  225. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/count_tool.py +0 -0
  226. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/cron.py +0 -0
  227. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  228. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/glob_tool.py +0 -0
  229. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/grep.py +0 -0
  230. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  231. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/linear_algebra_tool.py +0 -0
  232. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/logic_tool.py +0 -0
  233. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/lsp.py +0 -0
  234. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/math_tool.py +0 -0
  235. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  236. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/mechanical_rename.py +0 -0
  237. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/memory_tool.py +0 -0
  238. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  239. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/number_theory_tool.py +0 -0
  240. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/powershell.py +0 -0
  241. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prolog_tool.py +0 -0
  242. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  243. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  244. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  245. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  246. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  247. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  248. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  249. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  250. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  251. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  252. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  253. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  254. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
  255. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  256. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  257. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/task.md +0 -0
  258. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  259. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  260. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  261. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  262. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  263. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  264. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  265. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/read_file.py +0 -0
  266. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/retrieve.py +0 -0
  267. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/search_replace.py +0 -0
  268. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/set_tool.py +0 -0
  269. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/solve_tool.py +0 -0
  270. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/stats_tool.py +0 -0
  271. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/task.py +0 -0
  272. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/todo.py +0 -0
  273. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/tool_search.py +0 -0
  274. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/units_tool.py +0 -0
  275. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/verify_tool.py +0 -0
  276. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/webfetch.py +0 -0
  277. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/websearch.py +0 -0
  278. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/worktree.py +0 -0
  279. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/builtins/write_file.py +0 -0
  280. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/injection_guard.py +0 -0
  281. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/manager.py +0 -0
  282. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/mcp/__init__.py +0 -0
  283. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/mcp/registry.py +0 -0
  284. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/mcp/tools.py +0 -0
  285. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/mcp_sampling.py +0 -0
  286. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/ui.py +0 -0
  287. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/tools/utils.py +0 -0
  288. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/trusted_folders.py +0 -0
  289. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/types.py +0 -0
  290. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/core/utils.py +0 -0
  291. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/curiosity/__init__.py +0 -0
  292. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/curiosity/__main__.py +0 -0
  293. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/curiosity/gap_detector.py +0 -0
  294. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/curiosity/ingest.py +0 -0
  295. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/curiosity/item.py +0 -0
  296. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/curiosity/queue.py +0 -0
  297. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/curiosity/surprise.py +0 -0
  298. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/graphrag/__init__.py +0 -0
  299. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/graphrag/__main__.py +0 -0
  300. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/graphrag/code_indexer.py +0 -0
  301. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/graphrag/retriever.py +0 -0
  302. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/graphrag/storage.py +0 -0
  303. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/graphrag/text_indexer.py +0 -0
  304. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/onboarding/__init__.py +0 -0
  305. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/onboarding/base.py +0 -0
  306. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/onboarding/onboarding.tcss +0 -0
  307. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/onboarding/screens/__init__.py +0 -0
  308. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/onboarding/screens/api_key.py +0 -0
  309. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/onboarding/screens/choice.py +0 -0
  310. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/onboarding/screens/local_model.py +0 -0
  311. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/onboarding/screens/welcome.py +0 -0
  312. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  313. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  314. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/__init__.py +0 -0
  315. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/api-design/SKILL.md +0 -0
  316. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/audit-tests/SKILL.md +0 -0
  317. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/batch/SKILL.md +0 -0
  318. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/checklist/SKILL.md +0 -0
  319. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/commit-code/SKILL.md +0 -0
  320. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/constraint-reasoning/SKILL.md +0 -0
  321. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/context-summary/SKILL.md +0 -0
  322. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/create-presentation/SKILL.md +0 -0
  323. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/deep-research/SKILL.md +0 -0
  324. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/deploy/SKILL.md +0 -0
  325. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/diff-review/SKILL.md +0 -0
  326. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/doc-gen/SKILL.md +0 -0
  327. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/explain-code/SKILL.md +0 -0
  328. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/explore-code/SKILL.md +0 -0
  329. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/fix-issue/SKILL.md +0 -0
  330. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/git-ops/SKILL.md +0 -0
  331. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/init-project/SKILL.md +0 -0
  332. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/investigate/SKILL.md +0 -0
  333. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/logic/SKILL.md +0 -0
  334. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/logic/assets/cheat_sheet_full.txt +0 -0
  335. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/loop/SKILL.md +0 -0
  336. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/migrate/SKILL.md +0 -0
  337. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/perf-analyze/SKILL.md +0 -0
  338. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/plan-impl/SKILL.md +0 -0
  339. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/pr-review/SKILL.md +0 -0
  340. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/prove/SKILL.md +0 -0
  341. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/refactor/SKILL.md +0 -0
  342. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/regex-help/SKILL.md +0 -0
  343. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/review/SKILL.md +0 -0
  344. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/security-review/SKILL.md +0 -0
  345. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/ship/SKILL.md +0 -0
  346. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/simplify/SKILL.md +0 -0
  347. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/strong-tests/SKILL.md +0 -0
  348. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/skills/test-verify/SKILL.md +0 -0
  349. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/__init__.py +0 -0
  350. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/__main__.py +0 -0
  351. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/applier.py +0 -0
  352. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/config.py +0 -0
  353. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/registry.py +0 -0
  354. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/sandbox.py +0 -0
  355. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/sidecar/__init__.py +0 -0
  356. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/sidecar/header_parser.py +0 -0
  357. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/sidecar/hooks.py +0 -0
  358. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/sidecar/loader.py +0 -0
  359. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/sidecar/server.py +0 -0
  360. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/train/__init__.py +0 -0
  361. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/train/capture.py +0 -0
  362. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/train/compute_vector.py +0 -0
  363. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/train/extract_pairs.py +0 -0
  364. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/train/scan_sessions.py +0 -0
  365. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/steering/vectors.py +0 -0
  366. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/drydock/whats_new.md +0 -0
  367. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/install_tests/README.md +0 -0
  368. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/install_tests/publish/README.md +0 -0
  369. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/install_tests/windows/README.md +0 -0
  370. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/scripts/README.md +0 -0
  371. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/scripts/_archived_eval_harness/README.md +0 -0
  372. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/scripts/llm/README.md +0 -0
  373. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/__init__.py +0 -0
  374. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/conftest.py +0 -0
  375. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_acp.py +0 -0
  376. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_agent_thought.py +0 -0
  377. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_bash.py +0 -0
  378. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_compact_session_updates.py +0 -0
  379. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_content.py +0 -0
  380. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_initialize.py +0 -0
  381. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_list_sessions.py +0 -0
  382. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_load_session.py +0 -0
  383. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_multi_session.py +0 -0
  384. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_new_session.py +0 -0
  385. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_proxy_setup_acp.py +0 -0
  386. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_read_file.py +0 -0
  387. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_search_replace.py +0 -0
  388. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_set_config_option.py +0 -0
  389. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_set_mode.py +0 -0
  390. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_set_model.py +0 -0
  391. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_tool_call_session_update.py +0 -0
  392. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_utils.py +0 -0
  393. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/acp/test_write_file.py +0 -0
  394. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/autocompletion/conftest.py +0 -0
  395. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/autocompletion/test_file_indexer.py +0 -0
  396. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/autocompletion/test_fuzzy.py +0 -0
  397. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  398. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  399. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/autocompletion/test_path_completion_controller.py +0 -0
  400. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  401. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/autocompletion/test_slash_command_controller.py +0 -0
  402. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  403. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/backend/__init__.py +0 -0
  404. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/backend/data/__init__.py +0 -0
  405. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/backend/data/fireworks.py +0 -0
  406. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/backend/data/mistral.py +0 -0
  407. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/backend/test_anthropic_adapter.py +0 -0
  408. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/backend/test_backend.py +0 -0
  409. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  410. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/backend/test_reasoning_adapter.py +0 -0
  411. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  412. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  413. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  414. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  415. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_bell_notifications.py +0 -0
  416. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_braille_renderer.py +0 -0
  417. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_clipboard.py +0 -0
  418. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_commands.py +0 -0
  419. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_copy_shortcuts.py +0 -0
  420. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_external_editor.py +0 -0
  421. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_no_markup_static.py +0 -0
  422. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_question_app.py +0 -0
  423. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_spinner.py +0 -0
  424. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_switching_mode.py +0 -0
  425. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  426. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  427. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_ui_session_resume.py +0 -0
  428. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/test_ui_skill_dispatch.py +0 -0
  429. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/textual_ui/__init__.py +0 -0
  430. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/cli/textual_ui/test_session_picker.py +0 -0
  431. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/conftest.py +0 -0
  432. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_agents.py +0 -0
  433. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_auth_crypto.py +0 -0
  434. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_auth_github.py +0 -0
  435. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_config_load_dotenv.py +0 -0
  436. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_file_logging.py +0 -0
  437. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_plan_session.py +0 -0
  438. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_proxy_setup.py +0 -0
  439. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_slug.py +0 -0
  440. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_telemetry_send.py +0 -0
  441. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_teleport_git.py +0 -0
  442. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_teleport_nuage.py +0 -0
  443. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_teleport_service.py +0 -0
  444. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_trusted_folders.py +0 -0
  445. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/core/test_utils.py +0 -0
  446. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/e2e/common.py +0 -0
  447. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/e2e/conftest.py +0 -0
  448. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/e2e/mock_server.py +0 -0
  449. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  450. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/e2e/test_cli_tui_streaming.py +0 -0
  451. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  452. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/fixtures/doc_qa_system_prd.md +0 -0
  453. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/mock/__init__.py +0 -0
  454. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/mock/mock_backend_factory.py +0 -0
  455. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/mock/mock_entrypoint.py +0 -0
  456. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/mock/utils.py +0 -0
  457. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/onboarding/test_run_onboarding.py +0 -0
  458. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/onboarding/test_ui_onboarding.py +0 -0
  459. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/session/test_session_loader.py +0 -0
  460. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/session/test_session_logger.py +0 -0
  461. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/session/test_session_migration.py +0 -0
  462. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/skills/conftest.py +0 -0
  463. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/skills/test_manager.py +0 -0
  464. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/skills/test_models.py +0 -0
  465. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/skills/test_parser.py +0 -0
  466. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  467. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  468. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  469. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  470. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  471. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  472. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  473. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  474. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  475. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  476. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  477. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  478. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  479. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  480. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  481. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  482. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  483. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  484. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  485. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  486. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  487. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  488. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  489. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  490. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  491. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  492. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  493. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  494. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  495. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  496. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  497. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  498. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  499. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  500. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  501. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  502. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  503. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  504. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  505. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  506. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  507. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  508. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  509. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  510. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  511. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  512. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  513. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  514. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  515. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  516. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  517. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  518. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  519. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  520. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  521. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  522. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  523. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  524. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  525. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  526. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/base_snapshot_test_app.py +0 -0
  527. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/conftest.py +0 -0
  528. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/snap_compare.py +0 -0
  529. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  530. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  531. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  532. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  533. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  534. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  535. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  536. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  537. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  538. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  539. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  540. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  541. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  542. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  543. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/stress/__init__.py +0 -0
  544. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/stress/test_io_thrash.py +0 -0
  545. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/stubs/fake_backend.py +0 -0
  546. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/stubs/fake_client.py +0 -0
  547. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/stubs/fake_tool.py +0 -0
  548. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_admiral.py +0 -0
  549. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
  550. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_admiral_intervention_outcome.py +0 -0
  551. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_admiral_phase3.py +0 -0
  552. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_admiral_proposed.py +0 -0
  553. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_admiral_session_id.py +0 -0
  554. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_admiral_struggle_dedup.py +0 -0
  555. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_agent_auto_compact.py +0 -0
  556. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_agent_backend.py +0 -0
  557. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_agent_observer_streaming.py +0 -0
  558. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_agent_stats.py +0 -0
  559. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_agent_tasks.py +0 -0
  560. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_agent_tool_call.py +0 -0
  561. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_agents.py +0 -0
  562. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_algebra_tool.py +0 -0
  563. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_api_error_recovery.py +0 -0
  564. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_approval_modal_stray_keys.py +0 -0
  565. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_auto_retrieve_soft_nudge.py +0 -0
  566. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_auto_solve.py +0 -0
  567. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_bank_build.py +0 -0
  568. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_bank_debug.py +0 -0
  569. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_bank_multiagent.py +0 -0
  570. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_bank_prd.py +0 -0
  571. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_bank_prd_extended.py +0 -0
  572. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_bank_tools.py +0 -0
  573. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_bank_update.py +0 -0
  574. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_build_projects.py +0 -0
  575. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_checkpoint.py +0 -0
  576. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_chemistry_tool.py +0 -0
  577. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_classifier.py +0 -0
  578. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_cli_programmatic_preload.py +0 -0
  579. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_config_migration.py +0 -0
  580. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_constraint_extract.py +0 -0
  581. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_constraint_hint.py +0 -0
  582. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_context_recovery.py +0 -0
  583. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_count_tool.py +0 -0
  584. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_curiosity.py +0 -0
  585. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_current_bugs.py +0 -0
  586. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_dispatch_report.py +0 -0
  587. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_dispatcher.py +0 -0
  588. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_drydock_regression.py +0 -0
  589. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_drydock_tasks.py +0 -0
  590. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  591. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_full_regression.py +0 -0
  592. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_gemma4_anti_loop_migration.py +0 -0
  593. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_goal.py +0 -0
  594. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_graphrag.py +0 -0
  595. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_graphrag_worked_examples.py +0 -0
  596. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_hallucinated_tool_suppression.py +0 -0
  597. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_history_manager.py +0 -0
  598. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_hle_aggregate.py +0 -0
  599. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_integration.py +0 -0
  600. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_issue_fixes.py +0 -0
  601. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_linear_algebra_tool.py +0 -0
  602. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_local_detect.py +0 -0
  603. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_logic_tool.py +0 -0
  604. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_loop_detection.py +0 -0
  605. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_math_docs_lazy_injection.py +0 -0
  606. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_math_tool.py +0 -0
  607. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_mcp_settings.py +0 -0
  608. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_mcp_stdio_command_normalization.py +0 -0
  609. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_memory_tool.py +0 -0
  610. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_message_id.py +0 -0
  611. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_message_merging.py +0 -0
  612. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_middleware.py +0 -0
  613. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_multi_agent.py +0 -0
  614. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_number_theory_tool.py +0 -0
  615. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_prolog_tool.py +0 -0
  616. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_read_file_not_found_listing.py +0 -0
  617. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_read_file_notebook_slim.py +0 -0
  618. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_real_failures.py +0 -0
  619. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_real_issues.py +0 -0
  620. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_real_workflow.py +0 -0
  621. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_reasoning_content.py +0 -0
  622. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_rejudge_hle.py +0 -0
  623. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_retrieval_consumer.py +0 -0
  624. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_retrieve_project_detection.py +0 -0
  625. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_retrieve_tool.py +0 -0
  626. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_safe_parse_tool_args.py +0 -0
  627. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_search_replace_args_not_truncated.py +0 -0
  628. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_search_replace_syntax_rollback.py +0 -0
  629. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_session_log_event.py +0 -0
  630. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_session_publish_on_resume.py +0 -0
  631. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_set_tool.py +0 -0
  632. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_smoke.py +0 -0
  633. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_solve_tool.py +0 -0
  634. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_specialist_math_tools_hidden.py +0 -0
  635. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_stats_tool.py +0 -0
  636. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_steering.py +0 -0
  637. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_steering_capture.py +0 -0
  638. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_steering_compute_vector.py +0 -0
  639. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_steering_extract_pairs.py +0 -0
  640. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_steering_hook.py +0 -0
  641. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_steering_sidecar_chat_inputs.py +0 -0
  642. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_steering_sidecar_hooks.py +0 -0
  643. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_system_prompt.py +0 -0
  644. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_tagged_text.py +0 -0
  645. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_task_complete_nudge.py +0 -0
  646. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_tool_args.py +0 -0
  647. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_tool_call_loops_regression_suite.py +0 -0
  648. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_tool_stop_injected_scope.py +0 -0
  649. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_truncate_args_valid_json.py +0 -0
  650. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_truncated_arg_path_hint.py +0 -0
  651. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_truncated_search_replace_escalation.py +0 -0
  652. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_truncated_write_escalation.py +0 -0
  653. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_ui_external_editor.py +0 -0
  654. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_ui_input_history.py +0 -0
  655. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_units_tool.py +0 -0
  656. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_user_issues.py +0 -0
  657. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_validation_error_scrub.py +0 -0
  658. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_verify_tool.py +0 -0
  659. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_wall_of_text_rescue.py +0 -0
  660. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_workloads.py +0 -0
  661. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/test_write_file_missing_path.py +0 -0
  662. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/testbank_helpers.py +0 -0
  663. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_ask_user_question.py +0 -0
  664. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash.py +0 -0
  665. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash_binary_grep_hint.py +0 -0
  666. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash_consec_empty_search.py +0 -0
  667. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
  668. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
  669. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash_error_loop_breaker.py +0 -0
  670. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
  671. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
  672. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
  673. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
  674. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_exit_plan_mode.py +0 -0
  675. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_grep.py +0 -0
  676. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
  677. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_invoke_context.py +0 -0
  678. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  679. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_manager_get_tool_config.py +0 -0
  680. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_mcp.py +0 -0
  681. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_mcp_sampling.py +0 -0
  682. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_pre_rename_hook.py +0 -0
  683. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
  684. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  685. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_read_file_directory.py +0 -0
  686. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_read_file_limit_truncation.py +0 -0
  687. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_append_fallback.py +0 -0
  688. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_dir_path.py +0 -0
  689. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_empty_content.py +0 -0
  690. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_file_not_found.py +0 -0
  691. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
  692. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_hard_stop.py +0 -0
  693. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_malformed_block.py +0 -0
  694. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  695. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_placeholder.py +0 -0
  696. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  697. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_task.py +0 -0
  698. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_ui_bash_execution.py +0 -0
  699. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_webfetch.py +0 -0
  700. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_websearch.py +0 -0
  701. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  702. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_write_file_missing_main_module.py +0 -0
  703. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  704. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/tools/test_write_file_multifile_rename.py +0 -0
  705. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  706. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  707. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/update_notifier/test_do_update.py +0 -0
  708. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  709. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/update_notifier/test_github_update_gateway.py +0 -0
  710. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  711. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/update_notifier/test_ui_update_notification.py +0 -0
  712. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/update_notifier/test_update_use_case.py +0 -0
  713. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/tests/update_notifier/test_whats_new.py +0 -0
  714. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/web/README.md +0 -0
  715. {drydock_cli-2.9.87 → drydock_cli-2.9.91}/worked_examples/README.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.9.87
3
+ Version: 2.9.91
4
4
  Summary: Local-first CLI coding agent — tested with Gemma 4 26B via llama.cpp
5
5
  Project-URL: Homepage, https://github.com/fbobe321/drydock
6
6
  Project-URL: Repository, https://github.com/fbobe321/drydock
@@ -21,7 +21,7 @@ from pydantic import BaseModel
21
21
 
22
22
  from drydock.cli.terminal_setup import detect_terminal
23
23
  from drydock.core.agents.manager import AgentManager
24
- from drydock.core.agents.models import AgentProfile, BuiltinAgentName
24
+ from drydock.core.agents.models import AgentProfile, AgentType, BuiltinAgentName
25
25
  from drydock.core.config import Backend, ProviderConfig, DrydockConfig
26
26
  from drydock.core.llm.backend.factory import BACKEND_FACTORY
27
27
  from drydock.core.llm.exceptions import BackendError
@@ -1174,9 +1174,23 @@ class AgentLoop:
1174
1174
  # a final text response. 18 = 3× nudge threshold —
1175
1175
  # the nudge has fired AT LEAST twice without effect.
1176
1176
  # Gated by DRYDOCK_ADAPTIVE_BUDGET=1 (default ON).
1177
- if os.environ.get(
1178
- "DRYDOCK_ADAPTIVE_BUDGET", "1"
1179
- ).strip().lower() not in ("0", "false", "no"):
1177
+ #
1178
+ # SKIP for subagents (explore/diagnostic/planner/builder)
1179
+ # they are designed to be read-mostly and their parent
1180
+ # owns the overall deadline. Firing inside a subagent
1181
+ # made it return completed=False with the "Stopping
1182
+ # exploration" nudge as content; the parent read that
1183
+ # and dispatched ANOTHER subagent on a related question,
1184
+ # repeating indefinitely. Observed 2026-06-06 in user's
1185
+ # slide-reviewer drydock session: 28-minute loop of
1186
+ # back-to-back explore dispatches, each cut off at 18
1187
+ # read-only calls. The subagent's max_turns budget +
1188
+ # the parent's own ADAPTIVE-BUDGET still cap runtime.
1189
+ if (
1190
+ os.environ.get("DRYDOCK_ADAPTIVE_BUDGET", "1")
1191
+ .strip().lower() not in ("0", "false", "no")
1192
+ and self.agent_profile.agent_type != AgentType.SUBAGENT
1193
+ ):
1180
1194
  _streak = getattr(self, "_readonly_streak", 0)
1181
1195
  if _streak >= 18:
1182
1196
  self.stats.adaptive_budget_stops += 1
@@ -89,8 +89,17 @@ def select_grammar(
89
89
  )
90
90
  return None, None
91
91
 
92
+ # Tighten the schema: Pydantic `Field(default="")` markers in
93
+ # drydock args models leak as non-required JSON-Schema fields, and
94
+ # the grammar then lets the model emit empty paths / no-content
95
+ # writes. Reuse the union-grammar tightener. See policy_union for
96
+ # the heuristic.
97
+ from drydock.core.llm.grammar.policy_union import _tighten_args_schema
92
98
  try:
93
- gbnf = pydantic_to_gbnf(args_model)
99
+ raw_schema = args_model.model_json_schema()
100
+ tight_schema = _tighten_args_schema(raw_schema)
101
+ from drydock.core.llm.grammar import json_schema_to_gbnf
102
+ gbnf = json_schema_to_gbnf(tight_schema)
94
103
  except Exception as e:
95
104
  logger.warning(
96
105
  "[GRAMMAR-POLICY] failed to compile %s args to GBNF: %s",
@@ -44,6 +44,67 @@ _COMMON_RULES = ("space", "string", "char", "boolean", "null", "number",
44
44
  "integer", "value")
45
45
 
46
46
 
47
+ def _tighten_args_schema(schema: dict[str, Any]) -> dict[str, Any]:
48
+ """Force fields with vacuous defaults to be required in the grammar.
49
+
50
+ Pydantic args models in drydock use `Field(default="")` so the
51
+ AUTO-INFER recovery path can rewrite partial calls. But that makes
52
+ the JSON Schema mark those fields as optional, and the grammar then
53
+ accepts `{}` as valid args — the model under grammar emits empty
54
+ paths and garbage content because the schema permits it.
55
+ Concretely: WriteFileArgs.path defaults to "" and the model under
56
+ grammar emitted 18 writes with `path=None` and identical 428-char
57
+ `out0 = out0\\nout1 = out1\\n...` gibberish (2026-06-06 v2.9.87 batch,
58
+ circuit-fibsqrt trial).
59
+
60
+ Heuristic: a field with default value `""`, `[]`, `{}`, or `None`
61
+ (when the type isn't nullable) is "vacuous" — the default never
62
+ represents a real intent, it's a placeholder for the recovery
63
+ machinery. Strip the default from such fields and add them to
64
+ `required`. Boolean / numeric / non-empty-string defaults are
65
+ legitimate optionals and left alone.
66
+
67
+ Returns a NEW dict; does not mutate the input.
68
+ """
69
+ if not isinstance(schema, dict):
70
+ return schema
71
+ out = dict(schema)
72
+ props = dict(out.get("properties") or {})
73
+ if not props:
74
+ return out
75
+ required = list(out.get("required") or [])
76
+ for name, spec in list(props.items()):
77
+ if not isinstance(spec, dict):
78
+ continue
79
+ if "default" not in spec:
80
+ continue
81
+ default = spec["default"]
82
+ is_vacuous = False
83
+ if default == "" or default == [] or default == {}:
84
+ is_vacuous = True
85
+ elif default is None:
86
+ # `default=None` is fine when the type is nullable, e.g.
87
+ # ReadFileArgs.limit (type: int|null). It's a problem only
88
+ # for fields whose schema type doesn't allow null — those
89
+ # are buggy-optionals. Detect via anyOf branches.
90
+ any_of = spec.get("anyOf") or []
91
+ type_allows_null = any(
92
+ isinstance(b, dict) and b.get("type") == "null"
93
+ for b in any_of
94
+ ) or spec.get("type") == "null"
95
+ if not type_allows_null:
96
+ is_vacuous = True
97
+ if is_vacuous:
98
+ new_spec = {k: v for k, v in spec.items() if k != "default"}
99
+ props[name] = new_spec
100
+ if name not in required:
101
+ required.append(name)
102
+ out["properties"] = props
103
+ if required:
104
+ out["required"] = required
105
+ return out
106
+
107
+
47
108
  def build_union_gbnf(
48
109
  tool_specs: list[tuple[str, type]],
49
110
  ) -> str | None:
@@ -68,6 +129,7 @@ def build_union_gbnf(
68
129
  except Exception as e:
69
130
  logger.debug("[UNION] %s schema err: %s — skipping", tool_name, e)
70
131
  continue
132
+ args_schema = _tighten_args_schema(args_schema)
71
133
  one_of_branches.append({
72
134
  "type": "object",
73
135
  "properties": {
@@ -1305,7 +1305,7 @@ class Bash(
1305
1305
  if not _is_write_cmd:
1306
1306
  _run_cnt = run_count_state.get(args.command, 0) + 1
1307
1307
  run_count_state[args.command] = _run_cnt
1308
- if _run_cnt >= 5:
1308
+ if _run_cnt >= 3:
1309
1309
  cmd_preview = args.command[:80]
1310
1310
  # Truncate the previous stdout heavily so the
1311
1311
  # loop-breaker preamble isn't overshadowed by full
@@ -1346,7 +1346,7 @@ class Bash(
1346
1346
  if returncode != 0:
1347
1347
  err_count = err_state.get(args.command, 0) + 1
1348
1348
  err_state[args.command] = err_count
1349
- if err_count >= 5:
1349
+ if err_count >= 3:
1350
1350
  cmd_preview = args.command[:80]
1351
1351
  notice = (
1352
1352
  f"[NOTICE: `{cmd_preview}` has failed with a non-zero "
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.9.87"
3
+ version = "2.9.91"
4
4
  description = "Local-first CLI coding agent — tested with Gemma 4 26B via llama.cpp"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -194,13 +194,19 @@ class TestUserToolsDirs:
194
194
 
195
195
 
196
196
  class TestUserSkillsDirs:
197
- def test_returns_empty_when_user_not_in_sources(self) -> None:
197
+ def test_returns_empty_when_user_not_in_sources(
198
+ self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
199
+ ) -> None:
200
+ # Patch DRYDOCK_ROOT so bundled skills dir doesn't exist, isolating
201
+ # the "user" source gate check.
202
+ monkeypatch.setattr("drydock.DRYDOCK_ROOT", tmp_path)
198
203
  mgr = HarnessFilesManager(sources=("project",))
199
204
  assert mgr.user_skills_dirs == []
200
205
 
201
206
  def test_returns_empty_when_dir_does_not_exist(
202
207
  self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
203
208
  ) -> None:
209
+ monkeypatch.setattr("drydock.DRYDOCK_ROOT", tmp_path)
204
210
  monkeypatch.setattr("drydock.core.paths._drydock_home._DEFAULT_DRYDOCK_HOME", tmp_path)
205
211
  mgr = HarnessFilesManager(sources=("user",))
206
212
  assert mgr.user_skills_dirs == []
@@ -208,8 +214,13 @@ class TestUserSkillsDirs:
208
214
  def test_returns_path_when_user_in_sources_and_dir_exists(
209
215
  self, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
210
216
  ) -> None:
211
- monkeypatch.setattr("drydock.core.paths._drydock_home._DEFAULT_DRYDOCK_HOME", tmp_path)
212
- skills_dir = tmp_path / "skills"
217
+ fake_root = tmp_path / "pkg"
218
+ fake_root.mkdir()
219
+ fake_home = tmp_path / "home"
220
+ fake_home.mkdir()
221
+ monkeypatch.setattr("drydock.DRYDOCK_ROOT", fake_root)
222
+ monkeypatch.setattr("drydock.core.paths._drydock_home._DEFAULT_DRYDOCK_HOME", fake_home)
223
+ skills_dir = fake_home / "skills"
213
224
  skills_dir.mkdir()
214
225
  mgr = HarnessFilesManager(sources=("user",))
215
226
  assert mgr.user_skills_dirs == [skills_dir]
@@ -102,7 +102,9 @@ class TestAutoCompactThresholdFallback:
102
102
  assert cfg.get_active_model().auto_compact_threshold == 99_000
103
103
 
104
104
  def test_default_global_threshold_used_when_nothing_set(self) -> None:
105
- model = ModelConfig(name="m", provider="p", alias="m")
105
+ # context_window must exceed the global default (200K) or the ceiling
106
+ # clamp (context_window - 4096) fires and the assertion fails.
107
+ model = ModelConfig(name="m", provider="p", alias="m", context_window=500_000)
106
108
  cfg = build_test_drydock_config(models=[model], active_model="m")
107
109
  assert cfg.get_active_model().auto_compact_threshold == 200_000
108
110
 
@@ -22,7 +22,11 @@ from drydock.core.llm.grammar.policy import (
22
22
  apply_grammar,
23
23
  select_grammar,
24
24
  )
25
- from drydock.core.llm.grammar.policy_union import build_union_gbnf, select_union_grammar
25
+ from drydock.core.llm.grammar.policy_union import (
26
+ _tighten_args_schema,
27
+ build_union_gbnf,
28
+ select_union_grammar,
29
+ )
26
30
 
27
31
 
28
32
  # ---------------------------------------------------------------------------
@@ -321,3 +325,86 @@ def test_select_union_grammar_empty_tools_returns_none(monkeypatch):
321
325
  tool_manager=mgr,
322
326
  )
323
327
  assert gbnf is None
328
+
329
+
330
+ # ---------------------------------------------------------------------------
331
+ # Regression: vacuous-default fields must become grammar-required.
332
+ # v2.9.87 batch had 18 write_file calls with path=None and identical
333
+ # 428-char `out0 = out0\nout1 = out1\n...` garbage content because the
334
+ # pydantic schema (path: str = Field(default="")) marked path as
335
+ # non-required, the grammar accepted the empty default, and the model
336
+ # committed to whatever fit. The tightener strips those defaults.
337
+ # ---------------------------------------------------------------------------
338
+
339
+ def test_tighten_args_schema_forces_empty_string_defaults_required():
340
+ schema = {
341
+ "properties": {
342
+ "path": {"type": "string", "default": ""},
343
+ "content": {"type": "string", "default": ""},
344
+ "overwrite": {"type": "boolean", "default": True},
345
+ },
346
+ }
347
+ out = _tighten_args_schema(schema)
348
+ assert set(out["required"]) == {"path", "content"}
349
+ assert "default" not in out["properties"]["path"]
350
+ assert "default" not in out["properties"]["content"]
351
+ # legit boolean default left alone
352
+ assert out["properties"]["overwrite"]["default"] is True
353
+
354
+
355
+ def test_tighten_args_schema_preserves_nullable_optionals():
356
+ # ReadFileArgs.limit pattern: Optional[int] = None → type allows null,
357
+ # default=null is a legit "no limit" — must NOT be forced required.
358
+ schema = {
359
+ "properties": {
360
+ "path": {"type": "string"},
361
+ "limit": {
362
+ "anyOf": [{"type": "integer"}, {"type": "null"}],
363
+ "default": None,
364
+ },
365
+ },
366
+ "required": ["path"],
367
+ }
368
+ out = _tighten_args_schema(schema)
369
+ assert out["required"] == ["path"]
370
+ assert out["properties"]["limit"]["default"] is None
371
+
372
+
373
+ def test_tighten_args_schema_real_write_file_args():
374
+ """End-to-end with the actual production WriteFileArgs."""
375
+ from drydock.core.tools.builtins.write_file import WriteFileArgs
376
+ raw = WriteFileArgs.model_json_schema()
377
+ # baseline: pydantic leaves it open
378
+ assert "required" not in raw or "path" not in raw.get("required", [])
379
+ tight = _tighten_args_schema(raw)
380
+ assert "path" in tight["required"]
381
+ assert "content" in tight["required"]
382
+ # overwrite stays optional
383
+ assert "overwrite" not in tight["required"]
384
+
385
+
386
+ def test_union_grammar_requires_write_file_path_after_tightener():
387
+ """The grammar string itself must include the required-fields markers
388
+ for write_file's path. We assert by checking that the GBNF doesn't
389
+ contain a permissive write_file branch that lets path be omitted."""
390
+ from drydock.core.tools.builtins.write_file import WriteFileArgs
391
+ gbnf = build_union_gbnf([("write_file", WriteFileArgs)])
392
+ assert gbnf is not None
393
+ # Tool name + path appear as GBNF string constants (\"-escaped).
394
+ assert '\\"write_file\\"' in gbnf
395
+ assert '\\"path\\"' in gbnf
396
+ assert '\\"content\\"' in gbnf
397
+ # The smoking gun for the bug would be an args body rule that allows
398
+ # `{}` (no required keys). After the tightener, the args body opens
399
+ # with `path-kv "," space content-kv` — path and content are
400
+ # unconditional, overwrite is wrapped in `( ... )?`. Verify the args
401
+ # rule doesn't degenerate to `"{" space "}"`.
402
+ args_rule_line = next(
403
+ (ln for ln in gbnf.splitlines() if "-arguments ::=" in ln),
404
+ "",
405
+ )
406
+ assert args_rule_line, "expected an arguments rule in GBNF"
407
+ assert "path-kv" in args_rule_line # path is in the args body
408
+ assert "content-kv" in args_rule_line # content is in the args body
409
+ # overwrite (optional) should appear wrapped in `( ... )?`
410
+ assert "overwrite-kv )" in args_rule_line and "?" in args_rule_line
@@ -326,7 +326,7 @@ wheels = [
326
326
 
327
327
  [[package]]
328
328
  name = "drydock-cli"
329
- version = "2.9.55"
329
+ version = "2.9.89"
330
330
  source = { editable = "." }
331
331
  dependencies = [
332
332
  { name = "agent-client-protocol" },
@@ -1,94 +0,0 @@
1
- """Regression test: circuit breaker count escalates on repeated fires.
2
-
3
- Bug: _circuit_breaker_check returned the NOTE but never incremented the count
4
- in _tool_call_history when it fired. Every retry got the same "8 times" message,
5
- so the escalation signal was flat and the model never broke out.
6
-
7
- Fix: _circuit_breaker_check now increments the count on each fire, giving the
8
- model an increasing signal that nothing has changed.
9
- """
10
- import unittest
11
- from unittest.mock import MagicMock
12
-
13
-
14
- def _make_loop():
15
- from drydock.core.agent_loop import AgentLoop
16
- loop = AgentLoop.__new__(AgentLoop)
17
- loop._tool_call_history = {}
18
- loop._get_attempted_summary = lambda: ""
19
- return loop
20
-
21
-
22
- def _make_tc(name, args):
23
- tc = MagicMock()
24
- tc.tool_name = name
25
- tc.args_dict = args
26
- tc.call_id = "test-id"
27
- return tc
28
-
29
-
30
- def _record(loop, tc, result="output"):
31
- from drydock.core.agent_loop import AgentLoop
32
- AgentLoop._circuit_breaker_record(loop, tc, result)
33
-
34
-
35
- class TestCircuitBreakerCountEscalation(unittest.TestCase):
36
- def test_count_escalates_on_repeated_fires(self):
37
- """After the threshold, each fire increments the count so the message escalates."""
38
- loop = _make_loop()
39
- tc = _make_tc("bash", {"command": "python3 -m tool_agent run foo"})
40
-
41
- # Reach threshold (8 recorded calls)
42
- for _ in range(8):
43
- _record(loop, tc, "some output")
44
-
45
- # First fire: should mention 8
46
- msg1 = loop._circuit_breaker_check(tc)
47
- self.assertIsNotNone(msg1)
48
- self.assertIn("8 times", msg1)
49
-
50
- # Second fire (without any external record call): should mention 9
51
- msg2 = loop._circuit_breaker_check(tc)
52
- self.assertIsNotNone(msg2)
53
- self.assertIn("9 times", msg2)
54
-
55
- # Third fire: should mention 10
56
- msg3 = loop._circuit_breaker_check(tc)
57
- self.assertIsNotNone(msg3)
58
- self.assertIn("10 times", msg3)
59
-
60
- def test_last_result_preserved_across_fires(self):
61
- """last_result shown in NOTE stays as the real tool output, not a prior NOTE."""
62
- loop = _make_loop()
63
- tc = _make_tc("bash", {"command": "echo hello"})
64
-
65
- for _ in range(8):
66
- _record(loop, tc, "hello\n")
67
-
68
- msg1 = loop._circuit_breaker_check(tc)
69
- self.assertIn("hello", msg1)
70
-
71
- # After a second fire, last_result should still be the original output
72
- msg2 = loop._circuit_breaker_check(tc)
73
- assert msg2 is not None, "circuit breaker should fire on 10th call"
74
- self.assertIn("hello", msg2)
75
- # Not the prior NOTE text
76
- self.assertNotIn("NOTE: this exact call", msg2.split("Last result:")[1])
77
-
78
- def test_count_below_threshold_unaffected(self):
79
- """Calls below threshold still return None and don't mutate state unexpectedly."""
80
- loop = _make_loop()
81
- tc = _make_tc("bash", {"command": "ls"})
82
-
83
- for i in range(7):
84
- result = loop._circuit_breaker_check(tc)
85
- self.assertIsNone(result, f"Should not fire on call {i+1} (count={i})")
86
- _record(loop, tc)
87
-
88
- # 8th call is still below threshold (count=7 < 8)
89
- result = loop._circuit_breaker_check(tc)
90
- self.assertIsNone(result)
91
-
92
-
93
- if __name__ == "__main__":
94
- unittest.main()
@@ -1,93 +0,0 @@
1
- """Regression test: read_file circuit breaker fires at threshold 5, not 12.
2
-
3
- Stress sessions reset every 45 prompts. With threshold=12, the model could
4
- loop 11× on the same read_file call before being blocked — admiral advisories
5
- fire at 3× but are ignored. Threshold=5 actually engages the block before
6
- the session's budget is exhausted.
7
- """
8
- import hashlib
9
- import json
10
- import unittest
11
- from unittest.mock import MagicMock
12
-
13
-
14
- def _make_circuit_breaker_check():
15
- """Import and bind just the circuit breaker logic for unit testing."""
16
- from drydock.core.agent_loop import AgentLoop
17
-
18
- loop = AgentLoop.__new__(AgentLoop)
19
- loop._tool_call_history = {}
20
- loop._get_attempted_summary = lambda: ""
21
- return loop
22
-
23
-
24
- class TestCircuitBreakerReadonlyThreshold(unittest.TestCase):
25
- def _make_tool_call(self, name, args):
26
- tc = MagicMock()
27
- tc.tool_name = name
28
- tc.args_dict = args
29
- tc.call_id = "test-id"
30
- return tc
31
-
32
- def _record(self, loop, tool_call, result="some content"):
33
- from drydock.core.agent_loop import AgentLoop
34
- AgentLoop._circuit_breaker_record(loop, tool_call, result)
35
-
36
- def test_read_file_blocks_at_5(self):
37
- """Circuit breaker fires on the 6th identical call (threshold=5 means count>=5 blocks)."""
38
- loop = _make_circuit_breaker_check()
39
- tc = self._make_tool_call("read_file", {"path": "foo.py", "offset": 150, "limit": 100})
40
-
41
- # First 5 calls: should not block
42
- for i in range(5):
43
- result = loop._circuit_breaker_check(tc)
44
- self.assertIsNone(result, f"Expected no block on call {i+1}, got: {result}")
45
- self._record(loop, tc)
46
-
47
- # 6th call: should block (count=5 >= threshold=5)
48
- result = loop._circuit_breaker_check(tc)
49
- self.assertIsNotNone(result, "Expected circuit breaker to fire on 6th identical read_file")
50
- self.assertIn("read_file", result)
51
-
52
- def test_bash_still_blocks_at_8(self):
53
- """bash threshold=8, so blocks on 9th call (count=8 >= threshold=8)."""
54
- loop = _make_circuit_breaker_check()
55
- tc = self._make_tool_call("bash", {"command": "ls -la"})
56
-
57
- for i in range(8):
58
- result = loop._circuit_breaker_check(tc)
59
- self.assertIsNone(result, f"Expected no block on bash call {i+1}")
60
- self._record(loop, tc)
61
-
62
- result = loop._circuit_breaker_check(tc)
63
- self.assertIsNotNone(result, "Expected circuit breaker to fire on 9th identical bash")
64
-
65
- def test_grep_blocks_at_5(self):
66
- loop = _make_circuit_breaker_check()
67
- tc = self._make_tool_call("grep", {"pattern": "def foo", "path": "bar.py"})
68
-
69
- for i in range(5):
70
- result = loop._circuit_breaker_check(tc)
71
- self.assertIsNone(result)
72
- self._record(loop, tc)
73
-
74
- # 6th call blocks (count=5 >= threshold=5)
75
- result = loop._circuit_breaker_check(tc)
76
- self.assertIsNotNone(result, "Expected circuit breaker to fire on 6th identical grep")
77
-
78
- def test_different_args_not_blocked(self):
79
- loop = _make_circuit_breaker_check()
80
-
81
- # 5 reads of foo.py at offset 150
82
- tc1 = self._make_tool_call("read_file", {"path": "foo.py", "offset": 150})
83
- for _ in range(5):
84
- self._record(loop, tc1)
85
-
86
- # Different offset should not be blocked
87
- tc2 = self._make_tool_call("read_file", {"path": "foo.py", "offset": 200})
88
- result = loop._circuit_breaker_check(tc2)
89
- self.assertIsNone(result, "Different args should not be blocked")
90
-
91
-
92
- if __name__ == "__main__":
93
- unittest.main()
File without changes
File without changes
File without changes
File without changes