drydock-cli 2.7.30__tar.gz → 2.7.31__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.7.31/.auto_release.lock +1 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/PKG-INFO +1 -1
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/format.py +3 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/grep.py +10 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/search_replace.py +17 -1
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/pyproject.toml +1 -1
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_hallucinated_tool_suppression.py +3 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_grep.py +33 -0
- drydock_cli-2.7.31/tests/tools/test_search_replace_first_failure_hint.py +132 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/trip_log.md +96 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/uv.lock +1 -1
- drydock_cli-2.7.30/.auto_release.lock +0 -1
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.claude/scheduled_tasks.lock +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.gitignore +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.python-version +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.typos.toml +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.vscode/extensions.json +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.vscode/launch.json +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/.vscode/settings.json +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/AGENTS.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/Admiral.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/BASELINE_412.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/CHANGELOG.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/CLAUDE.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/DEPLOYMENT.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/Drydock_rebrand.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/LICENSE +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/MODEL_SHORTCOMINGS.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/NOTICE +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/OVERNIGHT_PROGRESS.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/OVERNIGHT_REPORT_2026_04_13.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/PERF_SWEEP_PLAN.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/PRD.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/README.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/SOVEREIGN_PRD.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/TRIAGE_v1.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/action.yml +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/README.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results1.tsv +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results13.tsv +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results14.tsv +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results15.tsv +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results16.tsv +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results17.tsv +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results18.tsv +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results19.tsv +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results2.tsv +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results20.tsv +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results3.tsv +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results4.tsv +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results5.tsv +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results6.tsv +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results7.tsv +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results8.tsv +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results9.tsv +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/baseline_history/results_evolved_v1.tsv +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/docs/README.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/docs/acp-setup.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/detectors.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/detectors_proposed.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/history.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/interventions.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/llm_analyzer.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/metrics.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/opus_escalator.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/persistence.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/policy.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/proposer.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/stager.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/task_classifier.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/tuning.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/validator.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/admiral/worker.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/checkpoint_picker.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/agent_loop.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/checkpoint.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/config/doctor.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/logger.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/paths/_drydock_home.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/gemma4.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/slug.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/types.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/core/utils.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/onboarding/screens/choice.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/onboarding/screens/local_model.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/audit-tests/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/strong-tests/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock/whats_new.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock-acp.spec +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/drydock_terms.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/flake.lock +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/flake.nix +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/nohup.out +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/perf_results/baseline_1777672181.json +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/perf_results/baseline_1777672218.json +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/perf_results/baseline_1777672322.json +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/README.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/config_base.toml +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/config_best.toml +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/domain_spec.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/experimenter.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/kernel.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/mini_prd.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/mini_prompts.txt +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/proposer.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/research/results.tsv +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/resume.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/README.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/admiral_probe.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/audit_sampler.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/auto_generate_tests.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/auto_release.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/auto_test_loop.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/autonomous_review.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/autonomous_review_prompt.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/backup.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/bump_version.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/comprehensive_loop.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/discover_cli_tools.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/evolve_tests.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/gen_2000_prompts.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/install.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/llm_balancer.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/mega_loop.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/meta_ralph_loop.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/monitor_swebench.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/monitor_test_battery.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/notify_release.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/oss_task_harness.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/overnight_agents_test.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/perf_baseline_when_idle.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/perf_sweep.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/poll_issues.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/port_task.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/prepare_release.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/ralph_loop.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/research_babysitter.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/session_loop_audit.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/shakedown.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/shakedown_interactive.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/shakedown_regression.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/shakedown_suite.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/shakedown_variance.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/stress_babysitter.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/stress_prompts_50.txt +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/stress_prompts_realuser.txt +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/stress_prompts_tool_agent.txt +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/stress_prompts_tool_agent_2000.txt +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/stress_shakedown.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/stress_telegram_status.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/stress_watcher.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/test_bank.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/test_full.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/test_smoke.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/test_tui_path.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/tui_test.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/scripts/vllm_failover.sh +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/test/project/dummy +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/backend/test_generic_adapter_sanitize.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/conftest.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_circuit_breaker_count_escalation.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_circuit_breaker_readonly_threshold.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/e2e/common.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/mock/utils.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/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.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_admiral.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_admiral_phase3.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_admiral_proposed.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_admiral_struggle_dedup.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_agents.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_checkpoint.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_fake_tool_call_paren_syntax.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_integration.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_issue_fixes.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_message_id.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_middleware.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_read_file_not_found_listing.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_search_replace_args_not_truncated.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_smoke.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_task_complete_nudge.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_truncate_args_valid_json.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_truncated_arg_path_hint.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_truncated_search_replace_escalation.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_truncated_write_escalation.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_wall_of_text_rescue.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_workloads.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/test_write_file_missing_path.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_manager_gemma_derived_models.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_read_file_dedup_alternating_offset.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_read_file_dedup_reembed.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_read_file_directory.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_read_file_limit_truncation.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_search_replace_append_fallback.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_search_replace_dir_path.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_search_replace_empty_content.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_search_replace_hard_stop.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_search_replace_malformed_block.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_search_replace_no_op_loop_breaker.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_search_replace_refused_loop_breaker.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_write_file_dedup_missing_imports.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/tools/test_write_file_missing_path_hint.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/worked_examples/README.md +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/worked_examples/cli_subcommand_dispatch.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/worked_examples/lookup.json +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/worked_examples/sql_parser.py +0 -0
- {drydock_cli-2.7.30 → drydock_cli-2.7.31}/worked_examples/tree_walking_interpreter.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2183712
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 2.7.
|
|
3
|
+
Version: 2.7.31
|
|
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
|
|
@@ -353,6 +353,9 @@ class APIToolFormatHandler:
|
|
|
353
353
|
# mini_db fresh build (called ralph_repo_index 5 times).
|
|
354
354
|
"ralph_repo_index", "repo_index", "index_repo",
|
|
355
355
|
"list_mcp_resources", "list_resources", "search_resources",
|
|
356
|
+
# Observed in stress run 2026-05-02: model hallucinates ralph_file_summary
|
|
357
|
+
# after receiving tool results, causing empty_after_tool stalls.
|
|
358
|
+
"ralph_file_summary", "file_summary", "repo_summary",
|
|
356
359
|
}
|
|
357
360
|
|
|
358
361
|
suppressed_failures = []
|
|
@@ -4,6 +4,7 @@ import asyncio
|
|
|
4
4
|
from collections.abc import AsyncGenerator
|
|
5
5
|
from enum import StrEnum, auto
|
|
6
6
|
from pathlib import Path
|
|
7
|
+
import re as _re
|
|
7
8
|
import shutil
|
|
8
9
|
from typing import TYPE_CHECKING, ClassVar
|
|
9
10
|
|
|
@@ -131,6 +132,15 @@ class Grep(
|
|
|
131
132
|
if not args.pattern.strip():
|
|
132
133
|
raise ToolError("Empty search pattern provided.")
|
|
133
134
|
|
|
135
|
+
try:
|
|
136
|
+
_re.compile(args.pattern)
|
|
137
|
+
except _re.error as regex_err:
|
|
138
|
+
escaped = _re.escape(args.pattern)
|
|
139
|
+
raise ToolError(
|
|
140
|
+
f"Invalid regex pattern: {regex_err}\n"
|
|
141
|
+
f"To search for this as literal text, use pattern={escaped!r}"
|
|
142
|
+
) from None
|
|
143
|
+
|
|
134
144
|
path_obj = Path(args.path).expanduser()
|
|
135
145
|
if not path_obj.is_absolute():
|
|
136
146
|
path_obj = Path.cwd() / path_obj
|
|
@@ -503,7 +503,23 @@ class SearchReplace(
|
|
|
503
503
|
entry = state.get(fail_key, {"count": 0})
|
|
504
504
|
entry["count"] += 1
|
|
505
505
|
state[fail_key] = entry
|
|
506
|
-
if entry["count"]
|
|
506
|
+
if entry["count"] == 1:
|
|
507
|
+
# First failure: embed file head so model sees actual content
|
|
508
|
+
# without waiting for a second retry cycle. Reduces
|
|
509
|
+
# retry_after_error:search_replace events significantly.
|
|
510
|
+
try:
|
|
511
|
+
head = original_content[:1500]
|
|
512
|
+
line_count = original_content.count("\n")
|
|
513
|
+
error_message += (
|
|
514
|
+
f"\n\n[HINT: search text not found in {file_path.name}. "
|
|
515
|
+
f"File may have changed. Current file head "
|
|
516
|
+
f"({line_count} lines total):\n"
|
|
517
|
+
f"-----FILE HEAD-----\n{head}\n-----FILE HEAD END-----\n"
|
|
518
|
+
f"Adjust your SEARCH text to match the actual content above.]"
|
|
519
|
+
)
|
|
520
|
+
except Exception:
|
|
521
|
+
pass
|
|
522
|
+
elif entry["count"] >= 2:
|
|
507
523
|
try:
|
|
508
524
|
line_count = original_content.count("\n")
|
|
509
525
|
count = entry["count"]
|
|
@@ -109,6 +109,39 @@ async def test_fails_with_nonexistent_path(grep):
|
|
|
109
109
|
assert "Path does not exist" in str(err.value)
|
|
110
110
|
|
|
111
111
|
|
|
112
|
+
@pytest.mark.asyncio
|
|
113
|
+
async def test_invalid_regex_unmatched_paren_raises_with_hint(grep, tmp_path):
|
|
114
|
+
# Pattern with unescaped ( triggers POSIX ERE error — model must get escaped form
|
|
115
|
+
(tmp_path / "test.py").write_text("def run(self):\n pass\n")
|
|
116
|
+
with pytest.raises(ToolError) as err:
|
|
117
|
+
await collect_result(grep.run(GrepArgs(pattern="def run(self,")))
|
|
118
|
+
|
|
119
|
+
msg = str(err.value)
|
|
120
|
+
assert "Invalid regex" in msg
|
|
121
|
+
assert "literal text" in msg
|
|
122
|
+
# Escaped suggestion must contain escaped paren so model can retry without loop
|
|
123
|
+
assert r"\(" in msg
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
@pytest.mark.asyncio
|
|
127
|
+
async def test_invalid_regex_unclosed_bracket_raises_with_hint(grep, tmp_path):
|
|
128
|
+
(tmp_path / "test.py").write_text("items = [1, 2]\n")
|
|
129
|
+
with pytest.raises(ToolError) as err:
|
|
130
|
+
await collect_result(grep.run(GrepArgs(pattern="[abc")))
|
|
131
|
+
|
|
132
|
+
msg = str(err.value)
|
|
133
|
+
assert "Invalid regex" in msg
|
|
134
|
+
assert "literal text" in msg
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
@pytest.mark.asyncio
|
|
138
|
+
async def test_valid_escaped_regex_does_not_raise(grep, tmp_path):
|
|
139
|
+
(tmp_path / "test.py").write_text("def run(self):\n pass\n")
|
|
140
|
+
# Properly escaped pattern must work without error
|
|
141
|
+
result = await collect_result(grep.run(GrepArgs(pattern=r"def run\(self\)")))
|
|
142
|
+
assert result.match_count >= 1
|
|
143
|
+
|
|
144
|
+
|
|
112
145
|
@pytest.mark.asyncio
|
|
113
146
|
async def test_searches_in_specific_path(grep, tmp_path):
|
|
114
147
|
subdir = tmp_path / "subdir"
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"""Regression test: search_replace embeds file head on first failure.
|
|
2
|
+
|
|
3
|
+
Admiral logs (2026-05-02) showed retry_after_error:search_replace events
|
|
4
|
+
where the model retried a failed search_replace without re-reading the file.
|
|
5
|
+
The file head was only embedded starting at count=2, so the model had no
|
|
6
|
+
context on the first failure and would blindly retry the same text.
|
|
7
|
+
|
|
8
|
+
Fix: embed a FILE HEAD hint on the first failure (count=1) so the model
|
|
9
|
+
can immediately see the actual file content and adjust its search text
|
|
10
|
+
without needing a second retry cycle.
|
|
11
|
+
"""
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import asyncio
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
import pytest
|
|
18
|
+
|
|
19
|
+
from drydock.core.tools.base import BaseToolState, InvokeContext
|
|
20
|
+
from drydock.core.tools.builtins.search_replace import (
|
|
21
|
+
SearchReplace,
|
|
22
|
+
SearchReplaceArgs,
|
|
23
|
+
SearchReplaceConfig,
|
|
24
|
+
SearchReplaceResult,
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@pytest.fixture
|
|
29
|
+
def tool():
|
|
30
|
+
return SearchReplace(SearchReplaceConfig(), BaseToolState())
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@pytest.fixture
|
|
34
|
+
def ctx() -> InvokeContext:
|
|
35
|
+
# read_file_state=None bypasses Read-before-Write guard so tests can focus
|
|
36
|
+
# on the "search text not found" hint behavior specifically.
|
|
37
|
+
return InvokeContext(tool_call_id="tc_hint_1", read_file_state=None)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
async def _run(tool, ctx, tmp_path, file_content, search_text, replace_text="NEW"):
|
|
41
|
+
f = tmp_path / "target.py"
|
|
42
|
+
f.write_text(file_content)
|
|
43
|
+
args = SearchReplaceArgs(
|
|
44
|
+
file_path=str(f),
|
|
45
|
+
content=f"<<<<<<< SEARCH\n{search_text}\n=======\n{replace_text}\n>>>>>>> REPLACE",
|
|
46
|
+
)
|
|
47
|
+
last = None
|
|
48
|
+
async for event in tool.run(args, ctx):
|
|
49
|
+
last = event
|
|
50
|
+
return last
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def test_first_failure_embeds_file_head(tool, ctx, tmp_path):
|
|
54
|
+
"""On first search_replace failure, result includes file content hint."""
|
|
55
|
+
content = "def foo():\n pass\n\ndef bar():\n return 42\n"
|
|
56
|
+
result = asyncio.run(_run(tool, ctx, tmp_path, content, search_text="def nonexistent_func():"))
|
|
57
|
+
assert isinstance(result, SearchReplaceResult)
|
|
58
|
+
assert result.blocks_applied == 0
|
|
59
|
+
assert "FILE HEAD" in result.content or "HINT" in result.content
|
|
60
|
+
assert "def foo():" in result.content
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def test_first_failure_hint_not_hard_stop(tool, ctx, tmp_path):
|
|
64
|
+
"""First failure uses soft HINT language, not HARD-STOP prohibition."""
|
|
65
|
+
content = "x = 1\ny = 2\n"
|
|
66
|
+
result = asyncio.run(_run(tool, ctx, tmp_path, content, search_text="z = 99"))
|
|
67
|
+
assert isinstance(result, SearchReplaceResult)
|
|
68
|
+
assert "HARD-STOP" not in result.content
|
|
69
|
+
assert "HINT" in result.content or "FILE HEAD" in result.content
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def test_second_failure_escalates(tool, ctx, tmp_path):
|
|
73
|
+
"""Second consecutive failure escalates to LOOP-BREAKER (existing behavior)."""
|
|
74
|
+
content = "alpha = 1\nbeta = 2\n"
|
|
75
|
+
f = tmp_path / "target.py"
|
|
76
|
+
f.write_text(content)
|
|
77
|
+
args = SearchReplaceArgs(
|
|
78
|
+
file_path=str(f),
|
|
79
|
+
content="<<<<<<< SEARCH\ngamma = 3\n=======\ndelta = 4\n>>>>>>> REPLACE",
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
async def run_twice():
|
|
83
|
+
async for _ in tool.run(args, ctx):
|
|
84
|
+
pass
|
|
85
|
+
last = None
|
|
86
|
+
async for event in tool.run(args, ctx):
|
|
87
|
+
last = event
|
|
88
|
+
return last
|
|
89
|
+
|
|
90
|
+
result = asyncio.run(run_twice())
|
|
91
|
+
assert isinstance(result, SearchReplaceResult)
|
|
92
|
+
assert "LOOP-BREAKER" in result.content or "consecutive" in result.content
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def test_success_resets_fail_counter(tool, ctx, tmp_path):
|
|
96
|
+
"""After a successful edit, the fail counter resets for that file."""
|
|
97
|
+
content = "def hello():\n pass\n"
|
|
98
|
+
f = tmp_path / "target.py"
|
|
99
|
+
f.write_text(content)
|
|
100
|
+
|
|
101
|
+
async def run_scenario():
|
|
102
|
+
# Fail once
|
|
103
|
+
fail_args = SearchReplaceArgs(
|
|
104
|
+
file_path=str(f),
|
|
105
|
+
content="<<<<<<< SEARCH\nno_such_function():\n=======\nreplaced\n>>>>>>> REPLACE",
|
|
106
|
+
)
|
|
107
|
+
async for _ in tool.run(fail_args, ctx):
|
|
108
|
+
pass
|
|
109
|
+
|
|
110
|
+
# Succeed
|
|
111
|
+
ok_args = SearchReplaceArgs(
|
|
112
|
+
file_path=str(f),
|
|
113
|
+
content="<<<<<<< SEARCH\ndef hello():\n=======\ndef goodbye():\n>>>>>>> REPLACE",
|
|
114
|
+
)
|
|
115
|
+
ok_result = None
|
|
116
|
+
async for event in tool.run(ok_args, ctx):
|
|
117
|
+
ok_result = event
|
|
118
|
+
assert ok_result.blocks_applied == 1
|
|
119
|
+
|
|
120
|
+
# Fail again — should be count=1 (reset), not count=2
|
|
121
|
+
fail2_args = SearchReplaceArgs(
|
|
122
|
+
file_path=str(f),
|
|
123
|
+
content="<<<<<<< SEARCH\nstill_no_such_function():\n=======\nreplaced\n>>>>>>> REPLACE",
|
|
124
|
+
)
|
|
125
|
+
fail2_result = None
|
|
126
|
+
async for event in tool.run(fail2_args, ctx):
|
|
127
|
+
fail2_result = event
|
|
128
|
+
return fail2_result
|
|
129
|
+
|
|
130
|
+
result = asyncio.run(run_scenario())
|
|
131
|
+
assert "HINT" in result.content or "FILE HEAD" in result.content
|
|
132
|
+
assert "LOOP-BREAKER" not in result.content
|
|
@@ -717,3 +717,99 @@ restarted, cron self-match bug fixed in this same session).
|
|
|
717
717
|
- Admiral last 2h: loop:bash ×8, struggle:none ×8, loop:search_replace ×4, struggle:write_file ×3, retry_after_error:search_replace ×3, retry_after_error:grep ×2, empty_after_tool:ralph_repo_index ×2 — all known model-behavior patterns; hallucinated ralph_repo_index is suppressed with system note per existing code; skip count stable at 121 (not growing since 03:00 UTC)
|
|
718
718
|
- Latest release: v2.7.29; 2 unreleased commits (df5e0f5 read_file dedup cache, 96fa517 bash truncation notice) pending auto-ship as v2.7.30 at 06:00 UTC
|
|
719
719
|
- Action this tick: no action — all services healthy, harness 83% complete, no new actionable drydock bugs found; stress should complete within ~3 hours at current rate (~18 prompts/hour in Perf: block)
|
|
720
|
+
|
|
721
|
+
## 2026-05-02 05:03 UTC tick
|
|
722
|
+
- Stress: 1398/1658 (84%) — PID 675181 alive 1d 13h 55m (RSS 1043 MB); active in Perf: block (coalesce-parallel-reads/warm-cache/evict-LRU); ~260 prompts remaining, ~4 hours at current rate
|
|
723
|
+
- Write rate: 32% last 100 prompts — expected for Perf: text-advice block; model explains caching strategies rather than writing files
|
|
724
|
+
- vLLM 400s: 0 — clean; vLLM gemma4 container healthy; llm_balancer PID 713929 on :8001 healthy and forwarding correctly
|
|
725
|
+
- GH issues: 0 open
|
|
726
|
+
- Latest release: v2.7.30 (auto-shipped at 06:00 UTC earlier today, 2 commits: read_file per-slot dedup cache + bash truncation notice)
|
|
727
|
+
- Admiral last 500 entries: struggle:none ×82, struggle:write_file ×38, struggle:search_replace ×27, loop:bash ×14 — all expected for Perf: block; retry_after_error:read_file only ×1 (not actionable)
|
|
728
|
+
- Action this tick: no action — all services healthy, harness 84% complete, no new actionable drydock bugs found
|
|
729
|
+
|
|
730
|
+
## 2026-05-02 05:30 UTC tick
|
|
731
|
+
- Stress: 1415/1658 (PID 675181, run 1 day 14h); progressing through "Perf:" block
|
|
732
|
+
- Write rate: 26% (last 89 prompts) — expected low; "Perf: cache/lazy-load/memoize" prompts are advisory, model rarely writes files
|
|
733
|
+
- Admiral last 30 min: retry_after_error:grep (Unmatched paren) fired 3 times since midnight; loop:grep fired twice — known pattern where model sends "def run(self," without escaping
|
|
734
|
+
- vLLM 400s: 0
|
|
735
|
+
- GH issues: 0 open
|
|
736
|
+
- Latest release: v2.7.30
|
|
737
|
+
- Action this tick: committed fix(grep) b79325f — _validate_args now runs re.compile() on pattern before subprocess invocation; on invalid regex raises ToolError with Python re.error message + re.escape() literal suggestion so model can immediately retry with correct pattern instead of looping. 3 regression tests added. Auto-release will ship v2.7.31 at next 0/6/12/18 UTC tick.
|
|
738
|
+
|
|
739
|
+
## 2026-05-02 06:01 UTC tick
|
|
740
|
+
- Stress: 1430/1658 on log stress_2000_v10_restart_1777561483 (PID 675181, running 1d 14h); the 680/1658 reading from earlier was from a stale log; harness babysitter relaunched and is near completion
|
|
741
|
+
- Write rate: 24% last 100 prompts — mostly "Perf:" and "API:" prompts that legitimately generate 0 writes (model answers without coding); not a regression
|
|
742
|
+
- Admiral last 30 min: loop:bash x2, loop:grep x1, empty_after_tool:ralph_repo_index x2, struggle:search_replace x2 — all known model-behavior patterns; no new failure types
|
|
743
|
+
- vLLM 400s: 0
|
|
744
|
+
- GH issues: 0 open
|
|
745
|
+
- Latest release: v2.7.30; grep fix (b79325f) awaiting v2.7.31 at 06:00 CDT auto_release
|
|
746
|
+
- Action this tick: no action — healthy; stress nearing completion, grep fix pending shipment
|
|
747
|
+
|
|
748
|
+
## 2026-05-02 06:32 UTC tick
|
|
749
|
+
- Stress: 1441/1658 (87%) — PID 675181 alive 1d 15h; active log stress_2000_v10_restart_1777561483 (last write 1 min ago); "Perf:" + "API:" block; ~217 prompts remain
|
|
750
|
+
- Write rate: 23% last 89 prompts — expected for Perf: advisory block (model explains caching strategies, rarely writes files)
|
|
751
|
+
- vLLM 400s: 0 — gemma4 container up 8 days; llm_balancer PID 713929 on :8001 healthy
|
|
752
|
+
- GH issues: 0 open
|
|
753
|
+
- Latest release: v2.7.30; grep validation fix (b79325f) unreleased, awaiting v2.7.31 at next auto_release (12:00 UTC)
|
|
754
|
+
- Admiral last 30 min: loop:bash x4 (model looping concurrent.futures benchmark), retry_after_error:grep x2 (unmatched paren — fixed by b79325f not yet shipped), loop:grep x2 — all known model-behavior patterns
|
|
755
|
+
- Action this tick: no action — all services healthy, stress 87% complete, grep fix pending shipment
|
|
756
|
+
|
|
757
|
+
## 2026-05-02 07:02 UTC tick
|
|
758
|
+
- Stress: 1447/1658 (87%) — PID 675181 alive 1d 15h; active log stress_2000_v10_restart_1777561483; 162 SKIPs (TUI slow during Perf/API block), 329 retries
|
|
759
|
+
- Write rate: 22% last 89 prompts — expected low; "Perf: cache/memoize/lazy-load/batch-writes" prompts are advisory-only, model explains without writing files
|
|
760
|
+
- vLLM 400s: 0; llm_balancer PID 713929 on :8001 healthy; gemma4 container up 8+ days
|
|
761
|
+
- GH issues: 0 open
|
|
762
|
+
- Latest release: v2.7.30; grep validation fix (b79325f) unreleased, pending v2.7.31 at 12:00 UTC auto_release
|
|
763
|
+
- Admiral last 30 min: loop:bash x6 (model stuck on concurrent.futures benchmark, same command every ~50s 06:28–06:33 UTC) — model-behavior, not a drydock bug; retry_after_error:grep x3 (unescaped paren — will be resolved by b79325f post-shipment)
|
|
764
|
+
- Action this tick: no action — all services healthy, stress 87% complete, no new actionable drydock bugs
|
|
765
|
+
|
|
766
|
+
## 2026-05-02 07:32 UTC tick
|
|
767
|
+
- Stress: 1466/1658 (88%) — PID 675181 alive; active log stress_2000_v10_restart_1777561483; in "Perf:" + "API:" block; ~192 prompts remaining
|
|
768
|
+
- Write rate: 20% last 89 prompts — expected for Perf:/API: advisory block (model explains strategies without writing files)
|
|
769
|
+
- vLLM 400s: 0 — gemma4 container healthy; llm_balancer PID 713929 on :8001 healthy
|
|
770
|
+
- GH issues: 0 open
|
|
771
|
+
- Latest release: v2.7.30; grep validation fix (b79325f) + search_replace first-failure hint (516d0c6) both unreleased, will auto-ship as v2.7.31 at next 0/6/12/18 UTC tick
|
|
772
|
+
- Action this tick: committed fix(search_replace) 516d0c6 — file head now embedded on first search-not-found failure (count=1) so model can immediately see actual content and adjust, instead of blindly retrying; previously file head was only shown at count=2. 4 regression tests added. Also fixed test file to use correct SearchReplaceArgs (file_path/content fields) and async tool.run() API — the test was written with wrong constructor args (file/diff, InvokeContext(cwd=)) that never matched the actual codebase.
|
|
773
|
+
|
|
774
|
+
## 2026-05-02 08:30 UTC tick
|
|
775
|
+
- Stress: 1473/1658 (88.8%), PID 675181 healthy (1d 17h elapsed, resumed from step 679)
|
|
776
|
+
- Write rate: 21% last 90 prompts — expected for "Integrate: X" advisory block (Slack/Discord/Datadog/etc., model explains integration without writing files)
|
|
777
|
+
- Admiral last 30 min: 0 fires (no new admiral patterns observed)
|
|
778
|
+
- vLLM 400s: 0 — gemma4 container healthy; llm_balancer PID 713929 on :8001 healthy
|
|
779
|
+
- GH issues: 0 open
|
|
780
|
+
- Action this tick: no fix committed — 08:00 UTC tick already committed 516d0c6 and b79325f; system healthy; skip rate ~17% (134/781) is stable, caused by TUI log hitting 1.24GB slowing PTY tail checks, expected to self-resolve as run finishes in ~2h
|
|
781
|
+
|
|
782
|
+
## 2026-05-02 09:02 UTC tick
|
|
783
|
+
- Stress: 1482/1658 (89.4%) — PID 675181 alive (1d 17h elapsed); active log stress_2000_v10_restart_1777561483; 139 SKIPs total, 52 TUI recycles
|
|
784
|
+
- Write rate: 23% last 90 prompts — expected for "Integrate: X" advisory block (Slack/Datadog/Vercel/OCI/etc., model explains integrations without writing files)
|
|
785
|
+
- vLLM 400s: 0 — gemma4 container healthy; llm_balancer PID 713929 on :8001 healthy (1d 14h uptime)
|
|
786
|
+
- GH issues: 0 open
|
|
787
|
+
- Admiral last 30 min: skip-cluster alerts (10-13 skips/34 prompts), tui-recycle-requested x5 between 08:08-09:00 UTC — all caused by large TUI log (1.28GB) slowing PTY detection; model-behavior patterns (loop:bash, retry_after_error:search_replace) but no new drydock bug class
|
|
788
|
+
- Latest release: v2.7.30; two unreleased fixes pending (b79325f grep validation + 516d0c6 search_replace first-failure hint) — will auto-ship as v2.7.31 at 11:00 UTC
|
|
789
|
+
- Action this tick: no fix committed — skip cluster is harness/log-size issue not drydock bug; all services healthy; ~176 prompts remaining (~10h at current pace)
|
|
790
|
+
|
|
791
|
+
## 2026-05-02 09:32 UTC tick
|
|
792
|
+
- Stress: 1498/1658 (90.3%) — PID 675181 alive (1d 18h elapsed, resumed from step 679); 139 SKIPs, 52 TUI recycles; ~160 prompts remaining
|
|
793
|
+
- Write rate: 30% last 100 prompts (18% overall) — expected: "Integrate: X" block (Slack/Datadog/Opsgenie/Honeycomb/PagerDuty, model explains integrations without writing files)
|
|
794
|
+
- vLLM 400s: 0 — gemma4 container healthy; llm_balancer PID 713929 on :8001 healthy
|
|
795
|
+
- GH issues: 0 open
|
|
796
|
+
- Admiral last 30 min: skip-cluster alerts (9-13 skips/34 prompts) + tui-recycle-requested x5; empty_after_tool:ralph_file_summary observed — model hallucinating non-existent summary tool causing stalls
|
|
797
|
+
- Action this tick: committed fix(hallucinated-tools) bf9f0e2 — added ralph_file_summary, file_summary, repo_summary to _IGNORE_TOOLS so they get suppressed with redirect instead of visible FailedToolCall error; 15 regression tests pass; will ship as v2.7.31 at 12:00 UTC auto_release
|
|
798
|
+
|
|
799
|
+
## 2026-05-02 10:02 UTC tick
|
|
800
|
+
- Stress: 1508/1658 (91.0%) — PID 675181 alive (1d 18h elapsed, resumed from step 679); active log stress_2000_v10_restart_1777561483; ~178 SKIPs (21%), consistent with prior ticks
|
|
801
|
+
- Write rate: 34% last 100 prompts — expected variation in "Integrate: X" block (Docker/OCI/Singularity/CI/monitoring prompts; model explains integration strategy without writing files)
|
|
802
|
+
- vLLM 400s: 0 — gemma4 container up 8 days; llm_balancer PID 713929 on :8001 healthy; no JSONDecodeErrors last 30 min
|
|
803
|
+
- GH issues: 0 open
|
|
804
|
+
- Admiral last 30 min: no banner=True, raw_md=0 — no write loops or raw-markdown dumps; skip cluster continuing from prior ticks (TUI log ~1.31GB, PTY tail slow)
|
|
805
|
+
- Unreleased commits since v2.7.30: 3 (bf9f0e2 ralph_file_summary suppression, 516d0c6 search_replace first-failure hint, b79325f grep validation) — will auto-ship as v2.7.31 at 12:00 UTC
|
|
806
|
+
- Action this tick: no fix committed — no new drydock bug class observed; all services healthy; ~150 prompts remaining, run likely completes before 18:00 UTC
|
|
807
|
+
|
|
808
|
+
## 2026-05-02 10:31 UTC tick
|
|
809
|
+
- Stress: 1528/1658 (92% complete); harness PID 675181 alive, running since 1d19h; 130 prompts remain, likely finishes this hour
|
|
810
|
+
- Write rate: 35% last 100 (lower than 74% peak; "Integrate: X" prompts in this range yield 0 writes — expected model behavior, not a regression)
|
|
811
|
+
- Skip rate: 143/1528 = 9.4% (stable, within prior range; all "TUI did not accept after 3 retries")
|
|
812
|
+
- vLLM 400s: 0 — gemma4 container healthy; balancer PID 713929 on :8001 unchanged
|
|
813
|
+
- GH issues: 0 open
|
|
814
|
+
- Unreleased commits since v2.7.30: 3 (bf9f0e2 hallucinated-tools, 516d0c6 search_replace hint, b79325f grep validation) — auto-ships as v2.7.31 at 12:00 UTC
|
|
815
|
+
- Action this tick: no fix committed — no new drydock bug class observed; all services healthy; run close to completion
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
2123904
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|