drydock-cli 2.9.55__tar.gz → 2.9.59__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 (708) hide show
  1. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/PKG-INFO +1 -1
  2. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/opus_escalator.py +11 -1
  3. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/agent_loop.py +121 -5
  4. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/write_file.py +64 -16
  5. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/curiosity/gap_detector.py +203 -2
  6. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/pyproject.toml +1 -1
  7. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/uv.lock +1 -1
  8. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/.gitignore +0 -0
  9. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/LICENSE +0 -0
  10. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/NOTICE +0 -0
  11. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/README.md +0 -0
  12. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/distribution/zed/LICENSE +0 -0
  13. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/docs/README.md +0 -0
  14. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/__init__.py +0 -0
  15. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/__main__.py +0 -0
  16. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/__init__.py +0 -0
  17. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/acp_agent_loop.py +0 -0
  18. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/acp_logger.py +0 -0
  19. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/entrypoint.py +0 -0
  20. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/tools/__init__.py +0 -0
  21. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/tools/base.py +0 -0
  22. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/tools/builtins/bash.py +0 -0
  23. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/tools/builtins/read_file.py +0 -0
  24. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/tools/builtins/search_replace.py +0 -0
  25. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/tools/builtins/todo.py +0 -0
  26. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/tools/builtins/write_file.py +0 -0
  27. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/tools/session_update.py +0 -0
  28. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/acp/utils.py +0 -0
  29. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/__init__.py +0 -0
  30. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/detectors.py +0 -0
  31. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/detectors_proposed.py +0 -0
  32. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/history.py +0 -0
  33. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/interventions.py +0 -0
  34. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/llm_analyzer.py +0 -0
  35. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/metrics.py +0 -0
  36. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/persistence.py +0 -0
  37. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/policy.py +0 -0
  38. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/proposer.py +0 -0
  39. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/stager.py +0 -0
  40. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/task_classifier.py +0 -0
  41. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/tuning.py +0 -0
  42. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/validator.py +0 -0
  43. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/admiral/worker.py +0 -0
  44. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/__init__.py +0 -0
  45. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/autocompletion/__init__.py +0 -0
  46. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/autocompletion/base.py +0 -0
  47. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/autocompletion/path_completion.py +0 -0
  48. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/autocompletion/slash_command.py +0 -0
  49. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/cli.py +0 -0
  50. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/clipboard.py +0 -0
  51. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/commands.py +0 -0
  52. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/entrypoint.py +0 -0
  53. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/fix_windows_path.py +0 -0
  54. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/history_manager.py +0 -0
  55. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  56. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  57. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  58. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/terminal_setup.py +0 -0
  59. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/__init__.py +0 -0
  60. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  61. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/app.py +0 -0
  62. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/app.tcss +0 -0
  63. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/external_editor.py +0 -0
  64. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  65. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  66. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  67. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  68. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  69. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  70. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  71. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  72. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  73. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  74. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  75. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  76. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  77. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  78. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  79. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  80. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  81. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  82. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  83. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  84. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  85. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  86. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  87. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  88. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  89. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  90. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  91. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  92. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  93. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  94. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  95. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  96. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  97. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  98. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  99. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  100. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  101. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/windowing/history.py +0 -0
  102. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  103. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/textual_ui/windowing/state.py +0 -0
  104. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/update_notifier/__init__.py +0 -0
  105. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  106. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  107. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  108. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  109. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  110. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/update_notifier/update.py +0 -0
  111. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/cli/update_notifier/whats_new.py +0 -0
  112. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/__init__.py +0 -0
  113. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/agents/__init__.py +0 -0
  114. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/agents/manager.py +0 -0
  115. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/agents/models.py +0 -0
  116. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/auth/__init__.py +0 -0
  117. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/auth/crypto.py +0 -0
  118. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/auth/github.py +0 -0
  119. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/auto_solve.py +0 -0
  120. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/__init__.py +0 -0
  121. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/completers.py +0 -0
  122. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  123. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  124. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  125. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  126. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  127. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/fuzzy.py +0 -0
  128. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/path_prompt.py +0 -0
  129. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  130. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/build_orchestrator.py +0 -0
  131. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/checkpoint.py +0 -0
  132. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/classifier/__init__.py +0 -0
  133. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/classifier/__main__.py +0 -0
  134. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/classifier/classifier.py +0 -0
  135. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/classifier/dispatcher.py +0 -0
  136. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/classifier/rules.py +0 -0
  137. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/classifier/signal.py +0 -0
  138. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/config/__init__.py +0 -0
  139. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/config/_dotenv.py +0 -0
  140. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/config/_settings.py +0 -0
  141. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/config/doctor.py +0 -0
  142. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/config/harness_files/__init__.py +0 -0
  143. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  144. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/config/harness_files/_paths.py +0 -0
  145. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/config/local_detect.py +0 -0
  146. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/config/migrate.py +0 -0
  147. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/constraint_extract.py +0 -0
  148. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/constraint_hint.py +0 -0
  149. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/consultant.py +0 -0
  150. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/context_recovery.py +0 -0
  151. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/drydock_states.py +0 -0
  152. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/goal.py +0 -0
  153. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/hooks.py +0 -0
  154. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/__init__.py +0 -0
  155. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/backend/anthropic.py +0 -0
  156. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/backend/base.py +0 -0
  157. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/backend/factory.py +0 -0
  158. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/backend/generic.py +0 -0
  159. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/backend/mistral.py +0 -0
  160. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  161. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/backend/vertex.py +0 -0
  162. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/exceptions.py +0 -0
  163. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/format.py +0 -0
  164. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/message_utils.py +0 -0
  165. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/llm/types.py +0 -0
  166. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/logger.py +0 -0
  167. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/middleware.py +0 -0
  168. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/output_formatters.py +0 -0
  169. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/paths/__init__.py +0 -0
  170. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/paths/_drydock_home.py +0 -0
  171. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/paths/_local_config_walk.py +0 -0
  172. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/paths/conventions.py +0 -0
  173. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/plan_session.py +0 -0
  174. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/plugins.py +0 -0
  175. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/programmatic.py +0 -0
  176. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/__init__.py +0 -0
  177. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/builder.md +0 -0
  178. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/cli.md +0 -0
  179. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/compact.md +0 -0
  180. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/dangerous_directory.md +0 -0
  181. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/diagnostic.md +0 -0
  182. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/explore.md +0 -0
  183. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/gemma4.md +0 -0
  184. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/gemma4_math.md +0 -0
  185. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/gemma4_slim.md +0 -0
  186. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/planner.md +0 -0
  187. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/project_context.md +0 -0
  188. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/prompts/tests.md +0 -0
  189. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/proxy_setup.py +0 -0
  190. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/session/agent_memory.py +0 -0
  191. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/session/checkpoints.py +0 -0
  192. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/session/session_loader.py +0 -0
  193. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/session/session_logger.py +0 -0
  194. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/session/session_migration.py +0 -0
  195. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/session/state_file.py +0 -0
  196. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/session_checker.py +0 -0
  197. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/skills/__init__.py +0 -0
  198. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/skills/manager.py +0 -0
  199. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/skills/models.py +0 -0
  200. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/skills/parser.py +0 -0
  201. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/slug.py +0 -0
  202. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/spec_check.py +0 -0
  203. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/steering_hook.py +0 -0
  204. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/system_prompt.py +0 -0
  205. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/telemetry/__init__.py +0 -0
  206. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/telemetry/send.py +0 -0
  207. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/teleport/errors.py +0 -0
  208. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/teleport/git.py +0 -0
  209. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/teleport/nuage.py +0 -0
  210. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/teleport/teleport.py +0 -0
  211. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/teleport/types.py +0 -0
  212. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/base.py +0 -0
  213. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/_task_manager.py +0 -0
  214. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/algebra_tool.py +0 -0
  215. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  216. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/bash.py +0 -0
  217. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/chemistry_tool.py +0 -0
  218. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/count_tool.py +0 -0
  219. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/cron.py +0 -0
  220. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  221. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/glob_tool.py +0 -0
  222. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/grep.py +0 -0
  223. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  224. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/linear_algebra_tool.py +0 -0
  225. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/logic_tool.py +0 -0
  226. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/lsp.py +0 -0
  227. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/math_tool.py +0 -0
  228. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  229. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/mechanical_rename.py +0 -0
  230. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/memory_tool.py +0 -0
  231. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  232. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/number_theory_tool.py +0 -0
  233. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/powershell.py +0 -0
  234. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prolog_tool.py +0 -0
  235. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  236. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  237. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  238. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  239. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  240. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  241. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  242. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  243. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  244. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  245. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  246. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  247. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
  248. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  249. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  250. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/task.md +0 -0
  251. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  252. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  253. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  254. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  255. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  256. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  257. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  258. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/read_file.py +0 -0
  259. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/retrieve.py +0 -0
  260. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/search_replace.py +0 -0
  261. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/set_tool.py +0 -0
  262. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/solve_tool.py +0 -0
  263. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/stats_tool.py +0 -0
  264. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/task.py +0 -0
  265. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/todo.py +0 -0
  266. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/tool_search.py +0 -0
  267. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/units_tool.py +0 -0
  268. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/verify_tool.py +0 -0
  269. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/webfetch.py +0 -0
  270. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/websearch.py +0 -0
  271. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/builtins/worktree.py +0 -0
  272. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/injection_guard.py +0 -0
  273. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/manager.py +0 -0
  274. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/mcp/__init__.py +0 -0
  275. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/mcp/registry.py +0 -0
  276. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/mcp/tools.py +0 -0
  277. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/mcp_sampling.py +0 -0
  278. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/ui.py +0 -0
  279. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/tools/utils.py +0 -0
  280. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/trusted_folders.py +0 -0
  281. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/types.py +0 -0
  282. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/core/utils.py +0 -0
  283. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/curiosity/__init__.py +0 -0
  284. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/curiosity/__main__.py +0 -0
  285. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/curiosity/ingest.py +0 -0
  286. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/curiosity/item.py +0 -0
  287. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/curiosity/queue.py +0 -0
  288. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/curiosity/surprise.py +0 -0
  289. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/graphrag/__init__.py +0 -0
  290. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/graphrag/__main__.py +0 -0
  291. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/graphrag/code_indexer.py +0 -0
  292. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/graphrag/retriever.py +0 -0
  293. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/graphrag/storage.py +0 -0
  294. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/graphrag/text_indexer.py +0 -0
  295. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/onboarding/__init__.py +0 -0
  296. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/onboarding/base.py +0 -0
  297. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/onboarding/onboarding.tcss +0 -0
  298. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/onboarding/screens/__init__.py +0 -0
  299. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/onboarding/screens/api_key.py +0 -0
  300. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/onboarding/screens/choice.py +0 -0
  301. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/onboarding/screens/local_model.py +0 -0
  302. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/onboarding/screens/welcome.py +0 -0
  303. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  304. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  305. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/__init__.py +0 -0
  306. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/api-design/SKILL.md +0 -0
  307. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/audit-tests/SKILL.md +0 -0
  308. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/batch/SKILL.md +0 -0
  309. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/checklist/SKILL.md +0 -0
  310. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/commit-code/SKILL.md +0 -0
  311. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/constraint-reasoning/SKILL.md +0 -0
  312. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/context-summary/SKILL.md +0 -0
  313. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/create-presentation/SKILL.md +0 -0
  314. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/deep-research/SKILL.md +0 -0
  315. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/deploy/SKILL.md +0 -0
  316. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/diff-review/SKILL.md +0 -0
  317. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/doc-gen/SKILL.md +0 -0
  318. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/explain-code/SKILL.md +0 -0
  319. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/explore-code/SKILL.md +0 -0
  320. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/fix-issue/SKILL.md +0 -0
  321. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/git-ops/SKILL.md +0 -0
  322. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/init-project/SKILL.md +0 -0
  323. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/investigate/SKILL.md +0 -0
  324. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/logic/SKILL.md +0 -0
  325. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/logic/assets/cheat_sheet_full.txt +0 -0
  326. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/loop/SKILL.md +0 -0
  327. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/migrate/SKILL.md +0 -0
  328. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/perf-analyze/SKILL.md +0 -0
  329. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/plan-impl/SKILL.md +0 -0
  330. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/pr-review/SKILL.md +0 -0
  331. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/prove/SKILL.md +0 -0
  332. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/refactor/SKILL.md +0 -0
  333. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/regex-help/SKILL.md +0 -0
  334. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/review/SKILL.md +0 -0
  335. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/security-review/SKILL.md +0 -0
  336. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/ship/SKILL.md +0 -0
  337. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/simplify/SKILL.md +0 -0
  338. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/strong-tests/SKILL.md +0 -0
  339. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/skills/test-verify/SKILL.md +0 -0
  340. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/__init__.py +0 -0
  341. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/__main__.py +0 -0
  342. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/applier.py +0 -0
  343. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/config.py +0 -0
  344. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/registry.py +0 -0
  345. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/sandbox.py +0 -0
  346. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/sidecar/__init__.py +0 -0
  347. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/sidecar/header_parser.py +0 -0
  348. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/sidecar/hooks.py +0 -0
  349. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/sidecar/loader.py +0 -0
  350. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/sidecar/server.py +0 -0
  351. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/train/__init__.py +0 -0
  352. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/train/capture.py +0 -0
  353. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/train/compute_vector.py +0 -0
  354. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/train/extract_pairs.py +0 -0
  355. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/train/scan_sessions.py +0 -0
  356. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/steering/vectors.py +0 -0
  357. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/drydock/whats_new.md +0 -0
  358. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/install_tests/README.md +0 -0
  359. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/install_tests/publish/README.md +0 -0
  360. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/install_tests/windows/README.md +0 -0
  361. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/scripts/README.md +0 -0
  362. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/scripts/_archived_eval_harness/README.md +0 -0
  363. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/scripts/llm/README.md +0 -0
  364. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/__init__.py +0 -0
  365. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/conftest.py +0 -0
  366. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_acp.py +0 -0
  367. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_agent_thought.py +0 -0
  368. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_bash.py +0 -0
  369. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_compact_session_updates.py +0 -0
  370. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_content.py +0 -0
  371. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_initialize.py +0 -0
  372. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_list_sessions.py +0 -0
  373. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_load_session.py +0 -0
  374. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_multi_session.py +0 -0
  375. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_new_session.py +0 -0
  376. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_proxy_setup_acp.py +0 -0
  377. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_read_file.py +0 -0
  378. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_search_replace.py +0 -0
  379. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_set_config_option.py +0 -0
  380. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_set_mode.py +0 -0
  381. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_set_model.py +0 -0
  382. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_tool_call_session_update.py +0 -0
  383. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_utils.py +0 -0
  384. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/acp/test_write_file.py +0 -0
  385. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/autocompletion/conftest.py +0 -0
  386. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/autocompletion/test_file_indexer.py +0 -0
  387. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/autocompletion/test_fuzzy.py +0 -0
  388. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  389. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  390. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/autocompletion/test_path_completion_controller.py +0 -0
  391. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  392. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/autocompletion/test_slash_command_controller.py +0 -0
  393. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  394. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/backend/__init__.py +0 -0
  395. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/backend/data/__init__.py +0 -0
  396. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/backend/data/fireworks.py +0 -0
  397. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/backend/data/mistral.py +0 -0
  398. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/backend/test_anthropic_adapter.py +0 -0
  399. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/backend/test_backend.py +0 -0
  400. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  401. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/backend/test_reasoning_adapter.py +0 -0
  402. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  403. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  404. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  405. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  406. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_bell_notifications.py +0 -0
  407. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_braille_renderer.py +0 -0
  408. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_clipboard.py +0 -0
  409. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_commands.py +0 -0
  410. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_copy_shortcuts.py +0 -0
  411. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_external_editor.py +0 -0
  412. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_no_markup_static.py +0 -0
  413. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_question_app.py +0 -0
  414. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_spinner.py +0 -0
  415. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_switching_mode.py +0 -0
  416. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  417. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  418. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_ui_session_resume.py +0 -0
  419. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/test_ui_skill_dispatch.py +0 -0
  420. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/textual_ui/__init__.py +0 -0
  421. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/cli/textual_ui/test_session_picker.py +0 -0
  422. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/conftest.py +0 -0
  423. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_agents.py +0 -0
  424. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_auth_crypto.py +0 -0
  425. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_auth_github.py +0 -0
  426. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
  427. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
  428. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_config_load_dotenv.py +0 -0
  429. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_config_paths.py +0 -0
  430. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_config_resolution.py +0 -0
  431. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_file_logging.py +0 -0
  432. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_plan_session.py +0 -0
  433. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_proxy_setup.py +0 -0
  434. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_slug.py +0 -0
  435. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_telemetry_send.py +0 -0
  436. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_teleport_git.py +0 -0
  437. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_teleport_nuage.py +0 -0
  438. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_teleport_service.py +0 -0
  439. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_trusted_folders.py +0 -0
  440. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/core/test_utils.py +0 -0
  441. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/e2e/common.py +0 -0
  442. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/e2e/conftest.py +0 -0
  443. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/e2e/mock_server.py +0 -0
  444. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  445. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/e2e/test_cli_tui_streaming.py +0 -0
  446. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  447. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/fixtures/doc_qa_system_prd.md +0 -0
  448. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/mock/__init__.py +0 -0
  449. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/mock/mock_backend_factory.py +0 -0
  450. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/mock/mock_entrypoint.py +0 -0
  451. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/mock/utils.py +0 -0
  452. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/onboarding/test_run_onboarding.py +0 -0
  453. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/onboarding/test_ui_onboarding.py +0 -0
  454. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/session/test_session_loader.py +0 -0
  455. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/session/test_session_logger.py +0 -0
  456. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/session/test_session_migration.py +0 -0
  457. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/skills/conftest.py +0 -0
  458. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/skills/test_manager.py +0 -0
  459. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/skills/test_models.py +0 -0
  460. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/skills/test_parser.py +0 -0
  461. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  462. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  463. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  464. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  465. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  466. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  467. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  468. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  469. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  470. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  471. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  472. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  473. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  474. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  475. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  476. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  477. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  478. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  479. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  480. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  481. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  482. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  483. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  484. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  485. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  486. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  487. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  488. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  489. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  490. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  491. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  492. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  493. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  494. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  495. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  496. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  497. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  498. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  499. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  500. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  501. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  502. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  503. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  504. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  505. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  506. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  507. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  508. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  509. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  510. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  511. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  512. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  513. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  514. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  515. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  516. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  517. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  518. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  519. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  520. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  521. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/base_snapshot_test_app.py +0 -0
  522. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/conftest.py +0 -0
  523. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/snap_compare.py +0 -0
  524. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  525. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  526. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  527. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  528. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  529. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  530. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  531. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  532. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  533. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  534. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  535. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  536. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  537. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  538. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/stubs/fake_backend.py +0 -0
  539. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/stubs/fake_client.py +0 -0
  540. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/stubs/fake_tool.py +0 -0
  541. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_admiral.py +0 -0
  542. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
  543. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_admiral_intervention_outcome.py +0 -0
  544. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_admiral_phase3.py +0 -0
  545. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_admiral_proposed.py +0 -0
  546. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_admiral_session_id.py +0 -0
  547. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_admiral_struggle_dedup.py +0 -0
  548. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_agent_auto_compact.py +0 -0
  549. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_agent_backend.py +0 -0
  550. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_agent_observer_streaming.py +0 -0
  551. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_agent_stats.py +0 -0
  552. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_agent_tasks.py +0 -0
  553. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_agent_tool_call.py +0 -0
  554. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_agents.py +0 -0
  555. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_algebra_tool.py +0 -0
  556. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_api_error_recovery.py +0 -0
  557. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_approval_modal_stray_keys.py +0 -0
  558. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_auto_retrieve_soft_nudge.py +0 -0
  559. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_auto_solve.py +0 -0
  560. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_bank_build.py +0 -0
  561. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_bank_debug.py +0 -0
  562. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_bank_multiagent.py +0 -0
  563. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_bank_prd.py +0 -0
  564. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_bank_prd_extended.py +0 -0
  565. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_bank_tools.py +0 -0
  566. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_bank_update.py +0 -0
  567. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_build_projects.py +0 -0
  568. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_checkpoint.py +0 -0
  569. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_chemistry_tool.py +0 -0
  570. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_classifier.py +0 -0
  571. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_cli_programmatic_preload.py +0 -0
  572. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_config_migration.py +0 -0
  573. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_constraint_extract.py +0 -0
  574. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_constraint_hint.py +0 -0
  575. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_context_recovery.py +0 -0
  576. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_count_tool.py +0 -0
  577. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_curiosity.py +0 -0
  578. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_current_bugs.py +0 -0
  579. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_dispatch_report.py +0 -0
  580. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_dispatcher.py +0 -0
  581. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_drydock_regression.py +0 -0
  582. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_drydock_tasks.py +0 -0
  583. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  584. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_full_regression.py +0 -0
  585. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_gemma4_anti_loop_migration.py +0 -0
  586. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_goal.py +0 -0
  587. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_graphrag.py +0 -0
  588. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_graphrag_worked_examples.py +0 -0
  589. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_hallucinated_tool_suppression.py +0 -0
  590. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_history_manager.py +0 -0
  591. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_hle_aggregate.py +0 -0
  592. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_integration.py +0 -0
  593. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_issue_fixes.py +0 -0
  594. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_linear_algebra_tool.py +0 -0
  595. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_local_detect.py +0 -0
  596. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_logic_tool.py +0 -0
  597. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_loop_detection.py +0 -0
  598. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_math_docs_lazy_injection.py +0 -0
  599. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_math_tool.py +0 -0
  600. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_mcp_settings.py +0 -0
  601. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_mcp_stdio_command_normalization.py +0 -0
  602. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_memory_tool.py +0 -0
  603. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_message_id.py +0 -0
  604. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_message_merging.py +0 -0
  605. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_middleware.py +0 -0
  606. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_multi_agent.py +0 -0
  607. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_number_theory_tool.py +0 -0
  608. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_prolog_tool.py +0 -0
  609. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_read_file_not_found_listing.py +0 -0
  610. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_read_file_notebook_slim.py +0 -0
  611. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_real_failures.py +0 -0
  612. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_real_issues.py +0 -0
  613. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_real_workflow.py +0 -0
  614. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_reasoning_content.py +0 -0
  615. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_rejudge_hle.py +0 -0
  616. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_retrieval_consumer.py +0 -0
  617. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_retrieve_project_detection.py +0 -0
  618. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_retrieve_tool.py +0 -0
  619. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_safe_parse_tool_args.py +0 -0
  620. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_search_replace_args_not_truncated.py +0 -0
  621. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_search_replace_syntax_rollback.py +0 -0
  622. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_session_log_event.py +0 -0
  623. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_session_publish_on_resume.py +0 -0
  624. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_set_tool.py +0 -0
  625. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_smoke.py +0 -0
  626. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_solve_tool.py +0 -0
  627. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_specialist_math_tools_hidden.py +0 -0
  628. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_stats_tool.py +0 -0
  629. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_steering.py +0 -0
  630. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_steering_capture.py +0 -0
  631. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_steering_compute_vector.py +0 -0
  632. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_steering_extract_pairs.py +0 -0
  633. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_steering_hook.py +0 -0
  634. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_steering_sidecar_chat_inputs.py +0 -0
  635. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_steering_sidecar_hooks.py +0 -0
  636. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_system_prompt.py +0 -0
  637. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_tagged_text.py +0 -0
  638. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_task_complete_nudge.py +0 -0
  639. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_tool_args.py +0 -0
  640. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_tool_call_loops_regression_suite.py +0 -0
  641. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_tool_stop_injected_scope.py +0 -0
  642. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_truncate_args_valid_json.py +0 -0
  643. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_truncated_arg_path_hint.py +0 -0
  644. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_truncated_search_replace_escalation.py +0 -0
  645. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_truncated_write_escalation.py +0 -0
  646. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_ui_external_editor.py +0 -0
  647. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_ui_input_history.py +0 -0
  648. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_units_tool.py +0 -0
  649. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_user_issues.py +0 -0
  650. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_validation_error_scrub.py +0 -0
  651. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_verify_tool.py +0 -0
  652. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_wall_of_text_rescue.py +0 -0
  653. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_workloads.py +0 -0
  654. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/test_write_file_missing_path.py +0 -0
  655. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/testbank_helpers.py +0 -0
  656. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_ask_user_question.py +0 -0
  657. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash.py +0 -0
  658. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash_binary_grep_hint.py +0 -0
  659. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash_consec_empty_search.py +0 -0
  660. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
  661. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
  662. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash_error_loop_breaker.py +0 -0
  663. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
  664. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
  665. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
  666. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
  667. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_exit_plan_mode.py +0 -0
  668. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_grep.py +0 -0
  669. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
  670. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_invoke_context.py +0 -0
  671. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  672. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_manager_get_tool_config.py +0 -0
  673. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_mcp.py +0 -0
  674. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_mcp_sampling.py +0 -0
  675. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_pre_rename_hook.py +0 -0
  676. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
  677. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  678. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_read_file_directory.py +0 -0
  679. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_read_file_limit_truncation.py +0 -0
  680. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_append_fallback.py +0 -0
  681. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_dir_path.py +0 -0
  682. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_empty_content.py +0 -0
  683. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_file_not_found.py +0 -0
  684. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
  685. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_hard_stop.py +0 -0
  686. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_malformed_block.py +0 -0
  687. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  688. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_placeholder.py +0 -0
  689. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  690. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_task.py +0 -0
  691. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_ui_bash_execution.py +0 -0
  692. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_webfetch.py +0 -0
  693. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_websearch.py +0 -0
  694. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  695. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_write_file_missing_main_module.py +0 -0
  696. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  697. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/tools/test_write_file_multifile_rename.py +0 -0
  698. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  699. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  700. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/update_notifier/test_do_update.py +0 -0
  701. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  702. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/update_notifier/test_github_update_gateway.py +0 -0
  703. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  704. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/update_notifier/test_ui_update_notification.py +0 -0
  705. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/update_notifier/test_update_use_case.py +0 -0
  706. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/tests/update_notifier/test_whats_new.py +0 -0
  707. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/web/README.md +0 -0
  708. {drydock_cli-2.9.55 → drydock_cli-2.9.59}/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.55
3
+ Version: 2.9.59
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
@@ -39,7 +39,7 @@ the user, say so explicitly.
39
39
 
40
40
  Detector: {code}
41
41
  Admiral's canned fallback: "{fallback}"
42
-
42
+ {loop_constraint}
43
43
  Recent conversation:
44
44
  <conversation>
45
45
  {context}
@@ -110,10 +110,20 @@ async def escalate(
110
110
  messages: Sequence[LLMMessage],
111
111
  ) -> str | None:
112
112
  """Ask Opus for a directive. Returns directive text or None."""
113
+ loop_constraint = ""
114
+ if finding.code.startswith("loop:bash::"):
115
+ cmd_snippet = finding.code[len("loop:bash::"):][:120]
116
+ loop_constraint = (
117
+ f"\nCRITICAL CONSTRAINT: The repeated command is `bash` with "
118
+ f"args `{cmd_snippet}`. Your directive MUST NOT suggest running "
119
+ f"this same command again — the model already has its output. "
120
+ f"Direct the agent to read/edit source code instead.\n"
121
+ )
113
122
  prompt = _OPUS_PROMPT.format(
114
123
  rubric=_DIRECTIVES_RUBRIC,
115
124
  code=finding.code,
116
125
  fallback=finding.directive[:200],
126
+ loop_constraint=loop_constraint,
117
127
  context=_render_turns(messages, n_turns=12),
118
128
  )
119
129
  out = await _try_anthropic_sdk(prompt)
@@ -1680,6 +1680,70 @@ class AgentLoop:
1680
1680
  expected_paths = list(dict.fromkeys(pat.findall(task_text)))[:10]
1681
1681
  missing_expected = [p for p in expected_paths if p not in written_paths]
1682
1682
  has_expected_misses = bool(expected_paths and missing_expected)
1683
+
1684
+ # Fix E (2026-06-04): parse the task instruction for
1685
+ # explicit verify commands and check if the model has
1686
+ # ever run them. Targets the partial-pytest-credit
1687
+ # cluster — fix-code-vulnerability scored 5/6 pytest
1688
+ # but never ran the explicit `pytest -rA` the task
1689
+ # named. Same shape across 14 trials in v2.9.55 batch.
1690
+ expected_verifies: list[str] = []
1691
+ if len(self.messages) >= 2:
1692
+ task_text = (self.messages[1].content or "")
1693
+ import re as _re2
1694
+ # Patterns the model should run before exit:
1695
+ # - "you can run: `pytest -rA`"
1696
+ # - "verify by running `bash test.sh`"
1697
+ # - "to test, run `python test.py`"
1698
+ # - bare `pytest` mentions in instructions
1699
+ # Capture the command text (inside backticks first).
1700
+ cmd_patterns = [
1701
+ r"(?:you can run|verify by running|to test,?\s*run|"
1702
+ r"to verify,?\s*run|run the tests? with|tests? are run with|"
1703
+ r"verifier runs?|you may run|run\s+the\s+command|"
1704
+ r"to evaluate|evaluation command):\s*`([^`]+)`",
1705
+ r"verify by:?\s*`([^`]+)`",
1706
+ # bare backtick commands containing pytest/bash/make
1707
+ r"`(pytest\s[^`]*|bash\s+[^`]*\.sh[^`]*|make\s+test[^`]*|"
1708
+ r"npm\s+test[^`]*|cargo\s+test[^`]*|go\s+test[^`]*)`",
1709
+ ]
1710
+ for p in cmd_patterns:
1711
+ for m in _re2.finditer(p, task_text, _re2.IGNORECASE):
1712
+ cmd = m.group(1).strip()
1713
+ if cmd and cmd not in expected_verifies:
1714
+ expected_verifies.append(cmd)
1715
+ if len(expected_verifies) >= 5:
1716
+ break
1717
+ if len(expected_verifies) >= 5:
1718
+ break
1719
+ # Did the model run any matching command via bash?
1720
+ ran_verify_cmds: list[str] = []
1721
+ if expected_verifies:
1722
+ bash_cmds: list[str] = []
1723
+ for msg in self.messages:
1724
+ for tc in (msg.tool_calls or []):
1725
+ fn_obj = tc.function
1726
+ if not fn_obj or fn_obj.name != "bash":
1727
+ continue
1728
+ try:
1729
+ import json as _json2
1730
+ a = _json2.loads(fn_obj.arguments or "{}")
1731
+ c = a.get("command") or ""
1732
+ if c:
1733
+ bash_cmds.append(c)
1734
+ except Exception:
1735
+ pass
1736
+ # Match: any token of the expected command appears in
1737
+ # any of the model's bash commands. Lenient match
1738
+ # (model might add extra flags or paths).
1739
+ for ev in expected_verifies:
1740
+ first_token = ev.split()[0] if ev.split() else ev
1741
+ if any(first_token in bc for bc in bash_cmds):
1742
+ ran_verify_cmds.append(ev)
1743
+ missing_verify_cmds = [
1744
+ ev for ev in expected_verifies if ev not in ran_verify_cmds
1745
+ ]
1746
+ has_missing_verify = bool(missing_verify_cmds)
1683
1747
  # Cap raised 5 → 10 nudges per session. Removed tool_turns
1684
1748
  # gate entirely — the 2026-06-03 v2948 batch showed that
1685
1749
  # most "engaged but failed" trials (bucket D, 26/50 fails)
@@ -1690,16 +1754,24 @@ class AgentLoop:
1690
1754
  # The verifier never ran for any of them. Nudging late
1691
1755
  # forces them to run the verifier and iterate.
1692
1756
  #
1693
- # Also count `verify` tool calls. If the model emitted a
1694
- # `verify` call recently AND it returned passed=True, do
1695
- # NOT nudge the model genuinely passed its check.
1757
+ # Count `verify` tool calls for the nudge text. Note:
1758
+ # `last_verify_passed` is NOT used as a gate anymore.
1759
+ # 2026-06-04 v2.9.55 batch: the model's `verify` tool
1760
+ # checks MODEL-CHOSEN criteria, not the external tbench
1761
+ # verifier. Self-pass happens easily (chess-best-move had
1762
+ # 4 verify calls, last passed=True, model's answer was
1763
+ # wrong, external tbench verifier rejected). Using
1764
+ # last_verify_passed as a gate silenced the nudge across
1765
+ # 37/37 fails in that batch. The nudge cap (10) is
1766
+ # already a sufficient bound; let it fire so Fix A
1767
+ # (path-aware nudge) actually runs.
1696
1768
  verify_count = 0
1697
1769
  last_verify_passed = False
1698
1770
  for msg in self.messages:
1699
1771
  if msg.role == Role.tool and (msg.name == "verify"):
1700
1772
  verify_count += 1
1701
1773
  last_verify_passed = "passed: True" in (msg.content or "")
1702
- if is_programmatic and nudges < 10 and not last_verify_passed:
1774
+ if is_programmatic and nudges < 10:
1703
1775
  self._premature_exit_nudges = nudges + 1
1704
1776
  if zero_writes:
1705
1777
  paths_hint = ""
@@ -1740,6 +1812,44 @@ class AgentLoop:
1740
1812
  f"no file, and partial-credit verifiers reward "
1741
1813
  f"format correctness even when content is off."
1742
1814
  )
1815
+ elif has_missing_verify:
1816
+ # Fix E (2026-06-04): task explicitly names a
1817
+ # verify command (e.g. "you can run: `pytest -rA`")
1818
+ # and the model never executed it. 14 of 37 fails
1819
+ # in v2.9.55 had partial pytest credit (one named
1820
+ # 5/6, another 4/5) — they were ONE iteration away
1821
+ # from passing but never ran the verifier to see.
1822
+ note = (
1823
+ f"⚠ PREMATURE EXIT BLOCK #{nudges + 1}/10. "
1824
+ f"The task explicitly names this verify "
1825
+ f"command: `{missing_verify_cmds[0]}`"
1826
+ f"{' (+%d more)' % (len(missing_verify_cmds)-1) if len(missing_verify_cmds) > 1 else ''}"
1827
+ f". You have NOT run it. The external "
1828
+ f"verifier will use that exact command (or "
1829
+ f"equivalent) after you exit — run it NOW "
1830
+ f"yourself via `bash`, READ every failure "
1831
+ f"line, FIX what it reports, then rerun "
1832
+ f"until 0 failures. Your self-`verify` tool "
1833
+ f"checks YOUR criterion, not this command."
1834
+ )
1835
+ elif last_verify_passed:
1836
+ # 2026-06-04: model self-verified with its OWN
1837
+ # criterion. Real tbench/pytest verifier runs
1838
+ # later and is stricter. Warn explicitly.
1839
+ note = (
1840
+ f"⚠ PREMATURE EXIT BLOCK #{nudges + 1}/10. "
1841
+ f"Your `verify` call passed, but that checks "
1842
+ f"the criterion YOU wrote — not the external "
1843
+ f"pytest the harness will run after you exit. "
1844
+ f"Common gap: your verify checks 'file exists' "
1845
+ f"or 'output contains X', but the verifier "
1846
+ f"checks EXACT format / EXACT path / specific "
1847
+ f"line content. Re-read the task literally: "
1848
+ f"the path it names, the format it specifies, "
1849
+ f"the example outputs it shows. Run a stricter "
1850
+ f"check (cat the file, run pytest if installed, "
1851
+ f"diff against the example) BEFORE exiting."
1852
+ )
1743
1853
  else:
1744
1854
  note = (
1745
1855
  f"⚠ PREMATURE EXIT BLOCK #{nudges + 1}/10. "
@@ -2550,7 +2660,13 @@ class AgentLoop:
2550
2660
  # Read-only checks (ls, pwd, git status) get a higher threshold.
2551
2661
  tool_name = tool_call.tool_name
2552
2662
  is_readonly = tool_name in ("grep", "read_file", "glob", "ls")
2553
- success_threshold = 6 if is_readonly else 4
2663
+ # 2026-06-04: lowered read-only success threshold 6 3 after
2664
+ # operator TUI session showed read_file looping 7× on the same
2665
+ # file before circuit breaker fired. The tool already injects a
2666
+ # "2nd identical read" header; if the model hasn't pivoted by
2667
+ # the 3rd call, it never will. Cuts wasted-turn cost on stuck
2668
+ # models from ~6 to ~3 per loop.
2669
+ success_threshold = 3 if is_readonly else 4
2554
2670
 
2555
2671
  if is_failed and count >= 2:
2556
2672
  pass # will be blocked below
@@ -451,6 +451,27 @@ class WriteFile(
451
451
  # triggers panic-retry loops (feedback_no_tool_errors_for_loop_detection).
452
452
  if not args.path.strip():
453
453
  cwd = Path.cwd()
454
+ # Track consecutive missing-path attempts so the advisory can
455
+ # escalate from gentle → concrete-suggestion → hard-block.
456
+ # 2026-06-04: operator reported 3+ identical missing-path
457
+ # attempts in TUI session — the soft advisory wasn't enough.
458
+ miss_state = self.state.__dict__.setdefault(
459
+ "_write_file_missing_path_streak", 0
460
+ )
461
+ miss_state += 1
462
+ self.state.__dict__["_write_file_missing_path_streak"] = miss_state
463
+
464
+ # Pull last-read paths from the read-file state for concrete
465
+ # suggestions on retry.
466
+ read_state = ctx.read_file_state if ctx else None
467
+ recent_reads: list[str] = []
468
+ if read_state:
469
+ try:
470
+ # read_file_state is keyed by path; pull a stable list
471
+ recent_reads = list(read_state.keys())[-3:]
472
+ except Exception:
473
+ pass
474
+
454
475
  try:
455
476
  pkg_dirs = [
456
477
  d.name for d in sorted(cwd.iterdir())
@@ -459,29 +480,56 @@ class WriteFile(
459
480
  hint = f"Package dirs in {cwd.name}/: {', '.join(pkg_dirs)}" if pkg_dirs else f"cwd: {cwd}"
460
481
  except OSError:
461
482
  hint = f"cwd: {cwd}"
462
- # 2026-05-31: do NOT echo a sample call shape in the error
463
- # content. Gemma 4 copies whatever it sees from prior tool
464
- # results as the next call's args a literal call-syntax
465
- # template in the error message gets re-emitted as the next
466
- # call (operator session 2026-05-31 hit 5+ identical
467
- # empty-path errors in a row). Keep the error terse and
468
- # actionable; the tool schema in the system prompt is the
469
- # canonical reference, not the error message. Same
470
- # root-cause as the search_replace empty-call loop fixed
471
- # via dedup-strip in commit dee310a.
472
- yield WriteFileResult(
473
- path="(missing)",
474
- bytes_written=0,
475
- file_existed=False,
476
- content=(
483
+
484
+ if miss_state == 1:
485
+ # 2026-05-31: do NOT echo a sample call shape in the
486
+ # error content. Gemma 4 copies whatever it sees from
487
+ # prior tool results as the next call's args — a
488
+ # literal call-syntax template in the error message
489
+ # gets re-emitted as the next call. Keep terse.
490
+ msg = (
477
491
  f"NO path supplied. Pick a concrete file path "
478
492
  f"under the current project (e.g. one of the "
479
493
  f"existing source files you just read), then "
480
494
  f"re-emit the call with that path and the full "
481
495
  f"file content. {hint}."
482
- ),
496
+ )
497
+ elif miss_state == 2 and recent_reads:
498
+ # Escalate: name the actual recently-read files so the
499
+ # model has a concrete target. Removes ambiguity that
500
+ # caused the model to retry with the same empty args.
501
+ msg = (
502
+ f"[REPEAT #{miss_state}] write_file STILL called with "
503
+ f"NO path. Stop guessing — pick ONE of these files "
504
+ f"you just read and pass its FULL absolute path as "
505
+ f"`path`: {', '.join(recent_reads[:3])}. If none "
506
+ f"of these is right, call read_file on the file "
507
+ f"you intend to edit FIRST, then write_file with "
508
+ f"that exact path."
509
+ )
510
+ else:
511
+ # 3rd+ miss with no recoverable suggestion. Block harder
512
+ # so the agent loop's "no progress" detector kicks in.
513
+ msg = (
514
+ f"[HARD-BLOCK] write_file called with NO path "
515
+ f"{miss_state} times in a row. STOP calling "
516
+ f"write_file. Do one of: (1) call read_file on the "
517
+ f"file you intend to edit so its path enters my "
518
+ f"context, (2) call bash with `ls` or `find` to "
519
+ f"locate the target file, (3) end your turn with a "
520
+ f"text summary if you're stuck. Continuing to call "
521
+ f"write_file without a path will produce this same "
522
+ f"block — it is not progress."
523
+ )
524
+ yield WriteFileResult(
525
+ path="(missing)",
526
+ bytes_written=0,
527
+ file_existed=False,
528
+ content=msg,
483
529
  )
484
530
  return
531
+ # Reset the missing-path streak on a successful path arg.
532
+ self.state.__dict__["_write_file_missing_path_streak"] = 0
485
533
  file_path, file_existed, content_bytes = self._prepare_and_validate_path(args)
486
534
 
487
535
  # Read-before-Write enforcement (Claude Code tool contract).
@@ -43,6 +43,8 @@ _STOPWORDS: frozenset[str] = frozenset({
43
43
  # because they always lead a Title-Case phrase ("Consider the X").
44
44
  "Consider", "Suppose", "Given", "Let", "Define", "Compute",
45
45
  "Determine", "Evaluate", "Prove", "Recall", "Note", "Assume",
46
+ "Render", "Parse", "Scan", "Detect", "Match", "Merge",
47
+ "Insert", "Delete", "Select", "Update", "Create", "Drop",
46
48
  })
47
49
 
48
50
  # HLE / harness prompt-template tokens that the detector kept flagging
@@ -99,10 +101,98 @@ _TEMPLATE_NOISE: frozenset[str] = frozenset(
99
101
  # knowledge gap — 2026-06-04 queue audit top false positives.
100
102
  "ERROR", "WARNING", "INFO", "DEBUG", "CRITICAL", "FATAL",
101
103
  "TRACE", "VERBOSE", "NOTICE",
104
+ # HTTP methods — always known in coding context.
105
+ "GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS", "CONNECT",
106
+ # HTTP/web protocol abbreviations.
107
+ "SSE", "WS", "WSS", "RPC", "JSONRPC",
108
+ # Web/style formats.
109
+ "CSS", "SASS", "SCSS", "LESS",
110
+ # Common programming concepts always known in coding context.
111
+ "AST", "CFG", "DAG", "FSM", "DSL", "BNF", "EBNF", "REPL",
112
+ # Caching strategies.
113
+ "LRU", "LFU", "FIFO", "LIFO", "MRU",
114
+ # Encoding names with hyphen variants.
115
+ "UTF-8", "UTF-16", "UTF-32",
116
+ # Common placeholder / schema column-type words.
117
+ "VALUE", "DATE", "TIME", "SIZE", "HASH", "RANK",
118
+ # Project doc file names always known to a coding assistant.
119
+ "FAQ", "CONTRIBUTING", "AUTHORS", "CODEOWNERS", "SECURITY",
120
+ "MAINTAINERS", "NOTICE",
121
+ # Connector prepositions that match short-string regexes but are prose.
122
+ "IN", "OF", "AT", "ON", "BY", "AS",
123
+ # PRD section headers — always prose in template specs, not entities.
124
+ "OPEN QUESTIONS", "USE CASES", "NON-GOALS", "NON GOALS",
125
+ "EDGE CASES", "GETTING STARTED", "QUICK START", "OVERVIEW",
126
+ "BACKGROUND", "MOTIVATION", "RATIONALE", "OBJECTIVES", "SCOPE",
127
+ # Pytest / CI test-status words — appear as "pytest is RED / GREEN"
128
+ # in task prompts but are never GraphRAG-retrievable knowledge.
129
+ "RED", "GREEN", "PASS", "FAIL", "SKIP", "XFAIL",
130
+ "PASSED", "FAILED", "SKIPPED", "BROKEN", "XPASS",
102
131
  "STATUS", "STATE", "MODE", "TYPE", "KIND", "FLAG", "OPTION",
103
132
  "FINDINGS", "PATTERNS", "REGEXES", "FIELDS", "METHODS",
104
133
  "VERSION", "NAME", "PATH", "DATA", "OUTPUT", "INPUT",
105
134
  "CONFIG", "SCHEMA", "FORMAT", "TEMPLATE", "LAYOUT",
135
+ # SQL DDL keywords — written in ALL-CAPS in schema code but never
136
+ # a GraphRAG knowledge gap for a coding assistant.
137
+ "TEXT", "INTEGER", "REAL", "BLOB", "BOOLEAN", "NUMERIC",
138
+ "PRIMARY", "KEY", "UNIQUE", "INDEX", "FOREIGN", "REFERENCES",
139
+ "CONSTRAINT", "DEFAULT", "NOT NULL", "NULL", "AUTO INCREMENT",
140
+ "CREATE", "TABLE", "SELECT", "INSERT", "UPDATE", "DELETE",
141
+ "FROM", "WHERE", "JOIN", "LEFT", "RIGHT", "INNER", "OUTER",
142
+ "GROUP BY", "ORDER BY", "HAVING", "LIMIT", "OFFSET",
143
+ "BEGIN", "COMMIT", "ROLLBACK", "TRANSACTION",
144
+ # Common English words used in ALL-CAPS for emphasis in user specs —
145
+ # they match _RE_ACRONYM (≥3 uppercase) but carry no knowledge gap.
146
+ "OFFLINE", "ONLINE", "LOCAL", "REMOTE", "ALWAYS", "NEVER",
147
+ "ONLY", "ALSO", "MUST", "SHOULD", "WILL", "FULL", "EMPTY",
148
+ "DONE", "NEXT", "LAST", "FIRST", "EACH", "BOTH", "SAME",
149
+ "EVERY", "KEEP", "NEED", "ABLE", "MAKE", "WRITE", "READ",
150
+ "STORE", "CACHE", "DISK", "FILE", "PARSE", "LOAD", "CALL",
151
+ "SEND", "RECV", "OPEN", "CLOSE", "INIT", "STOP", "WAIT",
152
+ "SYNC", "ASYNC", "COPY", "MOVE", "PUSH", "PULL", "FETCH",
153
+ # Temporal conjunctions/prepositions used for emphasis in specs
154
+ "BEFORE", "AFTER", "DURING", "WHILE", "SINCE", "UNTIL",
155
+ "WHEN", "THEN", "ONCE", "ALREADY", "STILL", "AGAIN",
156
+ "ACROSS", "BETWEEN", "WITHIN", "WITHOUT", "THROUGH",
157
+ "ABOVE", "BELOW", "UNDER", "OVER", "INTO", "ONTO", "FROM",
158
+ "AGAINST", "BEYOND", "DESPITE", "EXCEPT", "INSTEAD",
159
+ "CLARIFICATION", "IMPLEMENTATION", "REQUIREMENT", "SPECIFICATION",
160
+ "DEFINITION", "DESCRIPTION", "DOCUMENTATION", "EXAMPLE",
161
+ "FEATURE", "FUNCTION", "INTERFACE", "PROPERTY", "ATTRIBUTE",
162
+ "INSTANCE", "OBJECT", "CLASS", "MODULE", "PACKAGE", "LIBRARY",
163
+ "MILK", # from "buy milk" test prompt — common English word
164
+ # Single-word emphasis — match _RE_ACRONYM (≥3 uppercase) but are
165
+ # common English words used for stress in PRD specs, not identifiers.
166
+ "ONE", "OLD", "END", "POST", "MOSTLY", "QUITE", "VERY",
167
+ # Networking / infra abbreviations always known in coding context.
168
+ "TTL", "ACL", "NAT", "DNS", "VPN", "LAN", "WAN",
169
+ # Product / project management abbreviations used in PRD prompts.
170
+ "PRD", "RFC", "ADR", "SLA", "SLO", "SLI", "KPI", "OKR",
171
+ # iCalendar (RFC 5545) protocol keywords — appear in iCal-format PRDs.
172
+ "VCALENDAR", "VEVENT", "VTODO", "VJOURNAL", "VALARM",
173
+ "DTSTART", "DTEND", "DTSTAMP", "DURATION", "RRULE",
174
+ # Common English nouns used as PRD field / attribute names — never a
175
+ # GraphRAG knowledge gap. 2026-06-04 queue audit: recency (215×),
176
+ # tasks (188×), untitled (67×), username (65×).
177
+ "recency", "tasks", "untitled", "username", "summary",
178
+ "legacy", "snapshot", "artifact", "payload", "metadata",
179
+ "endpoint", "workflow", "pipeline", "plugin", "widget",
180
+ "sidebar", "toolbar", "viewport", "canvas", "panel",
181
+ "dialog", "modal", "popup", "tooltip", "banner", "badge",
182
+ # Well-known infrastructure / framework names always known to a coding
183
+ # assistant — appear as lowercase terms in stress-run sessions where
184
+ # the model is asked to add support for common servers/tools.
185
+ "nginx", "gunicorn", "uwsgi", "celery", "supervisor",
186
+ "flask", "django", "fastapi", "tornado", "aiohttp", "bottle",
187
+ "pytest", "unittest", "nose", "tox",
188
+ "pandas", "numpy", "scipy", "matplotlib", "seaborn", "sklearn",
189
+ "docker", "kubernetes", "helm", "terraform", "ansible",
190
+ "webpack", "vite", "rollup", "esbuild", "babel",
191
+ # Generic technical snake_case nouns that are code-artifact names,
192
+ # not external library knowledge gaps.
193
+ "stack_trace", "word_count", "line_count", "byte_count", "char_count",
194
+ "legacy_modules", "legacy_module", "legacy_code",
195
+ "drydock_lifecycle", "drydock_test",
106
196
  }
107
197
  )
108
198
 
@@ -112,6 +202,39 @@ _CONNECTOR_WORDS: frozenset[str] = frozenset({
112
202
  "of", "the", "and", "for", "in", "de", "von", "a", "an",
113
203
  })
114
204
 
205
+ # Snake-case identifiers that start with a common action verb are generated
206
+ # code artifacts (CRUD methods, helpers), not external knowledge gaps.
207
+ _VERB_PREFIXES: frozenset[str] = frozenset({
208
+ "get_", "set_", "add_", "put_", "has_", "is_",
209
+ "list_", "count_", "delete_", "remove_", "create_", "make_",
210
+ "build_", "update_", "edit_", "save_", "load_", "read_", "write_",
211
+ "parse_", "format_", "render_", "handle_", "process_", "compute_",
212
+ "calc_", "check_", "validate_", "fetch_", "send_", "recv_",
213
+ "run_", "exec_", "init_", "reset_", "clear_", "close_", "open_",
214
+ "find_", "search_", "query_", "filter_", "sort_", "group_",
215
+ "encode_", "decode_", "serialize_", "deserialize_", "convert_",
216
+ "show_", "hide_", "display_", "print_", "log_", "report_",
217
+ "sample_", "generate_", "emit_", "merge_", "patch_", "register_",
218
+ "unregister_", "subscribe_", "publish_", "notify_", "watch_",
219
+ "require_", "resolve_", "dispatch_", "route_", "map_", "reduce_",
220
+ "collect_", "gather_", "aggregate_", "transform_", "extract_",
221
+ "inject_", "wrap_", "unwrap_", "clone_", "copy_", "move_",
222
+ "import_", "export_", "upload_", "download_", "stream_",
223
+ "test_", "assert_", "expect_", "mock_", "stub_", "spy_",
224
+ # Architecture-layer prefixes — snake_case with these prefixes are
225
+ # internal variables/types, not external library knowledge gaps.
226
+ "backend_", "frontend_", "status_", "top_", "base_", "main_",
227
+ "core_", "util_", "helper_", "common_", "shared_", "default_",
228
+ "current_", "prev_", "next_", "max_", "min_", "total_", "avg_",
229
+ "num_", "idx_", "pos_", "key_", "val_", "src_", "dst_", "tmp_",
230
+ "raw_", "cached_", "parsed_", "formatted_", "rendered_", "computed_",
231
+ # Format-sniffing / detection / request-field prefixes — code artifacts
232
+ # generated by the agent, not external library knowledge gaps.
233
+ "sniff_", "detect_", "infer_", "guess_",
234
+ "req_", "resp_", "res_", "body_", "header_", "param_",
235
+ "source_", "target_", "dest_", "output_", "input_",
236
+ })
237
+
115
238
 
116
239
  def _is_template_noise(candidate: str) -> bool:
117
240
  """True if the candidate is HLE/admiral boilerplate, not a real term."""
@@ -144,16 +267,38 @@ def _is_template_noise(candidate: str) -> bool:
144
267
  ".toml", ".log", ".html", ".xml", ".sql", ".sh", ".rs",
145
268
  ".go", ".ts", ".js", ".jsx", ".tsx", ".css", ".scss",
146
269
  ".bak", ".tmp", ".lock", ".pid", ".gz", ".zip", ".tar",
270
+ ".db", ".sqlite3", ".cache", ".dat", ".bin",
147
271
  )
148
272
  if "/" not in norm and any(norm.endswith(ext) for ext in _CODE_EXTS):
149
273
  return True
150
274
  # Dotted identifier where the post-dot component is a common English
151
- # word → sentence boundary artifact ("scratch.Step", "fail.Stop").
275
+ # word OR starts with a verb-prefix → sentence boundary artifact or
276
+ # code artifact ("scratch.Step", "fail.Stop", "parser.sniff_format").
152
277
  if "." in norm:
153
278
  parts = norm.split(".")
154
279
  _sw_lower = {w.lower() for w in _STOPWORDS}
155
280
  if any(p in _sw_lower for p in parts[1:]):
156
281
  return True
282
+ if any(any(p.startswith(vp) for vp in _VERB_PREFIXES) for p in parts[1:]):
283
+ return True
284
+ # Python stdlib module dotted names (json.loads, http.server, os.path)
285
+ # are always known to a coding assistant.
286
+ _STDLIB_MODULES: frozenset[str] = frozenset({
287
+ "os", "sys", "re", "io", "json", "csv", "xml", "html", "http",
288
+ "urllib", "email", "logging", "threading", "multiprocessing",
289
+ "subprocess", "socket", "ssl", "hashlib", "hmac", "uuid",
290
+ "datetime", "time", "calendar", "random", "math", "statistics",
291
+ "collections", "itertools", "functools", "operator", "copy",
292
+ "abc", "typing", "dataclasses", "enum", "pathlib", "shutil",
293
+ "tempfile", "glob", "fnmatch", "pickle", "shelve", "sqlite3",
294
+ "struct", "array", "queue", "heapq", "bisect", "weakref",
295
+ "contextlib", "inspect", "ast", "dis", "gc", "traceback",
296
+ "warnings", "unittest", "doctest", "pprint", "textwrap",
297
+ "string", "difflib", "argparse", "configparser", "platform",
298
+ "signal", "asyncio", "base64", "binascii", "codecs",
299
+ })
300
+ if parts[0] in _STDLIB_MODULES:
301
+ return True
157
302
  # LaTeX math expressions — false positives from HLE/academic prompts.
158
303
  # A term starting with $ or a LaTeX command backslash is math notation,
159
304
  # not a GraphRAG-retrievable identifier.
@@ -175,18 +320,74 @@ def _is_template_noise(candidate: str) -> bool:
175
320
  # generic utility patterns, not external library gaps.
176
321
  if norm.startswith("to_"):
177
322
  return True
323
+ # Snake_case names ending in common implementation-pattern suffixes are
324
+ # code artifacts generated by the agent, not external knowledge gaps.
325
+ # E.g. stack_trace, error_handler, config_manager, log_formatter.
326
+ _NOUN_SUFFIXES: frozenset[str] = frozenset({
327
+ "_trace", "_count", "_handler", "_manager", "_parser",
328
+ "_formatter", "_reader", "_writer", "_builder", "_factory",
329
+ "_registry", "_provider", "_consumer", "_producer",
330
+ "_iterator", "_generator", "_validator", "_serializer",
331
+ "_deserializer", "_encoder", "_decoder", "_processor",
332
+ "_executor", "_scheduler", "_dispatcher", "_router",
333
+ "_resolver", "_collector", "_aggregator", "_transformer",
334
+ "_extractor", "_injector", "_wrapper", "_observer",
335
+ "_listener", "_emitter", "_subscriber", "_publisher",
336
+ "_module", "_modules", "_helper", "_util", "_utils",
337
+ "_config", "_settings", "_options", "_params",
338
+ "_result", "_results", "_response", "_request",
339
+ "_context", "_session", "_client", "_server",
340
+ "_queue", "_stack", "_buffer", "_cache", "_store",
341
+ "_pool", "_cluster", "_node", "_worker", "_runner",
342
+ "_loop", "_cycle", "_tick", "_batch", "_chunk",
343
+ })
344
+ if "_" in norm and any(norm.endswith(s) for s in _NOUN_SUFFIXES):
345
+ return True
346
+ # Common action-verb prefixed snake_case names are code artifacts.
347
+ if any(norm.startswith(p) for p in _VERB_PREFIXES):
348
+ return True
349
+ # Roman numerals (MCMXCIV, XIV, etc.) — matched by _RE_ACRONYM but
350
+ # carry no knowledge gap for a coding assistant.
351
+ if len(norm) > 2 and re.match(
352
+ r'^m{0,4}(?:cm|cd|d?c{0,3})(?:xc|xl|l?x{0,3})(?:ix|iv|v?i{0,3})$',
353
+ norm
354
+ ) and norm:
355
+ return True
356
+ # Sentence fragments starting with a single lowercase letter then a space
357
+ # are contraction tails ("Don't" → "t ...", "Let's" → "s ..."). These
358
+ # are never retrievable identifiers.
359
+ if re.match(r"^[a-z] ", norm):
360
+ return True
178
361
  # All-lowercase multi-word phrases (e.g. "buy milk", "sample logs") —
179
362
  # quoted prose from task prompts, not identifiers worth retrieving.
180
363
  # Only filter if the *original* candidate is already lowercase — Title Case
181
364
  # phrases like "Attention Is All You Need" must still be detected.
365
+ # Strip punctuation before the regex so commas/periods don't block matches.
182
366
  orig = candidate.strip(" :.,;")
183
- if " " in norm and orig == orig.lower() and re.match(r"^[a-z][a-z0-9 _-]+$", norm):
367
+ norm_alphanum = re.sub(r"[^a-z0-9 _-]", "", norm)
368
+ if " " in norm and orig == orig.lower() and re.match(r"^[a-z][a-z0-9 _-]+$", norm_alphanum) and len(norm_alphanum) > 3:
184
369
  return True
185
370
  # Date format strings like "YYYY-MM", "YYYY-MM-DD", "/DD/YYYY" — these
186
371
  # are template tokens that contain YYYY/MM/DD components (now in
187
372
  # TEMPLATE_NOISE) separated by punctuation but the combined string isn't.
188
373
  if re.match(r"^[/\-]?(?:yyyy|mm|dd|hh|ss)(?:[/\-](?:yyyy|mm|dd|hh|ss))+$", norm):
189
374
  return True
375
+ # Hyphenated lowercase adjective phrases from PRD prose
376
+ # ("tab-separated", "human-readable", "newline-delimited") — these are
377
+ # format descriptors, not library identifiers worth retrieving.
378
+ if re.match(r"^[a-z][a-z0-9]+-[a-z][a-z0-9]+(?:-[a-z][a-z0-9]+)*$", norm):
379
+ return True
380
+ # Paths that contain known test-run or lifecycle directories — these are
381
+ # ephemeral artifacts from stress/lifecycle sessions, not real projects.
382
+ if re.search(r"(/drydock_lifecycle/|/pytest-of-|/pytest-\d|/tmp/drydock_|/swe_bench_|/test_harness_)", norm):
383
+ return True
384
+ # Latin abbreviations used as prose connectors ("i.e", "e.g", "etc").
385
+ if norm in ("i.e", "e.g", "etc", "i.e.", "e.g.", "etc.", "cf.", "cf", "vs", "vs."):
386
+ return True
387
+ # Snake_case identifiers containing _to_ in the middle are converter helpers
388
+ # (csv_to_json, rgb_to_hex) — project-generated code artifacts, not gaps.
389
+ if re.match(r"^[a-z][a-z0-9]*_to_[a-z][a-z0-9_]*$", norm):
390
+ return True
190
391
  return False
191
392
 
192
393
  # Acronyms shorter than this are too noisy to chase ("ID", "OK", "OS").
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "drydock-cli"
3
- version = "2.9.55"
3
+ version = "2.9.59"
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"
@@ -326,7 +326,7 @@ wheels = [
326
326
 
327
327
  [[package]]
328
328
  name = "drydock-cli"
329
- version = "2.9.54"
329
+ version = "2.9.55"
330
330
  source = { editable = "." }
331
331
  dependencies = [
332
332
  { name = "agent-client-protocol" },
File without changes
File without changes
File without changes
File without changes