drydock-cli 2.10.5__tar.gz → 2.10.7__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 (735) hide show
  1. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/PKG-INFO +1 -1
  2. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/entrypoint.py +137 -0
  3. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/format.py +24 -9
  4. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/gemma4_slim.md +2 -0
  5. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/session/session_logger.py +25 -12
  6. drydock_cli-2.10.7/drydock/data/cookbook/python/global_rename.md +134 -0
  7. drydock_cli-2.10.7/drydock/data/cookbook/tbench_domains/elf_extraction_js.md +165 -0
  8. drydock_cli-2.10.7/drydock/data/cookbook/tbench_domains/mobilesam_cell_seg.md +162 -0
  9. drydock_cli-2.10.7/drydock/data/cookbook/tbench_domains/mteb_retrieve.md +124 -0
  10. drydock_cli-2.10.7/drydock/data/cookbook/tbench_domains/regex_chess.md +211 -0
  11. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/graphrag/__main__.py +1 -1
  12. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/graphrag/storage.py +1 -1
  13. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/graphrag/text_indexer.py +54 -4
  14. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/pyproject.toml +1 -1
  15. drydock_cli-2.10.7/tests/test_broken_tool_isolation.py +74 -0
  16. drydock_cli-2.10.7/tests/test_graphrag_pdf_ingest.py +104 -0
  17. drydock_cli-2.10.7/tests/test_mechanical_rename_type_extraction.py +91 -0
  18. drydock_cli-2.10.5/tests/test_mechanical_rename_type_extraction.py +0 -60
  19. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/.gitignore +0 -0
  20. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/LICENSE +0 -0
  21. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/NOTICE +0 -0
  22. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/README.md +0 -0
  23. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/distribution/zed/LICENSE +0 -0
  24. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/docs/README.md +0 -0
  25. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/__init__.py +0 -0
  26. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/__main__.py +0 -0
  27. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/__init__.py +0 -0
  28. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/acp_agent_loop.py +0 -0
  29. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/acp_logger.py +0 -0
  30. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/entrypoint.py +0 -0
  31. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/tools/__init__.py +0 -0
  32. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/tools/base.py +0 -0
  33. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/tools/builtins/bash.py +0 -0
  34. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/tools/builtins/read_file.py +0 -0
  35. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/tools/builtins/search_replace.py +0 -0
  36. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/tools/builtins/todo.py +0 -0
  37. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/tools/builtins/write_file.py +0 -0
  38. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/tools/session_update.py +0 -0
  39. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/utils.py +0 -0
  40. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/__init__.py +0 -0
  41. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/detectors.py +0 -0
  42. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/detectors_proposed.py +0 -0
  43. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/history.py +0 -0
  44. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/interventions.py +0 -0
  45. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/llm_analyzer.py +0 -0
  46. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/metrics.py +0 -0
  47. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/opus_escalator.py +0 -0
  48. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/persistence.py +0 -0
  49. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/policy.py +0 -0
  50. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/proposer.py +0 -0
  51. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/stager.py +0 -0
  52. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/task_classifier.py +0 -0
  53. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/tuning.py +0 -0
  54. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/validator.py +0 -0
  55. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/worker.py +0 -0
  56. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/__init__.py +0 -0
  57. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/autocompletion/__init__.py +0 -0
  58. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/autocompletion/base.py +0 -0
  59. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/autocompletion/path_completion.py +0 -0
  60. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/autocompletion/slash_command.py +0 -0
  61. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/cli.py +0 -0
  62. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/clipboard.py +0 -0
  63. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/commands.py +0 -0
  64. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/fix_windows_path.py +0 -0
  65. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/history_manager.py +0 -0
  66. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
  67. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
  68. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
  69. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/terminal_setup.py +0 -0
  70. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/__init__.py +0 -0
  71. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
  72. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/app.py +0 -0
  73. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/app.tcss +0 -0
  74. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/external_editor.py +0 -0
  75. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
  76. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
  77. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
  78. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
  79. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
  80. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
  81. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
  82. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
  83. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
  84. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
  85. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
  86. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
  87. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
  88. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
  89. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
  90. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
  91. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
  92. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
  93. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
  94. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/compact.py +0 -0
  95. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
  96. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
  97. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
  98. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/loading.py +0 -0
  99. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/messages.py +0 -0
  100. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
  101. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
  102. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
  103. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
  104. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
  105. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
  106. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
  107. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
  108. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
  109. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/tools.py +0 -0
  110. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
  111. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
  112. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/windowing/history.py +0 -0
  113. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
  114. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/windowing/state.py +0 -0
  115. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/update_notifier/__init__.py +0 -0
  116. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
  117. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
  118. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
  119. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
  120. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
  121. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/update_notifier/update.py +0 -0
  122. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/update_notifier/whats_new.py +0 -0
  123. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/__init__.py +0 -0
  124. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/agent_loop.py +0 -0
  125. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/agents/__init__.py +0 -0
  126. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/agents/manager.py +0 -0
  127. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/agents/models.py +0 -0
  128. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/auth/__init__.py +0 -0
  129. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/auth/crypto.py +0 -0
  130. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/auth/github.py +0 -0
  131. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/auto_solve.py +0 -0
  132. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/__init__.py +0 -0
  133. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/completers.py +0 -0
  134. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
  135. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
  136. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
  137. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/file_indexer/store.py +0 -0
  138. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
  139. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/fuzzy.py +0 -0
  140. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/path_prompt.py +0 -0
  141. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
  142. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/build_orchestrator.py +0 -0
  143. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/checkpoint.py +0 -0
  144. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/classifier/__init__.py +0 -0
  145. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/classifier/__main__.py +0 -0
  146. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/classifier/classifier.py +0 -0
  147. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/classifier/dispatcher.py +0 -0
  148. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/classifier/rules.py +0 -0
  149. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/classifier/signal.py +0 -0
  150. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/config/__init__.py +0 -0
  151. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/config/_dotenv.py +0 -0
  152. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/config/_settings.py +0 -0
  153. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/config/doctor.py +0 -0
  154. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/config/harness_files/__init__.py +0 -0
  155. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/config/harness_files/_harness_manager.py +0 -0
  156. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/config/harness_files/_paths.py +0 -0
  157. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/config/local_detect.py +0 -0
  158. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/config/migrate.py +0 -0
  159. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/constraint_extract.py +0 -0
  160. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/constraint_hint.py +0 -0
  161. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/consultant.py +0 -0
  162. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/context_recovery.py +0 -0
  163. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/drydock_states.py +0 -0
  164. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/goal.py +0 -0
  165. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/hooks.py +0 -0
  166. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/__init__.py +0 -0
  167. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/backend/anthropic.py +0 -0
  168. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/backend/base.py +0 -0
  169. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/backend/factory.py +0 -0
  170. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/backend/generic.py +0 -0
  171. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/backend/mistral.py +0 -0
  172. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
  173. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/backend/vertex.py +0 -0
  174. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/exceptions.py +0 -0
  175. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/grammar/__init__.py +0 -0
  176. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/grammar/_llamacpp_converter.py +0 -0
  177. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/grammar/policy.py +0 -0
  178. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/grammar/policy_union.py +0 -0
  179. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/message_utils.py +0 -0
  180. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/types.py +0 -0
  181. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/logger.py +0 -0
  182. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/middleware.py +0 -0
  183. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/output_formatters.py +0 -0
  184. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/paths/__init__.py +0 -0
  185. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/paths/_drydock_home.py +0 -0
  186. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/paths/_local_config_walk.py +0 -0
  187. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/paths/conventions.py +0 -0
  188. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/plan_session.py +0 -0
  189. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/plugins.py +0 -0
  190. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/programmatic.py +0 -0
  191. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/__init__.py +0 -0
  192. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/builder.md +0 -0
  193. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/cli.md +0 -0
  194. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/compact.md +0 -0
  195. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/dangerous_directory.md +0 -0
  196. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/diagnostic.md +0 -0
  197. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/explore.md +0 -0
  198. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/gemma4.md +0 -0
  199. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/gemma4_math.md +0 -0
  200. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/planner.md +0 -0
  201. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/project_context.md +0 -0
  202. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/tests.md +0 -0
  203. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/proxy_setup.py +0 -0
  204. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/session/agent_memory.py +0 -0
  205. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/session/checkpoints.py +0 -0
  206. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/session/session_loader.py +0 -0
  207. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/session/session_migration.py +0 -0
  208. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/session/state_file.py +0 -0
  209. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/session_checker.py +0 -0
  210. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/skills/__init__.py +0 -0
  211. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/skills/manager.py +0 -0
  212. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/skills/models.py +0 -0
  213. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/skills/parser.py +0 -0
  214. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/slug.py +0 -0
  215. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/spec_check.py +0 -0
  216. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/steering_hook.py +0 -0
  217. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/system_prompt.py +0 -0
  218. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/telemetry/__init__.py +0 -0
  219. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/telemetry/send.py +0 -0
  220. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/teleport/errors.py +0 -0
  221. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/teleport/git.py +0 -0
  222. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/teleport/nuage.py +0 -0
  223. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/teleport/teleport.py +0 -0
  224. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/teleport/types.py +0 -0
  225. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/base.py +0 -0
  226. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/_task_manager.py +0 -0
  227. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/algebra_tool.py +0 -0
  228. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/ask_user_question.py +0 -0
  229. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/bash.py +0 -0
  230. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/chemistry_tool.py +0 -0
  231. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/count_tool.py +0 -0
  232. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/cron.py +0 -0
  233. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
  234. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/glob_tool.py +0 -0
  235. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/grep.py +0 -0
  236. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/invoke_skill.py +0 -0
  237. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/linear_algebra_tool.py +0 -0
  238. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/logic_tool.py +0 -0
  239. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/lsp.py +0 -0
  240. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/math_tool.py +0 -0
  241. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/mcp_resources.py +0 -0
  242. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/mechanical_rename.py +0 -0
  243. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/memory_tool.py +0 -0
  244. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/notebook_edit.py +0 -0
  245. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/number_theory_tool.py +0 -0
  246. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/powershell.py +0 -0
  247. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prolog_tool.py +0 -0
  248. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
  249. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
  250. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/bash.md +0 -0
  251. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/cron.md +0 -0
  252. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/glob.md +0 -0
  253. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/grep.md +0 -0
  254. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
  255. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
  256. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
  257. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
  258. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
  259. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
  260. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
  261. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
  262. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
  263. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/task.md +0 -0
  264. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
  265. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/todo.md +0 -0
  266. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
  267. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
  268. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
  269. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
  270. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
  271. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/read_file.py +0 -0
  272. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/retrieve.py +0 -0
  273. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/search_replace.py +0 -0
  274. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/set_tool.py +0 -0
  275. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/solve_tool.py +0 -0
  276. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/stats_tool.py +0 -0
  277. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/task.py +0 -0
  278. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/todo.py +0 -0
  279. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/tool_search.py +0 -0
  280. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/units_tool.py +0 -0
  281. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/verify_tool.py +0 -0
  282. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/webfetch.py +0 -0
  283. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/websearch.py +0 -0
  284. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/worktree.py +0 -0
  285. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/write_file.py +0 -0
  286. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/injection_guard.py +0 -0
  287. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/manager.py +0 -0
  288. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/mcp/__init__.py +0 -0
  289. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/mcp/registry.py +0 -0
  290. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/mcp/tools.py +0 -0
  291. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/mcp_sampling.py +0 -0
  292. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/ui.py +0 -0
  293. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/utils.py +0 -0
  294. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/trusted_folders.py +0 -0
  295. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/types.py +0 -0
  296. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/utils.py +0 -0
  297. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/curiosity/__init__.py +0 -0
  298. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/curiosity/__main__.py +0 -0
  299. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/curiosity/gap_detector.py +0 -0
  300. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/curiosity/ingest.py +0 -0
  301. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/curiosity/item.py +0 -0
  302. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/curiosity/queue.py +0 -0
  303. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/curiosity/surprise.py +0 -0
  304. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/data/cookbook/tbench_domains/biopython_dna.md +0 -0
  305. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/data/cookbook/tbench_domains/dense_eigenvalue.md +0 -0
  306. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/data/cookbook/tbench_domains/feal_cryptanalysis.md +0 -0
  307. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/data/cookbook/tbench_domains/llm_batching_scheduler.md +0 -0
  308. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/data/cookbook/tbench_domains/mips_isa.md +0 -0
  309. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/data/cookbook/tbench_domains/path_tracing.md +0 -0
  310. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/data/cookbook/tbench_domains/vim_macros.md +0 -0
  311. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/data/cookbook/tbench_domains/xss_filter.md +0 -0
  312. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/graphrag/__init__.py +0 -0
  313. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/graphrag/code_indexer.py +0 -0
  314. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/graphrag/retriever.py +0 -0
  315. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/onboarding/__init__.py +0 -0
  316. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/onboarding/base.py +0 -0
  317. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/onboarding/onboarding.tcss +0 -0
  318. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/onboarding/screens/__init__.py +0 -0
  319. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/onboarding/screens/api_key.py +0 -0
  320. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/onboarding/screens/choice.py +0 -0
  321. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/onboarding/screens/local_model.py +0 -0
  322. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/onboarding/screens/welcome.py +0 -0
  323. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
  324. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
  325. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/__init__.py +0 -0
  326. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/api-design/SKILL.md +0 -0
  327. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/audit-tests/SKILL.md +0 -0
  328. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/batch/SKILL.md +0 -0
  329. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/checklist/SKILL.md +0 -0
  330. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/commit-code/SKILL.md +0 -0
  331. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/constraint-reasoning/SKILL.md +0 -0
  332. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/context-summary/SKILL.md +0 -0
  333. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/create-presentation/SKILL.md +0 -0
  334. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/deep-research/SKILL.md +0 -0
  335. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/deploy/SKILL.md +0 -0
  336. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/diff-review/SKILL.md +0 -0
  337. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/doc-gen/SKILL.md +0 -0
  338. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/explain-code/SKILL.md +0 -0
  339. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/explore-code/SKILL.md +0 -0
  340. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/fix-issue/SKILL.md +0 -0
  341. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/git-ops/SKILL.md +0 -0
  342. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/init-project/SKILL.md +0 -0
  343. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/investigate/SKILL.md +0 -0
  344. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/logic/SKILL.md +0 -0
  345. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/logic/assets/cheat_sheet_full.txt +0 -0
  346. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/loop/SKILL.md +0 -0
  347. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/migrate/SKILL.md +0 -0
  348. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/perf-analyze/SKILL.md +0 -0
  349. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/plan-impl/SKILL.md +0 -0
  350. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/pr-review/SKILL.md +0 -0
  351. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/prove/SKILL.md +0 -0
  352. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/refactor/SKILL.md +0 -0
  353. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/regex-help/SKILL.md +0 -0
  354. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/review/SKILL.md +0 -0
  355. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/security-review/SKILL.md +0 -0
  356. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/ship/SKILL.md +0 -0
  357. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/simplify/SKILL.md +0 -0
  358. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/strong-tests/SKILL.md +0 -0
  359. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/test-verify/SKILL.md +0 -0
  360. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/__init__.py +0 -0
  361. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/__main__.py +0 -0
  362. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/applier.py +0 -0
  363. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/config.py +0 -0
  364. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/registry.py +0 -0
  365. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/sandbox.py +0 -0
  366. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/sidecar/__init__.py +0 -0
  367. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/sidecar/header_parser.py +0 -0
  368. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/sidecar/hooks.py +0 -0
  369. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/sidecar/loader.py +0 -0
  370. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/sidecar/server.py +0 -0
  371. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/train/__init__.py +0 -0
  372. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/train/capture.py +0 -0
  373. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/train/compute_vector.py +0 -0
  374. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/train/extract_pairs.py +0 -0
  375. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/train/scan_sessions.py +0 -0
  376. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/vectors.py +0 -0
  377. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/whats_new.md +0 -0
  378. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/install_tests/README.md +0 -0
  379. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/install_tests/publish/README.md +0 -0
  380. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/install_tests/windows/README.md +0 -0
  381. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/scripts/README.md +0 -0
  382. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/scripts/_archived_eval_harness/README.md +0 -0
  383. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/scripts/llm/README.md +0 -0
  384. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/__init__.py +0 -0
  385. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/conftest.py +0 -0
  386. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_acp.py +0 -0
  387. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_agent_thought.py +0 -0
  388. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_bash.py +0 -0
  389. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_compact_session_updates.py +0 -0
  390. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_content.py +0 -0
  391. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_initialize.py +0 -0
  392. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_list_sessions.py +0 -0
  393. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_load_session.py +0 -0
  394. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_multi_session.py +0 -0
  395. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_new_session.py +0 -0
  396. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_proxy_setup_acp.py +0 -0
  397. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_read_file.py +0 -0
  398. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_search_replace.py +0 -0
  399. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_set_config_option.py +0 -0
  400. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_set_mode.py +0 -0
  401. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_set_model.py +0 -0
  402. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_tool_call_session_update.py +0 -0
  403. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_utils.py +0 -0
  404. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_write_file.py +0 -0
  405. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/autocompletion/conftest.py +0 -0
  406. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/autocompletion/test_file_indexer.py +0 -0
  407. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/autocompletion/test_fuzzy.py +0 -0
  408. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
  409. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/autocompletion/test_path_completer_recursive.py +0 -0
  410. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/autocompletion/test_path_completion_controller.py +0 -0
  411. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
  412. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/autocompletion/test_slash_command_controller.py +0 -0
  413. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
  414. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/backend/__init__.py +0 -0
  415. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/backend/data/__init__.py +0 -0
  416. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/backend/data/fireworks.py +0 -0
  417. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/backend/data/mistral.py +0 -0
  418. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/backend/test_anthropic_adapter.py +0 -0
  419. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/backend/test_backend.py +0 -0
  420. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/backend/test_generic_adapter_sanitize.py +0 -0
  421. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/backend/test_reasoning_adapter.py +0 -0
  422. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
  423. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
  424. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
  425. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
  426. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_bell_notifications.py +0 -0
  427. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_braille_renderer.py +0 -0
  428. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_clipboard.py +0 -0
  429. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_commands.py +0 -0
  430. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_copy_shortcuts.py +0 -0
  431. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_external_editor.py +0 -0
  432. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_no_markup_static.py +0 -0
  433. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_question_app.py +0 -0
  434. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_spinner.py +0 -0
  435. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_switching_mode.py +0 -0
  436. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_ui_clipboard_notifications.py +0 -0
  437. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
  438. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_ui_session_resume.py +0 -0
  439. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_ui_skill_dispatch.py +0 -0
  440. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/textual_ui/__init__.py +0 -0
  441. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/textual_ui/test_session_picker.py +0 -0
  442. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/conftest.py +0 -0
  443. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_agents.py +0 -0
  444. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_auth_crypto.py +0 -0
  445. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_auth_github.py +0 -0
  446. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_config_load_dotenv.py +0 -0
  447. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_config_paths.py +0 -0
  448. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_config_resolution.py +0 -0
  449. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_file_logging.py +0 -0
  450. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_plan_session.py +0 -0
  451. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_proxy_setup.py +0 -0
  452. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_slug.py +0 -0
  453. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_telemetry_send.py +0 -0
  454. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_teleport_git.py +0 -0
  455. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_teleport_nuage.py +0 -0
  456. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_teleport_service.py +0 -0
  457. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_trusted_folders.py +0 -0
  458. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_utils.py +0 -0
  459. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/e2e/common.py +0 -0
  460. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/e2e/conftest.py +0 -0
  461. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/e2e/mock_server.py +0 -0
  462. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/e2e/test_cli_tui_onboarding.py +0 -0
  463. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/e2e/test_cli_tui_streaming.py +0 -0
  464. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
  465. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/fixtures/doc_qa_system_prd.md +0 -0
  466. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/mock/__init__.py +0 -0
  467. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/mock/mock_backend_factory.py +0 -0
  468. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/mock/mock_entrypoint.py +0 -0
  469. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/mock/utils.py +0 -0
  470. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/onboarding/test_run_onboarding.py +0 -0
  471. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/onboarding/test_ui_onboarding.py +0 -0
  472. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/session/test_session_loader.py +0 -0
  473. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/session/test_session_logger.py +0 -0
  474. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/session/test_session_migration.py +0 -0
  475. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/skills/conftest.py +0 -0
  476. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/skills/test_manager.py +0 -0
  477. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/skills/test_models.py +0 -0
  478. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/skills/test_parser.py +0 -0
  479. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
  480. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
  481. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
  482. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
  483. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
  484. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
  485. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
  486. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
  487. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
  488. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
  489. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
  490. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
  491. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
  492. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
  493. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
  494. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
  495. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
  496. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
  497. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
  498. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
  499. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
  500. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
  501. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
  502. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
  503. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
  504. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
  505. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
  506. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
  507. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
  508. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
  509. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
  510. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
  511. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
  512. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
  513. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
  514. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
  515. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
  516. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
  517. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
  518. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
  519. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
  520. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
  521. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
  522. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
  523. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
  524. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
  525. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
  526. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
  527. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
  528. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
  529. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
  530. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
  531. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
  532. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
  533. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
  534. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
  535. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
  536. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
  537. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
  538. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
  539. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/base_snapshot_test_app.py +0 -0
  540. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/conftest.py +0 -0
  541. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/snap_compare.py +0 -0
  542. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
  543. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
  544. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
  545. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
  546. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
  547. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
  548. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
  549. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
  550. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
  551. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
  552. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
  553. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
  554. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
  555. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
  556. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/stress/__init__.py +0 -0
  557. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/stress/test_io_thrash.py +0 -0
  558. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/stubs/fake_backend.py +0 -0
  559. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/stubs/fake_client.py +0 -0
  560. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/stubs/fake_tool.py +0 -0
  561. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_admiral.py +0 -0
  562. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
  563. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_admiral_intervention_outcome.py +0 -0
  564. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_admiral_phase3.py +0 -0
  565. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_admiral_proposed.py +0 -0
  566. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_admiral_session_id.py +0 -0
  567. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_admiral_struggle_dedup.py +0 -0
  568. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_agent_auto_compact.py +0 -0
  569. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_agent_backend.py +0 -0
  570. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_agent_observer_streaming.py +0 -0
  571. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_agent_stats.py +0 -0
  572. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_agent_tasks.py +0 -0
  573. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_agent_tool_call.py +0 -0
  574. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_agents.py +0 -0
  575. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_algebra_tool.py +0 -0
  576. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_api_error_recovery.py +0 -0
  577. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_approval_modal_stray_keys.py +0 -0
  578. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_auto_retrieve_cookbook_bypass.py +0 -0
  579. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_auto_retrieve_soft_nudge.py +0 -0
  580. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_auto_solve.py +0 -0
  581. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_bank_build.py +0 -0
  582. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_bank_debug.py +0 -0
  583. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_bank_multiagent.py +0 -0
  584. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_bank_prd.py +0 -0
  585. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_bank_prd_extended.py +0 -0
  586. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_bank_tools.py +0 -0
  587. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_bank_update.py +0 -0
  588. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_build_projects.py +0 -0
  589. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_checkpoint.py +0 -0
  590. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_chemistry_tool.py +0 -0
  591. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_classifier.py +0 -0
  592. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_cli_programmatic_preload.py +0 -0
  593. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_config_migration.py +0 -0
  594. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_constraint_extract.py +0 -0
  595. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_constraint_hint.py +0 -0
  596. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_context_recovery.py +0 -0
  597. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_count_tool.py +0 -0
  598. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_curiosity.py +0 -0
  599. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_current_bugs.py +0 -0
  600. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_dispatch_report.py +0 -0
  601. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_dispatcher.py +0 -0
  602. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_drydock_regression.py +0 -0
  603. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_drydock_tasks.py +0 -0
  604. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_fake_tool_call_paren_syntax.py +0 -0
  605. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_full_regression.py +0 -0
  606. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_gemma4_anti_loop_migration.py +0 -0
  607. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_gemma4_tool_filter.py +0 -0
  608. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_goal.py +0 -0
  609. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_grammar.py +0 -0
  610. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_graphrag.py +0 -0
  611. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_graphrag_worked_examples.py +0 -0
  612. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_hallucinated_tool_suppression.py +0 -0
  613. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_history_manager.py +0 -0
  614. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_hle_aggregate.py +0 -0
  615. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_integration.py +0 -0
  616. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_issue_fixes.py +0 -0
  617. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_linear_algebra_tool.py +0 -0
  618. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_local_detect.py +0 -0
  619. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_local_detect_fallback.py +0 -0
  620. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_logic_tool.py +0 -0
  621. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_loop_detection.py +0 -0
  622. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_loop_regressions_2026_06_06.py +0 -0
  623. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_math_docs_lazy_injection.py +0 -0
  624. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_math_tool.py +0 -0
  625. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_mcp_settings.py +0 -0
  626. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_mcp_stdio_command_normalization.py +0 -0
  627. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_mechanical_rename_tool.py +0 -0
  628. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_memory_tool.py +0 -0
  629. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_message_id.py +0 -0
  630. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_message_merging.py +0 -0
  631. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_middleware.py +0 -0
  632. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_multi_agent.py +0 -0
  633. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_number_theory_tool.py +0 -0
  634. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_prolog_tool.py +0 -0
  635. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_read_file_not_found_listing.py +0 -0
  636. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_read_file_notebook_slim.py +0 -0
  637. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_real_failures.py +0 -0
  638. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_real_issues.py +0 -0
  639. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_real_workflow.py +0 -0
  640. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_reasoning_content.py +0 -0
  641. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_rejudge_hle.py +0 -0
  642. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_retrieval_consumer.py +0 -0
  643. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_retrieve_project_detection.py +0 -0
  644. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_retrieve_tool.py +0 -0
  645. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_safe_parse_tool_args.py +0 -0
  646. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_search_replace_args_not_truncated.py +0 -0
  647. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_search_replace_syntax_rollback.py +0 -0
  648. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_session_log_event.py +0 -0
  649. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_session_publish_on_resume.py +0 -0
  650. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_set_tool.py +0 -0
  651. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_smoke.py +0 -0
  652. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_solve_tool.py +0 -0
  653. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_specialist_math_tools_hidden.py +0 -0
  654. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_stats_tool.py +0 -0
  655. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_steering.py +0 -0
  656. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_steering_capture.py +0 -0
  657. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_steering_compute_vector.py +0 -0
  658. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_steering_extract_pairs.py +0 -0
  659. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_steering_hook.py +0 -0
  660. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_steering_sidecar_chat_inputs.py +0 -0
  661. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_steering_sidecar_hooks.py +0 -0
  662. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_system_prompt.py +0 -0
  663. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_tagged_text.py +0 -0
  664. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_task_complete_nudge.py +0 -0
  665. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_tool_args.py +0 -0
  666. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_tool_call_loops_regression_suite.py +0 -0
  667. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_tool_stop_injected_scope.py +0 -0
  668. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_truncate_args_valid_json.py +0 -0
  669. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_truncated_arg_path_hint.py +0 -0
  670. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_truncated_search_replace_escalation.py +0 -0
  671. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_truncated_write_escalation.py +0 -0
  672. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_ui_external_editor.py +0 -0
  673. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_ui_input_history.py +0 -0
  674. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_units_tool.py +0 -0
  675. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_user_issues.py +0 -0
  676. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_validation_error_scrub.py +0 -0
  677. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_verify_tool.py +0 -0
  678. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_wall_of_text_rescue.py +0 -0
  679. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_workloads.py +0 -0
  680. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_write_file_missing_path.py +0 -0
  681. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/testbank_helpers.py +0 -0
  682. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_ask_user_question.py +0 -0
  683. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash.py +0 -0
  684. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash_binary_grep_hint.py +0 -0
  685. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash_consec_empty_search.py +0 -0
  686. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
  687. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
  688. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash_error_loop_breaker.py +0 -0
  689. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
  690. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
  691. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
  692. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
  693. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_exit_plan_mode.py +0 -0
  694. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_grep.py +0 -0
  695. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
  696. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_invoke_context.py +0 -0
  697. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_manager_gemma_derived_models.py +0 -0
  698. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_manager_get_tool_config.py +0 -0
  699. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_mcp.py +0 -0
  700. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_mcp_sampling.py +0 -0
  701. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_pre_rename_hook.py +0 -0
  702. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
  703. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_read_file_dedup_reembed.py +0 -0
  704. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_read_file_directory.py +0 -0
  705. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_read_file_limit_truncation.py +0 -0
  706. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_append_fallback.py +0 -0
  707. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_dir_path.py +0 -0
  708. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_empty_content.py +0 -0
  709. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_file_not_found.py +0 -0
  710. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
  711. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_hard_stop.py +0 -0
  712. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_malformed_block.py +0 -0
  713. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
  714. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_placeholder.py +0 -0
  715. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
  716. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_task.py +0 -0
  717. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_ui_bash_execution.py +0 -0
  718. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_webfetch.py +0 -0
  719. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_websearch.py +0 -0
  720. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
  721. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_write_file_missing_main_module.py +0 -0
  722. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_write_file_missing_path_hint.py +0 -0
  723. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_write_file_multifile_rename.py +0 -0
  724. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
  725. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
  726. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/update_notifier/test_do_update.py +0 -0
  727. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
  728. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/update_notifier/test_github_update_gateway.py +0 -0
  729. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
  730. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/update_notifier/test_ui_update_notification.py +0 -0
  731. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/update_notifier/test_update_use_case.py +0 -0
  732. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/update_notifier/test_whats_new.py +0 -0
  733. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/uv.lock +0 -0
  734. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/web/README.md +0 -0
  735. {drydock_cli-2.10.5 → drydock_cli-2.10.7}/worked_examples/README.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: drydock-cli
3
- Version: 2.10.5
3
+ Version: 2.10.7
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
@@ -190,6 +190,140 @@ def check_and_resolve_trusted_folder() -> None:
190
190
  trusted_folders_manager.add_untrusted(cwd)
191
191
 
192
192
 
193
+ def _warn_on_path_shadow() -> None:
194
+ """If a different drydock install — either on PATH or in a
195
+ well-known install dir — is newer than the one we're running,
196
+ print a one-line warning.
197
+
198
+ Operator observed 2026-06-08: ~/.local/bin/drydock was 2.9.46
199
+ (months old) while the auto-released install in
200
+ ~/miniforge3/envs/drydock/bin was 2.10.4. The fresh install
201
+ wasn't even on PATH (the conda env wasn't activated), so a
202
+ strict $PATH walk wouldn't catch this. We also scan a few
203
+ conventional install locations.
204
+
205
+ Opt-out: DRYDOCK_NO_SHADOW_WARN=1.
206
+ """
207
+ if os.environ.get("DRYDOCK_NO_SHADOW_WARN", "").strip().lower() in (
208
+ "1", "true", "yes",
209
+ ):
210
+ return
211
+ if __version__ == "dev":
212
+ # Running from source — every install would be "newer" by version
213
+ # number but the dev tree IS what's intended. Skip.
214
+ return
215
+ try:
216
+ import glob
217
+ import shutil
218
+ from packaging.version import Version
219
+ running_bin = shutil.which("drydock")
220
+ if not running_bin:
221
+ return
222
+ running_real = os.path.realpath(running_bin)
223
+
224
+ # 1) Anything on $PATH named drydock.
225
+ candidates: list[str] = []
226
+ for path_dir in os.environ.get("PATH", "").split(os.pathsep):
227
+ if path_dir and os.path.isdir(path_dir):
228
+ p = os.path.join(path_dir, "drydock")
229
+ if os.path.isfile(p) and os.access(p, os.X_OK):
230
+ candidates.append(p)
231
+ # 2) Conventional install dirs (uv tool, conda envs) — these
232
+ # often contain drydock but aren't on PATH unless activated.
233
+ home = os.path.expanduser("~")
234
+ for pattern in (
235
+ os.path.join(home, ".local", "bin", "drydock"),
236
+ os.path.join(home, "miniforge3", "envs", "*", "bin", "drydock"),
237
+ os.path.join(home, "miniconda3", "envs", "*", "bin", "drydock"),
238
+ os.path.join(home, "anaconda3", "envs", "*", "bin", "drydock"),
239
+ os.path.join(home, ".local", "share", "uv", "tools",
240
+ "drydock-cli", "bin", "drydock"),
241
+ "/usr/local/bin/drydock",
242
+ ):
243
+ for p in glob.glob(pattern):
244
+ if os.path.isfile(p) and os.access(p, os.X_OK):
245
+ candidates.append(p)
246
+
247
+ seen: set[str] = {running_real}
248
+ for cand in candidates:
249
+ cand_real = os.path.realpath(cand)
250
+ if cand_real in seen:
251
+ continue
252
+ seen.add(cand_real)
253
+ try:
254
+ other_ver = _read_drydock_version_for(cand_real)
255
+ except Exception:
256
+ continue
257
+ if not other_ver:
258
+ continue
259
+ if Version(other_ver) > Version(__version__):
260
+ rprint(
261
+ f"[yellow]Note: drydock {other_ver} is installed at "
262
+ f"{cand}, but this session is running {__version__} "
263
+ f"from {running_real}. To use the newer one, run "
264
+ f"{cand} directly or put its bin dir first on PATH. "
265
+ f"Silence: DRYDOCK_NO_SHADOW_WARN=1.[/]"
266
+ )
267
+ return # one warning is enough
268
+ except Exception:
269
+ # Never block startup on a diagnostic.
270
+ return
271
+
272
+
273
+ def _read_drydock_version_for(executable_path: str) -> str | None:
274
+ """Given a drydock executable path, return the installed version
275
+ by reading dist-info metadata. Tries two env layouts: the binary's
276
+ sibling (env/bin/drydock + env/lib/.../site-packages — conda/venv
277
+ style) and the binary's shebang-pointed python (uv tool installs
278
+ that put the script in ~/.local/bin but the env at
279
+ ~/.local/share/uv/tools/...). No subprocess fork."""
280
+ candidate_envs: list[str] = []
281
+ # Layout A: <env>/bin/drydock — env root is one level up.
282
+ bin_dir = os.path.dirname(executable_path)
283
+ candidate_envs.append(os.path.dirname(bin_dir))
284
+ # Layout B: read the shebang from the executable and resolve the
285
+ # python interpreter path to its env root.
286
+ try:
287
+ with open(executable_path, "rb") as f:
288
+ first = f.readline()
289
+ if first.startswith(b"#!"):
290
+ shebang = first[2:].strip().decode("utf-8", errors="replace")
291
+ # shebang format is usually "/path/to/env/bin/python" possibly
292
+ # followed by args; take the executable token.
293
+ py = shebang.split()[0] if shebang.split() else ""
294
+ if py:
295
+ # Use the literal shebang path, NOT realpath — many tool
296
+ # installers (uv) ship a venv where bin/python is a
297
+ # symlink to system python. realpath would jump us out
298
+ # of the venv to /usr, losing the dist-info location.
299
+ py_bin_dir = os.path.dirname(py)
300
+ candidate_envs.append(os.path.dirname(py_bin_dir))
301
+ except OSError:
302
+ pass
303
+
304
+ for env_root in candidate_envs:
305
+ lib_dir = os.path.join(env_root, "lib")
306
+ if not os.path.isdir(lib_dir):
307
+ continue
308
+ for py_dir in sorted(os.listdir(lib_dir), reverse=True):
309
+ candidate_sp = os.path.join(lib_dir, py_dir, "site-packages")
310
+ if not os.path.isdir(candidate_sp):
311
+ continue
312
+ try:
313
+ for entry in os.listdir(candidate_sp):
314
+ if entry.startswith("drydock_cli-") and entry.endswith(".dist-info"):
315
+ meta = os.path.join(candidate_sp, entry, "METADATA")
316
+ if not os.path.isfile(meta):
317
+ continue
318
+ with open(meta, encoding="utf-8") as f:
319
+ for line in f:
320
+ if line.startswith("Version:"):
321
+ return line.split(":", 1)[1].strip()
322
+ except OSError:
323
+ continue
324
+ return None
325
+
326
+
193
327
  def main() -> None:
194
328
  args = parse_arguments()
195
329
 
@@ -202,6 +336,9 @@ def main() -> None:
202
336
  init_harness_files_manager("user", "project")
203
337
  sys.exit(run_doctor(apply=bool(getattr(args, "fix", False))))
204
338
 
339
+ # PATH-shadow check (after early-exit args, before interactive setup).
340
+ _warn_on_path_shadow()
341
+
205
342
  if args.workdir:
206
343
  workdir = args.workdir.expanduser().resolve()
207
344
  if not workdir.is_dir():
@@ -182,16 +182,31 @@ class APIToolFormatHandler:
182
182
  return "api"
183
183
 
184
184
  def get_available_tools(self, tool_manager: ToolManager) -> list[AvailableTool]:
185
- return [
186
- AvailableTool(
187
- function=AvailableFunction(
188
- name=tool_class.get_name(),
189
- description=tool_class.description,
190
- parameters=tool_class.get_parameters(),
185
+ # 2026-06-08: per-tool isolation. Previously a single tool with a
186
+ # broken run() annotation (e.g. bare AsyncGenerator) raised
187
+ # TypeError from get_parameters() and crashed the entire LLM
188
+ # call — model got an empty tool list and the session save died.
189
+ # Now: skip the broken tool with a logged warning, continue with
190
+ # the rest. One bad tool ≠ a dead session.
191
+ out: list[AvailableTool] = []
192
+ for tool_class in tool_manager.available_tools.values():
193
+ try:
194
+ out.append(AvailableTool(
195
+ function=AvailableFunction(
196
+ name=tool_class.get_name(),
197
+ description=tool_class.description,
198
+ parameters=tool_class.get_parameters(),
199
+ )
200
+ ))
201
+ except Exception as e:
202
+ # Defensive log; the tool is now invisible to the model
203
+ # for this turn, but the session keeps going.
204
+ from drydock.core.logger import logger
205
+ logger.error(
206
+ "[get_available_tools] skipping tool %r: %s",
207
+ getattr(tool_class, "__name__", tool_class), e,
191
208
  )
192
- )
193
- for tool_class in tool_manager.available_tools.values()
194
- ]
209
+ return out
195
210
 
196
211
  def get_tool_choice(self) -> StrToolChoice | AvailableTool:
197
212
  return "auto"
@@ -34,6 +34,8 @@ WHEN TO USE retrieve (project's GraphRAG index):
34
34
 
35
35
  If the user asks to "set up GraphRAG" / "configure RAG" / "is the cookbook indexed?", run `bash` with `python3 -m drydock.graphrag setup` — it auto-detects bundled + local cookbooks and ingests them. No-op safe to re-run. To confirm afterward, run `python3 -m drydock.graphrag stats`.
36
36
 
37
+ If the user asks to ingest a folder with PDFs (or specific files), run `bash` with `python3 -m drydock.graphrag ingest <path>`. The ingester handles `.py`, `.md`/`.markdown`, `.rst`, `.txt`, and `.pdf` (via pypdf). Image-only/scanned PDFs are silently skipped.
38
+
37
39
  WHEN TO USE WEB TOOLS (sparingly):
38
40
  - Stuck on an error you've tried to fix 2+ times: `web_search` for the exact error message
39
41
  - Need an API example you don't remember: `web_search`
@@ -298,18 +298,31 @@ class SessionLogger:
298
298
  messages_data = [m.model_dump(exclude_none=True) for m in new_messages]
299
299
  await SessionLogger.persist_messages(messages_data, self.session_dir)
300
300
 
301
- # If message update succeeded, write metadata
302
- tools_available = [
303
- {
304
- "type": "function",
305
- "function": {
306
- "name": tool_class.get_name(),
307
- "description": tool_class.description,
308
- "parameters": tool_class.get_parameters(),
309
- },
310
- }
311
- for tool_class in tool_manager.available_tools.values()
312
- ]
301
+ # If message update succeeded, write metadata.
302
+ # 2026-06-08: per-tool isolation — same defensive pattern as
303
+ # format.get_available_tools. A single tool with a broken
304
+ # run() annotation used to crash session save (and through
305
+ # save_interaction's re-raise, the whole TUI session). Skip
306
+ # broken tools with a logged warning; the session metadata
307
+ # just lacks those entries.
308
+ tools_available = []
309
+ for tool_class in tool_manager.available_tools.values():
310
+ try:
311
+ tools_available.append({
312
+ "type": "function",
313
+ "function": {
314
+ "name": tool_class.get_name(),
315
+ "description": tool_class.description,
316
+ "parameters": tool_class.get_parameters(),
317
+ },
318
+ })
319
+ except Exception as tool_err:
320
+ from drydock.core.logger import logger
321
+ logger.error(
322
+ "[session_logger] skipping broken tool %r: %s",
323
+ getattr(tool_class, "__name__", tool_class),
324
+ tool_err,
325
+ )
313
326
 
314
327
  title = self._get_title(messages)
315
328
  system_prompt = (
@@ -0,0 +1,134 @@
1
+ # Global rename across modules — fields, functions, or public API
2
+
3
+ For pure identifier renames across multiple `.py` files, use `mechanical_rename(old_name, new_name, scope, kind)` — it applies the rename atomically, runs pytest, and rolls back if the suite goes red. One call replaces 5–8 manual edits. `kind` is `"function"`, `"class"`, `"field"` (also rewrites dict-key string literals), or `"auto"`.
4
+
5
+ For renames that touch non-Python files, README, `__all__`, or require judgment on what to skip, fall back to the manual `search_replace` (or `sed -i 's/\boldname\b/newname/g'` via bash) file-by-file process described below.
6
+
7
+ Three flavors:
8
+ - **Internal field rename**: rename `oldname → newname` across schema, transforms, aggregate, pipeline, and tests.
9
+ - **Public function rename**: rename `old_func → new_func` in source AND every test AND every import AND `__init__.__all__` AND README/CHANGELOG.
10
+ - **Class rename**: similar to public function — touches imports, type annotations, tests.
11
+
12
+ All are "rename everywhere" tasks. The harness check is usually "no occurrence of the old name remains anywhere in the package". One straggler = fail.
13
+
14
+ ## For PUBLIC function/class renames specifically
15
+
16
+ A public-API rename touches MORE places than an internal field:
17
+
18
+ 1. **Source definition** — `def newname(...)` (was `def oldname`).
19
+ 2. **All call sites** in the same module AND other modules: `grep -rn '\boldname\b' pkg/` to find them.
20
+ 3. **`__init__.py` re-exports** — `__init__.__all__` must list `"newname"` not `"oldname"`. Also any `from .x import oldname as oldname` must change to import the new name.
21
+ 4. **Every test file** — both the import line AND every assertion that referenced the old name.
22
+ 5. **README + CHANGELOG** — operator-facing docs. Search for the old name in `*.md`.
23
+ 6. **No backwards-compat alias by default** — the prompt says "full rename"; don't keep `oldname = newname` for compat unless explicitly asked.
24
+
25
+ After the rename, this command should print **NOTHING**:
26
+
27
+ ```bash
28
+ grep -rn '\boldname\b' pkg/ tests/ README.md CHANGELOG.md 2>/dev/null
29
+ ```
30
+
31
+ If anything shows up, that's the straggler that fails the case.
32
+
33
+ ## Disciplined process
34
+
35
+ 1. **Map the footprint** before editing. Count occurrences:
36
+
37
+ ```bash
38
+ grep -rn '\boldname\b' pkg/ tests/ # word-boundary anchored
39
+ ```
40
+
41
+ The `\b` matters: `oldname` should NOT match `oldname_test`, `newname_oldname` etc. If your tool can't do `\b`, use `'\\boldname\\b'` or pipe through `grep -wn`.
42
+
43
+ 2. **Decide what's in scope.** The prompt usually scopes to the *internal* identifier, not user-facing copy. So:
44
+
45
+ - YES rename: source code references, function args, schema keys, column names in code.
46
+ - YES rename: test fixtures + assertions that reference the old name.
47
+ - Maybe NOT: fixture data files (depends on prompt). Re-read it.
48
+ - Maybe NOT: README, docstrings (depends on prompt — these are user-facing).
49
+
50
+ When in doubt, rename everything that the harness can grep, because the check usually looks at every `.py` file under the package.
51
+
52
+ 3. **Rename, file by file**, top of the dependency tree first.
53
+
54
+ For each file: `search_replace` the old name → new name. If using `sed`:
55
+
56
+ ```bash
57
+ sed -i 's/\boldname\b/newname/g' pkg/module.py
58
+ ```
59
+
60
+ 4. **Verify nothing was missed**:
61
+
62
+ ```bash
63
+ grep -rn '\boldname\b' pkg/ tests/ 2>/dev/null
64
+ # should print NOTHING (except in fixture data files you intentionally left alone)
65
+ ```
66
+
67
+ 5. **If a data fixture also uses the old name** — decide based on the prompt:
68
+ - Prompt says "rename internal only" → keep the data file as-is, rename to the new name at the read boundary:
69
+
70
+ ```python
71
+ def read_input(path, ...):
72
+ rows = []
73
+ with open(path) as f:
74
+ reader = csv.DictReader(f)
75
+ for src in reader:
76
+ row = dict(src)
77
+ if "oldname" in row:
78
+ row["newname"] = row.pop("oldname") # rename at the boundary
79
+ rows.append(row)
80
+ return rows
81
+ ```
82
+
83
+ - Prompt says "rename everywhere including data" → also rewrite the data file.
84
+
85
+ 6. **Re-run the test suite**. The renamed tests should still pass; existing tests that don't reference the old name are unaffected.
86
+
87
+ ```bash
88
+ pytest -q
89
+ ```
90
+
91
+ ## Completeness check
92
+
93
+ ```bash
94
+ # (1) Source files are clean of the old name
95
+ grep -rn '\boldname\b' pkg/ && echo "BUG: still references"
96
+ # (2) New name appears everywhere old name did
97
+ grep -rn '\bnewname\b' pkg/ tests/ | wc -l
98
+ # (3) Tests pass
99
+ pytest -q
100
+ # (4) Re-test end-to-end
101
+ python3 -m pkg run # should work
102
+ ```
103
+
104
+ The harness check usually looks for:
105
+ - `grep '\boldname\b' pkg/module.py` is empty AFTER the rename (and same for related files).
106
+ - `grep '\bnewname\b'` finds the new name in those same files.
107
+ - `green(N)` — the test suite stays green.
108
+
109
+ If any of those is wrong, the rename is incomplete.
110
+
111
+ ## Common straggler locations
112
+
113
+ | Place | Why it's easy to miss |
114
+ | --- | --- |
115
+ | Default value in a function signature | `def f(x, default_oldname=0)` — the kwarg has the old name |
116
+ | Error/log strings | `raise ValueError(f"oldname must be int, got {oldname!r}")` |
117
+ | Dict keys in `__init__` | `self._fields = {"oldname": int, ...}` |
118
+ | Docstrings | If the doc says "the oldname column", grep won't filter docstrings out |
119
+ | Tests' SETUP data | `data = [{"oldname": 5}, {"oldname": 7}]` |
120
+
121
+ Run `grep -rn '\boldname\b'` AFTER the rename and inspect every remaining hit. Either rename it or document why it stays.
122
+
123
+ ## Don't grep in fixture data unless the prompt says so
124
+
125
+ If a CSV or JSON fixture file has the column header / field name `oldname`, whether to rewrite it is a JUDGMENT CALL based on the prompt:
126
+
127
+ - "rename internal field" → leave the fixture data alone
128
+ - "rename everywhere including data" → rewrite the fixture (NOT the column values — those are unrelated)
129
+
130
+ For the safer interpretation, leave the fixture alone and rename `oldname` → `newname` only at the read boundary as shown above. This means the fixture is untouched (no "data drift" failure) and the in-memory representation uses the new name.
131
+
132
+ ## Don't use `replace_all` blindly
133
+
134
+ `search_replace` with `replace_all` is fast but dangerous: it might rename `oldname_helper` to `newname_helper` accidentally. Always combine with word-boundary regex (`\boldname\b`) or do them file-by-file and read the diff.
@@ -0,0 +1,165 @@
1
+ # ELF binary memory extraction with Node.js
2
+
3
+ Used by: `extract-elf`. Task gives an `a.out` compiled C binary and
4
+ asks for an `extract.js` that, when invoked as
5
+ `node extract.js /app/a.out > out.json`, outputs a JSON object
6
+ mapping virtual-memory addresses (as numeric strings) to the
7
+ integer values at those addresses.
8
+
9
+ Pass requires ≥75% of the reference solution's address coverage,
10
+ and every emitted address must match the reference value (no
11
+ false positives).
12
+
13
+ ## What "memory values" means here
14
+
15
+ The reference solution reads the bytes of each LOAD segment from
16
+ the ELF file at its declared virtual address. For each 4-byte
17
+ aligned word in the loadable segments, it emits
18
+ `{ "<virt_addr>": <int32_le_value> }`.
19
+
20
+ So the work is:
21
+ 1. Parse the ELF header (64-byte fixed layout for ELF64).
22
+ 2. Find the Program Header Table (PHT) — `e_phoff`, `e_phentsize`,
23
+ `e_phnum` fields in the ELF header.
24
+ 3. For each program header with `p_type == PT_LOAD (1)`:
25
+ - read `p_offset` (file offset), `p_vaddr` (virtual address),
26
+ `p_filesz` (bytes to read), `p_flags`
27
+ 4. Read `p_filesz` bytes from the file starting at `p_offset`.
28
+ 5. For each 4-byte word, emit `vaddr+i → uint32_le_value`.
29
+
30
+ ## ELF64 header layout (the bytes we care about)
31
+
32
+ ```
33
+ offset size field meaning
34
+ 0 16 e_ident magic + class + endian
35
+ 0 4 ELF magic 0x7F 'E' 'L' 'F'
36
+ 4 1 EI_CLASS 1=ELF32, 2=ELF64
37
+ 5 1 EI_DATA 1=little-endian, 2=big-endian
38
+ ...
39
+ 24 8 e_entry entry-point vaddr
40
+ 32 8 e_phoff file offset of program-header table
41
+ 40 8 e_shoff file offset of section-header table
42
+ 48 4 e_flags
43
+ 52 2 e_ehsize header size (64 for ELF64)
44
+ 54 2 e_phentsize each PHT entry size (56 for ELF64)
45
+ 56 2 e_phnum number of PHT entries
46
+ 58 2 e_shentsize
47
+ 60 2 e_shnum
48
+ 62 2 e_shstrndx
49
+ ```
50
+
51
+ ## ELF64 program header entry (56 bytes)
52
+
53
+ ```
54
+ offset size field
55
+ 0 4 p_type 1 = LOAD (the only one we care about)
56
+ 4 4 p_flags
57
+ 8 8 p_offset file offset
58
+ 16 8 p_vaddr virtual address
59
+ 24 8 p_paddr physical address (usually = p_vaddr)
60
+ 32 8 p_filesz bytes to read from file
61
+ 40 8 p_memsz bytes in memory (may > filesz for BSS)
62
+ 48 8 p_align
63
+ ```
64
+
65
+ ## Reference-shaped Node.js implementation
66
+
67
+ ```javascript
68
+ #!/usr/bin/env node
69
+ const fs = require('fs');
70
+
71
+ const path = process.argv[2];
72
+ if (!path) { console.error('usage: node extract.js <elf>'); process.exit(1); }
73
+ const buf = fs.readFileSync(path);
74
+
75
+ // Sanity check ELF magic + 64-bit + little-endian
76
+ if (buf.readUInt32BE(0) !== 0x7F454C46) {
77
+ console.error('not an ELF binary'); process.exit(1);
78
+ }
79
+ const ei_class = buf.readUInt8(4); // 2 = ELF64
80
+ const ei_data = buf.readUInt8(5); // 1 = little-endian
81
+ if (ei_class !== 2 || ei_data !== 1) {
82
+ console.error('only ELF64 little-endian supported'); process.exit(1);
83
+ }
84
+
85
+ // Header fields (ELF64 layout)
86
+ const e_phoff = Number(buf.readBigUInt64LE(32));
87
+ const e_phentsize = buf.readUInt16LE(54);
88
+ const e_phnum = buf.readUInt16LE(56);
89
+
90
+ const out = {};
91
+
92
+ for (let i = 0; i < e_phnum; i++) {
93
+ const ph = e_phoff + i * e_phentsize;
94
+ const p_type = buf.readUInt32LE(ph + 0);
95
+ if (p_type !== 1) continue; // skip non-LOAD
96
+ const p_offset = Number(buf.readBigUInt64LE(ph + 8));
97
+ const p_vaddr = Number(buf.readBigUInt64LE(ph + 16));
98
+ const p_filesz = Number(buf.readBigUInt64LE(ph + 32));
99
+
100
+ // Emit 4-byte words. The reference emits little-endian int32 values
101
+ // (the JSON expects unsigned 32-bit ints — `>>> 0` forces unsigned).
102
+ for (let off = 0; off + 4 <= p_filesz; off += 4) {
103
+ const vaddr = p_vaddr + off;
104
+ const value = buf.readUInt32LE(p_offset + off);
105
+ out[String(vaddr)] = value;
106
+ }
107
+ }
108
+
109
+ process.stdout.write(JSON.stringify(out));
110
+ ```
111
+
112
+ ## Pitfalls that cost passes
113
+
114
+ 1. **Big-endian vs little-endian**: `extract-elf` ships an x86_64
115
+ binary → little-endian. Use `readUInt32LE`, not BE. Emitting
116
+ the wrong endianness fails every assertion silently.
117
+ 2. **Signed vs unsigned int32**: JSON allows arbitrary integers but
118
+ the task's reference treats values as **unsigned**. Use
119
+ `readUInt32LE`, or apply `>>> 0` to a signed read.
120
+ 3. **Address as STRING key, value as NUMBER**: The reference output
121
+ has string keys (`"4194304"`) but numeric values. Mixing them
122
+ (e.g., `out[String(vaddr)] = String(value)`) fails the value-
123
+ type check.
124
+ 4. **Don't emit p_memsz beyond p_filesz** — those are BSS (zero-
125
+ initialized at load time, not present in file). The reference
126
+ doesn't emit them.
127
+ 5. **Step size 4, not 1**: emitting per-byte values would (a) blow
128
+ up the JSON size, (b) wouldn't match the reference. 4 byte
129
+ alignment is the contract.
130
+ 6. **Don't include section-header LOAD-like data** — only PT_LOAD
131
+ program headers, not sections.
132
+ 7. **Address arithmetic in JS**: `p_vaddr + off` can exceed
133
+ Number.MAX_SAFE_INTEGER for some binaries (uncommon). If tests
134
+ reject huge addresses, switch to BigInt and stringify.
135
+
136
+ ## How the verifier checks correctness
137
+
138
+ - Loads the reference solution's `out.json`.
139
+ - For each address in YOUR output:
140
+ - If address is in the reference: value must match.
141
+ - If address is NOT in the reference: silently ignored
142
+ (extra addresses don't hurt; can help coverage).
143
+ - Counts addresses present in BOTH yours and reference; pass
144
+ requires ≥ 75% of reference addresses covered.
145
+
146
+ So the conservative strategy is: emit the entire `.text`, `.rodata`,
147
+ and any other R/RX LOAD segments as 4-byte words. If unsure of an
148
+ address, emit it — extra entries don't penalize you, missing
149
+ entries do.
150
+
151
+ ## Common task shape variants
152
+
153
+ The task occasionally ships a stripped binary (no section headers)
154
+ — that's fine, this approach uses program headers, not sections,
155
+ so it works regardless of stripping.
156
+
157
+ For ELF32 binaries (`ei_class == 1`), the layout shifts to
158
+ 32-bit fields:
159
+ - e_phoff at offset 28 (4 bytes), e_phentsize at offset 42
160
+ - PHT entry: p_type(4), p_offset(4), p_vaddr(4), p_paddr(4),
161
+ p_filesz(4), p_memsz(4), p_flags(4), p_align(4) — 32 bytes
162
+ total
163
+
164
+ `extract-elf` ships ELF64 by default but a defensive impl handles
165
+ both.