drydock-cli 2.0.0__tar.gz → 2.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/PKG-INFO +1 -1
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/PRD.md +123 -5
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/agent_loop.py +46 -7
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/build_orchestrator.py +5 -1
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/pyproject.toml +1 -1
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/.gitignore +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/.python-version +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/.typos.toml +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/.vscode/extensions.json +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/.vscode/launch.json +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/.vscode/settings.json +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/AGENTS.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/CHANGELOG.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/CLAUDE.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/Drydock_rebrand.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/LICENSE +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/NOTICE +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/README.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/action.yml +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/docs/README.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/docs/acp-setup.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/logger.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/slug.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/task_manager.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/types.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/utils.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/whats_new.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock-acp.spec +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock_terms.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/flake.lock +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/flake.nix +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/scripts/README.md +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/scripts/auto_test_loop.sh +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/scripts/backup.sh +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/scripts/bump_version.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/scripts/install.sh +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/scripts/monitor_test_battery.sh +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/scripts/notify_release.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/scripts/prepare_release.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/scripts/test_bank.sh +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/scripts/test_full.sh +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/scripts/test_smoke.sh +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/conftest.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/e2e/common.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/mock/utils.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_agents.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_integration.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_message_id.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_middleware.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_smoke.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/test_workloads.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.0.0 → drydock_cli-2.0.1}/uv.lock +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# DryDock — Local CLI Coding Agent
|
|
2
2
|
|
|
3
3
|
**Repository:** https://github.com/fbobe321/drydock
|
|
4
|
-
**PyPI:** https://pypi.org/project/drydock-cli/ (
|
|
4
|
+
**PyPI:** https://pypi.org/project/drydock-cli/ (v2.0.0)
|
|
5
5
|
**License:** Apache 2.0 (fork of [mistralai/mistral-vibe](https://github.com/mistralai/mistral-vibe))
|
|
6
6
|
**Status:** Active development
|
|
7
|
-
**Current version:**
|
|
7
|
+
**Current version:** 2.0.0
|
|
8
8
|
**Hardware:** 2x RTX 4060 Ti 16GB, devstral-24B-AWQ-4bit via vLLM at localhost:8000
|
|
9
9
|
**Server:** remus (Ubuntu 22.04, user: bobef)
|
|
10
10
|
|
|
@@ -323,15 +323,84 @@ drydock/
|
|
|
323
323
|
|
|
324
324
|
---
|
|
325
325
|
|
|
326
|
+
## Mistral/devstral Tool Calling Design (CRITICAL)
|
|
327
|
+
|
|
328
|
+
Understanding how devstral handles tools, agents, and skills is essential. Getting this wrong cost weeks of debugging.
|
|
329
|
+
|
|
330
|
+
### How devstral Decides to Call Tools
|
|
331
|
+
|
|
332
|
+
In `tool_choice="auto"` (default), the model **autonomously decides** whether to call a tool or respond with text. Key rules:
|
|
333
|
+
|
|
334
|
+
1. **If the system prompt asks the model to output text first** (e.g., "Restate the goal"), the model generates text and SKIPS tool calling entirely
|
|
335
|
+
2. **Tool descriptions matter** — the model picks tools based on description quality, not just name
|
|
336
|
+
3. **`tool_choice="required"`** forces a tool call (useful for first-turn delegation)
|
|
337
|
+
4. **`tool_choice={"type":"function","function":{"name":"task"}}`** forces a specific tool
|
|
338
|
+
|
|
339
|
+
### The "Restate the Goal" Bug (v2.0.0 fix)
|
|
340
|
+
|
|
341
|
+
The single line `"Restate the goal in one line."` in the system prompt caused devstral to output text instead of making tool calls. This blocked subagent delegation for months. Evidence: removing it improved task() tool usage from 1/5 to 5/5 across SWE-bench prompts.
|
|
342
|
+
|
|
343
|
+
**Rule: Never ask the model to output text before its first tool call.** Any instruction that triggers text generation pre-empts tool calling.
|
|
344
|
+
|
|
345
|
+
### Tool Definition Format
|
|
346
|
+
|
|
347
|
+
```json
|
|
348
|
+
{
|
|
349
|
+
"type": "function",
|
|
350
|
+
"function": {
|
|
351
|
+
"name": "task",
|
|
352
|
+
"description": "Delegate to subagent (explore/diagnostic/planner)",
|
|
353
|
+
"parameters": {
|
|
354
|
+
"type": "object",
|
|
355
|
+
"properties": {
|
|
356
|
+
"task": {"type": "string"},
|
|
357
|
+
"agent": {"type": "string", "enum": ["explore","diagnostic","planner"]}
|
|
358
|
+
},
|
|
359
|
+
"required": ["task", "agent"]
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### Multi-Agent Pattern
|
|
366
|
+
|
|
367
|
+
DryDock's subagents follow Mistral's agent-to-agent delegation pattern:
|
|
368
|
+
- `explore` — read-only codebase exploration (grep, read_file, glob)
|
|
369
|
+
- `diagnostic` — analyze test failures (grep, read_file, bash, glob)
|
|
370
|
+
- `planner` — create implementation plans (grep, read_file, glob)
|
|
371
|
+
|
|
372
|
+
Each spawns a separate AgentLoop with its own context window. The main agent sees results as tool responses.
|
|
373
|
+
|
|
374
|
+
### Build Orchestrator (bypasses model entirely)
|
|
375
|
+
|
|
376
|
+
For complex build tasks, the orchestrator makes direct API calls instead of going through the model:
|
|
377
|
+
- Phase 1: Deterministic plan extraction from PRD (no LLM)
|
|
378
|
+
- Phase 2: Scaffold package structure (no LLM)
|
|
379
|
+
- Phase 3: One `backend.complete()` call per file (separate context each)
|
|
380
|
+
- Phase 4: Model tests and fixes (standard agent loop)
|
|
381
|
+
|
|
382
|
+
### Key Gotchas
|
|
383
|
+
|
|
384
|
+
| Issue | Solution |
|
|
385
|
+
|-------|----------|
|
|
386
|
+
| Model outputs text instead of calling tools | Don't ask for text before first tool call |
|
|
387
|
+
| vLLM rejects `user` after `tool` messages | `_sanitize_message_ordering()` before every LLM call |
|
|
388
|
+
| `tool_choice="any"` not supported by vLLM | Use `"required"` instead |
|
|
389
|
+
| Model hallucinates tool names (`task_agent:`) | Error handler shows available tool names |
|
|
390
|
+
| Circuit breaker blocks valid retries | Only block FAILED commands (3+ identical failures) |
|
|
391
|
+
| Separate httpx calls get 404 from vLLM | Use `self.backend.complete()` (same connection) |
|
|
392
|
+
|
|
393
|
+
---
|
|
394
|
+
|
|
326
395
|
## Key Decisions
|
|
327
396
|
|
|
328
397
|
**No mock tests.** Every behavior test runs against the real vLLM backend. Mocks gave false confidence — critical bugs like `raw_arguments` crash and circuit breaker failures passed all mock tests but broke in production.
|
|
329
398
|
|
|
330
|
-
**Circuit breaker
|
|
399
|
+
**Circuit breaker: failed-only.** Only blocks commands that FAILED 3+ times with identical args. Successful commands and retries-after-fix are never blocked. Loop detection handles pattern-based repetition separately.
|
|
331
400
|
|
|
332
|
-
**Bash abuse
|
|
401
|
+
**Bash abuse detection.** Model uses cat/grep/sed via bash instead of proper tools. Detected at 3/6/10 bash calls with escalating nudges.
|
|
333
402
|
|
|
334
|
-
**
|
|
403
|
+
**Auto-explore for all tasks.** Instead of relying on the model to call `task(agent="explore")`, the agent loop auto-reads project files and injects function/class signatures before the model's first turn.
|
|
335
404
|
|
|
336
405
|
**Scroll workaround.** Mouse wheel doesn't work in Textual's alternate screen buffer. Shift+Up/Down is the working solution. Copy/paste works with native text selection (mouse=False).
|
|
337
406
|
|
|
@@ -411,3 +480,52 @@ Run with: `./scripts/test_bank.sh` (full) or `./scripts/test_bank.sh quick` (eas
|
|
|
411
480
|
**PRD-driven test bank:** 65 tests (15 core + 50 extended) that give DryDock a PRD and verify the built project RUNS. Core 15 pass at 100%.
|
|
412
481
|
|
|
413
482
|
**Relative import auto-fix:** When model gets "relative import with no known parent package", agent loop explains absolute imports vs python3 -m and forces search_replace.
|
|
483
|
+
|
|
484
|
+
### Phase 13 (Mar 29-30): Multi-Phase Build Orchestrator (v1.6.0-v1.8.0)
|
|
485
|
+
|
|
486
|
+
DryDock was unusable for building projects — broke within 2 minutes every time. Root causes:
|
|
487
|
+
1. Model wasted context on `__init__.py`, relative imports, `__main__.py`
|
|
488
|
+
2. Single context window for everything → model degraded by Phase 4
|
|
489
|
+
3. Cross-file import name mismatches (each file built independently)
|
|
490
|
+
|
|
491
|
+
**Solution: Multi-phase build orchestrator** (`drydock/core/build_orchestrator.py`):
|
|
492
|
+
|
|
493
|
+
| Phase | What | LLM? |
|
|
494
|
+
|---|---|---|
|
|
495
|
+
| 1. PLAN | Parse PRD, extract package name + modules | No (regex) |
|
|
496
|
+
| 2. SCAFFOLD | Create dirs, `__init__.py`, `__main__.py` | No (deterministic) |
|
|
497
|
+
| 3. IMPLEMENT | One `backend.complete()` call per file | Yes (separate context each) |
|
|
498
|
+
| 3.5 FIX | Cross-file import matching, circular import breaking, `from __future__ import annotations` | No (AST analysis) |
|
|
499
|
+
| 4. TEST | Model runs `python3 -m package --help`, fixes errors | Yes (main loop) |
|
|
500
|
+
|
|
501
|
+
**Results:** 79-83% pass rate on 6 PRD types over 24 rounds of automated testing.
|
|
502
|
+
|
|
503
|
+
**Key issues solved along the way:**
|
|
504
|
+
- Orchestrator was calling Mistral cloud API instead of local vLLM (wrong provider selection)
|
|
505
|
+
- Separate httpx calls got 404 from vLLM → switched to `self.backend.complete()`
|
|
506
|
+
- Plan extractor matched English words as package names ("with", "from") → 80+ word blocklist
|
|
507
|
+
- Model rebuilt files in Phase 4 despite being told not to → yield summary directly to user
|
|
508
|
+
- Circuit breaker blocked valid retries after fixes → disabled for successful commands
|
|
509
|
+
|
|
510
|
+
### Phase 14 (Mar 30): Subagent Delegation Fixed + v2.0.0
|
|
511
|
+
|
|
512
|
+
**ROOT CAUSE FOUND for subagent non-use:** The system prompt line `"Restate the goal in one line."` caused devstral to output text instead of making tool calls. This pre-empted the tool-calling mechanism entirely.
|
|
513
|
+
|
|
514
|
+
Evidence: removing this one line improved `task(agent="explore")` usage from 1/5 to 5/5 across SWE-bench test prompts.
|
|
515
|
+
|
|
516
|
+
**Other v2.0.0 changes:**
|
|
517
|
+
- All user-visible "Vibe" references removed (interrupt, window title, onboarding, user agent)
|
|
518
|
+
- `/setup-model` command: interactive wizard for local LLM setup (vLLM, Ollama, LM Studio)
|
|
519
|
+
- `--local` CLI flag: `drydock --local http://localhost:8000/v1`
|
|
520
|
+
- Auto-explore + skill routing for all task types (review, investigate, ship, simplify)
|
|
521
|
+
- Telegram release notifications
|
|
522
|
+
- `whats_new.md` updated
|
|
523
|
+
|
|
524
|
+
### Lessons Learned (Updated)
|
|
525
|
+
|
|
526
|
+
1. **One prompt line can block an entire feature.** "Restate the goal" prevented tool calling for months.
|
|
527
|
+
2. **Don't rely on the model to delegate.** Force it structurally (orchestrator) or do it before the model responds.
|
|
528
|
+
3. **Same-process API calls can fail.** httpx from inside DryDock got 404 from vLLM. Use the existing backend connection.
|
|
529
|
+
4. **Test the installed package, not source.** Different Python envs (miniconda3 vs miniforge3) have different behavior.
|
|
530
|
+
5. **Explicit Python paths everywhere.** Cron doesn't inherit PATH. Every script must use the full path.
|
|
531
|
+
6. **The circuit breaker was net negative.** It blocked valid retries more than it prevented loops. Failed-only mode is the right balance.
|
|
@@ -489,14 +489,53 @@ class AgentLoop:
|
|
|
489
489
|
prd_content = prd_path.read_text()[:8000]
|
|
490
490
|
build_prompt = f"{user_msg}\n\nPRD CONTENT:\n{prd_content}"
|
|
491
491
|
break
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
492
|
+
from drydock.core.build_orchestrator import (
|
|
493
|
+
make_plan_from_prd, scaffold_package, implement_file,
|
|
494
|
+
_fix_cross_file_imports, _fix_circular_imports,
|
|
495
|
+
_extract_public_api,
|
|
496
|
+
)
|
|
497
|
+
|
|
498
|
+
# Phase 1: Plan
|
|
499
|
+
yield AssistantEvent(content="Planning project structure...")
|
|
500
|
+
plan = make_plan_from_prd(build_prompt)
|
|
501
|
+
file_list = ", ".join(f.path.split("/")[-1] for f in plan.files)
|
|
502
|
+
yield AssistantEvent(
|
|
503
|
+
content=f"Package: `{plan.package_name}` with {len(plan.files)} files: {file_list}"
|
|
504
|
+
)
|
|
505
|
+
|
|
506
|
+
# Phase 2: Scaffold
|
|
507
|
+
yield AssistantEvent(content="Creating package structure...")
|
|
508
|
+
scaffold_package(plan, Path.cwd())
|
|
509
|
+
|
|
510
|
+
# Phase 3: Implement each file
|
|
511
|
+
for i, file_spec in enumerate(plan.files):
|
|
512
|
+
yield AssistantEvent(
|
|
513
|
+
content=f"Writing {file_spec.path} ({i+1}/{len(plan.files)})..."
|
|
514
|
+
)
|
|
515
|
+
for attempt in range(3):
|
|
516
|
+
success = await implement_file(
|
|
517
|
+
file_spec, plan, self.config, Path.cwd(), self.backend
|
|
518
|
+
)
|
|
519
|
+
if success:
|
|
520
|
+
from drydock.core.build_orchestrator import _fix_imports
|
|
521
|
+
_fix_imports(Path.cwd() / file_spec.path, plan.package_name)
|
|
522
|
+
break
|
|
523
|
+
|
|
524
|
+
# Phase 3.5: Fix imports
|
|
525
|
+
yield AssistantEvent(content="Fixing cross-file imports...")
|
|
526
|
+
_fix_cross_file_imports(plan, Path.cwd())
|
|
527
|
+
_fix_circular_imports(plan, Path.cwd())
|
|
528
|
+
|
|
529
|
+
# Build summary
|
|
530
|
+
succeeded = sum(
|
|
531
|
+
1 for f in plan.files
|
|
532
|
+
if (Path.cwd() / f.path).exists()
|
|
533
|
+
and (Path.cwd() / f.path).stat().st_size > 100
|
|
534
|
+
)
|
|
535
|
+
summary = (
|
|
536
|
+
f"Project `{plan.package_name}` built: {succeeded}/{len(plan.files)} files.\n"
|
|
537
|
+
f"Test with: `python3 -m {plan.package_name} --help`"
|
|
497
538
|
)
|
|
498
|
-
# Yield the summary directly to the user — don't let the model
|
|
499
|
-
# respond, because it will ignore the instructions and rebuild files.
|
|
500
539
|
yield AssistantEvent(content=summary)
|
|
501
540
|
|
|
502
541
|
# Auto-test: run python3 -m package and report result
|
|
@@ -539,11 +539,15 @@ async def run_build_pipeline(
|
|
|
539
539
|
logger.warning(" Attempt %d error for %s: %s", attempt + 1, file_spec.path, e)
|
|
540
540
|
results.append((file_spec.path, success))
|
|
541
541
|
|
|
542
|
-
# Phase 3.5: Auto-fix
|
|
542
|
+
# Phase 3.5: Auto-fix imports
|
|
543
543
|
logger.info("BUILD PHASE 3.5: Fixing imports...")
|
|
544
544
|
_fix_cross_file_imports(plan, base_dir)
|
|
545
545
|
_fix_circular_imports(plan, base_dir)
|
|
546
546
|
|
|
547
|
+
# Phase 3.75: Verify the package actually imports — fix errors iteratively
|
|
548
|
+
logger.info("BUILD PHASE 3.75: Verify & fix...")
|
|
549
|
+
_verify_and_fix_imports(plan, base_dir)
|
|
550
|
+
|
|
547
551
|
# Build summary
|
|
548
552
|
succeeded = sum(1 for _, ok in results if ok)
|
|
549
553
|
failed_files = [path for path, ok in results if not ok]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/notifications/adapters/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/notifications/ports/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/chat_input/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/chat_input/container.py
RENAMED
|
File without changes
|
{drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/widgets/chat_input/text_area.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/textual_ui/windowing/history_windowing.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py
RENAMED
|
File without changes
|
{drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/cli/update_notifier/ports/update_cache_repository.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/autocompletion/file_indexer/__init__.py
RENAMED
|
File without changes
|
{drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/autocompletion/file_indexer/ignore_rules.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-2.0.0 → drydock_cli-2.0.1}/drydock/core/config/harness_files/_harness_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|