drydock-cli 1.3.6__tar.gz → 1.3.9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/PKG-INFO +1 -1
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/agent_loop.py +22 -31
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/prompts/cli.md +4 -2
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/pyproject.toml +1 -1
- drydock_cli-1.3.9/tests/test_real_workflow.py +86 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/.github/CODEOWNERS +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/.github/workflows/ci.yml +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/.github/workflows/release.yml +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/.gitignore +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/.pre-commit-config.yaml +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/.python-version +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/.typos.toml +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/.vscode/extensions.json +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/.vscode/launch.json +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/.vscode/settings.json +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/AGENTS.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/CHANGELOG.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/CLAUDE.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/CONTRIBUTING.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/Drydock_rebrand.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/LICENSE +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/NOTICE +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/PRD.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/README.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/action.yml +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/distribution/zed/LICENSE +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/distribution/zed/extension.toml +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/docs/README.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/docs/acp-setup.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/docs/proxy-setup.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/acp/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/acp/utils.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/cli.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/commands.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/agents/models.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/auth/github.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/consultant.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/hooks.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/llm/format.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/llm/types.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/logger.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/middleware.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/plan_session.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/plugins.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/programmatic.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/skills/models.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/slug.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/base.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/task_manager.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/types.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/utils.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/skills/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/whats_new.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock-acp.spec +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock_terms.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/flake.lock +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/flake.nix +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/scripts/README.md +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/scripts/backup.sh +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/scripts/bump_version.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/scripts/install.sh +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/scripts/prepare_release.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/scripts/test_full.sh +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/scripts/test_smoke.sh +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/conftest.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/test_acp.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/test_bash.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/test_content.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/test_utils.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/backend/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/backend/test_backend.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/cli/test_commands.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/conftest.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/core/test_agents.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/core/test_slug.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/core/test_utils.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/e2e/common.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/e2e/conftest.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/mock/__init__.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/mock/utils.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/skills/conftest.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/skills/test_manager.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/skills/test_models.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/skills/test_parser.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/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.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_agent_backend.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_agent_stats.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_agents.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_current_bugs.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_full_regression.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_history_manager.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_integration.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_loop_detection.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_message_id.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_message_merging.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_middleware.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_multi_agent.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_real_failures.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_real_issues.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_smoke.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_system_prompt.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_tagged_text.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/test_user_issues.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/tools/test_bash.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/tools/test_grep.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/tools/test_task.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-1.3.6 → drydock_cli-1.3.9}/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
|
|
@@ -935,22 +932,16 @@ class AgentLoop:
|
|
|
935
932
|
f"{tool_call.tool_name}:{args_str}".encode()
|
|
936
933
|
).hexdigest()
|
|
937
934
|
|
|
938
|
-
# Determine threshold based on tool type
|
|
939
|
-
if tool_call.tool_name in ("grep", "read_file", "glob", "tool_search", "lsp"):
|
|
940
|
-
threshold = 4 # Read-only tools get more room
|
|
941
|
-
elif tool_call.tool_name == "bash":
|
|
942
|
-
# Check if it's a read-only bash command
|
|
943
|
-
cmd = args_str.lower()
|
|
944
|
-
read_only = any(k in cmd for k in ["ls ", "pwd", "cat ", "head ", "tail ",
|
|
945
|
-
"git status", "git log", "git diff", "echo ", "which ", "whoami"])
|
|
946
|
-
threshold = 4 if read_only else 3
|
|
947
|
-
elif tool_call.tool_name in ("search_replace", "write_file"):
|
|
948
|
-
threshold = 2 # Write tools — strict
|
|
949
|
-
else:
|
|
950
|
-
threshold = 3
|
|
951
|
-
|
|
952
935
|
count, last_result = self._tool_call_history.get(sig, (0, ""))
|
|
953
|
-
if
|
|
936
|
+
is_failed = last_result.startswith("FAILED:") if last_result else False
|
|
937
|
+
|
|
938
|
+
# ONLY block commands that FAILED — successful commands are allowed to repeat.
|
|
939
|
+
# The model legitimately runs ls, git status, etc. multiple times during work.
|
|
940
|
+
# Loop detection (_check_tool_call_repetition) handles pattern-based loops.
|
|
941
|
+
if not (is_failed and count >= 2):
|
|
942
|
+
return None
|
|
943
|
+
|
|
944
|
+
if count >= 2:
|
|
954
945
|
attempted = self._get_attempted_summary()
|
|
955
946
|
msg = (
|
|
956
947
|
f"CIRCUIT BREAKER: You already ran `{tool_call.tool_name}` with these "
|
|
@@ -993,7 +984,7 @@ class AgentLoop:
|
|
|
993
984
|
if blocked := self._circuit_breaker_check(tool_call):
|
|
994
985
|
self._consecutive_circuit_breaker_fires += 1
|
|
995
986
|
|
|
996
|
-
if self._consecutive_circuit_breaker_fires >=
|
|
987
|
+
if self._consecutive_circuit_breaker_fires >= 5:
|
|
997
988
|
# Model is ignoring the circuit breaker — force stop
|
|
998
989
|
force_msg = (
|
|
999
990
|
f"FORCED STOP: You ignored the circuit breaker {self._consecutive_circuit_breaker_fires} times. "
|
|
@@ -1190,7 +1181,7 @@ class AgentLoop:
|
|
|
1190
1181
|
yield event
|
|
1191
1182
|
for tool_call in resolved.tool_calls:
|
|
1192
1183
|
# Stop processing more tool calls if circuit breaker force-stopped
|
|
1193
|
-
if self._consecutive_circuit_breaker_fires >=
|
|
1184
|
+
if self._consecutive_circuit_breaker_fires >= 5:
|
|
1194
1185
|
break
|
|
1195
1186
|
|
|
1196
1187
|
yield ToolCallEvent(
|
|
@@ -209,11 +209,13 @@ Bug Fixing in Open-Source Repos
|
|
|
209
209
|
NEVER edit test files. The bug is in the library source code, not the tests.
|
|
210
210
|
|
|
211
211
|
CRITICAL — Tool Usage:
|
|
212
|
+
- To CREATE files: use write_file. NEVER use bash with touch/echo>/cat<<EOF.
|
|
212
213
|
- To EDIT files: use search_replace. NEVER use bash with sed/awk/echo to edit files.
|
|
213
214
|
- To READ files: use read_file. NEVER use bash with cat/head/tail.
|
|
214
215
|
- To SEARCH code: use grep. NEVER use bash with grep/find/rg.
|
|
215
|
-
-
|
|
216
|
-
-
|
|
216
|
+
- To CREATE directories: bash mkdir -p is fine.
|
|
217
|
+
- bash is ONLY for: running tests, git commands, installing packages, mkdir, running scripts.
|
|
218
|
+
- If you have not called write_file or search_replace, you have not created or fixed anything.
|
|
217
219
|
|
|
218
220
|
Error Handling:
|
|
219
221
|
- If a command FAILS, do NOT repeat it. Read the error message and adapt.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""Real workflow tests — the EXACT scenarios users hit.
|
|
2
|
+
|
|
3
|
+
These run against the real vLLM backend with realistic prompts.
|
|
4
|
+
If these pass, DryDock is usable for normal work.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import asyncio
|
|
10
|
+
import os
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
import httpx
|
|
14
|
+
import pytest
|
|
15
|
+
|
|
16
|
+
from drydock.core.config.harness_files import init_harness_files_manager
|
|
17
|
+
try:
|
|
18
|
+
init_harness_files_manager("user", "project")
|
|
19
|
+
except RuntimeError:
|
|
20
|
+
pass
|
|
21
|
+
|
|
22
|
+
from drydock.core.agent_loop import AgentLoop
|
|
23
|
+
from drydock.core.agents.models import BuiltinAgentName
|
|
24
|
+
from drydock.core.config import Backend, ModelConfig, ProviderConfig, VibeConfig
|
|
25
|
+
from drydock.core.types import AssistantEvent, ToolCallEvent, ToolResultEvent
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _vllm_ok():
|
|
29
|
+
try:
|
|
30
|
+
return httpx.get("http://localhost:8000/v1/models", timeout=3).status_code == 200
|
|
31
|
+
except Exception:
|
|
32
|
+
return False
|
|
33
|
+
|
|
34
|
+
pytestmark = pytest.mark.skipif(not _vllm_ok(), reason="vLLM not running")
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _agent(tmp_path, max_turns=20):
|
|
38
|
+
config = VibeConfig(
|
|
39
|
+
active_model="devstral", auto_approve=True, enable_telemetry=False,
|
|
40
|
+
include_project_context=False, system_prompt_id="cli",
|
|
41
|
+
providers=[ProviderConfig(name="local", api_base="http://localhost:8000/v1", api_key_env_var="", backend=Backend.GENERIC)],
|
|
42
|
+
models=[ModelConfig(name="devstral", provider="local", input_price=0, output_price=0)],
|
|
43
|
+
session_logging={"enabled": False, "save_dir": str(tmp_path / "logs")},
|
|
44
|
+
)
|
|
45
|
+
os.chdir(tmp_path)
|
|
46
|
+
return AgentLoop(config=config, agent_name=BuiltinAgentName.AUTO_APPROVE, max_turns=max_turns)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
async def _run(agent, prompt, max_events=150):
|
|
50
|
+
events = []
|
|
51
|
+
async for ev in agent.act(prompt):
|
|
52
|
+
events.append(ev)
|
|
53
|
+
if len(events) >= max_events:
|
|
54
|
+
break
|
|
55
|
+
return events
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@pytest.mark.asyncio
|
|
59
|
+
async def test_build_project_from_prd(tmp_path):
|
|
60
|
+
"""THE user's exact scenario: read PRD, build project.
|
|
61
|
+
|
|
62
|
+
Must NOT trigger circuit breaker or crash.
|
|
63
|
+
Must create at least some files.
|
|
64
|
+
"""
|
|
65
|
+
(tmp_path / "PRD.md").write_text(
|
|
66
|
+
"# CLI Tool\\n\\nBuild a Python CLI tool.\\n"
|
|
67
|
+
"## Features\\n- Parse input files\\n- Show statistics\\n"
|
|
68
|
+
"## Structure\\n- myapp/ package\\n- parser.py, cli.py\\n"
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
agent = _agent(tmp_path)
|
|
72
|
+
events = await _run(agent, "review the PRD and get started")
|
|
73
|
+
|
|
74
|
+
errors = [e for e in events if isinstance(e, ToolResultEvent) and e.error]
|
|
75
|
+
cb_errors = [e for e in errors if "CIRCUIT BREAKER" in str(e.error)]
|
|
76
|
+
force_stops = [e for e in events if isinstance(e, AssistantEvent) and e.stopped_by_middleware
|
|
77
|
+
and "FORCED STOP" in (e.content or "")]
|
|
78
|
+
ordering = [e for e in errors if "Unexpected role" in str(e.error)]
|
|
79
|
+
|
|
80
|
+
assert not force_stops, f"Session force-stopped during normal project setup"
|
|
81
|
+
assert not ordering, f"Message ordering crash: {ordering[0].error[:100]}"
|
|
82
|
+
assert len(cb_errors) <= 2, f"Circuit breaker fired {len(cb_errors)} times during normal work"
|
|
83
|
+
|
|
84
|
+
# Should have created some files
|
|
85
|
+
created = list(tmp_path.rglob("*.py"))
|
|
86
|
+
assert len(created) > 0, "No Python files created"
|
|
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.6 → drydock_cli-1.3.9}/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.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/notifications/adapters/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{drydock_cli-1.3.6 → drydock_cli-1.3.9}/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.6 → drydock_cli-1.3.9}/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.6 → drydock_cli-1.3.9}/drydock/cli/textual_ui/widgets/chat_input/container.py
RENAMED
|
File without changes
|
{drydock_cli-1.3.6 → drydock_cli-1.3.9}/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.6 → drydock_cli-1.3.9}/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.6 → drydock_cli-1.3.9}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py
RENAMED
|
File without changes
|
{drydock_cli-1.3.6 → drydock_cli-1.3.9}/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
|
{drydock_cli-1.3.6 → drydock_cli-1.3.9}/drydock/core/autocompletion/file_indexer/__init__.py
RENAMED
|
File without changes
|
{drydock_cli-1.3.6 → drydock_cli-1.3.9}/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.3.6 → drydock_cli-1.3.9}/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
|