drydock-cli 2.6.1__tar.gz → 2.6.3__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.3/.auto_release.lock +1 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/PKG-INFO +1 -1
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/agent_loop.py +3 -163
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/llm/backend/generic.py +1 -1
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/ask_user_question.py +1 -2
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/todo.py +15 -1
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/pyproject.toml +1 -1
- drydock_cli-2.6.3/tests/test_tool_args.py +246 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/.gitignore +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/.python-version +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/.typos.toml +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/.vscode/extensions.json +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/.vscode/launch.json +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/.vscode/settings.json +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/AGENTS.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/CHANGELOG.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/CLAUDE.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/Drydock_rebrand.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/LICENSE +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/NOTICE +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/PRD.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/README.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/action.yml +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/docs/README.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/docs/acp-setup.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/logger.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/prompts/gemma4.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/slug.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/task_manager.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/types.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/core/utils.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/whats_new.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock-acp.spec +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock_terms.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/flake.lock +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/flake.nix +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/log_analyzer/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/log_analyzer/__main__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/log_analyzer/analyzer.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/log_analyzer/cli.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/README.md +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/auto_release.sh +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/auto_test_loop.sh +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/backup.sh +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/bump_version.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/discover_cli_tools.sh +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/install.sh +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/monitor_swebench.sh +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/monitor_test_battery.sh +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/notify_release.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/overnight_agents_test.sh +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/prepare_release.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/test_bank.sh +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/test_full.sh +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/test_smoke.sh +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/test_tui_path.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/scripts/tui_test.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/conftest.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/e2e/common.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/mock/utils.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/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.1 → drydock_cli-2.6.3}/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.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_agents.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_integration.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_message_id.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_middleware.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_smoke.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/test_workloads.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.6.1 → drydock_cli-2.6.3}/uv.lock +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3774888
|
|
@@ -594,174 +594,14 @@ class AgentLoop:
|
|
|
594
594
|
|
|
595
595
|
last_message = self.messages[-1]
|
|
596
596
|
|
|
597
|
-
# Track
|
|
597
|
+
# Track edits — no circuit breakers, just track for has_made_edit
|
|
598
598
|
if not has_made_edit:
|
|
599
599
|
for msg in reversed(self.messages[-5:]):
|
|
600
600
|
if msg.role == Role.assistant and msg.tool_calls:
|
|
601
601
|
for tc in msg.tool_calls:
|
|
602
|
-
if
|
|
603
|
-
continue
|
|
604
|
-
if tc.function.name in ("search_replace", "write_file"):
|
|
605
|
-
first_edit = not has_made_edit
|
|
602
|
+
if tc.function and tc.function.name in ("search_replace", "write_file"):
|
|
606
603
|
has_made_edit = True
|
|
607
|
-
|
|
608
|
-
# Reset circuit breaker — the world changed after an edit,
|
|
609
|
-
# so previously-failing commands may now succeed
|
|
610
|
-
self._tool_call_history.clear()
|
|
611
|
-
self._consecutive_circuit_breaker_fires = 0
|
|
612
|
-
# Track blast radius
|
|
613
|
-
try:
|
|
614
|
-
edit_args = json.loads(tc.function.arguments or "{}")
|
|
615
|
-
edit_path = edit_args.get("file_path", edit_args.get("path", ""))
|
|
616
|
-
if edit_path and edit_path not in files_modified:
|
|
617
|
-
files_modified.append(edit_path)
|
|
618
|
-
except (json.JSONDecodeError, AttributeError):
|
|
619
|
-
edit_path = ""
|
|
620
|
-
|
|
621
|
-
# AUTO-FIX: Fix packaging issues the model gets wrong
|
|
622
|
-
if edit_path and edit_path.endswith(".py"):
|
|
623
|
-
self._auto_fix_package(edit_path)
|
|
624
|
-
|
|
625
|
-
# Auto-run diagnostics on edited Python files
|
|
626
|
-
if edit_path and edit_path.endswith(".py"):
|
|
627
|
-
try:
|
|
628
|
-
import asyncio
|
|
629
|
-
import subprocess
|
|
630
|
-
diag_result = subprocess.run(
|
|
631
|
-
["python3", "-c", f"import ast; ast.parse(open('{edit_path}').read()); print('OK')"],
|
|
632
|
-
capture_output=True, text=True, timeout=5,
|
|
633
|
-
)
|
|
634
|
-
if diag_result.returncode != 0:
|
|
635
|
-
self._inject_system_note(
|
|
636
|
-
f"SYNTAX ERROR in {edit_path}: {diag_result.stderr.strip()[:200]}. "
|
|
637
|
-
f"Fix the syntax error before continuing."
|
|
638
|
-
)
|
|
639
|
-
except Exception:
|
|
640
|
-
pass
|
|
641
|
-
|
|
642
|
-
# After first edit: prompt to check related files
|
|
643
|
-
if first_edit and edit_path:
|
|
644
|
-
self._inject_system_note(
|
|
645
|
-
f"Good — you edited {edit_path}. Now check: "
|
|
646
|
-
f"does this bug have a RELATED file that also needs changes? "
|
|
647
|
-
f"Common patterns: if you edited a model, check the serializer/migration. "
|
|
648
|
-
f"If you edited a base class, check subclasses. "
|
|
649
|
-
f"If you edited a util, check callers. "
|
|
650
|
-
f"Use grep to search for imports of the function/class you changed."
|
|
651
|
-
)
|
|
652
|
-
if tc.function.name == "read_file":
|
|
653
|
-
try:
|
|
654
|
-
args = json.loads(tc.function.arguments or "{}")
|
|
655
|
-
path = args.get("path", args.get("file_path", ""))
|
|
656
|
-
if path and path not in files_explored:
|
|
657
|
-
files_explored.append(path)
|
|
658
|
-
except (json.JSONDecodeError, AttributeError):
|
|
659
|
-
pass
|
|
660
|
-
if tc.function.name in ("bash", "run_command"):
|
|
661
|
-
bash_count += 1
|
|
662
|
-
|
|
663
|
-
# Track search_replace failures (called but error in result)
|
|
664
|
-
for msg in reversed(self.messages[-3:]):
|
|
665
|
-
if msg.role == Role.tool and msg.content:
|
|
666
|
-
content = msg.content or ""
|
|
667
|
-
if "search_replace" in content.lower() and "error" in content.lower():
|
|
668
|
-
search_replace_failures += 1
|
|
669
|
-
|
|
670
|
-
# Blast radius check: warn when touching 5+ files
|
|
671
|
-
if len(files_modified) >= 5 and len(files_modified) % 5 == 0:
|
|
672
|
-
self._inject_system_note(
|
|
673
|
-
f"BLAST RADIUS WARNING: You have modified {len(files_modified)} files. "
|
|
674
|
-
f"Files: {', '.join(files_modified[-5:])}. "
|
|
675
|
-
f"This is a large change. Are you sure all these edits are needed? "
|
|
676
|
-
f"Consider stopping to verify your approach."
|
|
677
|
-
)
|
|
678
|
-
|
|
679
|
-
# Post-edit bash loop: model made edits but now loops on bash
|
|
680
|
-
# trying to test code that keeps failing
|
|
681
|
-
if has_made_edit and bash_count >= 3:
|
|
682
|
-
# Count consecutive bash calls at end of tool history
|
|
683
|
-
consecutive_bash = 0
|
|
684
|
-
for tc_name in reversed(self._recent_tool_names()):
|
|
685
|
-
if tc_name in ("bash", "run_command"):
|
|
686
|
-
consecutive_bash += 1
|
|
687
|
-
else:
|
|
688
|
-
break
|
|
689
|
-
if consecutive_bash >= 3:
|
|
690
|
-
self._inject_system_note(
|
|
691
|
-
"You have run 3+ bash commands in a row. "
|
|
692
|
-
"If your project is WORKING, you are DONE — tell the user the project "
|
|
693
|
-
"is complete and what commands they can use. "
|
|
694
|
-
"If it is FAILING, STOP running bash and use read_file + search_replace "
|
|
695
|
-
"to fix the code. Do NOT keep running the same test."
|
|
696
|
-
)
|
|
697
|
-
|
|
698
|
-
# Detect bash file creation (touch, echo >, cat <<)
|
|
699
|
-
for msg in reversed(self.messages[-3:]):
|
|
700
|
-
if msg.role == Role.assistant and msg.tool_calls:
|
|
701
|
-
for tc in msg.tool_calls:
|
|
702
|
-
if tc.function and tc.function.name in ("bash", "run_command"):
|
|
703
|
-
cmd = ""
|
|
704
|
-
try:
|
|
705
|
-
cmd = json.loads(tc.function.arguments or "{}").get("command", "")
|
|
706
|
-
except (json.JSONDecodeError, AttributeError):
|
|
707
|
-
pass
|
|
708
|
-
if any(kw in cmd for kw in ("touch ", "echo ", "cat <<", "printf ", "> ")):
|
|
709
|
-
self._inject_system_note(
|
|
710
|
-
f"Do NOT use bash to create files. Use write_file instead. "
|
|
711
|
-
f"bash touch/echo/cat does not create proper code files."
|
|
712
|
-
)
|
|
713
|
-
|
|
714
|
-
# Bash abuse detection: model uses bash instead of proper tools
|
|
715
|
-
if not has_made_edit and bash_count >= 3:
|
|
716
|
-
if bash_count == 3:
|
|
717
|
-
self._inject_system_note(
|
|
718
|
-
"You have run 3 bash commands without creating or editing any files. "
|
|
719
|
-
"STOP running bash. Start CREATING files with write_file or "
|
|
720
|
-
"EDITING files with search_replace. bash does not create code."
|
|
721
|
-
)
|
|
722
|
-
elif bash_count == 6:
|
|
723
|
-
self._inject_system_note(
|
|
724
|
-
"WARNING: 6 bash commands, ZERO file edits. You are stuck in a loop. "
|
|
725
|
-
"Your NEXT action MUST be write_file to create a file or "
|
|
726
|
-
"search_replace to edit one. Do NOT run any more bash commands."
|
|
727
|
-
)
|
|
728
|
-
elif bash_count >= 10 and bash_count % 5 == 0:
|
|
729
|
-
# Nudge every 5 bash calls, never stop
|
|
730
|
-
self._inject_system_note(
|
|
731
|
-
"You have run many bash commands. Consider using write_file "
|
|
732
|
-
"or search_replace to create/edit files."
|
|
733
|
-
)
|
|
734
|
-
|
|
735
|
-
# 3-Strike Rule: search_replace keeps failing
|
|
736
|
-
if search_replace_failures >= 3:
|
|
737
|
-
if search_replace_failures == 3:
|
|
738
|
-
self._inject_system_note(
|
|
739
|
-
f"3-STRIKE RULE: Your search_replace has failed {search_replace_failures} times. "
|
|
740
|
-
"STOP trying the same approach. "
|
|
741
|
-
"Either: (1) use read_file to get the EXACT text first, "
|
|
742
|
-
"(2) try a completely different file, or "
|
|
743
|
-
"(3) ask the user for help with /consult."
|
|
744
|
-
)
|
|
745
|
-
elif search_replace_failures % 3 == 0:
|
|
746
|
-
self._inject_system_note(
|
|
747
|
-
f"STOP: {search_replace_failures} failed edits. You are stuck. Ask the user for help."
|
|
748
|
-
)
|
|
749
|
-
|
|
750
|
-
# Context budget warning: after 7 tool turns without an edit,
|
|
751
|
-
# warn that context is being consumed without progress
|
|
752
|
-
if tool_turns == 7 and not has_made_edit and not context_summary_injected:
|
|
753
|
-
context_summary_injected = True
|
|
754
|
-
summary = (
|
|
755
|
-
"CONTEXT BUDGET WARNING: You have used 7 tool calls without making an edit. "
|
|
756
|
-
"Your context window is filling up — performance degrades as it fills. "
|
|
757
|
-
)
|
|
758
|
-
if files_explored:
|
|
759
|
-
summary += "Files explored: " + ", ".join(files_explored[-5:]) + ". "
|
|
760
|
-
summary += (
|
|
761
|
-
"You MUST state your TARGET/FUNCTION/CAUSE/FIX now and use search_replace "
|
|
762
|
-
"on your next turn. Do NOT continue exploring."
|
|
763
|
-
)
|
|
764
|
-
self._inject_system_note(summary)
|
|
604
|
+
break
|
|
765
605
|
|
|
766
606
|
should_break_loop = last_message.role != Role.tool
|
|
767
607
|
|
|
@@ -160,7 +160,7 @@ class OpenAIAdapter(APIAdapter):
|
|
|
160
160
|
)
|
|
161
161
|
|
|
162
162
|
# Enable thinking for models that support it (Gemma 4)
|
|
163
|
-
if thinking and thinking
|
|
163
|
+
if thinking and thinking not in ("off", ""):
|
|
164
164
|
payload["chat_template_kwargs"] = {"enable_thinking": True}
|
|
165
165
|
|
|
166
166
|
if enable_streaming:
|
|
@@ -46,9 +46,8 @@ class Question(BaseModel):
|
|
|
46
46
|
|
|
47
47
|
class AskUserQuestionArgs(BaseModel):
|
|
48
48
|
questions: list[Question] = Field(
|
|
49
|
-
default_factory=
|
|
49
|
+
default_factory=list,
|
|
50
50
|
description="Questions to ask (1-4). Displayed as tabs if multiple.",
|
|
51
|
-
min_length=1,
|
|
52
51
|
max_length=4,
|
|
53
52
|
)
|
|
54
53
|
content_preview: str | None = Field(
|
|
@@ -4,7 +4,7 @@ from collections.abc import AsyncGenerator
|
|
|
4
4
|
from enum import StrEnum, auto
|
|
5
5
|
from typing import ClassVar
|
|
6
6
|
|
|
7
|
-
from pydantic import BaseModel, Field
|
|
7
|
+
from pydantic import BaseModel, Field, field_validator
|
|
8
8
|
|
|
9
9
|
from drydock.core.tools.base import (
|
|
10
10
|
BaseTool,
|
|
@@ -37,6 +37,20 @@ class TodoItem(BaseModel):
|
|
|
37
37
|
status: TodoStatus = TodoStatus.PENDING
|
|
38
38
|
priority: TodoPriority = TodoPriority.MEDIUM
|
|
39
39
|
|
|
40
|
+
@field_validator("status", mode="before")
|
|
41
|
+
@classmethod
|
|
42
|
+
def clean_status(cls, v):
|
|
43
|
+
if isinstance(v, str):
|
|
44
|
+
return v.strip("'\"").lower()
|
|
45
|
+
return v
|
|
46
|
+
|
|
47
|
+
@field_validator("priority", mode="before")
|
|
48
|
+
@classmethod
|
|
49
|
+
def clean_priority(cls, v):
|
|
50
|
+
if isinstance(v, str):
|
|
51
|
+
return v.strip("'\"").lower()
|
|
52
|
+
return v
|
|
53
|
+
|
|
40
54
|
|
|
41
55
|
class TodoArgs(BaseModel):
|
|
42
56
|
action: str = Field(default="read", description="Either 'read' or 'write'")
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"""Test all tools accept the argument formats Gemma 4 actually sends.
|
|
2
|
+
|
|
3
|
+
Gemma 4 quirks:
|
|
4
|
+
- Wraps enum values in extra quotes: "'completed'" instead of "completed"
|
|
5
|
+
- Sometimes omits required fields
|
|
6
|
+
- Sometimes sends empty {} for all args
|
|
7
|
+
- Sends file_path as "path" or vice versa
|
|
8
|
+
- Sends content in wrong field for search_replace
|
|
9
|
+
"""
|
|
10
|
+
import json
|
|
11
|
+
import pytest
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from unittest.mock import MagicMock
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def try_validate(args_class, data: dict) -> tuple[bool, str]:
|
|
17
|
+
"""Try to validate args, return (success, error_message)."""
|
|
18
|
+
try:
|
|
19
|
+
args_class.model_validate(data)
|
|
20
|
+
return True, ""
|
|
21
|
+
except Exception as e:
|
|
22
|
+
return False, str(e)[:200]
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class TestTodoArgs:
|
|
26
|
+
"""Todo tool argument validation."""
|
|
27
|
+
|
|
28
|
+
def setup_method(self):
|
|
29
|
+
from drydock.core.tools.builtins.todo import TodoArgs, TodoItem
|
|
30
|
+
self.TodoArgs = TodoArgs
|
|
31
|
+
self.TodoItem = TodoItem
|
|
32
|
+
|
|
33
|
+
def test_empty_args_has_default(self):
|
|
34
|
+
"""Empty {} should work — action defaults to 'read'."""
|
|
35
|
+
ok, err = try_validate(self.TodoArgs, {})
|
|
36
|
+
assert ok, f"Empty args failed: {err}"
|
|
37
|
+
|
|
38
|
+
def test_quoted_enum_status(self):
|
|
39
|
+
"""Gemma 4 sends \"'completed'\" with extra quotes."""
|
|
40
|
+
ok, err = try_validate(self.TodoItem, {
|
|
41
|
+
"id": "1", "content": "test", "status": "'completed'", "priority": "high"
|
|
42
|
+
})
|
|
43
|
+
assert ok, f"Quoted status failed: {err}"
|
|
44
|
+
|
|
45
|
+
def test_quoted_enum_priority(self):
|
|
46
|
+
"""Gemma 4 sends \"'high'\" with extra quotes."""
|
|
47
|
+
ok, err = try_validate(self.TodoItem, {
|
|
48
|
+
"id": "1", "content": "test", "status": "pending", "priority": "'high'"
|
|
49
|
+
})
|
|
50
|
+
assert ok, f"Quoted priority failed: {err}"
|
|
51
|
+
|
|
52
|
+
def test_uppercase_enum(self):
|
|
53
|
+
"""Model might send COMPLETED instead of completed."""
|
|
54
|
+
ok, err = try_validate(self.TodoItem, {
|
|
55
|
+
"id": "1", "content": "test", "status": "COMPLETED", "priority": "HIGH"
|
|
56
|
+
})
|
|
57
|
+
assert ok, f"Uppercase enum failed: {err}"
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class TestWriteFileArgs:
|
|
61
|
+
"""Write file tool argument validation."""
|
|
62
|
+
|
|
63
|
+
def setup_method(self):
|
|
64
|
+
from drydock.core.tools.builtins.write_file import WriteFileArgs
|
|
65
|
+
self.WriteFileArgs = WriteFileArgs
|
|
66
|
+
|
|
67
|
+
def test_normal_args(self):
|
|
68
|
+
ok, err = try_validate(self.WriteFileArgs, {
|
|
69
|
+
"path": "test.py", "content": "print('hello')"
|
|
70
|
+
})
|
|
71
|
+
assert ok, f"Normal args failed: {err}"
|
|
72
|
+
|
|
73
|
+
def test_overwrite_defaults_true(self):
|
|
74
|
+
"""Overwrite should default to True."""
|
|
75
|
+
args = self.WriteFileArgs.model_validate({"path": "test.py", "content": "x"})
|
|
76
|
+
assert args.overwrite is True
|
|
77
|
+
|
|
78
|
+
def test_empty_content(self):
|
|
79
|
+
"""Empty content should be accepted (for __init__.py)."""
|
|
80
|
+
ok, err = try_validate(self.WriteFileArgs, {
|
|
81
|
+
"path": "test.py", "content": ""
|
|
82
|
+
})
|
|
83
|
+
assert ok, f"Empty content failed: {err}"
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class TestSearchReplaceArgs:
|
|
87
|
+
"""Search replace tool argument validation."""
|
|
88
|
+
|
|
89
|
+
def setup_method(self):
|
|
90
|
+
from drydock.core.tools.builtins.search_replace import SearchReplaceArgs
|
|
91
|
+
self.SearchReplaceArgs = SearchReplaceArgs
|
|
92
|
+
|
|
93
|
+
def test_normal_args(self):
|
|
94
|
+
ok, err = try_validate(self.SearchReplaceArgs, {
|
|
95
|
+
"file_path": "test.py",
|
|
96
|
+
"content": "<<<<<<< SEARCH\nold\n=======\nnew\n>>>>>>> REPLACE"
|
|
97
|
+
})
|
|
98
|
+
assert ok, f"Normal args failed: {err}"
|
|
99
|
+
|
|
100
|
+
def test_missing_file_path_has_default(self):
|
|
101
|
+
"""file_path should default to empty string, not crash."""
|
|
102
|
+
ok, err = try_validate(self.SearchReplaceArgs, {
|
|
103
|
+
"content": "<<<<<<< SEARCH\nold\n=======\nnew\n>>>>>>> REPLACE"
|
|
104
|
+
})
|
|
105
|
+
assert ok, f"Missing file_path failed: {err}"
|
|
106
|
+
|
|
107
|
+
def test_old_new_string_direct(self):
|
|
108
|
+
"""Gemma 4 sometimes sends old_string/new_string directly."""
|
|
109
|
+
ok, err = try_validate(self.SearchReplaceArgs, {
|
|
110
|
+
"file_path": "test.py",
|
|
111
|
+
"old_string": "old text",
|
|
112
|
+
"new_string": "new text"
|
|
113
|
+
})
|
|
114
|
+
assert ok, f"Direct old/new string failed: {err}"
|
|
115
|
+
|
|
116
|
+
def test_empty_args(self):
|
|
117
|
+
"""Empty args should not crash."""
|
|
118
|
+
ok, err = try_validate(self.SearchReplaceArgs, {})
|
|
119
|
+
assert ok, f"Empty args failed: {err}"
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class TestAskUserQuestionArgs:
|
|
123
|
+
"""Ask user question tool argument validation."""
|
|
124
|
+
|
|
125
|
+
def setup_method(self):
|
|
126
|
+
from drydock.core.tools.builtins.ask_user_question import AskUserQuestionArgs
|
|
127
|
+
self.AskUserQuestionArgs = AskUserQuestionArgs
|
|
128
|
+
|
|
129
|
+
def test_empty_args_has_default(self):
|
|
130
|
+
"""Empty {} should work — questions has a default."""
|
|
131
|
+
ok, err = try_validate(self.AskUserQuestionArgs, {})
|
|
132
|
+
assert ok, f"Empty args failed: {err}"
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
class TestReadFileArgs:
|
|
136
|
+
"""Read file tool argument validation."""
|
|
137
|
+
|
|
138
|
+
def setup_method(self):
|
|
139
|
+
from drydock.core.tools.builtins.read_file import ReadFileArgs
|
|
140
|
+
self.ReadFileArgs = ReadFileArgs
|
|
141
|
+
|
|
142
|
+
def test_path_field(self):
|
|
143
|
+
ok, err = try_validate(self.ReadFileArgs, {"path": "test.py"})
|
|
144
|
+
assert ok, f"Path field failed: {err}"
|
|
145
|
+
|
|
146
|
+
def test_with_offset_limit(self):
|
|
147
|
+
ok, err = try_validate(self.ReadFileArgs, {
|
|
148
|
+
"path": "test.py", "offset": 10, "limit": 50
|
|
149
|
+
})
|
|
150
|
+
assert ok, f"Offset/limit failed: {err}"
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class TestBashArgs:
|
|
154
|
+
"""Bash tool argument validation."""
|
|
155
|
+
|
|
156
|
+
def setup_method(self):
|
|
157
|
+
from drydock.core.tools.builtins.bash import BashArgs
|
|
158
|
+
self.BashArgs = BashArgs
|
|
159
|
+
|
|
160
|
+
def test_command_field(self):
|
|
161
|
+
ok, err = try_validate(self.BashArgs, {"command": "ls -la"})
|
|
162
|
+
assert ok, f"Command field failed: {err}"
|
|
163
|
+
|
|
164
|
+
def test_with_timeout(self):
|
|
165
|
+
ok, err = try_validate(self.BashArgs, {"command": "sleep 1", "timeout": 5})
|
|
166
|
+
assert ok, f"Timeout failed: {err}"
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
class TestGrepArgs:
|
|
170
|
+
"""Grep tool argument validation."""
|
|
171
|
+
|
|
172
|
+
def setup_method(self):
|
|
173
|
+
from drydock.core.tools.builtins.grep import GrepArgs
|
|
174
|
+
self.GrepArgs = GrepArgs
|
|
175
|
+
|
|
176
|
+
def test_pattern_only(self):
|
|
177
|
+
ok, err = try_validate(self.GrepArgs, {"pattern": "def main"})
|
|
178
|
+
assert ok, f"Pattern only failed: {err}"
|
|
179
|
+
|
|
180
|
+
def test_with_path(self):
|
|
181
|
+
ok, err = try_validate(self.GrepArgs, {"pattern": "import", "path": "."})
|
|
182
|
+
assert ok, f"With path failed: {err}"
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
class TestGlobArgs:
|
|
186
|
+
"""Glob tool argument validation."""
|
|
187
|
+
|
|
188
|
+
def setup_method(self):
|
|
189
|
+
from drydock.core.tools.builtins.glob_tool import GlobArgs
|
|
190
|
+
self.GlobArgs = GlobArgs
|
|
191
|
+
|
|
192
|
+
def test_pattern(self):
|
|
193
|
+
ok, err = try_validate(self.GlobArgs, {"pattern": "*.py"})
|
|
194
|
+
assert ok, f"Pattern failed: {err}"
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
class TestTaskCreateArgs:
|
|
198
|
+
"""Task create tool argument validation."""
|
|
199
|
+
|
|
200
|
+
def setup_method(self):
|
|
201
|
+
from drydock.core.tools.builtins.task_manager import TaskCreateArgs
|
|
202
|
+
self.TaskCreateArgs = TaskCreateArgs
|
|
203
|
+
|
|
204
|
+
def test_normal(self):
|
|
205
|
+
ok, err = try_validate(self.TaskCreateArgs, {"title": "Build the app"})
|
|
206
|
+
assert ok, f"Normal args failed: {err}"
|
|
207
|
+
|
|
208
|
+
def test_with_description(self):
|
|
209
|
+
ok, err = try_validate(self.TaskCreateArgs, {
|
|
210
|
+
"title": "Build the app", "description": "Create all files"
|
|
211
|
+
})
|
|
212
|
+
assert ok, f"With description failed: {err}"
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
class TestSearchReplaceBlockParsing:
|
|
216
|
+
"""Test that search_replace parses various block formats."""
|
|
217
|
+
|
|
218
|
+
def setup_method(self):
|
|
219
|
+
from drydock.core.tools.builtins.search_replace import SearchReplace
|
|
220
|
+
self.parse = SearchReplace._parse_search_replace_blocks
|
|
221
|
+
|
|
222
|
+
def test_standard_format(self):
|
|
223
|
+
blocks = self.parse("<<<<<<< SEARCH\nold text\n=======\nnew text\n>>>>>>> REPLACE")
|
|
224
|
+
assert len(blocks) == 1
|
|
225
|
+
assert blocks[0].search == "old text"
|
|
226
|
+
assert blocks[0].replace == "new text"
|
|
227
|
+
|
|
228
|
+
def test_repeated_search_word(self):
|
|
229
|
+
"""Gemma 4 sometimes repeats: SEARCH SEARCH SEARCH."""
|
|
230
|
+
blocks = self.parse("<<<<<<<<< SEARCH SEARCH SEARCH\nold\n=======\nnew\n>>>>>>>>> REPLACE REPLACE")
|
|
231
|
+
assert len(blocks) == 1
|
|
232
|
+
|
|
233
|
+
def test_json_format(self):
|
|
234
|
+
"""Gemma 4 sometimes sends JSON."""
|
|
235
|
+
blocks = self.parse('{"old_string": "old", "new_string": "new"}')
|
|
236
|
+
assert len(blocks) == 1
|
|
237
|
+
assert blocks[0].search == "old"
|
|
238
|
+
|
|
239
|
+
def test_separator_format(self):
|
|
240
|
+
"""Simple ======= separator."""
|
|
241
|
+
blocks = self.parse("old text\n=======\nnew text")
|
|
242
|
+
assert len(blocks) == 1
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
if __name__ == "__main__":
|
|
246
|
+
pytest.main([__file__, "-v"])
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-2.6.1 → drydock_cli-2.6.3}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|