drydock-cli 2.8.21__tar.gz → 2.8.23__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.8.23/.auto_release.lock +1 -0
- drydock_cli-2.8.23/.github/ISSUE_TEMPLATE/bug-report.yml +118 -0
- drydock_cli-2.8.23/.github/ISSUE_TEMPLATE/config.yml +8 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/PKG-INFO +87 -3
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/README.md +86 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/gemma4.md +12 -0
- drydock_cli-2.8.23/drydock/core/tools/builtins/count_tool.py +218 -0
- drydock_cli-2.8.23/drydock/core/tools/builtins/math_tool.py +248 -0
- drydock_cli-2.8.23/drydock/core/tools/builtins/memory_tool.py +356 -0
- drydock_cli-2.8.23/drydock/core/tools/builtins/verify_tool.py +320 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/pyproject.toml +5 -3
- drydock_cli-2.8.23/scripts/bench_inference.py +79 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/deploy_to_github.sh +1 -1
- drydock_cli-2.8.23/tests/test_count_tool.py +187 -0
- drydock_cli-2.8.23/tests/test_math_tool.py +231 -0
- drydock_cli-2.8.23/tests/test_memory_tool.py +235 -0
- drydock_cli-2.8.23/tests/test_verify_tool.py +206 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/trip_log.md +81 -0
- drydock_cli-2.8.21/.auto_release.lock +0 -1
- drydock_cli-2.8.21/.github/ISSUE_TEMPLATE/bug-report.yml +0 -58
- drydock_cli-2.8.21/.github/ISSUE_TEMPLATE/config.yml +0 -11
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.gitignore +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.python-version +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.typos.toml +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.vscode/extensions.json +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.vscode/launch.json +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/.vscode/settings.json +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/AGENTS.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/Admiral.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/CHANGELOG.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/CLAUDE.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/DEEP_NOIR_PRD.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/DEPLOYMENT.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/HLE_PRD.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/JETSON_BENCH.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/LICENSE +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/MODEL_SHORTCOMINGS.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/NOTICE +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/SOVEREIGN_PRD.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/TRIAGE_v1.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/action.yml +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/README.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results1.tsv +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results13.tsv +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results14.tsv +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results15.tsv +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results16.tsv +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results17.tsv +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results18.tsv +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results19.tsv +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results2.tsv +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results20.tsv +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results3.tsv +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results4.tsv +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results5.tsv +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results6.tsv +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results7.tsv +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results8.tsv +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results9.tsv +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/baseline_history/results_evolved_v1.tsv +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/README.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/acp-setup.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/archive/BASELINE_412.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/archive/Drydock_rebrand.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/archive/OVERNIGHT_PROGRESS.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/archive/OVERNIGHT_REPORT_2026_04_13.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/archive/PERF_SWEEP_PLAN.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/archive/PRD.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/archive/drydock_terms.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/archive/resume.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/__main__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/detectors.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/detectors_proposed.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/history.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/interventions.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/llm_analyzer.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/metrics.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/opus_escalator.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/persistence.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/policy.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/proposer.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/stager.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/task_classifier.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/tuning.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/validator.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/admiral/worker.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/fix_windows_path.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/agent_loop.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/checkpoint.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/classifier/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/classifier/__main__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/classifier/classifier.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/classifier/dispatcher.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/classifier/rules.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/classifier/signal.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/config/_dotenv.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/config/doctor.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/config/local_detect.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/config/migrate.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/context_recovery.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/logger.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/paths/_drydock_home.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/slug.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/steering_hook.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/retrieve.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/retrieve.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/types.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/core/utils.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/curiosity/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/curiosity/__main__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/curiosity/gap_detector.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/curiosity/item.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/curiosity/queue.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/curiosity/surprise.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/graphrag/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/graphrag/__main__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/graphrag/code_indexer.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/graphrag/retriever.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/graphrag/storage.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/graphrag/text_indexer.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/onboarding/screens/choice.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/onboarding/screens/local_model.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/audit-tests/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/strong-tests/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/__main__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/applier.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/config.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/registry.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/sandbox.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/sidecar/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/sidecar/header_parser.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/sidecar/hooks.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/sidecar/loader.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/sidecar/server.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/train/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/train/capture.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/train/compute_vector.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/train/extract_pairs.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/steering/vectors.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock/whats_new.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/drydock-acp.spec +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/flake.lock +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/flake.nix +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/outlook_draft_assistant.tar.gz +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/README.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/config_base.toml +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/config_best.toml +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/domain_spec.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/experimenter.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/kernel.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/mini_prd.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/mini_prompts.txt +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/proposer.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/research/results.tsv +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/README.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/admiral_probe.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/archive/auto_test_loop.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/archive/monitor_test_battery.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/archive/overnight_agents_test.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/archive/test_bank.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/archive/test_full.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/archive/test_smoke.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/archive/tui_test.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/audit_sampler.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/auto_generate_tests.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/auto_release.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/autonomous_review.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/autonomous_review_prompt.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/backfill_hle_curiosity.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/backup.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/bump_version.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/classify_pulse.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/consume_retrieval_queue.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/curiosity_idle_cycle.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/fetch_arxiv_abstracts.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/gen_2000_prompts.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/hle_eval.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/hle_eval_seed.jsonl +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/llm_balancer.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/notify_release.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/perf_baseline_when_idle.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/perf_sweep.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/poll_issues.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/queue_top.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/ralph_loop.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/research_babysitter.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/shakedown.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/shakedown_interactive.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/shakedown_suite.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/shakedown_variance.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/start_steering_sidecar.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/stress_babysitter.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/stress_prompts_50.txt +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/stress_prompts_realuser.txt +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/stress_prompts_tool_agent.txt +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/stress_shakedown.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/stress_telegram_status.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/stress_watcher.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/scripts/vllm_failover.sh +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/backend/test_generic_adapter_sanitize.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/conftest.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/e2e/common.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/mock/utils.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/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.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_admiral.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_admiral_hallucinated_tool_filter.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_admiral_intervention_outcome.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_admiral_phase3.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_admiral_proposed.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_admiral_session_id.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_admiral_struggle_dedup.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_agents.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_checkpoint.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_classifier.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_config_migration.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_context_recovery.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_curiosity.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_dispatcher.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_fake_tool_call_paren_syntax.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_graphrag.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_graphrag_worked_examples.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_hallucinated_tool_suppression.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_hle_typing.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_integration.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_issue_fixes.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_local_detect.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_mcp_settings.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_message_id.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_middleware.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_read_file_not_found_listing.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_retrieval_consumer.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_retrieve_tool.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_search_replace_args_not_truncated.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_smoke.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_steering.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_steering_capture.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_steering_compute_vector.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_steering_extract_pairs.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_steering_hook.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_steering_sidecar_hooks.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_task_complete_nudge.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_truncate_args_valid_json.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_truncated_arg_path_hint.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_truncated_search_replace_escalation.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_truncated_write_escalation.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_wall_of_text_rescue.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_workloads.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/test_write_file_missing_path.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash_binary_grep_hint.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash_consec_empty_search.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash_echo_escape_loop_breaker.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash_empty_search_loop_breaker.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash_error_loop_breaker.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash_exact_cmd_loop_breaker.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash_heredoc_confirmation.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash_kill_exit1_annotation.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_bash_python_c_syntaxerr_loop_breaker.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_hallucinated_retrieval_redirect.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_manager_gemma_derived_models.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_read_file_dedup_reembed.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_read_file_directory.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_read_file_limit_truncation.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_append_fallback.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_dir_path.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_empty_content.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_file_not_found.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_first_failure_hint.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_hard_stop.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_malformed_block.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_placeholder.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/tools/test_write_file_missing_path_hint.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/uv.lock +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/worked_examples/README.md +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/worked_examples/cli_subcommand_dispatch.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/worked_examples/lookup.json +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/worked_examples/sql_parser.py +0 -0
- {drydock_cli-2.8.21 → drydock_cli-2.8.23}/worked_examples/tree_walking_interpreter.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1014651
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
name: Bug Report
|
|
2
|
+
description: Tell us about a defect in DryDock
|
|
3
|
+
title: "bug: "
|
|
4
|
+
labels: ["bug"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: >
|
|
9
|
+
Thanks for filing a detailed bug. Fill out every section so the
|
|
10
|
+
autonomous improvement loop can reproduce, classify, and ship a fix
|
|
11
|
+
on the next 6-hour release tick.
|
|
12
|
+
|
|
13
|
+
- type: checkboxes
|
|
14
|
+
id: prechecks
|
|
15
|
+
attributes:
|
|
16
|
+
label: Pre-flight
|
|
17
|
+
description: Quick sanity checks before filing.
|
|
18
|
+
options:
|
|
19
|
+
- label: I'm on the latest released version (`pip install -U drydock-cli`)
|
|
20
|
+
required: true
|
|
21
|
+
- label: I searched existing open + closed issues for this symptom
|
|
22
|
+
required: true
|
|
23
|
+
|
|
24
|
+
- type: dropdown
|
|
25
|
+
id: component
|
|
26
|
+
attributes:
|
|
27
|
+
label: Component
|
|
28
|
+
description: Which part of DryDock is affected?
|
|
29
|
+
options:
|
|
30
|
+
- CLI / TUI
|
|
31
|
+
- ACP (Agent Client Protocol)
|
|
32
|
+
- MCP (Model Context Protocol integration)
|
|
33
|
+
- GraphRAG / retrieve tool
|
|
34
|
+
- Curiosity Layer
|
|
35
|
+
- Auto-release / cron / autonomous loop
|
|
36
|
+
- Install / packaging
|
|
37
|
+
- Other
|
|
38
|
+
validations:
|
|
39
|
+
required: true
|
|
40
|
+
|
|
41
|
+
- type: input
|
|
42
|
+
id: version
|
|
43
|
+
attributes:
|
|
44
|
+
label: DryDock version
|
|
45
|
+
description: Output of `drydock --version`.
|
|
46
|
+
placeholder: "drydock 2.8.21"
|
|
47
|
+
validations:
|
|
48
|
+
required: true
|
|
49
|
+
|
|
50
|
+
- type: input
|
|
51
|
+
id: model
|
|
52
|
+
attributes:
|
|
53
|
+
label: Model + provider
|
|
54
|
+
description: >
|
|
55
|
+
DryDock's behavior is highly model-dependent. Tell us the active
|
|
56
|
+
model name and the runtime serving it (vLLM, llama.cpp, Ollama,
|
|
57
|
+
LM Studio, OpenAI-compatible endpoint, etc.).
|
|
58
|
+
placeholder: "gemma4 (vLLM Docker on localhost:8000)"
|
|
59
|
+
validations:
|
|
60
|
+
required: true
|
|
61
|
+
|
|
62
|
+
- type: input
|
|
63
|
+
id: env
|
|
64
|
+
attributes:
|
|
65
|
+
label: OS + Python + install method
|
|
66
|
+
description: Operating system, Python version, and how DryDock was installed.
|
|
67
|
+
placeholder: "Ubuntu 22.04, Python 3.12, pip install drydock-cli"
|
|
68
|
+
validations:
|
|
69
|
+
required: true
|
|
70
|
+
|
|
71
|
+
- type: textarea
|
|
72
|
+
id: summary
|
|
73
|
+
attributes:
|
|
74
|
+
label: Summary
|
|
75
|
+
description: One or two sentences. What went wrong, in user terms.
|
|
76
|
+
validations:
|
|
77
|
+
required: true
|
|
78
|
+
|
|
79
|
+
- type: textarea
|
|
80
|
+
id: repro
|
|
81
|
+
attributes:
|
|
82
|
+
label: Reproduction steps
|
|
83
|
+
description: >
|
|
84
|
+
Exact commands, prompts, or actions that trigger the bug. Include
|
|
85
|
+
the slash command / tool / agent if relevant. Redact secrets.
|
|
86
|
+
placeholder: |
|
|
87
|
+
1. Run `drydock`
|
|
88
|
+
2. Type `/mcp add stdio foo npx -y @modelcontextprotocol/server-foo`
|
|
89
|
+
3. Type `list_mcp_resources` ...
|
|
90
|
+
4. See error
|
|
91
|
+
validations:
|
|
92
|
+
required: true
|
|
93
|
+
|
|
94
|
+
- type: textarea
|
|
95
|
+
id: expected
|
|
96
|
+
attributes:
|
|
97
|
+
label: Expected vs actual
|
|
98
|
+
description: What you expected to happen vs what actually happened.
|
|
99
|
+
validations:
|
|
100
|
+
required: true
|
|
101
|
+
|
|
102
|
+
- type: textarea
|
|
103
|
+
id: logs
|
|
104
|
+
attributes:
|
|
105
|
+
label: Logs / traceback / screenshots
|
|
106
|
+
description: >
|
|
107
|
+
Paste the relevant traceback, error message, JSON snippet, or
|
|
108
|
+
console output. For TUI rendering bugs, screenshots help most.
|
|
109
|
+
Session logs live at `~/.drydock/logs/` and `~/.vibe/logs/session/`.
|
|
110
|
+
render: shell
|
|
111
|
+
|
|
112
|
+
- type: textarea
|
|
113
|
+
id: context
|
|
114
|
+
attributes:
|
|
115
|
+
label: Anything else?
|
|
116
|
+
description: >
|
|
117
|
+
Workarounds you tried, related issues, anything you noticed about
|
|
118
|
+
when it does/doesn't reproduce. Optional.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
blank_issues_enabled: false
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: Feature request or idea
|
|
4
|
+
url: https://github.com/fbobe321/drydock/issues/new?labels=enhancement&template=
|
|
5
|
+
about: Open an enhancement issue describing the feature you'd like to see
|
|
6
|
+
- name: Read the docs
|
|
7
|
+
url: https://github.com/fbobe321/drydock#readme
|
|
8
|
+
about: README + per-feature setup guides (MCP, Curiosity Layer, GraphRAG, etc.)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 2.8.
|
|
3
|
+
Version: 2.8.23
|
|
4
4
|
Summary: Local-first CLI coding agent — tested with Gemma 4 26B via vLLM
|
|
5
5
|
Project-URL: Homepage, https://github.com/fbobe321/drydock
|
|
6
6
|
Project-URL: Repository, https://github.com/fbobe321/drydock
|
|
@@ -36,13 +36,11 @@ Requires-Dist: markdownify>=1.2.2
|
|
|
36
36
|
Requires-Dist: mcp>=1.14.0
|
|
37
37
|
Requires-Dist: mistralai==1.12.4
|
|
38
38
|
Requires-Dist: packaging>=24.1
|
|
39
|
-
Requires-Dist: pexpect>=4.9.0
|
|
40
39
|
Requires-Dist: pydantic-settings>=2.12.0
|
|
41
40
|
Requires-Dist: pydantic>=2.12.4
|
|
42
41
|
Requires-Dist: pypdf>=4.0.0
|
|
43
42
|
Requires-Dist: pyperclip>=1.11.0
|
|
44
43
|
Requires-Dist: pyyaml>=6.0.0
|
|
45
|
-
Requires-Dist: requests>=2.20.0
|
|
46
44
|
Requires-Dist: rich>=14.0.0
|
|
47
45
|
Requires-Dist: textual-speedups>=0.2.1
|
|
48
46
|
Requires-Dist: textual>=7.4.0
|
|
@@ -378,6 +376,92 @@ DryDock discovers skills from:
|
|
|
378
376
|
3. Global `~/.drydock/skills/`
|
|
379
377
|
4. Bundled skills (shipped with the package)
|
|
380
378
|
|
|
379
|
+
### Built-in tools beyond the basics
|
|
380
|
+
|
|
381
|
+
In addition to the standard `read_file` / `write_file` / `search_replace` / `bash` / `grep` / `glob` / `task` / `retrieve` set, DryDock ships four direct built-ins designed to plug well-known transformer weaknesses:
|
|
382
|
+
|
|
383
|
+
- **`math`** — exact arithmetic via stdlib (math, statistics, Fraction, Decimal). Sandboxed Python expression. Fixes factorials, large multiplies, primes, statistics, exact fractions.
|
|
384
|
+
- **`count`** — exact substring/regex/lines/words/chars/bytes count over a string OR a file. Fixes "how many X are in this text" estimation errors.
|
|
385
|
+
- **`memory`** — persistent cross-session key/value notes at `~/.drydock/agent_memory/notes.jsonl`. Save, recall (TF-IDF ranked), list keys, forget. Bridges the long-term memory gap.
|
|
386
|
+
- **`verify`** — runs a shell command (or checks a file) and matches the output against an expectation (contains/not_contains/regex/equals/exit_code/file_exists/file_contains). Operationalizes the "Loop until verified" core principle.
|
|
387
|
+
|
|
388
|
+
All four are direct built-ins, NOT MCP servers — per Babich's "MCP is Dead" (Apr 2026), MCP servers burn ~20K tokens of context per call which is a real cost on a 131K-context local model. Direct built-ins use a strict Pydantic schema, single subprocess-free path, and tighter security.
|
|
389
|
+
|
|
390
|
+
### Math Tool
|
|
391
|
+
|
|
392
|
+
DryDock ships with a `math` tool the model calls instead of doing arithmetic in its head. It's a direct built-in (NOT an MCP server — see [MCP is Dead](https://medium.com/) for why direct tools beat MCP for small bandwidth-limited models like Gemma 4). One argument, sandboxed Python expression, exact results.
|
|
393
|
+
|
|
394
|
+
```
|
|
395
|
+
math(expression="math.factorial(20)") # 2432902008176640000 — exact
|
|
396
|
+
math(expression="math.comb(50, 5)") # 2118760
|
|
397
|
+
math(expression="math.gcd(48, 18)") # 6
|
|
398
|
+
math(expression="statistics.stdev([2,4,4,4,5,5,7,9])")
|
|
399
|
+
math(expression="Fraction(1,3) + Fraction(1,6)") # exact 1/2
|
|
400
|
+
math(expression="Decimal('0.1') + Decimal('0.2')") # exact 0.3
|
|
401
|
+
math(expression="round(math.pi, 12)")
|
|
402
|
+
math(expression="sum(range(1, 101))") # 5050
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
Available names: arithmetic operators (`+ - * / // % **`), comparisons, `and / or / not`, `abs / round / min / max / sum / len / pow / divmod / range / int / float / bool`, the `math` and `statistics` modules, `Fraction`, `Decimal`. Constants: `pi`, `e`, `tau`, `inf`, `nan`. **No imports, no `open()`, no file/network access**, no attribute access outside the whitelist.
|
|
406
|
+
|
|
407
|
+
Always auto-approved (read-only, side-effect free). Errors return a structured `{ok: false, error: "..."}` instead of raising.
|
|
408
|
+
|
|
409
|
+
### Custom Tools
|
|
410
|
+
|
|
411
|
+
Add your own built-in tools by dropping a file into one of these locations:
|
|
412
|
+
|
|
413
|
+
- **Project-local:** any path listed in `config.toml`'s `tool_paths` array
|
|
414
|
+
- **Global:** `~/.drydock/tools/`
|
|
415
|
+
- **Bundled:** `drydock/core/tools/builtins/` (forks only)
|
|
416
|
+
|
|
417
|
+
Each file should subclass `BaseTool[ArgsModel, ResultModel, ConfigModel, StateModel]` with a Pydantic args model + result model + an async `run()` generator. Auto-discovery picks up every non-underscore-prefixed `.py` in those directories. The class name auto-converts to a snake_case tool name (`MyTool` → `my_tool`).
|
|
418
|
+
|
|
419
|
+
Minimum viable tool:
|
|
420
|
+
|
|
421
|
+
```python
|
|
422
|
+
# ~/.drydock/tools/word_count.py
|
|
423
|
+
from collections.abc import AsyncGenerator
|
|
424
|
+
from typing import ClassVar, final
|
|
425
|
+
from pydantic import BaseModel, Field
|
|
426
|
+
from drydock.core.tools.base import (
|
|
427
|
+
BaseTool, BaseToolConfig, BaseToolState, InvokeContext, ToolPermission,
|
|
428
|
+
)
|
|
429
|
+
from drydock.core.tools.ui import ToolCallDisplay, ToolResultDisplay, ToolUIData
|
|
430
|
+
from drydock.core.types import ToolStreamEvent
|
|
431
|
+
|
|
432
|
+
class WordCountArgs(BaseModel):
|
|
433
|
+
text: str = Field(description="Text to count words in")
|
|
434
|
+
|
|
435
|
+
class WordCountResult(BaseModel):
|
|
436
|
+
count: int
|
|
437
|
+
|
|
438
|
+
class WordCountConfig(BaseToolConfig):
|
|
439
|
+
permission: ToolPermission = ToolPermission.ALWAYS
|
|
440
|
+
|
|
441
|
+
class WordCount(
|
|
442
|
+
BaseTool[WordCountArgs, WordCountResult, WordCountConfig, BaseToolState],
|
|
443
|
+
ToolUIData[WordCountArgs, WordCountResult],
|
|
444
|
+
):
|
|
445
|
+
description: ClassVar[str] = "Count words in a string."
|
|
446
|
+
|
|
447
|
+
@classmethod
|
|
448
|
+
def format_call_display(cls, args): return ToolCallDisplay(summary=f"count: {args.text[:30]}")
|
|
449
|
+
@classmethod
|
|
450
|
+
def get_result_display(cls, event): return ToolResultDisplay(success=True, message=f"{event.result.count} words")
|
|
451
|
+
@classmethod
|
|
452
|
+
def get_status_text(cls): return "Counting"
|
|
453
|
+
def resolve_permission(self, args): return ToolPermission.ALWAYS
|
|
454
|
+
|
|
455
|
+
@final
|
|
456
|
+
async def run(self, args: WordCountArgs, ctx: InvokeContext | None = None
|
|
457
|
+
) -> AsyncGenerator[ToolStreamEvent | WordCountResult, None]:
|
|
458
|
+
yield WordCountResult(count=len(args.text.split()))
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
Restart drydock; the model now sees `word_count` in its tool list.
|
|
462
|
+
|
|
463
|
+
For tools that should run as separate processes or that you want to share with other AI clients (Claude Code, Cursor, etc.), use the [MCP integration](#mcp-servers) instead — but be aware MCP burns substantial context per call (~20K tokens for tool-rich servers like Figma's), so a direct built-in is almost always the better choice for performance-sensitive local-model setups.
|
|
464
|
+
|
|
381
465
|
### MCP Servers
|
|
382
466
|
|
|
383
467
|
DryDock can connect to any Model Context Protocol server. Tools from a server `foo` show up as `foo__<tool_name>` in the agent's tool list. Two ways to add one:
|
|
@@ -323,6 +323,92 @@ DryDock discovers skills from:
|
|
|
323
323
|
3. Global `~/.drydock/skills/`
|
|
324
324
|
4. Bundled skills (shipped with the package)
|
|
325
325
|
|
|
326
|
+
### Built-in tools beyond the basics
|
|
327
|
+
|
|
328
|
+
In addition to the standard `read_file` / `write_file` / `search_replace` / `bash` / `grep` / `glob` / `task` / `retrieve` set, DryDock ships four direct built-ins designed to plug well-known transformer weaknesses:
|
|
329
|
+
|
|
330
|
+
- **`math`** — exact arithmetic via stdlib (math, statistics, Fraction, Decimal). Sandboxed Python expression. Fixes factorials, large multiplies, primes, statistics, exact fractions.
|
|
331
|
+
- **`count`** — exact substring/regex/lines/words/chars/bytes count over a string OR a file. Fixes "how many X are in this text" estimation errors.
|
|
332
|
+
- **`memory`** — persistent cross-session key/value notes at `~/.drydock/agent_memory/notes.jsonl`. Save, recall (TF-IDF ranked), list keys, forget. Bridges the long-term memory gap.
|
|
333
|
+
- **`verify`** — runs a shell command (or checks a file) and matches the output against an expectation (contains/not_contains/regex/equals/exit_code/file_exists/file_contains). Operationalizes the "Loop until verified" core principle.
|
|
334
|
+
|
|
335
|
+
All four are direct built-ins, NOT MCP servers — per Babich's "MCP is Dead" (Apr 2026), MCP servers burn ~20K tokens of context per call which is a real cost on a 131K-context local model. Direct built-ins use a strict Pydantic schema, single subprocess-free path, and tighter security.
|
|
336
|
+
|
|
337
|
+
### Math Tool
|
|
338
|
+
|
|
339
|
+
DryDock ships with a `math` tool the model calls instead of doing arithmetic in its head. It's a direct built-in (NOT an MCP server — see [MCP is Dead](https://medium.com/) for why direct tools beat MCP for small bandwidth-limited models like Gemma 4). One argument, sandboxed Python expression, exact results.
|
|
340
|
+
|
|
341
|
+
```
|
|
342
|
+
math(expression="math.factorial(20)") # 2432902008176640000 — exact
|
|
343
|
+
math(expression="math.comb(50, 5)") # 2118760
|
|
344
|
+
math(expression="math.gcd(48, 18)") # 6
|
|
345
|
+
math(expression="statistics.stdev([2,4,4,4,5,5,7,9])")
|
|
346
|
+
math(expression="Fraction(1,3) + Fraction(1,6)") # exact 1/2
|
|
347
|
+
math(expression="Decimal('0.1') + Decimal('0.2')") # exact 0.3
|
|
348
|
+
math(expression="round(math.pi, 12)")
|
|
349
|
+
math(expression="sum(range(1, 101))") # 5050
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
Available names: arithmetic operators (`+ - * / // % **`), comparisons, `and / or / not`, `abs / round / min / max / sum / len / pow / divmod / range / int / float / bool`, the `math` and `statistics` modules, `Fraction`, `Decimal`. Constants: `pi`, `e`, `tau`, `inf`, `nan`. **No imports, no `open()`, no file/network access**, no attribute access outside the whitelist.
|
|
353
|
+
|
|
354
|
+
Always auto-approved (read-only, side-effect free). Errors return a structured `{ok: false, error: "..."}` instead of raising.
|
|
355
|
+
|
|
356
|
+
### Custom Tools
|
|
357
|
+
|
|
358
|
+
Add your own built-in tools by dropping a file into one of these locations:
|
|
359
|
+
|
|
360
|
+
- **Project-local:** any path listed in `config.toml`'s `tool_paths` array
|
|
361
|
+
- **Global:** `~/.drydock/tools/`
|
|
362
|
+
- **Bundled:** `drydock/core/tools/builtins/` (forks only)
|
|
363
|
+
|
|
364
|
+
Each file should subclass `BaseTool[ArgsModel, ResultModel, ConfigModel, StateModel]` with a Pydantic args model + result model + an async `run()` generator. Auto-discovery picks up every non-underscore-prefixed `.py` in those directories. The class name auto-converts to a snake_case tool name (`MyTool` → `my_tool`).
|
|
365
|
+
|
|
366
|
+
Minimum viable tool:
|
|
367
|
+
|
|
368
|
+
```python
|
|
369
|
+
# ~/.drydock/tools/word_count.py
|
|
370
|
+
from collections.abc import AsyncGenerator
|
|
371
|
+
from typing import ClassVar, final
|
|
372
|
+
from pydantic import BaseModel, Field
|
|
373
|
+
from drydock.core.tools.base import (
|
|
374
|
+
BaseTool, BaseToolConfig, BaseToolState, InvokeContext, ToolPermission,
|
|
375
|
+
)
|
|
376
|
+
from drydock.core.tools.ui import ToolCallDisplay, ToolResultDisplay, ToolUIData
|
|
377
|
+
from drydock.core.types import ToolStreamEvent
|
|
378
|
+
|
|
379
|
+
class WordCountArgs(BaseModel):
|
|
380
|
+
text: str = Field(description="Text to count words in")
|
|
381
|
+
|
|
382
|
+
class WordCountResult(BaseModel):
|
|
383
|
+
count: int
|
|
384
|
+
|
|
385
|
+
class WordCountConfig(BaseToolConfig):
|
|
386
|
+
permission: ToolPermission = ToolPermission.ALWAYS
|
|
387
|
+
|
|
388
|
+
class WordCount(
|
|
389
|
+
BaseTool[WordCountArgs, WordCountResult, WordCountConfig, BaseToolState],
|
|
390
|
+
ToolUIData[WordCountArgs, WordCountResult],
|
|
391
|
+
):
|
|
392
|
+
description: ClassVar[str] = "Count words in a string."
|
|
393
|
+
|
|
394
|
+
@classmethod
|
|
395
|
+
def format_call_display(cls, args): return ToolCallDisplay(summary=f"count: {args.text[:30]}")
|
|
396
|
+
@classmethod
|
|
397
|
+
def get_result_display(cls, event): return ToolResultDisplay(success=True, message=f"{event.result.count} words")
|
|
398
|
+
@classmethod
|
|
399
|
+
def get_status_text(cls): return "Counting"
|
|
400
|
+
def resolve_permission(self, args): return ToolPermission.ALWAYS
|
|
401
|
+
|
|
402
|
+
@final
|
|
403
|
+
async def run(self, args: WordCountArgs, ctx: InvokeContext | None = None
|
|
404
|
+
) -> AsyncGenerator[ToolStreamEvent | WordCountResult, None]:
|
|
405
|
+
yield WordCountResult(count=len(args.text.split()))
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
Restart drydock; the model now sees `word_count` in its tool list.
|
|
409
|
+
|
|
410
|
+
For tools that should run as separate processes or that you want to share with other AI clients (Claude Code, Cursor, etc.), use the [MCP integration](#mcp-servers) instead — but be aware MCP burns substantial context per call (~20K tokens for tool-rich servers like Figma's), so a direct built-in is almost always the better choice for performance-sensitive local-model setups.
|
|
411
|
+
|
|
326
412
|
### MCP Servers
|
|
327
413
|
|
|
328
414
|
DryDock can connect to any Model Context Protocol server. Tools from a server `foo` show up as `foo__<tool_name>` in the agent's tool list. Two ways to add one:
|
|
@@ -79,6 +79,18 @@ Workflow for fixing bugs:
|
|
|
79
79
|
3. Fix with search_replace
|
|
80
80
|
4. Verify the fix
|
|
81
81
|
|
|
82
|
+
CORE PRINCIPLES (the four lines that win):
|
|
83
|
+
1. Don't assume. Don't hide confusion. Surface tradeoffs.
|
|
84
|
+
2. Minimum code that solves the problem. Nothing speculative.
|
|
85
|
+
3. Touch only what you must. Clean up only your own mess.
|
|
86
|
+
4. Define success criteria. Loop until verified.
|
|
87
|
+
|
|
88
|
+
USE THE math TOOL for any non-trivial arithmetic. Gemma 4 gets factorials,
|
|
89
|
+
large multiplies, prime tests, and floating-point edge cases wrong from
|
|
90
|
+
prior alone. The math tool is sandboxed Python (`math.factorial(20)`,
|
|
91
|
+
`math.comb(50,5)`, `Fraction(1,3)+Fraction(1,6)`, `statistics.mean([...])`)
|
|
92
|
+
and returns exact results. Use it. Don't compute in your head.
|
|
93
|
+
|
|
82
94
|
Rules:
|
|
83
95
|
- Create files immediately. Do not plan or discuss — write code.
|
|
84
96
|
- Use absolute imports for Python packages
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"""Count tool — exact substring / regex / line / token counts.
|
|
2
|
+
|
|
3
|
+
The companion to the math tool: transformers can't count reliably (they
|
|
4
|
+
estimate token positions and overshoot/undershoot on "how many X are in
|
|
5
|
+
this text"). This tool fixes it by deferring to deterministic stdlib code.
|
|
6
|
+
|
|
7
|
+
Use INSTEAD of estimating "how many" anything. The model just calls and
|
|
8
|
+
gets the exact number.
|
|
9
|
+
|
|
10
|
+
Modes:
|
|
11
|
+
- substring — case-sensitive substring count (default)
|
|
12
|
+
- substring_ci — case-insensitive substring count
|
|
13
|
+
- regex — regex match count (uses re.findall)
|
|
14
|
+
- lines — number of lines (newline-separated)
|
|
15
|
+
- words — whitespace-separated word count
|
|
16
|
+
- chars — total character count
|
|
17
|
+
- bytes — UTF-8 byte length
|
|
18
|
+
|
|
19
|
+
Source can be:
|
|
20
|
+
- `text` arg directly
|
|
21
|
+
- `path` arg pointing at a file (read up to 10 MB)
|
|
22
|
+
|
|
23
|
+
Examples:
|
|
24
|
+
|
|
25
|
+
count(pattern="r", text="strawberry") # 3
|
|
26
|
+
count(pattern="def ", path="/data3/drydock/drydock/core/agent_loop.py", mode="substring")
|
|
27
|
+
count(pattern="^class\\s", path="...", mode="regex")
|
|
28
|
+
count(mode="lines", path="...")
|
|
29
|
+
count(mode="words", text="hello world hello") # 3
|
|
30
|
+
"""
|
|
31
|
+
from __future__ import annotations
|
|
32
|
+
|
|
33
|
+
import re
|
|
34
|
+
from collections.abc import AsyncGenerator
|
|
35
|
+
from pathlib import Path
|
|
36
|
+
from typing import TYPE_CHECKING, ClassVar, Literal, final
|
|
37
|
+
|
|
38
|
+
from pydantic import BaseModel, Field
|
|
39
|
+
|
|
40
|
+
from drydock.core.tools.base import (
|
|
41
|
+
BaseTool,
|
|
42
|
+
BaseToolConfig,
|
|
43
|
+
BaseToolState,
|
|
44
|
+
InvokeContext,
|
|
45
|
+
ToolPermission,
|
|
46
|
+
)
|
|
47
|
+
from drydock.core.tools.ui import ToolCallDisplay, ToolResultDisplay, ToolUIData
|
|
48
|
+
from drydock.core.types import ToolStreamEvent
|
|
49
|
+
|
|
50
|
+
if TYPE_CHECKING:
|
|
51
|
+
from drydock.core.types import ToolResultEvent
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
_MAX_FILE_BYTES = 10 * 1024 * 1024 # 10 MB
|
|
55
|
+
|
|
56
|
+
CountMode = Literal[
|
|
57
|
+
"substring", "substring_ci", "regex", "lines", "words", "chars", "bytes",
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class CountArgs(BaseModel):
|
|
62
|
+
mode: CountMode = Field(
|
|
63
|
+
default="substring",
|
|
64
|
+
description=(
|
|
65
|
+
"How to count. `substring` = case-sensitive substring (needs "
|
|
66
|
+
"`pattern`). `substring_ci` = case-insensitive. `regex` = "
|
|
67
|
+
"Python re.findall (needs `pattern`). `lines` / `words` / "
|
|
68
|
+
"`chars` / `bytes` = pattern-free."
|
|
69
|
+
),
|
|
70
|
+
)
|
|
71
|
+
pattern: str = Field(
|
|
72
|
+
default="",
|
|
73
|
+
description=(
|
|
74
|
+
"Required for substring / substring_ci / regex. Ignored otherwise."
|
|
75
|
+
),
|
|
76
|
+
)
|
|
77
|
+
text: str = Field(
|
|
78
|
+
default="",
|
|
79
|
+
description=(
|
|
80
|
+
"Inline text to count in. Provide either `text` OR `path`, not both."
|
|
81
|
+
),
|
|
82
|
+
)
|
|
83
|
+
path: str = Field(
|
|
84
|
+
default="",
|
|
85
|
+
description=(
|
|
86
|
+
"Path to a file to count in. Capped at 10 MB. Use either `text` "
|
|
87
|
+
"OR `path`."
|
|
88
|
+
),
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class CountResult(BaseModel):
|
|
93
|
+
ok: bool
|
|
94
|
+
count: int = 0
|
|
95
|
+
mode: str = ""
|
|
96
|
+
source: str = "" # "text" or the file path
|
|
97
|
+
error: str = ""
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class CountConfig(BaseToolConfig):
|
|
101
|
+
permission: ToolPermission = ToolPermission.ALWAYS
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _resolve_text(args: CountArgs) -> tuple[str, str]:
|
|
105
|
+
"""Returns (text, source_label). Raises ValueError on bad input.
|
|
106
|
+
|
|
107
|
+
Empty text + empty path is treated as the empty string source — valid
|
|
108
|
+
for pattern-free modes like `lines` (returns 0). Substring / regex
|
|
109
|
+
modes still error out via `_do_count` if the pattern is empty.
|
|
110
|
+
"""
|
|
111
|
+
if args.text and args.path:
|
|
112
|
+
raise ValueError("provide either `text` or `path`, not both")
|
|
113
|
+
if args.path:
|
|
114
|
+
p = Path(args.path).expanduser()
|
|
115
|
+
if not p.is_file():
|
|
116
|
+
raise ValueError(f"file not found: {p}")
|
|
117
|
+
size = p.stat().st_size
|
|
118
|
+
if size > _MAX_FILE_BYTES:
|
|
119
|
+
raise ValueError(
|
|
120
|
+
f"file too large ({size} bytes > {_MAX_FILE_BYTES})"
|
|
121
|
+
)
|
|
122
|
+
return p.read_text(errors="replace"), str(p)
|
|
123
|
+
return args.text, "text"
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _do_count(text: str, args: CountArgs) -> int:
|
|
127
|
+
if args.mode == "substring":
|
|
128
|
+
if not args.pattern:
|
|
129
|
+
raise ValueError("substring mode requires `pattern`")
|
|
130
|
+
return text.count(args.pattern)
|
|
131
|
+
if args.mode == "substring_ci":
|
|
132
|
+
if not args.pattern:
|
|
133
|
+
raise ValueError("substring_ci mode requires `pattern`")
|
|
134
|
+
return text.lower().count(args.pattern.lower())
|
|
135
|
+
if args.mode == "regex":
|
|
136
|
+
if not args.pattern:
|
|
137
|
+
raise ValueError("regex mode requires `pattern`")
|
|
138
|
+
try:
|
|
139
|
+
return len(re.findall(args.pattern, text))
|
|
140
|
+
except re.error as e:
|
|
141
|
+
raise ValueError(f"invalid regex: {e}") from e
|
|
142
|
+
if args.mode == "lines":
|
|
143
|
+
# If text ends without a newline, it still counts as one line.
|
|
144
|
+
if not text:
|
|
145
|
+
return 0
|
|
146
|
+
return text.count("\n") + (0 if text.endswith("\n") else 1)
|
|
147
|
+
if args.mode == "words":
|
|
148
|
+
return len(text.split())
|
|
149
|
+
if args.mode == "chars":
|
|
150
|
+
return len(text)
|
|
151
|
+
if args.mode == "bytes":
|
|
152
|
+
return len(text.encode("utf-8"))
|
|
153
|
+
raise ValueError(f"unknown mode: {args.mode}")
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
class Count(
|
|
157
|
+
BaseTool[CountArgs, CountResult, CountConfig, BaseToolState],
|
|
158
|
+
ToolUIData[CountArgs, CountResult],
|
|
159
|
+
):
|
|
160
|
+
description: ClassVar[str] = (
|
|
161
|
+
"Exact count of substrings, regex matches, lines, words, chars, "
|
|
162
|
+
"or bytes in a string OR file. Use INSTEAD of estimating 'how "
|
|
163
|
+
"many X are in this text' — transformers count poorly. Modes: "
|
|
164
|
+
"substring (default), substring_ci, regex, lines, words, chars, "
|
|
165
|
+
"bytes. Source: pass `text=...` OR `path=...` (file capped at "
|
|
166
|
+
"10 MB). Examples: count(pattern='r', text='strawberry') -> 3; "
|
|
167
|
+
"count(pattern='^def ', path='foo.py', mode='regex'); "
|
|
168
|
+
"count(mode='lines', path='foo.txt')."
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
@classmethod
|
|
172
|
+
def format_call_display(cls, args: CountArgs) -> ToolCallDisplay:
|
|
173
|
+
if args.path:
|
|
174
|
+
target = args.path.split("/")[-1] if "/" in args.path else args.path
|
|
175
|
+
target = f"file:{target}"
|
|
176
|
+
else:
|
|
177
|
+
preview = args.text[:30].replace("\n", " ")
|
|
178
|
+
target = f'text:"{preview}..."' if len(args.text) > 30 else f'text:"{preview}"'
|
|
179
|
+
if args.mode in ("substring", "substring_ci", "regex") and args.pattern:
|
|
180
|
+
return ToolCallDisplay(summary=f"count {args.mode} {args.pattern!r} in {target}")
|
|
181
|
+
return ToolCallDisplay(summary=f"count {args.mode} in {target}")
|
|
182
|
+
|
|
183
|
+
@classmethod
|
|
184
|
+
def get_result_display(cls, event: "ToolResultEvent") -> ToolResultDisplay:
|
|
185
|
+
if isinstance(event.result, CountResult):
|
|
186
|
+
if not event.result.ok:
|
|
187
|
+
return ToolResultDisplay(
|
|
188
|
+
success=False, message=f"count: {event.result.error[:80]}"
|
|
189
|
+
)
|
|
190
|
+
return ToolResultDisplay(
|
|
191
|
+
success=True,
|
|
192
|
+
message=f"= {event.result.count} ({event.result.mode})",
|
|
193
|
+
)
|
|
194
|
+
return ToolResultDisplay(success=True, message="count complete")
|
|
195
|
+
|
|
196
|
+
@classmethod
|
|
197
|
+
def get_status_text(cls) -> str:
|
|
198
|
+
return "Counting"
|
|
199
|
+
|
|
200
|
+
def resolve_permission(self, args: CountArgs) -> ToolPermission | None:
|
|
201
|
+
return ToolPermission.ALWAYS
|
|
202
|
+
|
|
203
|
+
@final
|
|
204
|
+
async def run(
|
|
205
|
+
self, args: CountArgs, ctx: InvokeContext | None = None
|
|
206
|
+
) -> AsyncGenerator[ToolStreamEvent | CountResult, None]:
|
|
207
|
+
try:
|
|
208
|
+
text, source = _resolve_text(args)
|
|
209
|
+
n = _do_count(text, args)
|
|
210
|
+
except ValueError as e:
|
|
211
|
+
yield CountResult(ok=False, error=str(e), mode=args.mode)
|
|
212
|
+
return
|
|
213
|
+
except OSError as e:
|
|
214
|
+
yield CountResult(
|
|
215
|
+
ok=False, error=f"OSError: {e}", mode=args.mode
|
|
216
|
+
)
|
|
217
|
+
return
|
|
218
|
+
yield CountResult(ok=True, count=n, mode=args.mode, source=source)
|