drydock-cli 1.3.8__tar.gz → 1.4.0__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.3.8 → drydock_cli-1.4.0}/PKG-INFO +1 -1
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/agent_loop.py +11 -14
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/pyproject.toml +1 -1
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/scripts/test_full.sh +4 -0
- drydock_cli-1.4.0/tests/test_build_projects.py +272 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/.github/CODEOWNERS +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/.github/workflows/ci.yml +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/.github/workflows/release.yml +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/.gitignore +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/.pre-commit-config.yaml +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/.python-version +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/.typos.toml +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/.vscode/extensions.json +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/.vscode/launch.json +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/.vscode/settings.json +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/AGENTS.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/CHANGELOG.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/CLAUDE.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/CONTRIBUTING.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/Drydock_rebrand.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/LICENSE +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/NOTICE +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/PRD.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/README.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/action.yml +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/distribution/zed/LICENSE +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/distribution/zed/extension.toml +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/docs/README.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/docs/acp-setup.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/docs/proxy-setup.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/acp/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/acp/utils.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/cli.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/commands.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/agents/models.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/auth/github.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/consultant.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/hooks.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/llm/format.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/llm/types.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/logger.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/middleware.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/plan_session.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/plugins.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/programmatic.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/skills/models.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/slug.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/base.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/task_manager.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/types.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/core/utils.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/skills/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/whats_new.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock-acp.spec +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock_terms.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/flake.lock +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/flake.nix +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/scripts/README.md +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/scripts/backup.sh +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/scripts/bump_version.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/scripts/install.sh +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/scripts/prepare_release.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/scripts/test_smoke.sh +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/conftest.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/test_acp.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/test_bash.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/test_content.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/test_utils.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/backend/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/backend/test_backend.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/cli/test_commands.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/conftest.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/core/test_agents.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/core/test_slug.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/core/test_utils.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/e2e/common.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/e2e/conftest.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/mock/__init__.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/mock/utils.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/skills/conftest.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/skills/test_manager.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/skills/test_models.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/skills/test_parser.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/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.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_agent_backend.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_agent_stats.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_agents.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_current_bugs.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_full_regression.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_history_manager.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_integration.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_loop_detection.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_message_id.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_message_merging.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_middleware.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_multi_agent.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_real_failures.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_real_issues.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_real_workflow.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_smoke.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_system_prompt.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_tagged_text.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/test_user_issues.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/tools/test_bash.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/tools/test_grep.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/tools/test_task.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-1.3.8 → drydock_cli-1.4.0}/uv.lock +0 -0
|
@@ -617,25 +617,22 @@ class AgentLoop:
|
|
|
617
617
|
)
|
|
618
618
|
|
|
619
619
|
# Bash abuse detection: model uses bash instead of proper tools
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
if bash_count == 5:
|
|
620
|
+
if not has_made_edit and bash_count >= 3:
|
|
621
|
+
if bash_count == 3:
|
|
623
622
|
self._inject_system_note(
|
|
624
|
-
"You have run
|
|
625
|
-
"STOP
|
|
626
|
-
"
|
|
627
|
-
"Call search_replace NOW to fix the bug."
|
|
623
|
+
"You have run 3 bash commands without creating or editing any files. "
|
|
624
|
+
"STOP running bash. Start CREATING files with write_file or "
|
|
625
|
+
"EDITING files with search_replace. bash does not create code."
|
|
628
626
|
)
|
|
629
|
-
elif bash_count ==
|
|
627
|
+
elif bash_count == 6:
|
|
630
628
|
self._inject_system_note(
|
|
631
|
-
"WARNING:
|
|
632
|
-
"
|
|
633
|
-
"
|
|
629
|
+
"WARNING: 6 bash commands, ZERO file edits. You are stuck in a loop. "
|
|
630
|
+
"Your NEXT action MUST be write_file to create a file or "
|
|
631
|
+
"search_replace to edit one. Do NOT run any more bash commands."
|
|
634
632
|
)
|
|
635
|
-
elif bash_count >=
|
|
636
|
-
# Force stop — model is clearly stuck in bash loop
|
|
633
|
+
elif bash_count >= 10:
|
|
637
634
|
yield AssistantEvent(
|
|
638
|
-
content="\n\n[STOPPED:
|
|
635
|
+
content="\n\n[STOPPED: 10+ bash commands without creating any files. Use write_file.]\n",
|
|
639
636
|
stopped_by_middleware=True,
|
|
640
637
|
)
|
|
641
638
|
return
|
|
@@ -11,3 +11,7 @@ python3 -m pytest tests/test_smoke.py -p no:xdist -p no:cov --override-ini="addo
|
|
|
11
11
|
echo ""
|
|
12
12
|
echo "=== FULL REGRESSION (real backend) ==="
|
|
13
13
|
python3 -m pytest tests/test_full_regression.py -v -p no:xdist -p no:cov --override-ini="addopts="
|
|
14
|
+
|
|
15
|
+
echo ""
|
|
16
|
+
echo "=== BUILD PROJECT TESTS (real backend, 30-60 min) ==="
|
|
17
|
+
python3 -m pytest tests/test_build_projects.py -v -s -p no:xdist -p no:cov --override-ini="addopts="
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
"""Build project tests — DryDock must actually BUILD things.
|
|
2
|
+
|
|
3
|
+
These are LONG tests (5-20 min each) that run against the real vLLM backend.
|
|
4
|
+
They ask DryDock to build real projects and verify:
|
|
5
|
+
1. Files are actually created
|
|
6
|
+
2. No circuit breaker kills the session
|
|
7
|
+
3. No message ordering crashes
|
|
8
|
+
4. No infinite loops (bash abuse, repetition)
|
|
9
|
+
5. Created code is valid Python (syntax check)
|
|
10
|
+
|
|
11
|
+
Run: pytest tests/test_build_projects.py -v -s
|
|
12
|
+
Expected runtime: 30-60 minutes total
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import asyncio
|
|
18
|
+
import os
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
|
|
21
|
+
import httpx
|
|
22
|
+
import pytest
|
|
23
|
+
|
|
24
|
+
from drydock.core.config.harness_files import init_harness_files_manager
|
|
25
|
+
try:
|
|
26
|
+
init_harness_files_manager("user", "project")
|
|
27
|
+
except RuntimeError:
|
|
28
|
+
pass
|
|
29
|
+
|
|
30
|
+
from drydock.core.agent_loop import AgentLoop
|
|
31
|
+
from drydock.core.agents.models import BuiltinAgentName
|
|
32
|
+
from drydock.core.config import Backend, ModelConfig, ProviderConfig, VibeConfig
|
|
33
|
+
from drydock.core.types import AssistantEvent, ToolCallEvent, ToolResultEvent
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _vllm_ok():
|
|
37
|
+
try:
|
|
38
|
+
return httpx.get("http://localhost:8000/v1/models", timeout=3).status_code == 200
|
|
39
|
+
except Exception:
|
|
40
|
+
return False
|
|
41
|
+
|
|
42
|
+
pytestmark = pytest.mark.skipif(not _vllm_ok(), reason="vLLM not running")
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _agent(work_dir: Path, max_turns: int = 30):
|
|
46
|
+
config = VibeConfig(
|
|
47
|
+
active_model="devstral", auto_approve=True, enable_telemetry=False,
|
|
48
|
+
include_project_context=False, system_prompt_id="cli",
|
|
49
|
+
providers=[ProviderConfig(name="local", api_base="http://localhost:8000/v1", api_key_env_var="", backend=Backend.GENERIC)],
|
|
50
|
+
models=[ModelConfig(name="devstral", provider="local", input_price=0, output_price=0)],
|
|
51
|
+
session_logging={"enabled": False, "save_dir": str(work_dir / ".logs")},
|
|
52
|
+
)
|
|
53
|
+
os.chdir(work_dir)
|
|
54
|
+
return AgentLoop(config=config, agent_name=BuiltinAgentName.AUTO_APPROVE, max_turns=max_turns)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
async def _run_and_evaluate(agent, prompt, work_dir, max_events=200):
|
|
58
|
+
"""Run agent and collect detailed metrics."""
|
|
59
|
+
events = []
|
|
60
|
+
tool_counts = {}
|
|
61
|
+
errors = []
|
|
62
|
+
circuit_breaker_fires = 0
|
|
63
|
+
force_stops = 0
|
|
64
|
+
ordering_crashes = 0
|
|
65
|
+
|
|
66
|
+
async for ev in agent.act(prompt):
|
|
67
|
+
events.append(ev)
|
|
68
|
+
if isinstance(ev, ToolCallEvent):
|
|
69
|
+
tool_counts[ev.tool_name] = tool_counts.get(ev.tool_name, 0) + 1
|
|
70
|
+
elif isinstance(ev, ToolResultEvent) and ev.error:
|
|
71
|
+
err = str(ev.error)
|
|
72
|
+
errors.append(err[:100])
|
|
73
|
+
if "CIRCUIT BREAKER" in err:
|
|
74
|
+
circuit_breaker_fires += 1
|
|
75
|
+
if "Unexpected role" in err:
|
|
76
|
+
ordering_crashes += 1
|
|
77
|
+
elif isinstance(ev, AssistantEvent) and ev.stopped_by_middleware:
|
|
78
|
+
if "FORCED STOP" in (ev.content or ""):
|
|
79
|
+
force_stops += 1
|
|
80
|
+
if len(events) >= max_events:
|
|
81
|
+
break
|
|
82
|
+
|
|
83
|
+
# Count created files
|
|
84
|
+
py_files = list(work_dir.rglob("*.py"))
|
|
85
|
+
all_files = [f for f in work_dir.rglob("*") if f.is_file() and ".logs" not in str(f)]
|
|
86
|
+
|
|
87
|
+
# Syntax check created Python files
|
|
88
|
+
syntax_errors = 0
|
|
89
|
+
for f in py_files:
|
|
90
|
+
try:
|
|
91
|
+
import ast
|
|
92
|
+
ast.parse(f.read_text())
|
|
93
|
+
except SyntaxError:
|
|
94
|
+
syntax_errors += 1
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
"events": len(events),
|
|
98
|
+
"tool_counts": tool_counts,
|
|
99
|
+
"errors": len(errors),
|
|
100
|
+
"circuit_breaker_fires": circuit_breaker_fires,
|
|
101
|
+
"force_stops": force_stops,
|
|
102
|
+
"ordering_crashes": ordering_crashes,
|
|
103
|
+
"py_files": len(py_files),
|
|
104
|
+
"all_files": len(all_files),
|
|
105
|
+
"syntax_errors": syntax_errors,
|
|
106
|
+
"error_details": errors[:5],
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
# ============================================================================
|
|
111
|
+
# Test 1: Build a CLI tool from a PRD
|
|
112
|
+
# ============================================================================
|
|
113
|
+
|
|
114
|
+
@pytest.mark.asyncio
|
|
115
|
+
async def test_build_cli_from_prd(tmp_path):
|
|
116
|
+
"""User scenario: 'review the PRD and get started'
|
|
117
|
+
|
|
118
|
+
Must create a Python package with multiple files.
|
|
119
|
+
Must NOT crash, loop, or get killed by circuit breaker.
|
|
120
|
+
"""
|
|
121
|
+
(tmp_path / "PRD.md").write_text(
|
|
122
|
+
"# File Counter CLI\n\n"
|
|
123
|
+
"Build a Python CLI tool that counts files in a directory.\n\n"
|
|
124
|
+
"## Features\n"
|
|
125
|
+
"- Count files by extension\n"
|
|
126
|
+
"- Show total size\n"
|
|
127
|
+
"- Support --recursive flag\n\n"
|
|
128
|
+
"## Structure\n"
|
|
129
|
+
"- file_counter/ package\n"
|
|
130
|
+
"- counter.py — core counting logic\n"
|
|
131
|
+
"- cli.py — argparse interface\n"
|
|
132
|
+
"- __init__.py\n"
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
agent = _agent(tmp_path, max_turns=25)
|
|
136
|
+
result = await _run_and_evaluate(agent, "review the PRD and build the project", tmp_path)
|
|
137
|
+
|
|
138
|
+
print(f"\n=== BUILD CLI RESULTS ===")
|
|
139
|
+
print(f"Events: {result['events']}, Tools: {result['tool_counts']}")
|
|
140
|
+
print(f"Files: {result['py_files']} Python, {result['all_files']} total")
|
|
141
|
+
print(f"Errors: {result['errors']}, CB: {result['circuit_breaker_fires']}, Stops: {result['force_stops']}")
|
|
142
|
+
if result['error_details']:
|
|
143
|
+
print(f"Error samples: {result['error_details'][:3]}")
|
|
144
|
+
|
|
145
|
+
assert result["ordering_crashes"] == 0, "Message ordering crash"
|
|
146
|
+
assert result["force_stops"] == 0, "Session force-stopped"
|
|
147
|
+
assert result["circuit_breaker_fires"] <= 2, f"Circuit breaker fired {result['circuit_breaker_fires']} times"
|
|
148
|
+
assert result["py_files"] >= 2, f"Only {result['py_files']} Python files created (need 2+)"
|
|
149
|
+
assert result["syntax_errors"] == 0, f"{result['syntax_errors']} files have syntax errors"
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
# ============================================================================
|
|
153
|
+
# Test 2: Build a simple Python script
|
|
154
|
+
# ============================================================================
|
|
155
|
+
|
|
156
|
+
@pytest.mark.asyncio
|
|
157
|
+
async def test_build_simple_script(tmp_path):
|
|
158
|
+
"""User scenario: 'write a Python script that...'
|
|
159
|
+
|
|
160
|
+
Simpler task — should complete quickly with write_file.
|
|
161
|
+
"""
|
|
162
|
+
agent = _agent(tmp_path, max_turns=15)
|
|
163
|
+
result = await _run_and_evaluate(
|
|
164
|
+
agent,
|
|
165
|
+
"Write a Python script called calculator.py that implements add, subtract, multiply, divide functions and a main() that demos them",
|
|
166
|
+
tmp_path,
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
print(f"\n=== SIMPLE SCRIPT RESULTS ===")
|
|
170
|
+
print(f"Events: {result['events']}, Tools: {result['tool_counts']}")
|
|
171
|
+
print(f"Files: {result['py_files']} Python")
|
|
172
|
+
|
|
173
|
+
assert result["ordering_crashes"] == 0
|
|
174
|
+
assert result["force_stops"] == 0
|
|
175
|
+
assert result["py_files"] >= 1, "No Python file created"
|
|
176
|
+
assert (tmp_path / "calculator.py").exists(), "calculator.py not created"
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
# ============================================================================
|
|
180
|
+
# Test 3: Add a feature to existing code
|
|
181
|
+
# ============================================================================
|
|
182
|
+
|
|
183
|
+
@pytest.mark.asyncio
|
|
184
|
+
async def test_add_feature_to_existing(tmp_path):
|
|
185
|
+
"""User scenario: 'add X to this code'
|
|
186
|
+
|
|
187
|
+
Tests search_replace on existing files.
|
|
188
|
+
"""
|
|
189
|
+
(tmp_path / "app.py").write_text(
|
|
190
|
+
"def greet(name):\n"
|
|
191
|
+
" return f'Hello, {name}!'\n\n"
|
|
192
|
+
"if __name__ == '__main__':\n"
|
|
193
|
+
" print(greet('World'))\n"
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
agent = _agent(tmp_path, max_turns=15)
|
|
197
|
+
result = await _run_and_evaluate(
|
|
198
|
+
agent,
|
|
199
|
+
"Add a goodbye function to app.py and call it from main",
|
|
200
|
+
tmp_path,
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
print(f"\n=== ADD FEATURE RESULTS ===")
|
|
204
|
+
print(f"Events: {result['events']}, Tools: {result['tool_counts']}")
|
|
205
|
+
|
|
206
|
+
assert result["ordering_crashes"] == 0
|
|
207
|
+
assert result["force_stops"] == 0
|
|
208
|
+
# Should have used search_replace or write_file
|
|
209
|
+
edit_tools = result["tool_counts"].get("search_replace", 0) + result["tool_counts"].get("write_file", 0)
|
|
210
|
+
assert edit_tools >= 1, f"No edits made (search_replace={result['tool_counts'].get('search_replace',0)}, write_file={result['tool_counts'].get('write_file',0)})"
|
|
211
|
+
|
|
212
|
+
content = (tmp_path / "app.py").read_text()
|
|
213
|
+
assert "goodbye" in content.lower() or "bye" in content.lower(), "Feature not added"
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
# ============================================================================
|
|
217
|
+
# Test 4: Fix a bug in existing code
|
|
218
|
+
# ============================================================================
|
|
219
|
+
|
|
220
|
+
@pytest.mark.asyncio
|
|
221
|
+
async def test_fix_bug(tmp_path):
|
|
222
|
+
"""User scenario: 'there's a bug, fix it'"""
|
|
223
|
+
(tmp_path / "divide.py").write_text(
|
|
224
|
+
"def safe_divide(a, b):\n"
|
|
225
|
+
" return a / b # BUG: no zero check\n\n"
|
|
226
|
+
"print(safe_divide(10, 0))\n"
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
agent = _agent(tmp_path, max_turns=15)
|
|
230
|
+
result = await _run_and_evaluate(
|
|
231
|
+
agent,
|
|
232
|
+
"Fix the divide by zero bug in divide.py",
|
|
233
|
+
tmp_path,
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
print(f"\n=== FIX BUG RESULTS ===")
|
|
237
|
+
print(f"Events: {result['events']}, Tools: {result['tool_counts']}")
|
|
238
|
+
|
|
239
|
+
assert result["ordering_crashes"] == 0
|
|
240
|
+
assert result["force_stops"] == 0
|
|
241
|
+
|
|
242
|
+
content = (tmp_path / "divide.py").read_text()
|
|
243
|
+
has_fix = "if" in content or "try" in content or "== 0" in content or "ZeroDivision" in content
|
|
244
|
+
assert has_fix, "Bug not fixed — no zero check added"
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
# ============================================================================
|
|
248
|
+
# Test 5: Multi-file project with tests
|
|
249
|
+
# ============================================================================
|
|
250
|
+
|
|
251
|
+
@pytest.mark.asyncio
|
|
252
|
+
async def test_build_project_with_tests(tmp_path):
|
|
253
|
+
"""User scenario: 'build a project with tests'
|
|
254
|
+
|
|
255
|
+
The hardest test — must create package + test files.
|
|
256
|
+
"""
|
|
257
|
+
agent = _agent(tmp_path, max_turns=30)
|
|
258
|
+
result = await _run_and_evaluate(
|
|
259
|
+
agent,
|
|
260
|
+
"Create a Python package called 'mathlib' with functions for factorial, fibonacci, and is_prime. Include a test file.",
|
|
261
|
+
tmp_path,
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
print(f"\n=== PROJECT WITH TESTS RESULTS ===")
|
|
265
|
+
print(f"Events: {result['events']}, Tools: {result['tool_counts']}")
|
|
266
|
+
print(f"Files: {result['py_files']} Python, {result['all_files']} total")
|
|
267
|
+
print(f"Syntax errors: {result['syntax_errors']}")
|
|
268
|
+
|
|
269
|
+
assert result["ordering_crashes"] == 0
|
|
270
|
+
assert result["force_stops"] == 0
|
|
271
|
+
assert result["py_files"] >= 2, f"Only {result['py_files']} Python files (need package + tests)"
|
|
272
|
+
assert result["syntax_errors"] == 0, "Created files have syntax errors"
|
|
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-1.3.8 → drydock_cli-1.4.0}/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.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/notifications/adapters/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{drydock_cli-1.3.8 → drydock_cli-1.4.0}/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.3.8 → drydock_cli-1.4.0}/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.3.8 → drydock_cli-1.4.0}/drydock/cli/textual_ui/widgets/chat_input/container.py
RENAMED
|
File without changes
|
{drydock_cli-1.3.8 → drydock_cli-1.4.0}/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.3.8 → drydock_cli-1.4.0}/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.3.8 → drydock_cli-1.4.0}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py
RENAMED
|
File without changes
|
{drydock_cli-1.3.8 → drydock_cli-1.4.0}/drydock/cli/update_notifier/ports/update_cache_repository.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|