drydock-cli 2.6.85__tar.gz → 2.6.86__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.6.86/.auto_release.lock +1 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/PKG-INFO +1 -1
- drydock_cli-2.6.86/PRD.md +413 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/agent_loop.py +21 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/pyproject.toml +1 -1
- drydock_cli-2.6.86/scripts/stress_prompts_tool_agent.txt +222 -0
- drydock_cli-2.6.86/scripts/stress_shakedown.py +279 -0
- drydock_cli-2.6.85/.auto_release.lock +0 -1
- drydock_cli-2.6.85/PRD.md +0 -216
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.claude/scheduled_tasks.lock +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.gitignore +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.python-version +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.typos.toml +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.vscode/extensions.json +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.vscode/launch.json +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/.vscode/settings.json +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/AGENTS.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/BASELINE_412.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/CHANGELOG.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/CLAUDE.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/Drydock_rebrand.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/LICENSE +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/MODEL_SHORTCOMINGS.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/NOTICE +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/OVERNIGHT_REPORT_2026_04_13.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/README.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/action.yml +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/README.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results1.tsv +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results13.tsv +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results14.tsv +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results15.tsv +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results16.tsv +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results17.tsv +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results18.tsv +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results19.tsv +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results2.tsv +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results20.tsv +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results3.tsv +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results4.tsv +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results5.tsv +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results6.tsv +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results7.tsv +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results8.tsv +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results9.tsv +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/baseline_history/results_evolved_v1.tsv +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/docs/README.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/docs/acp-setup.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/config/doctor.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/logger.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/gemma4.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/slug.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/types.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/core/utils.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/audit-tests/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/strong-tests/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock/whats_new.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock-acp.spec +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/drydock_terms.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/flake.lock +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/flake.nix +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/README.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/audit_sampler.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/auto_generate_tests.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/auto_release.sh +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/auto_test_loop.sh +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/backup.sh +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/bump_version.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/comprehensive_loop.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/discover_cli_tools.sh +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/evolve_tests.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/install.sh +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/llm_balancer.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/mega_loop.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/meta_ralph_loop.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/monitor_swebench.sh +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/monitor_test_battery.sh +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/notify_release.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/oss_task_harness.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/overnight_agents_test.sh +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/port_task.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/prepare_release.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/ralph_loop.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/session_loop_audit.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/shakedown.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/shakedown_interactive.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/shakedown_regression.sh +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/shakedown_suite.sh +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/shakedown_variance.sh +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/test_bank.sh +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/test_full.sh +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/test_smoke.sh +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/test_tui_path.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/tui_test.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/scripts/vllm_failover.sh +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/conftest.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/e2e/common.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/mock/utils.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/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.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_agents.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_integration.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_message_id.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_middleware.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_smoke.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/test_workloads.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/uv.lock +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/worked_examples/README.md +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/worked_examples/cli_subcommand_dispatch.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/worked_examples/lookup.json +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/worked_examples/sql_parser.py +0 -0
- {drydock_cli-2.6.85 → drydock_cli-2.6.86}/worked_examples/tree_walking_interpreter.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1454502
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 2.6.
|
|
3
|
+
Version: 2.6.86
|
|
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
|
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
# DryDock — Local CLI Coding Agent
|
|
2
|
+
|
|
3
|
+
**Repository:** https://github.com/fbobe321/drydock
|
|
4
|
+
**PyPI:** https://pypi.org/project/drydock-cli/ (v2.6.85)
|
|
5
|
+
**License:** Apache 2.0 (fork of [mistralai/mistral-vibe](https://github.com/mistralai/mistral-vibe))
|
|
6
|
+
|
|
7
|
+
## Vision
|
|
8
|
+
|
|
9
|
+
Best-in-class local coding agent. Build, debug, and ship software using local
|
|
10
|
+
LLMs on consumer hardware — and **prove it actually works** with a test
|
|
11
|
+
harness that drives the real TUI like a real user, not a tool-call counter.
|
|
12
|
+
|
|
13
|
+
## Current Status
|
|
14
|
+
|
|
15
|
+
- **Active model:** Gemma 4 26B-A4B-it-AWQ-4bit (MoE, 4B active params per
|
|
16
|
+
token, ~70 tok/s) via vLLM Docker on 2x RTX 4060 Ti 16GB
|
|
17
|
+
- **Version:** 2.6.85 on PyPI. Major refactor wave (v2.6.79 → v2.6.85)
|
|
18
|
+
moved the loop-prevention model from hard `ToolError` blocks to
|
|
19
|
+
advisory-result + structural prevention (read-before-write, read dedup,
|
|
20
|
+
terse results, token sanitization, system-reminder framing). Most of
|
|
21
|
+
this is borrowed wholesale from a reading of the Claude Code source
|
|
22
|
+
tree — ideas, not code.
|
|
23
|
+
- **Users can:** build projects from PRDs, fix bugs, review code, refactor
|
|
24
|
+
— through the TUI only (headless mode is gone)
|
|
25
|
+
|
|
26
|
+
## How drydock is tested now
|
|
27
|
+
|
|
28
|
+
The `scripts/tui_test.py` and `core_tests_real.sh` harnesses count tool
|
|
29
|
+
calls and `--help` exit codes. They reported 80% pass rates while real
|
|
30
|
+
users saw drydock loop, hang, and produce broken code. **Both are
|
|
31
|
+
deprecated** in favour of `scripts/shakedown.py`, which:
|
|
32
|
+
|
|
33
|
+
- Drives the real `drydock` TUI via pexpect (no headless code paths)
|
|
34
|
+
- Polls the live `~/.vibe/logs/session/session_<id>/messages.jsonl` in
|
|
35
|
+
parallel to see what the model is actually doing
|
|
36
|
+
- Watches for **write loops** (≥3 identical-content writes to a path),
|
|
37
|
+
**hallucinated tool names** that hang the session, **search_replace
|
|
38
|
+
failure cascades**, and **dead silence** (no new messages of any kind
|
|
39
|
+
for 120 seconds)
|
|
40
|
+
- Types simulated `STOP` interrupts when it detects loops and tracks
|
|
41
|
+
whether the model OBEYS them
|
|
42
|
+
- Distinguishes three end-states: active turn, model declared done
|
|
43
|
+
(text response with no tool call), and dead silence
|
|
44
|
+
- Resets the cwd between runs (restores `PRD.md` from `PRD.master.md`,
|
|
45
|
+
wipes the package dir and stale data dirs) so contamination from one
|
|
46
|
+
run can't poison the next
|
|
47
|
+
- Auto-handles the "Trust this folder?" dialog drydock pops on new
|
|
48
|
+
directories
|
|
49
|
+
- **Pass criteria are user-perceptible**: no loops, no ignored
|
|
50
|
+
interrupts, no search_replace cascades, the package must actually
|
|
51
|
+
execute, session must finish under the time budget
|
|
52
|
+
|
|
53
|
+
Run a single project:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
PYTHONUNBUFFERED=1 python3 -u scripts/shakedown.py \
|
|
57
|
+
--cwd /data3/test_drydock \
|
|
58
|
+
--prompt "review the PRD and get started" \
|
|
59
|
+
--pkg doc_qa_system
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Run the 10-project core suite (or 3-run variance suite for stability):
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
bash scripts/shakedown_suite.sh # one run, ~25 min
|
|
66
|
+
bash scripts/shakedown_variance.sh 3 # three runs, ~75 min
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
For longer-form regression (what the single-prompt suite cannot catch):
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# 24-step interactive conversation per medium-hard PRD (30+ min each)
|
|
73
|
+
python3 scripts/shakedown_interactive.py \
|
|
74
|
+
--cwd /data3/drydock_test_projects/403_tool_agent \
|
|
75
|
+
--pkg tool_agent
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
The single-prompt suite catches block-loops, hallucinated tools, and
|
|
79
|
+
first-turn dead silence. Interactive shakedown exposes slow-drift
|
|
80
|
+
oscillation, thinking-stall between file writes, search_replace
|
|
81
|
+
cascades that only appear after several edits, and the cost of
|
|
82
|
+
echoing back content the model already wrote. Both are needed.
|
|
83
|
+
|
|
84
|
+
## Features
|
|
85
|
+
|
|
86
|
+
### Core
|
|
87
|
+
- 24 builtin tools (bash, grep, read_file, write_file, search_replace,
|
|
88
|
+
glob, todo, ask_user_question, invoke_skill, worktree, etc.)
|
|
89
|
+
- 7 bundled skills (/investigate, /review, /ship, /batch, /simplify,
|
|
90
|
+
/deep-research, /create-presentation)
|
|
91
|
+
- Multi-agent delegation (explore, diagnostic, planner subagents)
|
|
92
|
+
- Plan→Edit workflow (Mistral's designed pattern)
|
|
93
|
+
- AGENTS.md support (cross-tool standard, auto-created — same file works
|
|
94
|
+
with Claude Code, opencode, drydock, Aider)
|
|
95
|
+
- Textual TUI with wave spinner, message queuing
|
|
96
|
+
|
|
97
|
+
### Local Model Support
|
|
98
|
+
- `/setup-model` command (vLLM, Ollama, LM Studio, custom)
|
|
99
|
+
- `--local` CLI flag for quick setup
|
|
100
|
+
- Auto-detect model name from server
|
|
101
|
+
- **`slim_system_prompt`** config knob — drops the ~10K-token inlined
|
|
102
|
+
tool prompt files + skills + subagents lists for local models that
|
|
103
|
+
pay 7-12 ms per prefill token. Verified on Gemma 4: takes
|
|
104
|
+
first-turn latency from 60-120 s to 10-20 s on the dead-silence cases.
|
|
105
|
+
|
|
106
|
+
### Safety — advisory only, never blocks the TUI
|
|
107
|
+
After a regression in v2.6.79/v2.6.80 where hard `ToolError` blocks
|
|
108
|
+
caused the tool to refuse legitimate retries and spin the TUI in its
|
|
109
|
+
own block-loop, all loop-breakers are now structured returns with
|
|
110
|
+
guidance messages. Nothing here can stop the session. The full rule
|
|
111
|
+
is codified in memory as
|
|
112
|
+
`feedback_no_tool_errors_for_loop_detection.md`.
|
|
113
|
+
|
|
114
|
+
- Tool permission system (always/ask/never per tool)
|
|
115
|
+
- Loop detection wired into `_handle_tool_response()` — injects an
|
|
116
|
+
advisory nudge when the same tool call repeats, never stops the
|
|
117
|
+
session
|
|
118
|
+
- **Read-before-Write / Read-before-Edit** (Claude Code tool contract).
|
|
119
|
+
`write_file` and `search_replace` on an existing file the model has
|
|
120
|
+
NOT read this session return a structured no-op with a
|
|
121
|
+
`<system-reminder>` telling it to `read_file` first. After a
|
|
122
|
+
successful write or read, the session's `read_file_state` dict is
|
|
123
|
+
updated so chained operations pass without a re-read. mtime-based
|
|
124
|
+
staleness check also triggers the advisory when the file changed
|
|
125
|
+
on disk between the read and the write.
|
|
126
|
+
- **Read dedup stub** — `read_file` on a path+offset+limit with
|
|
127
|
+
unchanged mtime since the earlier read in this session returns a
|
|
128
|
+
`<system-reminder>` pointing to the earlier tool_result instead of
|
|
129
|
+
burning context re-reading.
|
|
130
|
+
- **Dedup advisories** on `write_file` — escalating text if the model
|
|
131
|
+
sends identical content to an existing file, including directory
|
|
132
|
+
listing and per-path write count. All advisory, no ToolError.
|
|
133
|
+
- **Syntax-error context** — when a Python write fails `ast.parse`, the
|
|
134
|
+
warning embeds ±3 surrounding source lines so the model can see the
|
|
135
|
+
structural mistake, not just the error message. Consecutive-error
|
|
136
|
+
counter escalates guidance at 2+ and 3+ but never blocks.
|
|
137
|
+
- **`<system-reminder>` framing** on every high-signal advisory — the
|
|
138
|
+
model attends to these more consistently than plain result text.
|
|
139
|
+
- **Centralized `safe_parse_tool_args`** — handles Gemma-4 leaked
|
|
140
|
+
thinking-token markers (`<|channel>...`, `<|tool_call>...`, orphan
|
|
141
|
+
`\Fix`-style escapes that abort the stdlib JSON decoder). Used at
|
|
142
|
+
every tool-arg JSON decode site so no call path can crash on leaked
|
|
143
|
+
escapes. Falls through to `{"_parse_error": "..."}` as the last
|
|
144
|
+
resort.
|
|
145
|
+
- **Terse tool results** (Claude Code pattern). `write_file` returns
|
|
146
|
+
just `"File X updated successfully (N bytes)."` — no echo of
|
|
147
|
+
`args.content`. A 3KB write no longer adds 3KB of redundant context.
|
|
148
|
+
Prevents the "model re-reads what it just wrote" class of loops.
|
|
149
|
+
- **Token-level loop-breaker** in agent_loop — temperature bump +
|
|
150
|
+
`frequency_penalty` + `presence_penalty` + fresh seed when
|
|
151
|
+
`_check_tool_call_repetition()` detects repeat signatures. Heavier
|
|
152
|
+
bumps at FORCE_STOP threshold.
|
|
153
|
+
- **Gemma-4 auto-disabled tools** — `task` (subagent delegation),
|
|
154
|
+
`task_create`, `task_update`, `task_list`, `ask_user_question`,
|
|
155
|
+
`invoke_skill`, `tool_search`. Model mixed `task` up with `todo`
|
|
156
|
+
and the subagent response leaked raw thinking tokens that hung the
|
|
157
|
+
parent session. Filtered out in `ToolManager.available_tools` when
|
|
158
|
+
the active model name contains "gemma".
|
|
159
|
+
- **`_check_main_module_entry()`** catches `__main__.py` files that
|
|
160
|
+
import `main` but never call it (the codec silent-exit bug)
|
|
161
|
+
- **`_check_missing_sibling_imports()`** catches `from .x import Y`
|
|
162
|
+
when `x.py` doesn't exist on disk yet (the minivc unimportable-
|
|
163
|
+
package bug)
|
|
164
|
+
- **`_check_stub_classes()`** catches the lang_interp anti-pattern
|
|
165
|
+
where the model writes `class Interpreter: pass` inline in cli.py
|
|
166
|
+
to silence ModuleNotFoundError instead of writing the real module
|
|
167
|
+
- **`_check_bare_raise_outside_except()`** — surfaces bare `raise`
|
|
168
|
+
in function bodies outside an except handler (real bug from the
|
|
169
|
+
ACE v2 build)
|
|
170
|
+
- API error auto-recovery (retry after 10s)
|
|
171
|
+
- `auto_release.sh` and `watchdog.sh` cron jobs respect pause flags
|
|
172
|
+
at `.pause_auto_release` and `.pause_watchdog` for manual debugging
|
|
173
|
+
|
|
174
|
+
### Read-only bash auto-accept
|
|
175
|
+
The bash tool's default allowlist now covers most read-only commands
|
|
176
|
+
without requiring per-user configuration:
|
|
177
|
+
|
|
178
|
+
- File/dir inspection: `ls`, `cat`, `head`, `tail`, `wc`, `file`,
|
|
179
|
+
`stat`, `pwd`, `which`, `basename`, `dirname`, `realpath`, `readlink`
|
|
180
|
+
- Search: `grep`, `rg`, `fd`, `fdfind`, `ag`, `find`, `tree`
|
|
181
|
+
- Text processing: `diff`, `cmp`, `sort`, `uniq`, `awk`, `cut`, `tr`
|
|
182
|
+
- Git read-only: `git diff`, `git log`, `git status`, `git show`,
|
|
183
|
+
`git branch`, `git ls-files`, `git grep`, `git remote`,
|
|
184
|
+
`git rev-parse`, `git blame`, `git config --get`, `git tag`,
|
|
185
|
+
`git stash list`
|
|
186
|
+
- System info: `date`, `id`, `hostname`, `env`, `printenv`, `du`,
|
|
187
|
+
`df`, `ps`, `free`, `uptime`, `uname`, `whoami`
|
|
188
|
+
- Python dev: `pip install/list/show/freeze/check`, `conda
|
|
189
|
+
list/info/env list`, `python -c`, `python -m pip`, `pytest`, `make`,
|
|
190
|
+
`tox`
|
|
191
|
+
|
|
192
|
+
Bash commands are AST-split so pipes/chains are each checked
|
|
193
|
+
individually — `ls | rm` still blocks on the `rm`.
|
|
194
|
+
|
|
195
|
+
### Config debt management
|
|
196
|
+
Package defaults ship in code, but user `~/.drydock/config.toml` is
|
|
197
|
+
mutable. When `pip install -U drydock-cli` adds new defaults (new
|
|
198
|
+
allowlist entries, etc.), users who'd customized the field previously
|
|
199
|
+
lost the new additions. Fixed two ways:
|
|
200
|
+
|
|
201
|
+
- **Option A — auto-merge** (`bash.allowlist`, `bash.denylist`,
|
|
202
|
+
`bash.denylist_standalone`): user values are UNIONED with package
|
|
203
|
+
defaults at load time, so new package defaults auto-propagate.
|
|
204
|
+
Escape hatch: include `"__override__"` in the list to use it
|
|
205
|
+
verbatim and skip defaults.
|
|
206
|
+
- **Option C — `drydock --doctor`** command shows drift vs. current
|
|
207
|
+
defaults in a rich table. `drydock --doctor --fix` rewrites
|
|
208
|
+
`config.toml` to union missing defaults with a `.bak` backup.
|
|
209
|
+
Verified end-to-end on the project maintainer's config: 51 missing
|
|
210
|
+
defaults detected, applied, re-run reports clean.
|
|
211
|
+
|
|
212
|
+
## Install
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
pip install drydock-cli
|
|
216
|
+
drydock --local http://localhost:8000/v1
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
For Gemma 4 / vLLM users, add this to `~/.drydock/config.toml` to drop
|
|
220
|
+
the system prompt bloat:
|
|
221
|
+
|
|
222
|
+
```toml
|
|
223
|
+
slim_system_prompt = true
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## Per-Project Instructions
|
|
227
|
+
|
|
228
|
+
DryDock loads instructions from these files in the project root, in
|
|
229
|
+
order:
|
|
230
|
+
|
|
231
|
+
- **AGENTS.md** — Cross-tool standard (recommended). Same file works
|
|
232
|
+
with Claude Code, opencode, drydock, Aider, and other coding agents.
|
|
233
|
+
- **DRYDOCK.md** — Legacy / drydock-only. Kept for backward compat;
|
|
234
|
+
prefer AGENTS.md for new projects.
|
|
235
|
+
- **.drydock/rules/*.md** — Modular rules
|
|
236
|
+
|
|
237
|
+
Auto-created if none exist. AGENTS.md is essential for devstral
|
|
238
|
+
(it loops without one) but Gemma 4 works without it.
|
|
239
|
+
|
|
240
|
+
## Recent fixes (April 13–14, 2026)
|
|
241
|
+
|
|
242
|
+
### v2.6.79 (April 13) — syntax-thrash loop-breaker
|
|
243
|
+
Added ToolError on 3rd consecutive syntax-error write to same file.
|
|
244
|
+
Caught color_converter's 38-consecutive-bad-writes case in a single
|
|
245
|
+
shakedown run.
|
|
246
|
+
|
|
247
|
+
### v2.6.80 (April 14) — cumulative path-write gate
|
|
248
|
+
Added ToolError at 5 writes to the same path regardless of content,
|
|
249
|
+
to catch the write_file ↔ search_replace ping-pong pattern in minivc
|
|
250
|
+
(model wrote `commands/__init__.py` 11 times, each clobbering a
|
|
251
|
+
search_replace fix).
|
|
252
|
+
|
|
253
|
+
### v2.6.81 (April 14) — Gemma 4 auto-disable + leak-token stripping
|
|
254
|
+
- `ToolManager.available_tools` now filters `task`/`todo`-family tools
|
|
255
|
+
when the active model name matches "gemma" — Gemma 4 confuses
|
|
256
|
+
`task` (subagent) with `todo` and the subagent response leaks raw
|
|
257
|
+
`<|tool_call>` markers that hang the parent session.
|
|
258
|
+
- Broadened thinking-token stripping in `process_api_response_message`:
|
|
259
|
+
handles bare `<|tool_call>...<tool_call|>`, stray `<|"|>`, unpaired
|
|
260
|
+
`<|...|>` from stream truncation, and nukes content to `None` when
|
|
261
|
+
the residue is just `call:toolname{...}` garbage so the agent
|
|
262
|
+
loop's empty-content nudge can fire.
|
|
263
|
+
|
|
264
|
+
### v2.6.82 (April 14) — REVERT all hard blocks to advisory
|
|
265
|
+
User reported: "it is trying to write a file or update something,
|
|
266
|
+
blocked... these loops make the tool unusable... little short tasks
|
|
267
|
+
you don't see it. Do anything that takes a while, many steps, and
|
|
268
|
+
it can't get through it."
|
|
269
|
+
|
|
270
|
+
The v2.6.79/v2.6.80 ToolErrors were making long tasks worse — model
|
|
271
|
+
got BLOCKED on one write, panicked, retried the same write, got
|
|
272
|
+
BLOCKED again, spun until timeout. Per the existing CLAUDE.md rule
|
|
273
|
+
"safety mechanisms must be advisory not blocking," reverted all
|
|
274
|
+
loop-breaker ToolErrors to structured WriteFileResult /
|
|
275
|
+
SearchReplaceResult / BashResult with strong guidance text. Memory
|
|
276
|
+
updated: `feedback_no_tool_errors_for_loop_detection.md`.
|
|
277
|
+
|
|
278
|
+
Also shipped in v2.6.82:
|
|
279
|
+
- `safe_parse_tool_args` sanitizer for `tool_call.arguments` —
|
|
280
|
+
Gemma-4 leak tokens inside JSON strings (e.g. `"<|\Fix"`) make
|
|
281
|
+
`\F` an invalid JSON escape and crash the decoder.
|
|
282
|
+
- TUI reasoning widget no longer finalizes on `ToolCallEvent` — a
|
|
283
|
+
turn with N tool calls was producing N stacked "Thought" widgets.
|
|
284
|
+
Now one "Thought" spans the full turn.
|
|
285
|
+
|
|
286
|
+
### v2.6.83 (April 14) — Claude Code tool contract
|
|
287
|
+
Second review of `/data3/claude-code/src` produced the real loop
|
|
288
|
+
fixes. Borrowed patterns (ideas only, no code copied):
|
|
289
|
+
|
|
290
|
+
- `read_file_state` dict on `AgentLoop`, passed through `InvokeContext`
|
|
291
|
+
to every tool. Session-scoped map of path → `{content, timestamp,
|
|
292
|
+
offset, limit}`.
|
|
293
|
+
- Read-before-Write in `write_file`: overwriting an existing unread
|
|
294
|
+
file yields a structured no-op with a `<system-reminder>` telling
|
|
295
|
+
the model to `read_file` first.
|
|
296
|
+
- Read-before-Edit in `search_replace`: same contract for SR.
|
|
297
|
+
- Read dedup stub in `read_file`: same path+offset+limit with
|
|
298
|
+
unchanged mtime returns `<system-reminder>` pointing to earlier
|
|
299
|
+
tool_result instead of re-reading.
|
|
300
|
+
- `<system-reminder>` framing on dedup/syntax/oscillation advisories.
|
|
301
|
+
- Read-only bash auto-accept: 30+ new safe commands in the default
|
|
302
|
+
allowlist (`rg`, `grep`, `fd`, `git show`/`branch`/`ls-files`, etc.).
|
|
303
|
+
- Config A + C: `bash.allowlist`/`denylist` auto-merge user values
|
|
304
|
+
with package defaults on load; `drydock --doctor [--fix]` command
|
|
305
|
+
reports and repairs config drift.
|
|
306
|
+
|
|
307
|
+
### v2.6.84 (April 14) — entrypoint hotfix
|
|
308
|
+
My duplicate `from ... import init_harness_files_manager` inside the
|
|
309
|
+
`--doctor` branch in `entrypoint.py` shadowed the module-level import
|
|
310
|
+
as a local variable, triggering `UnboundLocalError` on every
|
|
311
|
+
non-doctor drydock invocation. Broke v2.6.83 completely. Fixed by
|
|
312
|
+
dropping the redundant import.
|
|
313
|
+
|
|
314
|
+
The tail-end of the v2.6.83 shakedown suite (`csv_sorter`,
|
|
315
|
+
`makefile_gen`, `json_pipeline`) all showed 7-second 0-message
|
|
316
|
+
sessions — all of those were this crash, not real loop regressions.
|
|
317
|
+
|
|
318
|
+
### v2.6.85 (April 14) — terse results + centralized sanitizer
|
|
319
|
+
Second claude-code pass produced two more wins:
|
|
320
|
+
|
|
321
|
+
- Centralized `safe_parse_tool_args` helper — used in
|
|
322
|
+
`format.parse_message` AND `anthropic._convert_tool_call` (the
|
|
323
|
+
Anthropic backend previously had bare `json.loads` that could
|
|
324
|
+
crash on the same leak-token class of bugs).
|
|
325
|
+
- Terse tool-result content: `write_file` used to echo the full
|
|
326
|
+
`args.content` back in `result.content` — every successful 3KB
|
|
327
|
+
write added 3KB of redundant context, and the model re-reading
|
|
328
|
+
that blob was a documented oscillation trigger. Now returns
|
|
329
|
+
`"File X updated successfully (N bytes)."` Similar for
|
|
330
|
+
`search_replace`.
|
|
331
|
+
|
|
332
|
+
### Earlier (v2.5.x–v2.6.78)
|
|
333
|
+
- `slim_system_prompt` config knob — dropped first-turn latency on
|
|
334
|
+
Gemma 4 from 60-120s to 10-20s
|
|
335
|
+
- Trust dialog auto-dismissal in shakedown.py
|
|
336
|
+
- PRD reset between shakedown runs with PRD.master.md canary
|
|
337
|
+
- `_task_manager.py` rename (underscore prefix excludes from tool
|
|
338
|
+
discovery)
|
|
339
|
+
- `auto_release.sh` fail-loud on token errors
|
|
340
|
+
- `_check_tool_call_repetition` wired into `_handle_tool_response`
|
|
341
|
+
- `_truncate_old_tool_results` proactive shrinkage
|
|
342
|
+
|
|
343
|
+
## Roadmap
|
|
344
|
+
|
|
345
|
+
### Near-term (loop-prevention backlog)
|
|
346
|
+
Ideas catalogued after the 2nd Claude Code source review. All shipped
|
|
347
|
+
ideas are in "Safety" above; the list below is what's next, ordered
|
|
348
|
+
by bang-for-buck:
|
|
349
|
+
|
|
350
|
+
1. **Stop-sequences for leak tokens** — add `<|channel>`,
|
|
351
|
+
`<|tool_call>`, `<|"|>` as vLLM stop-sequences so generation halts
|
|
352
|
+
before a leaked marker lands in the stream. Kills a class of
|
|
353
|
+
JSON-decode + rendering issues at the tokenizer.
|
|
354
|
+
2. **Ping-pong detection** — `write(X) → search_replace(X) → write(X)`
|
|
355
|
+
within K turns injects "Pick ONE approach: full rewrite or surgical
|
|
356
|
+
edit." Addresses the exact minivc case that v2.6.80 tried to fix
|
|
357
|
+
with a hard block.
|
|
358
|
+
3. **Read-after-write stub** — if `read_file(X)` comes within K turns
|
|
359
|
+
of `write_file(X)` with mtime unchanged, return stub instead of
|
|
360
|
+
the file body.
|
|
361
|
+
4. **Per-turn status `<system-reminder>`** — "tool calls: 47/200 |
|
|
362
|
+
writes-per-file: cli.py=6 | recent SR fail: cli.py". Injected
|
|
363
|
+
every N turns to give the model raw awareness.
|
|
364
|
+
5. **Auto-prepend `read_file` when path is hot** — if `write_file(X)`
|
|
365
|
+
is called and `path_writes[X] >= 3` without an intervening read,
|
|
366
|
+
auto-run `read_file` first and include the result.
|
|
367
|
+
6. **Time-based microcompact** — replace old `tool_result` content
|
|
368
|
+
with a stub like `[Old tool result content cleared]` after N
|
|
369
|
+
minutes/turns. Claude Code pattern; drydock has per-call truncation
|
|
370
|
+
but not time-based aging.
|
|
371
|
+
7. **ruff inline on writes** — run `ruff check` on every Python write
|
|
372
|
+
and feed errors back as `<system-reminder>` warnings (cheaper than
|
|
373
|
+
full LSP).
|
|
374
|
+
8. **Grammar-constrained tool args** via vLLM's lm-format-enforcer —
|
|
375
|
+
JSON schema per tool; tokenizer can't emit invalid JSON. Kills the
|
|
376
|
+
`\Fix`-class of bugs entirely at the generation level.
|
|
377
|
+
9. **LSP integration** (pyright/ruff) — real diagnostics after every
|
|
378
|
+
write. Large lift but highest feedback quality.
|
|
379
|
+
10. **Per-model `auto_compact_threshold`** — current default of
|
|
380
|
+
200K never fires for Gemma 4 (131K max context).
|
|
381
|
+
|
|
382
|
+
### Medium-term
|
|
383
|
+
- **Second deployment target** so PyPI failures don't lose history
|
|
384
|
+
- **Replace `tui_test.py` and `core_tests_real.sh` entirely** —
|
|
385
|
+
`shakedown.py` + `shakedown_interactive.py` are the only honest
|
|
386
|
+
tests
|
|
387
|
+
- **Token cost dashboard** so first-turn prefill regressions catch
|
|
388
|
+
before they hit users
|
|
389
|
+
- **Consultant escalation** — partly wired in `agent_loop.py`; finish
|
|
390
|
+
the hook so on loop-depth ≥ N a bigger model gets ONE turn of
|
|
391
|
+
advice and returns control to Gemma
|
|
392
|
+
|
|
393
|
+
### Long-term
|
|
394
|
+
- Support larger models as hardware improves
|
|
395
|
+
- Plugin marketplace for custom tools/skills
|
|
396
|
+
- Web dashboard for monitoring long runs
|
|
397
|
+
- Multi-model routing (different models for different tasks)
|
|
398
|
+
- Fine-tune Gemma 4 on bail-out traces (sessions where drydock
|
|
399
|
+
recovered from a loop). Pairs naturally with the user's "Deep Noir"
|
|
400
|
+
research direction.
|
|
401
|
+
|
|
402
|
+
## Architecture Notes
|
|
403
|
+
|
|
404
|
+
See [CLAUDE.md](CLAUDE.md) for technical details, file locations,
|
|
405
|
+
constraints, lessons learned, and the development workflow including
|
|
406
|
+
the `.pause_auto_release` / `.pause_watchdog` flags you'll want during
|
|
407
|
+
manual debugging.
|
|
408
|
+
|
|
409
|
+
## Legal
|
|
410
|
+
|
|
411
|
+
All code is original or forked from Apache 2.0 mistral-vibe.
|
|
412
|
+
Architecture improvements are standard design patterns implemented from
|
|
413
|
+
scratch. No proprietary code copied.
|
|
@@ -1444,6 +1444,27 @@ class AgentLoop:
|
|
|
1444
1444
|
|
|
1445
1445
|
available_tools = self.format_handler.get_available_tools(self.tool_manager)
|
|
1446
1446
|
tool_choice = self.format_handler.get_tool_choice()
|
|
1447
|
+
|
|
1448
|
+
# Loop-break via tool_choice="none" — when repetition is severe
|
|
1449
|
+
# (FORCE_STOP signal), force the model to emit TEXT next turn.
|
|
1450
|
+
# Cannot call a tool on this turn. Forces reflection/replan via
|
|
1451
|
+
# natural language, then tool_choice returns to "auto" on the
|
|
1452
|
+
# following turn. This breaks attractor loops where the model
|
|
1453
|
+
# keeps firing identical tool calls despite advisories (144x
|
|
1454
|
+
# write_file, 13x read_file observed in stress session
|
|
1455
|
+
# 20260415_021415_ac6bd91f).
|
|
1456
|
+
# Ratelimit: only force tool_choice=none once per N turns so we
|
|
1457
|
+
# don't ping-pong between "none" and "auto" forever.
|
|
1458
|
+
if getattr(self, "_loop_detected", False) and getattr(self, "_loop_signal", "") == "FORCE_STOP":
|
|
1459
|
+
last_forced = getattr(self, "_last_tool_choice_none_turn", -999)
|
|
1460
|
+
current_turn = len(self.messages)
|
|
1461
|
+
if current_turn - last_forced >= 4:
|
|
1462
|
+
tool_choice = "none"
|
|
1463
|
+
self._last_tool_choice_none_turn = current_turn
|
|
1464
|
+
logger.info(
|
|
1465
|
+
"[LOOP-BREAK] FORCE_STOP signal → tool_choice=none "
|
|
1466
|
+
"for this turn (forces text response, breaks attractor)"
|
|
1467
|
+
)
|
|
1447
1468
|
_t2 = time.perf_counter()
|
|
1448
1469
|
|
|
1449
1470
|
n_msgs = len(self.messages)
|