drydock-cli 2.6.7__tar.gz → 2.6.9__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.9/.auto_release.lock +1 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/PKG-INFO +1 -1
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/app.py +10 -2
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/agent_loop.py +27 -12
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/gemma4.md +1 -1
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/search_replace.py +5 -6
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/manager.py +1 -1
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/pyproject.toml +1 -1
- drydock_cli-2.6.9/tests/test_user_issues.py +129 -0
- drydock_cli-2.6.7/.auto_release.lock +0 -1
- drydock_cli-2.6.7/tests/test_user_issues.py +0 -265
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.gitignore +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.python-version +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.typos.toml +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.vscode/extensions.json +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.vscode/launch.json +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/.vscode/settings.json +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/AGENTS.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/CHANGELOG.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/CLAUDE.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/Drydock_rebrand.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/LICENSE +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/NOTICE +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/PRD.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/README.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/action.yml +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/docs/README.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/docs/acp-setup.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/logger.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/slug.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/task_manager.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/types.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/core/utils.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock/whats_new.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock-acp.spec +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/drydock_terms.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/flake.lock +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/flake.nix +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/log_analyzer/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/log_analyzer/__main__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/log_analyzer/analyzer.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/log_analyzer/cli.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/README.md +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/auto_release.sh +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/auto_test_loop.sh +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/backup.sh +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/bump_version.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/discover_cli_tools.sh +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/install.sh +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/llm_balancer.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/monitor_swebench.sh +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/monitor_test_battery.sh +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/notify_release.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/overnight_agents_test.sh +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/prepare_release.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/test_bank.sh +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/test_full.sh +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/test_smoke.sh +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/test_tui_path.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/tui_test.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/scripts/vllm_failover.sh +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/conftest.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/e2e/common.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/mock/utils.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/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.7 → drydock_cli-2.6.9}/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.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_agents.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_integration.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_message_id.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_middleware.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_smoke.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/test_workloads.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.6.7 → drydock_cli-2.6.9}/uv.lock +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3928923
|
|
@@ -394,10 +394,18 @@ class VibeApp(App): # noqa: PLR0904
|
|
|
394
394
|
input_widget.value = ""
|
|
395
395
|
|
|
396
396
|
if self._agent_running:
|
|
397
|
-
# Queue the message
|
|
397
|
+
# Queue the message — join rapid-fire inputs (multi-line paste)
|
|
398
398
|
if not hasattr(self, "_pending_messages"):
|
|
399
399
|
self._pending_messages: list[str] = []
|
|
400
|
-
|
|
400
|
+
import time
|
|
401
|
+
now = time.time()
|
|
402
|
+
last_queue_time = getattr(self, "_last_queue_time", 0)
|
|
403
|
+
if now - last_queue_time < 0.5 and self._pending_messages:
|
|
404
|
+
# Rapid input (< 500ms apart) = likely paste — join with newline
|
|
405
|
+
self._pending_messages[-1] += "\n" + value
|
|
406
|
+
else:
|
|
407
|
+
self._pending_messages.append(value)
|
|
408
|
+
self._last_queue_time = now
|
|
401
409
|
preview = value[:60] + "..." if len(value) > 60 else value
|
|
402
410
|
self.notify(f"Queued: \"{preview}\" ({len(self._pending_messages)} pending)")
|
|
403
411
|
return
|
|
@@ -567,23 +567,34 @@ class AgentLoop:
|
|
|
567
567
|
or "maximum context" in error_str.lower()
|
|
568
568
|
or "400 bad request" in error_str.lower()
|
|
569
569
|
or "status: 400" in error_str.lower()):
|
|
570
|
-
# Context limit or malformed request —
|
|
570
|
+
# Context limit or malformed request — aggressive recovery
|
|
571
571
|
try:
|
|
572
|
-
|
|
572
|
+
# First try: truncate old messages
|
|
573
573
|
for i, msg in enumerate(self.messages):
|
|
574
574
|
if i >= len(self.messages) - 4:
|
|
575
|
-
break
|
|
575
|
+
break
|
|
576
576
|
if msg.role == Role.tool and hasattr(msg, 'content'):
|
|
577
577
|
content = str(msg.content) if msg.content else ""
|
|
578
578
|
if len(content) > 200:
|
|
579
|
-
msg.content = content[:100] + "\n[truncated]
|
|
580
|
-
compacted += 1
|
|
579
|
+
msg.content = content[:100] + "\n[truncated]"
|
|
581
580
|
elif msg.role == Role.assistant and hasattr(msg, 'content'):
|
|
582
581
|
content = str(msg.content) if msg.content else ""
|
|
583
582
|
if len(content) > 500:
|
|
584
583
|
msg.content = content[:200] + "\n[truncated]"
|
|
585
|
-
|
|
586
|
-
|
|
584
|
+
|
|
585
|
+
# Second try: if messages > 20, keep only last 6
|
|
586
|
+
if len(self.messages) > 20:
|
|
587
|
+
first_user = None
|
|
588
|
+
for msg in self.messages:
|
|
589
|
+
if msg.role == Role.user:
|
|
590
|
+
first_user = msg
|
|
591
|
+
break
|
|
592
|
+
kept = []
|
|
593
|
+
if first_user:
|
|
594
|
+
kept.append(first_user)
|
|
595
|
+
kept.extend(self.messages[-5:])
|
|
596
|
+
self.messages.reset(kept)
|
|
597
|
+
logger.info("Emergency reset: kept first user + last 5 messages")
|
|
587
598
|
except Exception:
|
|
588
599
|
pass
|
|
589
600
|
error_text = "Context compacted due to API error. Continue with your task."
|
|
@@ -592,6 +603,8 @@ class AgentLoop:
|
|
|
592
603
|
self._inject_system_note(error_text)
|
|
593
604
|
continue
|
|
594
605
|
|
|
606
|
+
if not self.messages:
|
|
607
|
+
continue
|
|
595
608
|
last_message = self.messages[-1]
|
|
596
609
|
|
|
597
610
|
# Track edits — no circuit breakers, just track for has_made_edit
|
|
@@ -625,6 +638,8 @@ class AgentLoop:
|
|
|
625
638
|
if assistant_event.content:
|
|
626
639
|
yield assistant_event
|
|
627
640
|
|
|
641
|
+
if not self.messages:
|
|
642
|
+
return
|
|
628
643
|
last_message = self.messages[-1]
|
|
629
644
|
|
|
630
645
|
# Detect repetitive text generation (Gemma 4 sometimes loops text within one response)
|
|
@@ -752,7 +767,7 @@ class AgentLoop:
|
|
|
752
767
|
- Other (bash with commands): block after 3
|
|
753
768
|
"""
|
|
754
769
|
args_str = json.dumps(tool_call.args_dict, sort_keys=True, default=str)
|
|
755
|
-
sig = hashlib.
|
|
770
|
+
sig = hashlib.sha256(
|
|
756
771
|
f"{tool_call.tool_name}:{args_str}".encode()
|
|
757
772
|
).hexdigest()
|
|
758
773
|
|
|
@@ -804,7 +819,7 @@ class AgentLoop:
|
|
|
804
819
|
def _circuit_breaker_record(self, tool_call: ResolvedToolCall, result_text: str) -> None:
|
|
805
820
|
"""Record a tool call execution for circuit breaker tracking."""
|
|
806
821
|
args_str = json.dumps(tool_call.args_dict, sort_keys=True, default=str)
|
|
807
|
-
sig = hashlib.
|
|
822
|
+
sig = hashlib.sha256(
|
|
808
823
|
f"{tool_call.tool_name}:{args_str}".encode()
|
|
809
824
|
).hexdigest()
|
|
810
825
|
count, _ = self._tool_call_history.get(sig, (0, ""))
|
|
@@ -1147,7 +1162,7 @@ class AgentLoop:
|
|
|
1147
1162
|
self.messages.reset(cleaned)
|
|
1148
1163
|
|
|
1149
1164
|
# Fix 2: If last message is assistant, add a user "Continue." prompt
|
|
1150
|
-
if self.messages[-1].role == Role.assistant:
|
|
1165
|
+
if self.messages and self.messages[-1].role == Role.assistant:
|
|
1151
1166
|
self.messages.append(LLMMessage(role=Role.user, content="Continue."))
|
|
1152
1167
|
|
|
1153
1168
|
async def _chat(self, max_tokens: int | None = None) -> LLMChunk:
|
|
@@ -1509,7 +1524,7 @@ class AgentLoop:
|
|
|
1509
1524
|
f"{tc.function.name}:{tc.function.arguments}"
|
|
1510
1525
|
)
|
|
1511
1526
|
tool_names.append(tc.function.name or "")
|
|
1512
|
-
sig = hashlib.
|
|
1527
|
+
sig = hashlib.sha256(
|
|
1513
1528
|
"|".join(sorted(call_parts)).encode()
|
|
1514
1529
|
).hexdigest()[:16]
|
|
1515
1530
|
sigs.append(sig)
|
|
@@ -1942,7 +1957,7 @@ class AgentLoop:
|
|
|
1942
1957
|
except (json.JSONDecodeError, TypeError):
|
|
1943
1958
|
pass
|
|
1944
1959
|
call_parts.append(f"{fn_name}:{fn_args}")
|
|
1945
|
-
sig = hashlib.
|
|
1960
|
+
sig = hashlib.sha256("|".join(sorted(call_parts)).encode()).hexdigest()[:16]
|
|
1946
1961
|
|
|
1947
1962
|
if sig in seen_sigs:
|
|
1948
1963
|
# Duplicate — mark for removal (assistant msg + next tool result)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
You are DryDock, a CLI coding agent. You write code, fix bugs, and build projects.
|
|
2
2
|
|
|
3
|
-
ACT IMMEDIATELY.
|
|
3
|
+
ACT IMMEDIATELY. Your FIRST response must be a tool call — not text. Do NOT explain, plan, or ask. Call a tool NOW.
|
|
4
4
|
|
|
5
5
|
Your tools: read_file, write_file, search_replace, grep, glob, bash.
|
|
6
6
|
|
|
@@ -241,14 +241,13 @@ class SearchReplace(
|
|
|
241
241
|
">>>>>>> REPLACE"
|
|
242
242
|
)
|
|
243
243
|
|
|
244
|
-
# Detect garbled token output
|
|
244
|
+
# Detect garbled token output — only flag obvious corruption
|
|
245
|
+
# (mixed angle brackets + repeated letters like <<t<ttt<t), not normal repeats
|
|
245
246
|
for block in search_replace_blocks:
|
|
246
|
-
if re.search(r'
|
|
247
|
+
if re.search(r'<[a-z]<[a-z]{2,}<[a-z]', block.search):
|
|
247
248
|
raise ToolError(
|
|
248
|
-
"Your search text appears garbled (
|
|
249
|
-
"
|
|
250
|
-
"WORKAROUND: Use read_file to get the exact line numbers, then use write_file "
|
|
251
|
-
"to rewrite the entire function instead of search_replace on complex regex patterns."
|
|
249
|
+
"Your search text appears garbled (token corruption). "
|
|
250
|
+
"Use write_file to rewrite the function instead of search_replace."
|
|
252
251
|
)
|
|
253
252
|
|
|
254
253
|
return file_path, search_replace_blocks
|
|
@@ -49,7 +49,7 @@ def _compute_module_name(path: Path) -> str:
|
|
|
49
49
|
return canonical
|
|
50
50
|
|
|
51
51
|
resolved = path.resolve()
|
|
52
|
-
path_hash = hashlib.
|
|
52
|
+
path_hash = hashlib.sha256(str(resolved).encode()).hexdigest()[:8]
|
|
53
53
|
stem = re.sub(r"[^0-9A-Za-z_]", "_", path.stem) or "mod"
|
|
54
54
|
return f"vibe_tools_discovered_{stem}_{path_hash}"
|
|
55
55
|
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"""Tests for user-reported issues (2026-04-07).
|
|
2
|
+
|
|
3
|
+
Each test should FAIL before the fix and PASS after.
|
|
4
|
+
"""
|
|
5
|
+
import hashlib
|
|
6
|
+
import pytest
|
|
7
|
+
from unittest.mock import patch, MagicMock
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class TestMD5Crash:
|
|
11
|
+
"""#61: Crash after install — md5 error in manager.py."""
|
|
12
|
+
|
|
13
|
+
def test_md5_usedforsecurity(self):
|
|
14
|
+
"""md5 should work with usedforsecurity=False."""
|
|
15
|
+
h = hashlib.md5(b"test", usedforsecurity=False)
|
|
16
|
+
assert h.hexdigest() == "098f6bcd4621d373cade4e832627b4f6"
|
|
17
|
+
|
|
18
|
+
def test_tool_manager_import(self):
|
|
19
|
+
"""Tool manager should not crash on import."""
|
|
20
|
+
from drydock.core.tools.manager import ToolManager
|
|
21
|
+
assert ToolManager is not None
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class TestSearchReplaceGarbled:
|
|
25
|
+
"""#55: search_replace garbled characters."""
|
|
26
|
+
|
|
27
|
+
def test_garbled_detection(self):
|
|
28
|
+
from drydock.core.tools.builtins.search_replace import SearchReplaceArgs
|
|
29
|
+
args = SearchReplaceArgs.model_validate({
|
|
30
|
+
"file_path": "test.py",
|
|
31
|
+
"content": "<<<<<<< SEARCH\nold text\n=======\nnew text\n>>>>>>> REPLACE",
|
|
32
|
+
})
|
|
33
|
+
assert args.file_path == "test.py"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class TestTodoEnumQuotes:
|
|
37
|
+
"""#60: Todo enum quoting issues."""
|
|
38
|
+
|
|
39
|
+
def test_double_quoted(self):
|
|
40
|
+
from drydock.core.tools.builtins.todo import TodoItem
|
|
41
|
+
item = TodoItem.model_validate({
|
|
42
|
+
"id": "1", "content": "test",
|
|
43
|
+
"status": '"completed"', "priority": '"high"',
|
|
44
|
+
})
|
|
45
|
+
assert item.status.value == "completed"
|
|
46
|
+
|
|
47
|
+
def test_single_quoted(self):
|
|
48
|
+
from drydock.core.tools.builtins.todo import TodoItem
|
|
49
|
+
item = TodoItem.model_validate({
|
|
50
|
+
"id": "1", "content": "test",
|
|
51
|
+
"status": "'completed'", "priority": "'high'",
|
|
52
|
+
})
|
|
53
|
+
assert item.status.value == "completed"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class TestEmptyState:
|
|
57
|
+
"""#58: IndexError on empty lists."""
|
|
58
|
+
|
|
59
|
+
def test_empty_tool_calls(self):
|
|
60
|
+
from drydock.core.types import LLMMessage, Role
|
|
61
|
+
msg = LLMMessage(role=Role.assistant, content="hello", tool_calls=None)
|
|
62
|
+
calls = msg.tool_calls or []
|
|
63
|
+
assert calls == []
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
if __name__ == "__main__":
|
|
67
|
+
pytest.main([__file__, "-v"])
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class TestSearchReplaceGarbledAdvanced:
|
|
71
|
+
"""#55: Garbled detection should only catch real corruption."""
|
|
72
|
+
|
|
73
|
+
def test_legitimate_repeats_not_flagged(self):
|
|
74
|
+
"""Normal repeated chars like ===== should NOT be flagged."""
|
|
75
|
+
from drydock.core.tools.builtins.search_replace import SearchReplace
|
|
76
|
+
blocks = SearchReplace._parse_search_replace_blocks(
|
|
77
|
+
"<<<<<<< SEARCH\ndef foo():\n x = 5\n=======\ndef foo():\n x = 10\n>>>>>>> REPLACE"
|
|
78
|
+
)
|
|
79
|
+
assert len(blocks) == 1
|
|
80
|
+
assert "x = 5" in blocks[0].search
|
|
81
|
+
|
|
82
|
+
def test_real_garble_detected(self):
|
|
83
|
+
"""Token corruption like <<t<ttt<t should be caught."""
|
|
84
|
+
import re
|
|
85
|
+
garbled = "(?P<<t<ttt<t<tststssts>\\d+)"
|
|
86
|
+
assert re.search(r'<[a-z]<[a-z]{2,}<[a-z]', garbled)
|
|
87
|
+
|
|
88
|
+
def test_normal_regex_not_garbled(self):
|
|
89
|
+
"""Normal regex should not trigger garble detection."""
|
|
90
|
+
import re
|
|
91
|
+
normal = r"(?P<timestamp>\d{4}-\d{2}-\d{2})"
|
|
92
|
+
assert not re.search(r'<[a-z]<[a-z]{2,}<[a-z]', normal)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class TestIndexErrorGuards:
|
|
96
|
+
"""#58: Guard all [-1] accesses on potentially empty lists."""
|
|
97
|
+
|
|
98
|
+
def test_empty_messages_safe(self):
|
|
99
|
+
"""Accessing last message on empty list should not crash."""
|
|
100
|
+
messages = []
|
|
101
|
+
last = messages[-1] if messages else None
|
|
102
|
+
assert last is None
|
|
103
|
+
|
|
104
|
+
def test_agent_loop_no_md5(self):
|
|
105
|
+
"""Agent loop should use sha256, not md5."""
|
|
106
|
+
import inspect
|
|
107
|
+
from drydock.core.agent_loop import AgentLoop
|
|
108
|
+
source = inspect.getsource(AgentLoop)
|
|
109
|
+
assert "hashlib.md5" not in source, "Still using md5 in agent_loop"
|
|
110
|
+
assert "hashlib.sha256" in source or "sha256" not in source # either uses sha256 or doesn't hash at all
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class TestAPIRecovery:
|
|
114
|
+
"""#57: API error recovery should auto-compact."""
|
|
115
|
+
|
|
116
|
+
def test_message_list_reset_keeps_structure(self):
|
|
117
|
+
"""Reset should produce valid message ordering."""
|
|
118
|
+
from drydock.core.types import MessageList, LLMMessage, Role
|
|
119
|
+
ml = MessageList()
|
|
120
|
+
for i in range(25):
|
|
121
|
+
ml.append(LLMMessage(role=Role.user, content=f"msg {i}"))
|
|
122
|
+
ml.append(LLMMessage(role=Role.assistant, content=f"reply {i}"))
|
|
123
|
+
|
|
124
|
+
# Simulate emergency reset: keep first user + last 5
|
|
125
|
+
first_user = ml[0]
|
|
126
|
+
kept = [first_user] + list(ml[-5:])
|
|
127
|
+
ml.reset(kept)
|
|
128
|
+
assert len(ml) == 6
|
|
129
|
+
assert ml[0].role == Role.user
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
3888135
|
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
"""Tests for user-reported issues.
|
|
2
|
-
|
|
3
|
-
Each test should FAIL before the fix, proving the issue exists.
|
|
4
|
-
After fixing, all should pass.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from __future__ import annotations
|
|
8
|
-
|
|
9
|
-
import inspect
|
|
10
|
-
import os
|
|
11
|
-
from pathlib import Path
|
|
12
|
-
from types import SimpleNamespace
|
|
13
|
-
from unittest.mock import patch
|
|
14
|
-
|
|
15
|
-
import pytest
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
# ============================================================================
|
|
19
|
-
# Issue 1: "DryDock" branding — should be DryDock not Drydock everywhere
|
|
20
|
-
# ============================================================================
|
|
21
|
-
|
|
22
|
-
class TestBranding:
|
|
23
|
-
def test_readme_says_drydock_capital(self):
|
|
24
|
-
readme = Path(__file__).parent.parent / "README.md"
|
|
25
|
-
content = readme.read_text()
|
|
26
|
-
# Title should be "# DryDock" not "# Drydock"
|
|
27
|
-
assert "# DryDock" in content
|
|
28
|
-
|
|
29
|
-
def test_system_prompt_says_drydock(self):
|
|
30
|
-
prompt = Path(__file__).parent.parent / "drydock" / "core" / "prompts" / "cli.md"
|
|
31
|
-
content = prompt.read_text()
|
|
32
|
-
# Should say "DryDock" not "Drydock" as the product name
|
|
33
|
-
assert "DryDock" in content
|
|
34
|
-
|
|
35
|
-
def test_loading_widget_says_drydock(self):
|
|
36
|
-
from drydock.cli.textual_ui.widgets.loading import LoadingWidget
|
|
37
|
-
widget = LoadingWidget.__new__(LoadingWidget)
|
|
38
|
-
status = widget._get_default_status()
|
|
39
|
-
# Anchor emoji is fine, but product references should be DryDock
|
|
40
|
-
assert status # Just verify it doesn't crash
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
# ============================================================================
|
|
44
|
-
# Issue 5: What conda env is pip using? Should preserve user's env
|
|
45
|
-
# ============================================================================
|
|
46
|
-
|
|
47
|
-
class TestCondaEnv:
|
|
48
|
-
def test_bash_env_preserves_active_conda(self):
|
|
49
|
-
"""If user has CONDA_DEFAULT_ENV set, bash should preserve it."""
|
|
50
|
-
from drydock.core.tools.builtins.bash import _get_base_env
|
|
51
|
-
with patch.dict(os.environ, {"CONDA_DEFAULT_ENV": "myproject", "CONDA_EXE": "/opt/conda/bin/conda"}):
|
|
52
|
-
env = _get_base_env()
|
|
53
|
-
# BASH_ENV should reference the user's env, not just base
|
|
54
|
-
if "BASH_ENV" in env:
|
|
55
|
-
bash_env_content = Path(env["BASH_ENV"]).read_text() if Path(env["BASH_ENV"]).exists() else ""
|
|
56
|
-
# Should activate the user's env, not just source conda.sh
|
|
57
|
-
assert "myproject" in bash_env_content or "CONDA_DEFAULT_ENV" in str(env)
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
# ============================================================================
|
|
61
|
-
# Issue 6: Circuit breaker shows message but still repeats
|
|
62
|
-
# ============================================================================
|
|
63
|
-
|
|
64
|
-
class TestCircuitBreakerEnforcement:
|
|
65
|
-
def test_circuit_breaker_disabled(self):
|
|
66
|
-
"""Circuit breaker is disabled — even failed commands are never blocked."""
|
|
67
|
-
from drydock.core.agent_loop import AgentLoop
|
|
68
|
-
from drydock.core.types import MessageList
|
|
69
|
-
|
|
70
|
-
al = object.__new__(AgentLoop)
|
|
71
|
-
al.messages = MessageList()
|
|
72
|
-
al._tool_call_history = {}
|
|
73
|
-
|
|
74
|
-
tc = SimpleNamespace(tool_name="bash", args_dict={"command": "bad_cmd"})
|
|
75
|
-
for _ in range(3):
|
|
76
|
-
al._circuit_breaker_record(tc, "FAILED: command not found")
|
|
77
|
-
|
|
78
|
-
# CB is disabled — always returns None
|
|
79
|
-
assert al._circuit_breaker_check(tc) is None
|
|
80
|
-
|
|
81
|
-
def test_circuit_breaker_resets_for_new_conversation(self):
|
|
82
|
-
"""Circuit breaker history is clearable between conversations."""
|
|
83
|
-
from drydock.core.agent_loop import AgentLoop
|
|
84
|
-
from drydock.core.types import MessageList
|
|
85
|
-
|
|
86
|
-
al = object.__new__(AgentLoop)
|
|
87
|
-
al.messages = MessageList()
|
|
88
|
-
al._tool_call_history = {}
|
|
89
|
-
|
|
90
|
-
tc = SimpleNamespace(tool_name="bash", args_dict={"command": "bad_cmd"})
|
|
91
|
-
for _ in range(3):
|
|
92
|
-
al._circuit_breaker_record(tc, "FAILED: command not found")
|
|
93
|
-
# CB is disabled — returns None even before clearing
|
|
94
|
-
assert al._circuit_breaker_check(tc) is None
|
|
95
|
-
|
|
96
|
-
# Simulate new conversation — history should be clearable
|
|
97
|
-
al._tool_call_history.clear()
|
|
98
|
-
assert al._circuit_breaker_check(tc) is None # Still None
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
# ============================================================================
|
|
102
|
-
# Issue 7: "Understood" after errors then stops
|
|
103
|
-
# ============================================================================
|
|
104
|
-
|
|
105
|
-
class TestUnderstoodBug:
|
|
106
|
-
def test_no_understood_in_agent(self):
|
|
107
|
-
"""The agent should not inject 'Understood.' which causes premature stops."""
|
|
108
|
-
from drydock.core.agent_loop import AgentLoop
|
|
109
|
-
src = inspect.getsource(AgentLoop)
|
|
110
|
-
# "Understood." was causing the model to think conversation ended
|
|
111
|
-
assert "Understood" not in src, \
|
|
112
|
-
"'Understood' found in agent_loop — should use 'Continuing...' instead"
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
# ============================================================================
|
|
116
|
-
# Issue 10: Circuit breaker too sensitive — same command later should be OK
|
|
117
|
-
# ============================================================================
|
|
118
|
-
|
|
119
|
-
class TestCircuitBreakerSensitivity:
|
|
120
|
-
def test_successful_commands_never_blocked(self):
|
|
121
|
-
"""Successful commands are never blocked."""
|
|
122
|
-
from drydock.core.agent_loop import AgentLoop
|
|
123
|
-
from drydock.core.types import MessageList
|
|
124
|
-
|
|
125
|
-
al = object.__new__(AgentLoop)
|
|
126
|
-
al.messages = MessageList()
|
|
127
|
-
al._tool_call_history = {}
|
|
128
|
-
|
|
129
|
-
tc = SimpleNamespace(tool_name="bash", args_dict={"command": "git status"})
|
|
130
|
-
for _ in range(10):
|
|
131
|
-
al._circuit_breaker_record(tc, "clean")
|
|
132
|
-
assert al._circuit_breaker_check(tc) is None # Never blocked
|
|
133
|
-
|
|
134
|
-
def test_failed_commands_not_blocked_cb_disabled(self):
|
|
135
|
-
"""CB disabled — failed commands are NOT blocked even after 3 repeats."""
|
|
136
|
-
from drydock.core.agent_loop import AgentLoop
|
|
137
|
-
from drydock.core.types import MessageList
|
|
138
|
-
|
|
139
|
-
al = object.__new__(AgentLoop)
|
|
140
|
-
al.messages = MessageList()
|
|
141
|
-
al._tool_call_history = {}
|
|
142
|
-
|
|
143
|
-
tc = SimpleNamespace(tool_name="bash", args_dict={"command": "git status"})
|
|
144
|
-
for _ in range(3):
|
|
145
|
-
al._circuit_breaker_record(tc, "FAILED: not a git repo")
|
|
146
|
-
assert al._circuit_breaker_check(tc) is None # CB disabled
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
# ============================================================================
|
|
150
|
-
# Issue 11: /consult needs to show which model is being used
|
|
151
|
-
# ============================================================================
|
|
152
|
-
|
|
153
|
-
class TestConsultModelDisplay:
|
|
154
|
-
def test_consult_handler_shows_model_name(self):
|
|
155
|
-
"""The /consult response should include the model name."""
|
|
156
|
-
from drydock.cli.textual_ui.app import VibeApp
|
|
157
|
-
src = inspect.getsource(VibeApp._consult_command)
|
|
158
|
-
# Should display which model is being used
|
|
159
|
-
assert "consultant_model" in src or "model" in src
|
|
160
|
-
|
|
161
|
-
def test_consult_help_shows_config_instructions(self):
|
|
162
|
-
"""Typing /consult with no args should show how to configure."""
|
|
163
|
-
from drydock.cli.textual_ui.app import VibeApp
|
|
164
|
-
src = inspect.getsource(VibeApp._consult_command)
|
|
165
|
-
assert "config.toml" in src or "consultant_model" in src
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
# ============================================================================
|
|
169
|
-
# Issue 12: SSL error on websearch — should use -k / DRYDOCK_INSECURE
|
|
170
|
-
# ============================================================================
|
|
171
|
-
|
|
172
|
-
class TestWebSearchSSL:
|
|
173
|
-
def test_websearch_respects_insecure_flag(self):
|
|
174
|
-
"""WebSearch should check DRYDOCK_INSECURE env var."""
|
|
175
|
-
from drydock.core.tools.builtins.websearch import WebSearch
|
|
176
|
-
src = inspect.getsource(WebSearch)
|
|
177
|
-
assert "DRYDOCK_INSECURE" in src or "insecure" in src.lower() or "verify" in src
|
|
178
|
-
|
|
179
|
-
def test_webfetch_respects_insecure_flag(self):
|
|
180
|
-
"""WebFetch should check DRYDOCK_INSECURE env var."""
|
|
181
|
-
from drydock.core.tools.builtins.webfetch import WebFetch
|
|
182
|
-
src = inspect.getsource(WebFetch)
|
|
183
|
-
assert "DRYDOCK_INSECURE" in src
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
# ============================================================================
|
|
187
|
-
# Issue 14: Config.toml consultant_model setup
|
|
188
|
-
# ============================================================================
|
|
189
|
-
|
|
190
|
-
class TestConsultantConfig:
|
|
191
|
-
def test_config_has_consultant_model_field(self):
|
|
192
|
-
"""VibeConfig should have consultant_model field."""
|
|
193
|
-
from drydock.core.config import VibeConfig
|
|
194
|
-
assert hasattr(VibeConfig, "model_fields")
|
|
195
|
-
assert "consultant_model" in VibeConfig.model_fields
|
|
196
|
-
|
|
197
|
-
def test_consultant_model_documented_in_readme(self):
|
|
198
|
-
"""README should mention how to set consultant_model."""
|
|
199
|
-
readme = Path(__file__).parent.parent / "README.md"
|
|
200
|
-
content = readme.read_text()
|
|
201
|
-
assert "consultant_model" in content or "consultant" in content.lower()
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
# ============================================================================
|
|
205
|
-
# Issue 15: Auto-consult agent — model should ask consultant when stuck
|
|
206
|
-
# ============================================================================
|
|
207
|
-
|
|
208
|
-
class TestAutoConsult:
|
|
209
|
-
def test_circuit_breaker_disabled_returns_none(self):
|
|
210
|
-
"""CB is disabled — returns None even for repeatedly failed commands."""
|
|
211
|
-
from drydock.core.agent_loop import AgentLoop
|
|
212
|
-
from drydock.core.types import MessageList
|
|
213
|
-
|
|
214
|
-
al = object.__new__(AgentLoop)
|
|
215
|
-
al.messages = MessageList()
|
|
216
|
-
al._tool_call_history = {}
|
|
217
|
-
|
|
218
|
-
tc = SimpleNamespace(tool_name="bash", args_dict={"command": "bad_cmd"})
|
|
219
|
-
for _ in range(3):
|
|
220
|
-
al._circuit_breaker_record(tc, "FAILED: command not found")
|
|
221
|
-
assert al._circuit_breaker_check(tc) is None
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
# ============================================================================
|
|
225
|
-
# Issue 16: /consult should include conversation history
|
|
226
|
-
# ============================================================================
|
|
227
|
-
|
|
228
|
-
class TestConsultHistory:
|
|
229
|
-
def test_consult_sends_context(self):
|
|
230
|
-
"""/consult handler should send conversation context to consultant."""
|
|
231
|
-
from drydock.core.consultant import ask_consultant
|
|
232
|
-
src = inspect.getsource(ask_consultant)
|
|
233
|
-
# Should accept and use context/conversation history
|
|
234
|
-
assert "context" in src or "messages" in src or "history" in src
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
# ============================================================================
|
|
238
|
-
# Issue 17: Deep research skill should exist
|
|
239
|
-
# ============================================================================
|
|
240
|
-
|
|
241
|
-
class TestDeepResearchSkill:
|
|
242
|
-
def test_research_skill_exists(self):
|
|
243
|
-
"""A deep-research skill should be bundled."""
|
|
244
|
-
skills_dir = Path(__file__).parent.parent / "drydock" / "skills"
|
|
245
|
-
skill_dirs = [d.name for d in skills_dir.iterdir() if d.is_dir()] if skills_dir.exists() else []
|
|
246
|
-
has_research = any("research" in d for d in skill_dirs)
|
|
247
|
-
assert has_research, f"No research skill found. Available: {skill_dirs}"
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
# ============================================================================
|
|
251
|
-
# Issue 18: Not using agents — explore/diagnostic agents should be utilized
|
|
252
|
-
# ============================================================================
|
|
253
|
-
|
|
254
|
-
class TestAgentsAvailable:
|
|
255
|
-
def test_explore_agent_registered(self):
|
|
256
|
-
"""The 'explore' agent should be registered."""
|
|
257
|
-
from drydock.core.agents.models import BuiltinAgentName
|
|
258
|
-
assert hasattr(BuiltinAgentName, "EXPLORE") or "explore" in dir(BuiltinAgentName)
|
|
259
|
-
|
|
260
|
-
def test_system_prompt_mentions_agents(self):
|
|
261
|
-
"""System prompt should tell the model about available agents."""
|
|
262
|
-
prompt = Path(__file__).parent.parent / "drydock" / "core" / "prompts" / "cli.md"
|
|
263
|
-
content = prompt.read_text()
|
|
264
|
-
has_agent_ref = "agent" in content.lower() or "subagent" in content.lower() or "task" in content.lower()
|
|
265
|
-
assert has_agent_ref
|
|
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
|