drydock-cli 1.1.6__tar.gz → 1.2.1__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-1.1.6 → drydock_cli-1.2.1}/PKG-INFO +1 -1
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/PRD.md +19 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/prompts/cli.md +41 -1
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/pyproject.toml +1 -1
- drydock_cli-1.2.1/tests/test_multi_agent.py +112 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/.github/CODEOWNERS +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/.github/workflows/ci.yml +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/.github/workflows/release.yml +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/.gitignore +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/.pre-commit-config.yaml +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/.python-version +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/.typos.toml +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/.vscode/extensions.json +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/.vscode/launch.json +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/.vscode/settings.json +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/AGENTS.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/CHANGELOG.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/CLAUDE.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/CONTRIBUTING.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/Drydock_rebrand.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/LICENSE +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/NOTICE +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/README.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/action.yml +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/distribution/zed/LICENSE +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/distribution/zed/extension.toml +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/docs/README.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/docs/acp-setup.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/docs/proxy-setup.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/acp/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/acp/utils.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/cli.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/commands.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/agent_loop.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/agents/models.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/auth/github.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/consultant.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/hooks.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/llm/format.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/llm/types.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/logger.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/middleware.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/plan_session.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/programmatic.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/skills/models.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/slug.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/base.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/task_manager.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/types.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/utils.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/skills/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/whats_new.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock-acp.spec +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock_terms.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/flake.lock +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/flake.nix +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/scripts/README.md +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/scripts/backup.sh +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/scripts/bump_version.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/scripts/install.sh +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/scripts/prepare_release.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/scripts/test_full.sh +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/scripts/test_smoke.sh +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/conftest.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/test_acp.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/test_bash.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/test_content.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/test_utils.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/backend/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/backend/test_backend.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/cli/test_commands.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/conftest.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/core/test_agents.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/core/test_slug.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/core/test_utils.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/e2e/common.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/e2e/conftest.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/mock/__init__.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/mock/utils.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/skills/conftest.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/skills/test_manager.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/skills/test_models.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/skills/test_parser.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_agent_backend.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_agent_stats.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_agents.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_current_bugs.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_full_regression.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_history_manager.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_integration.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_loop_detection.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_message_id.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_message_merging.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_middleware.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_real_failures.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_real_issues.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_smoke.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_system_prompt.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_tagged_text.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/test_user_issues.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/tools/test_bash.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/tools/test_grep.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/tools/test_task.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-1.1.6 → drydock_cli-1.2.1}/uv.lock +0 -0
|
@@ -229,3 +229,22 @@ drydock/
|
|
|
229
229
|
4. **Users find different bugs than benchmarks.** SWE-bench finds agent logic bugs. Real usage finds UI/UX bugs.
|
|
230
230
|
5. **Fix the #1 failure mode.** Bash abuse caused 88% of failures — one fix doubled the pass rate.
|
|
231
231
|
6. **I can't test the TUI.** I write code changes based on docs but can't verify visually. The user is the only tester for UI.
|
|
232
|
+
|
|
233
|
+
### Phase 10 (Mar 28): Multi-Agent Actually Works
|
|
234
|
+
|
|
235
|
+
The agent was NOT using subagents despite having them available since Phase 2.
|
|
236
|
+
Every previous "fix" added code but never told the model WHEN to use it.
|
|
237
|
+
|
|
238
|
+
**Test result (real backend, no hint in prompt):**
|
|
239
|
+
- Before fix: FAILED — 0 subagent calls for 5-file project review
|
|
240
|
+
- After fix: PASSED — model naturally calls `task(agent="explore")`
|
|
241
|
+
|
|
242
|
+
**Root cause:** System prompt had no instructions about multi-agent delegation.
|
|
243
|
+
Adding Python tools/agents doesn't matter if the prompt doesn't tell the model to use them.
|
|
244
|
+
|
|
245
|
+
**Fix:** Added comprehensive "Multi-Agent Delegation" section to system prompt:
|
|
246
|
+
- Lists all available agents (explore, diagnostic, planner)
|
|
247
|
+
- Lists all available skills (investigate, review, ship, batch, simplify, deep-research)
|
|
248
|
+
- Shows exact syntax for delegation
|
|
249
|
+
- Explicit WHEN to delegate rules (3+ files, reviews, bugs, planning)
|
|
250
|
+
- WHEN NOT to delegate (simple fixes, quick questions)
|
|
@@ -17,9 +17,49 @@ Investigate: user wants understanding, explanation, audit, review, or diagnosis
|
|
|
17
17
|
Change: user wants code created, modified, or fixed → proceed to Plan then Execute.
|
|
18
18
|
If unclear, default to investigate. It is better to explain what you would do than to make an unwanted change.
|
|
19
19
|
|
|
20
|
+
Multi-Agent Delegation (IMPORTANT):
|
|
21
|
+
You have subagents that run in their own context window. USE THEM to keep your main context clean.
|
|
22
|
+
|
|
23
|
+
Available agents:
|
|
24
|
+
- `explore` — Read-only codebase exploration (grep, read_file only)
|
|
25
|
+
- `diagnostic` — Analyze test failures and errors
|
|
26
|
+
- `planner` — Create implementation plans before coding
|
|
27
|
+
|
|
28
|
+
Available skills (invoke with `invoke_skill`):
|
|
29
|
+
- `investigate` — Systematic debugging with 3-strike rule
|
|
30
|
+
- `review` — Two-pass code review (critical then informational)
|
|
31
|
+
- `ship` — Test → review → commit → push → PR pipeline
|
|
32
|
+
- `batch` — Apply same change across many files
|
|
33
|
+
- `simplify` — Three-pass code quality review
|
|
34
|
+
- `deep-research` — Web + code research → structured report
|
|
35
|
+
|
|
36
|
+
HOW to delegate:
|
|
37
|
+
```
|
|
38
|
+
task(task="Explore the project structure and list all modules", agent="explore")
|
|
39
|
+
task(task="Analyze why test_auth fails with KeyError", agent="diagnostic")
|
|
40
|
+
task(task="Plan the refactoring of the auth module", agent="planner")
|
|
41
|
+
invoke_skill(skill_name="review")
|
|
42
|
+
invoke_skill(skill_name="investigate", arguments="Fix the login timeout bug")
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
WHEN to delegate (ALWAYS do this):
|
|
46
|
+
- Project has 3+ files to examine → `task(..., agent="explore")` FIRST
|
|
47
|
+
- Need to understand unfamiliar code → explore subagent, then you fix
|
|
48
|
+
- Bug investigation → `invoke_skill(skill_name="investigate")`
|
|
49
|
+
- Code review or audit → `invoke_skill(skill_name="review")`
|
|
50
|
+
- Shipping changes → `invoke_skill(skill_name="ship")`
|
|
51
|
+
- Changing many files → `invoke_skill(skill_name="batch")`
|
|
52
|
+
- Test failures to diagnose → `task(..., agent="diagnostic")`
|
|
53
|
+
- Planning a big change → `task(..., agent="planner")` before coding
|
|
54
|
+
|
|
55
|
+
WHEN NOT to delegate:
|
|
56
|
+
- Simple single-file fixes you can do in 2-3 tool calls
|
|
57
|
+
- Quick questions that need 1 grep + 1 read_file
|
|
58
|
+
- Tasks where you already know exactly what file and line to change
|
|
59
|
+
|
|
20
60
|
Explore. Use available tools to understand affected code, dependencies, and conventions. Never edit a file you haven't read in this session.
|
|
21
61
|
Identify constraints: language, framework, test setup, and any user restrictions on scope.
|
|
22
|
-
When given multiple file paths or a complex task:
|
|
62
|
+
When given multiple file paths or a complex task: delegate exploration to a subagent with `task(task="...", agent="explore")` first. The subagent explores and reports back. You then fix based on its findings. This keeps your main context clean.
|
|
23
63
|
|
|
24
64
|
Phase 2 — Plan (Change tasks only)
|
|
25
65
|
State your plan before writing code:
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"""Tests that DryDock actually uses multi-agent delegation.
|
|
2
|
+
|
|
3
|
+
These MUST run against the real vLLM backend.
|
|
4
|
+
They should FAIL if the model does everything in a single context
|
|
5
|
+
without using the task tool for subagent delegation.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import asyncio
|
|
11
|
+
import os
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
import httpx
|
|
15
|
+
import pytest
|
|
16
|
+
|
|
17
|
+
from drydock.core.config.harness_files import init_harness_files_manager
|
|
18
|
+
try:
|
|
19
|
+
init_harness_files_manager("user", "project")
|
|
20
|
+
except RuntimeError:
|
|
21
|
+
pass
|
|
22
|
+
|
|
23
|
+
from drydock.core.agent_loop import AgentLoop
|
|
24
|
+
from drydock.core.agents.models import BuiltinAgentName
|
|
25
|
+
from drydock.core.config import Backend, ModelConfig, ProviderConfig, VibeConfig
|
|
26
|
+
from drydock.core.types import AssistantEvent, BaseEvent, ToolCallEvent, ToolResultEvent
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _vllm_ok():
|
|
30
|
+
try:
|
|
31
|
+
return httpx.get("http://localhost:8000/v1/models", timeout=3).status_code == 200
|
|
32
|
+
except Exception:
|
|
33
|
+
return False
|
|
34
|
+
|
|
35
|
+
pytestmark = pytest.mark.skipif(not _vllm_ok(), reason="vLLM not running")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _config(tmp_path):
|
|
39
|
+
return VibeConfig(
|
|
40
|
+
active_model="devstral", auto_approve=True, enable_telemetry=False,
|
|
41
|
+
include_project_context=False, system_prompt_id="cli",
|
|
42
|
+
providers=[ProviderConfig(name="local", api_base="http://localhost:8000/v1", api_key_env_var="", backend=Backend.GENERIC)],
|
|
43
|
+
models=[ModelConfig(name="devstral", provider="local", input_price=0, output_price=0)],
|
|
44
|
+
session_logging={"enabled": False, "save_dir": str(tmp_path / "logs")},
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
def _agent(tmp_path, max_turns=12):
|
|
48
|
+
return AgentLoop(config=_config(tmp_path), agent_name=BuiltinAgentName.AUTO_APPROVE, max_turns=max_turns)
|
|
49
|
+
|
|
50
|
+
async def _run(agent, prompt, max_events=80):
|
|
51
|
+
events = []
|
|
52
|
+
async for ev in agent.act(prompt):
|
|
53
|
+
events.append(ev)
|
|
54
|
+
if len(events) >= max_events:
|
|
55
|
+
break
|
|
56
|
+
return events
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@pytest.mark.asyncio
|
|
60
|
+
async def test_agent_uses_subagent_naturally(tmp_path):
|
|
61
|
+
"""Agent should use subagents WITHOUT being told to.
|
|
62
|
+
|
|
63
|
+
The system prompt must instruct the model to delegate complex tasks
|
|
64
|
+
to subagents. If the model does everything alone, this test FAILS.
|
|
65
|
+
|
|
66
|
+
The prompt does NOT mention subagents, task tool, or delegation.
|
|
67
|
+
"""
|
|
68
|
+
# Create a multi-file project with enough complexity
|
|
69
|
+
proj = tmp_path / "project"
|
|
70
|
+
proj.mkdir()
|
|
71
|
+
(proj / "main.py").write_text(
|
|
72
|
+
"from auth import login\nfrom db import get_user\n\n"
|
|
73
|
+
"def handle_request(username, password):\n"
|
|
74
|
+
" user = get_user(username)\n"
|
|
75
|
+
" if login(user, password):\n"
|
|
76
|
+
" return {'status': 'ok'}\n"
|
|
77
|
+
" return {'status': 'denied'}\n"
|
|
78
|
+
)
|
|
79
|
+
(proj / "auth.py").write_text(
|
|
80
|
+
"import hashlib\n\ndef login(user, password):\n"
|
|
81
|
+
" hashed = hashlib.md5(password.encode()).hexdigest()\n"
|
|
82
|
+
" return user['password_hash'] == hashed\n"
|
|
83
|
+
)
|
|
84
|
+
(proj / "db.py").write_text(
|
|
85
|
+
"USERS = {'admin': {'password_hash': '21232f297a57a5a743894a0e4a801fc3', 'role': 'admin'}}\n\n"
|
|
86
|
+
"def get_user(username):\n return USERS.get(username)\n"
|
|
87
|
+
)
|
|
88
|
+
(proj / "config.py").write_text("DB_HOST = 'localhost'\nDB_PORT = 5432\nSECRET = 'changeme'\n")
|
|
89
|
+
(proj / "README.md").write_text("# My App\nA simple auth system.\n")
|
|
90
|
+
|
|
91
|
+
agent = _agent(tmp_path)
|
|
92
|
+
|
|
93
|
+
# Natural prompt — NO mention of subagents or task tool
|
|
94
|
+
events = await _run(agent,
|
|
95
|
+
f"Review the project at {proj}. It has multiple files. "
|
|
96
|
+
f"Find any security issues and explain the architecture."
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
tool_calls = {}
|
|
100
|
+
for ev in events:
|
|
101
|
+
if isinstance(ev, ToolCallEvent):
|
|
102
|
+
tool_calls[ev.tool_name] = tool_calls.get(ev.tool_name, 0) + 1
|
|
103
|
+
|
|
104
|
+
used_task = "task" in tool_calls
|
|
105
|
+
used_skill = "invoke_skill" in tool_calls
|
|
106
|
+
|
|
107
|
+
assert used_task or used_skill, (
|
|
108
|
+
f"FAIL: Agent did NOT use subagents for a multi-file review task. "
|
|
109
|
+
f"Tool calls: {tool_calls}. "
|
|
110
|
+
f"The system prompt must tell the model to use the task tool "
|
|
111
|
+
f"for codebase exploration and complex multi-file analysis."
|
|
112
|
+
)
|
|
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-1.1.6 → drydock_cli-1.2.1}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py
RENAMED
|
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-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/notifications/adapters/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/notifications/ports/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/chat_input/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/chat_input/container.py
RENAMED
|
File without changes
|
{drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/widgets/chat_input/text_area.py
RENAMED
|
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-1.1.6 → drydock_cli-1.2.1}/drydock/cli/textual_ui/windowing/history_windowing.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py
RENAMED
|
File without changes
|
{drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/cli/update_notifier/ports/update_cache_repository.py
RENAMED
|
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-1.1.6 → drydock_cli-1.2.1}/drydock/core/autocompletion/file_indexer/__init__.py
RENAMED
|
File without changes
|
{drydock_cli-1.1.6 → drydock_cli-1.2.1}/drydock/core/autocompletion/file_indexer/ignore_rules.py
RENAMED
|
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-1.1.6 → drydock_cli-1.2.1}/drydock/core/config/harness_files/_harness_manager.py
RENAMED
|
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
|