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.
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/PKG-INFO +1 -1
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/entrypoint.py +137 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/format.py +24 -9
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/gemma4_slim.md +2 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/session/session_logger.py +25 -12
- drydock_cli-2.10.7/drydock/data/cookbook/python/global_rename.md +134 -0
- drydock_cli-2.10.7/drydock/data/cookbook/tbench_domains/elf_extraction_js.md +165 -0
- drydock_cli-2.10.7/drydock/data/cookbook/tbench_domains/mobilesam_cell_seg.md +162 -0
- drydock_cli-2.10.7/drydock/data/cookbook/tbench_domains/mteb_retrieve.md +124 -0
- drydock_cli-2.10.7/drydock/data/cookbook/tbench_domains/regex_chess.md +211 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/graphrag/__main__.py +1 -1
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/graphrag/storage.py +1 -1
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/graphrag/text_indexer.py +54 -4
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/pyproject.toml +1 -1
- drydock_cli-2.10.7/tests/test_broken_tool_isolation.py +74 -0
- drydock_cli-2.10.7/tests/test_graphrag_pdf_ingest.py +104 -0
- drydock_cli-2.10.7/tests/test_mechanical_rename_type_extraction.py +91 -0
- drydock_cli-2.10.5/tests/test_mechanical_rename_type_extraction.py +0 -60
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/.gitignore +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/LICENSE +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/NOTICE +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/README.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/docs/README.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/__main__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/detectors.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/detectors_proposed.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/history.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/interventions.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/llm_analyzer.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/metrics.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/opus_escalator.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/persistence.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/policy.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/proposer.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/stager.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/task_classifier.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/tuning.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/validator.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/admiral/worker.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/fix_windows_path.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/agent_loop.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/auto_solve.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/checkpoint.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/classifier/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/classifier/__main__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/classifier/classifier.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/classifier/dispatcher.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/classifier/rules.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/classifier/signal.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/config/_dotenv.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/config/doctor.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/config/local_detect.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/config/migrate.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/constraint_extract.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/constraint_hint.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/context_recovery.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/goal.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/grammar/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/grammar/_llamacpp_converter.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/grammar/policy.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/grammar/policy_union.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/logger.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/paths/_drydock_home.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/gemma4.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/gemma4_math.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/slug.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/spec_check.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/steering_hook.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/algebra_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/chemistry_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/count_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/linear_algebra_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/logic_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/math_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/mechanical_rename.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/memory_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/number_theory_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prolog_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/retrieve.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/set_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/solve_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/stats_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/units_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/verify_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/types.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/core/utils.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/curiosity/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/curiosity/__main__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/curiosity/gap_detector.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/curiosity/ingest.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/curiosity/item.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/curiosity/queue.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/curiosity/surprise.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/data/cookbook/tbench_domains/biopython_dna.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/data/cookbook/tbench_domains/dense_eigenvalue.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/data/cookbook/tbench_domains/feal_cryptanalysis.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/data/cookbook/tbench_domains/llm_batching_scheduler.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/data/cookbook/tbench_domains/mips_isa.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/data/cookbook/tbench_domains/path_tracing.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/data/cookbook/tbench_domains/vim_macros.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/data/cookbook/tbench_domains/xss_filter.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/graphrag/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/graphrag/code_indexer.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/graphrag/retriever.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/onboarding/screens/choice.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/onboarding/screens/local_model.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/audit-tests/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/checklist/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/constraint-reasoning/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/logic/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/logic/assets/cheat_sheet_full.txt +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/prove/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/strong-tests/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/__main__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/applier.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/config.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/registry.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/sandbox.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/sidecar/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/sidecar/header_parser.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/sidecar/hooks.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/sidecar/loader.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/sidecar/server.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/train/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/train/capture.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/train/compute_vector.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/train/extract_pairs.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/train/scan_sessions.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/steering/vectors.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/drydock/whats_new.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/install_tests/README.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/install_tests/publish/README.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/install_tests/windows/README.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/scripts/README.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/scripts/_archived_eval_harness/README.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/scripts/llm/README.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/autocompletion/conftest.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/backend/test_generic_adapter_sanitize.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/conftest.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/e2e/common.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/mock/utils.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/skills/test_parser.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/stress/__init__.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/stress/test_io_thrash.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_admiral.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_admiral_intervention_outcome.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_admiral_phase3.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_admiral_proposed.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_admiral_session_id.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_admiral_struggle_dedup.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_agents.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_algebra_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_api_error_recovery.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_approval_modal_stray_keys.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_auto_retrieve_cookbook_bypass.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_auto_retrieve_soft_nudge.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_auto_solve.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_checkpoint.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_chemistry_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_classifier.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_config_migration.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_constraint_extract.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_constraint_hint.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_context_recovery.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_count_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_curiosity.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_dispatch_report.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_dispatcher.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_fake_tool_call_paren_syntax.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_gemma4_anti_loop_migration.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_gemma4_tool_filter.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_goal.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_grammar.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_graphrag.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_graphrag_worked_examples.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_hallucinated_tool_suppression.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_hle_aggregate.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_integration.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_issue_fixes.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_linear_algebra_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_local_detect.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_local_detect_fallback.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_logic_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_loop_regressions_2026_06_06.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_math_docs_lazy_injection.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_math_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_mcp_settings.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_mcp_stdio_command_normalization.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_mechanical_rename_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_memory_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_message_id.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_middleware.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_number_theory_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_prolog_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_read_file_not_found_listing.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_read_file_notebook_slim.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_rejudge_hle.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_retrieval_consumer.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_retrieve_project_detection.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_retrieve_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_safe_parse_tool_args.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_search_replace_args_not_truncated.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_search_replace_syntax_rollback.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_session_log_event.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_session_publish_on_resume.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_set_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_smoke.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_solve_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_specialist_math_tools_hidden.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_stats_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_steering.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_steering_capture.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_steering_compute_vector.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_steering_extract_pairs.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_steering_hook.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_steering_sidecar_chat_inputs.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_steering_sidecar_hooks.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_task_complete_nudge.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_tool_call_loops_regression_suite.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_tool_stop_injected_scope.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_truncate_args_valid_json.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_truncated_arg_path_hint.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_truncated_search_replace_escalation.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_truncated_write_escalation.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_units_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_validation_error_scrub.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_verify_tool.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_wall_of_text_rescue.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_workloads.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/test_write_file_missing_path.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash_binary_grep_hint.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash_consec_empty_search.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash_error_loop_breaker.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_manager_gemma_derived_models.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_pre_rename_hook.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_read_file_dedup_reembed.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_read_file_directory.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_read_file_limit_truncation.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_append_fallback.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_dir_path.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_empty_content.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_file_not_found.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_hard_stop.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_malformed_block.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_placeholder.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_write_file_missing_main_module.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_write_file_missing_path_hint.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/tools/test_write_file_multifile_rename.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/uv.lock +0 -0
- {drydock_cli-2.10.5 → drydock_cli-2.10.7}/web/README.md +0 -0
- {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.
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
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.
|