drydock-cli 0.6.3__tar.gz → 0.6.4__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-0.6.3 → drydock_cli-0.6.4}/PKG-INFO +1 -1
- drydock_cli-0.6.4/PRD.md +180 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/pyproject.toml +1 -1
- drydock_cli-0.6.3/PRD.md +0 -268
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/.github/CODEOWNERS +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/.github/workflows/ci.yml +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/.github/workflows/release.yml +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/.gitignore +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/.pre-commit-config.yaml +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/.python-version +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/.typos.toml +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/.vscode/extensions.json +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/.vscode/launch.json +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/.vscode/settings.json +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/AGENTS.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/CHANGELOG.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/CLAUDE.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/CONTRIBUTING.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/Drydock_rebrand.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/LICENSE +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/NOTICE +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/README.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/action.yml +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/distribution/zed/LICENSE +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/distribution/zed/extension.toml +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/docs/README.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/docs/acp-setup.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/docs/proxy-setup.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/acp/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/acp/utils.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/cli.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/commands.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/agent_loop.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/agents/models.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/auth/github.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/consultant.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/llm/format.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/llm/types.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/logger.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/middleware.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/plan_session.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/programmatic.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/skills/models.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/slug.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/base.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/types.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/core/utils.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/skills/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/whats_new.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock-acp.spec +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock_terms.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/flake.lock +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/flake.nix +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/scripts/README.md +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/scripts/bump_version.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/scripts/install.sh +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/scripts/prepare_release.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/conftest.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/test_acp.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/test_bash.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/test_content.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/test_utils.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/backend/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/backend/test_backend.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/cli/test_commands.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/conftest.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/core/test_agents.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/core/test_slug.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/core/test_utils.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/e2e/common.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/e2e/conftest.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/mock/__init__.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/mock/utils.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/skills/conftest.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/skills/test_manager.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/skills/test_models.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/skills/test_parser.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/test_agent_backend.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/test_agent_stats.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/test_agents.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/test_history_manager.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/test_message_id.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/test_message_merging.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/test_middleware.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/test_system_prompt.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/test_tagged_text.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/tools/test_bash.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/tools/test_grep.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/tools/test_task.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-0.6.3 → drydock_cli-0.6.4}/uv.lock +0 -0
drydock_cli-0.6.4/PRD.md
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# DryDock — Local CLI Coding Agent
|
|
2
|
+
|
|
3
|
+
**Repository:** https://github.com/fbobe321/drydock
|
|
4
|
+
**PyPI:** https://pypi.org/project/drydock-cli/ (v0.6.3)
|
|
5
|
+
**License:** Apache 2.0 (fork of [mistralai/mistral-vibe](https://github.com/mistralai/mistral-vibe))
|
|
6
|
+
**Status:** Active development — continuous improvement running
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Deployment Process
|
|
11
|
+
|
|
12
|
+
Every change follows this pipeline:
|
|
13
|
+
|
|
14
|
+
1. **Code** → modify files in `drydock/` package directory
|
|
15
|
+
2. **Syntax check** → `python3 -c "import ast; ast.parse(...)"`
|
|
16
|
+
3. **Regression tests** → 81 tests must pass (auto-run by deploy scripts)
|
|
17
|
+
4. **Commit** → descriptive message with Co-Authored-By
|
|
18
|
+
5. **Publish** → `./scripts/publish_to_pypi.sh` (tests → build → PyPI → GitHub)
|
|
19
|
+
|
|
20
|
+
Scripts:
|
|
21
|
+
- `scripts/deploy_to_github.sh` — runs tests, syncs to GitHub. Cron daily at 4 AM.
|
|
22
|
+
- `scripts/publish_to_pypi.sh` — runs tests, bumps version, builds wheel, uploads to PyPI, deploys to GitHub. Aborts on test failure.
|
|
23
|
+
|
|
24
|
+
Both scripts gate on the full 81-test regression suite. No deploy happens if tests fail.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Regression Test Suite (81 tests)
|
|
29
|
+
|
|
30
|
+
Two test files, run in 0.3s:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pytest tests/test_drydock_regression.py tests/test_drydock_tasks.py -p no:xdist -p no:cov --override-ini="addopts="
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**test_drydock_regression.py (37 tests):**
|
|
37
|
+
Message ordering (6), system note injection (3), wave spinner (2), config paths (3), state terms (4), Easter eggs (2), bash allowlist (5), conda detection (2), CLI flags (2), loop thresholds (1), write file safety (3), loop patterns (2), loading widget (2)
|
|
38
|
+
|
|
39
|
+
**test_drydock_tasks.py (44 tests):**
|
|
40
|
+
Binary file guard (5), unknown tool handling (1), loop thresholds (3), file I/O timeouts (4), skill discovery (3), config migration (2), system prompt content (3), bash allowlist (2), wave spinner (3), Easter eggs (1), injection guard (4), state file (4), context warnings (3), deviation rules (1), circuit breaker (2), CLI flags (2), thinking throttle (1)
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Continuous Improvement
|
|
45
|
+
|
|
46
|
+
DryDock improves itself automatically and survives restarts:
|
|
47
|
+
|
|
48
|
+
1. **`continuous_bench.sh`** runs SWE-bench batches in a loop (20 tasks, 600s timeout)
|
|
49
|
+
2. **`@reboot` cron** restarts 2 minutes after any system restart
|
|
50
|
+
3. **Every 6 hours** cron re-launches if the loop died
|
|
51
|
+
4. **Daily at 4 AM** deploys to GitHub (with test gate)
|
|
52
|
+
5. **State persists** in `continuous_bench_state.json`
|
|
53
|
+
|
|
54
|
+
**Latest results (Mar 25):**
|
|
55
|
+
- 520 task runs completed, 500/500 unique tasks covered
|
|
56
|
+
- **254/500 passed (50.8%)** — up from 207/500 baseline (41.4%)
|
|
57
|
+
- **+47 net improvement** (117 newly passing, 70 regressions from model non-determinism)
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Objective
|
|
62
|
+
|
|
63
|
+
| | Value |
|
|
64
|
+
|---|---|
|
|
65
|
+
| **Baseline (Mar 15)** | 207/500 (41.4%) |
|
|
66
|
+
| **Current (Mar 25)** | 254/500 (50.8%) |
|
|
67
|
+
| **Net improvement** | +47 tasks (+9.4%) |
|
|
68
|
+
| **Target** | 80%+ |
|
|
69
|
+
| **Hardware** | 2x RTX 4060 Ti 16GB, devstral-24B-AWQ-4bit via vLLM, 128k context |
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Development Progress
|
|
74
|
+
|
|
75
|
+
### Phase 1: Baseline & Analysis (Mar 14–20)
|
|
76
|
+
1,138 task runs across 254 unique SWE-bench Verified tasks. Identified top failure modes: message ordering crashes (9%), wrong file edits (15%), loop kills (28%), prose-only responses (11%).
|
|
77
|
+
|
|
78
|
+
### Phase 2: Core Agent Improvements (Mar 15–20)
|
|
79
|
+
10 features: failure recovery middleware, fuzzy search_replace, grep source-first sorting, smarter loop detection, diagnostic/planner subagents, "never edit tests" rule, SWE-bench workflow prompt, .codeignore, message ordering fix.
|
|
80
|
+
|
|
81
|
+
### Phase 3: Crash Elimination (Mar 23)
|
|
82
|
+
`_sanitize_message_ordering()` safety net, middleware safe injection, MessageList bug fix, loop threshold tuning, forced-edit nudges, ConversationLimitException exit 0. Result: zero crashes.
|
|
83
|
+
|
|
84
|
+
### Phase 4: Conda/Pip & Rebrand (Mar 23)
|
|
85
|
+
Bash tool allowlist (pip, conda, pytest auto-approve), conda environment detection via BASH_ENV, full Mistral Vibe → DryDock rebrand. Published to GitHub.
|
|
86
|
+
|
|
87
|
+
### Phase 5: UX Overhaul (Mar 24)
|
|
88
|
+
Wave spinner, .drydock config dir, double Ctrl-C, --dangerously-skip-permissions, nautical Easter eggs, status throttle, write file timeouts, binary file guard, pptx skill, bash abuse detection, alternating loop detection, progressive budget warnings, ambiguous prompt guard, message queuing, mouse scroll, ocean blue onboarding. 76 regression tests gating deploys.
|
|
89
|
+
|
|
90
|
+
### Phase 5b: Package Rename (Mar 24)
|
|
91
|
+
`vibe/` → `drydock/` directory rename (908 imports, 257 files). Published to PyPI as drydock-cli. Removed `vibe` CLI entry point.
|
|
92
|
+
|
|
93
|
+
### Phase 6: GSD Integration & Performance (Mar 25)
|
|
94
|
+
|
|
95
|
+
Inspired by [get-shit-done](https://github.com/gsd-build/get-shit-done) (41k stars):
|
|
96
|
+
|
|
97
|
+
| Feature | Details |
|
|
98
|
+
|---------|---------|
|
|
99
|
+
| Tiered context warnings | 4 levels at 50/65/75/85% usage, debounced every 5 calls |
|
|
100
|
+
| Prompt injection guard | Detects role overrides, invisible Unicode, hidden instructions |
|
|
101
|
+
| Structured state file | `.drydock/state.md` persists task context across sessions |
|
|
102
|
+
| Deviation handling rules | Auto-fix bugs/imports, ask user for architecture/scope decisions |
|
|
103
|
+
| Circuit breaker | Blocks exact same tool call after 2 attempts with "already attempted" summary |
|
|
104
|
+
| Thinking flicker fix | Status words change every 4s, not every token |
|
|
105
|
+
| Conda env protection | Preserves user's active environment in subprocesses |
|
|
106
|
+
| `--insecure` / `-k` flag | Disables SSL verification for corporate proxies |
|
|
107
|
+
| `/consult` command | Ask a smarter model for advice — response visible to local model |
|
|
108
|
+
| `consultant_model` config | Select consultant from configured models in config.toml |
|
|
109
|
+
| `.vibe` auto-migration | Copies ~/.vibe → ~/.drydock on first run |
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Architecture
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
drydock/
|
|
117
|
+
├── PRD.md ← This document
|
|
118
|
+
├── NOTICE ← Apache 2.0 attribution
|
|
119
|
+
├── drydock/
|
|
120
|
+
│ ├── core/
|
|
121
|
+
│ │ ├── agent_loop.py ← Loop detection, circuit breaker, message ordering
|
|
122
|
+
│ │ ├── consultant.py ← /consult command backend (read-only advisor)
|
|
123
|
+
│ │ ├── middleware.py ← Tiered context warnings
|
|
124
|
+
│ │ ├── programmatic.py ← Headless API entry point
|
|
125
|
+
│ │ ├── session/state_file.py ← Cross-session state persistence
|
|
126
|
+
│ │ ├── tools/injection_guard.py ← Prompt injection detection
|
|
127
|
+
│ │ ├── tools/builtins/bash.py ← Shell, conda/pip, allowlist/denylist
|
|
128
|
+
│ │ ├── tools/builtins/search_replace.py ← Fuzzy auto-apply, recovery hints
|
|
129
|
+
│ │ └── prompts/cli.md ← System prompt with deviation rules
|
|
130
|
+
│ ├── cli/
|
|
131
|
+
│ │ ├── entrypoint.py ← CLI flags (--insecure, --consultant, etc.)
|
|
132
|
+
│ │ ├── commands.py ← Slash commands (/consult, /help, etc.)
|
|
133
|
+
│ │ └── textual_ui/app.py ← TUI, message queuing, double Ctrl-C
|
|
134
|
+
│ └── skills/
|
|
135
|
+
│ └── create-presentation/SKILL.md ← Bundled pptx skill
|
|
136
|
+
├── tests/
|
|
137
|
+
│ ├── test_drydock_regression.py ← 37 component tests
|
|
138
|
+
│ └── test_drydock_tasks.py ← 44 behavior tests
|
|
139
|
+
└── scripts/
|
|
140
|
+
├── deploy_to_github.sh ← Test-gated GitHub deploy
|
|
141
|
+
└── publish_to_pypi.sh ← Test-gated PyPI publish
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Key Technical Decisions
|
|
147
|
+
|
|
148
|
+
**Circuit breaker:** Tracks tool call signatures (hash of name + args). After 2 identical calls, blocks execution and returns the cached result with "ALREADY ATTEMPTED" summary and suggestions to try different approaches.
|
|
149
|
+
|
|
150
|
+
**Consultant model:** `/consult` sends a question to a configured model using DryDock's own backend (same providers, same API keys). The consultant never calls tools — it only returns text advice that gets injected into the conversation so the local model can see and act on it.
|
|
151
|
+
|
|
152
|
+
**Tiered context warnings:** 4 warning levels (50%, 65%, 75%, 85% context used). Debounced every 5 tool calls. Messages escalate from "wrap up" to "STOP NOW."
|
|
153
|
+
|
|
154
|
+
**Config migration:** On first run, if `~/.vibe` exists but `~/.drydock` doesn't, auto-copies everything and leaves a `MIGRATED.txt` note.
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Lessons Learned
|
|
159
|
+
|
|
160
|
+
1. **Fix bugs before adding features.** The message ordering crash fix was worth more than all subagents combined.
|
|
161
|
+
2. **Non-determinism is real.** Run 500+ tasks to get stable numbers. 20-task batches are noise.
|
|
162
|
+
3. **The model needs hard guardrails, not suggestions.** The circuit breaker (block after 2) works better than warnings (which the model ignores).
|
|
163
|
+
4. **Test everything.** 81 regression tests catch issues before they ship. Gate deploys on tests.
|
|
164
|
+
5. **Users find different bugs than benchmarks.** SWE-bench found crash bugs. Real usage found UX bugs (flicker, loops, wrong config dirs).
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Next Steps
|
|
169
|
+
|
|
170
|
+
### P1: Startup optimization
|
|
171
|
+
20-second delay on launch. Profile imports, lazy-load heavy modules.
|
|
172
|
+
|
|
173
|
+
### P2: Expand to full SWE-bench (2,294 tasks)
|
|
174
|
+
Batch file ready. Switch continuous_bench.sh once Verified is stable.
|
|
175
|
+
|
|
176
|
+
### P3: Task queue UI
|
|
177
|
+
Show the user what the agent has planned in its execution pipeline.
|
|
178
|
+
|
|
179
|
+
### P4: Support more LLM backends
|
|
180
|
+
Test with Claude, GPT-4, Gemini to understand which improvements are model-specific.
|
drydock_cli-0.6.3/PRD.md
DELETED
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
# Drydock — Local CLI Coding Agent
|
|
2
|
-
|
|
3
|
-
**Repository:** https://github.com/fbobe321/drydock
|
|
4
|
-
**License:** Apache 2.0 (fork of [mistralai/mistral-vibe](https://github.com/mistralai/mistral-vibe))
|
|
5
|
-
**Status:** Active development — continuous improvement running
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Directive: Continuous Improvement
|
|
10
|
-
|
|
11
|
-
Drydock improves itself automatically and survives restarts:
|
|
12
|
-
|
|
13
|
-
1. **`continuous_bench.sh`** runs SWE-bench batches in a loop (20 tasks per batch, 600s timeout)
|
|
14
|
-
2. **`@reboot` cron** restarts the bench loop 2 minutes after any system restart
|
|
15
|
-
3. **Every 6 hours** cron re-launches if the loop died for any reason
|
|
16
|
-
4. **Daily at 4 AM** `deploy_to_github.sh` pushes all changes to GitHub
|
|
17
|
-
5. **State persists** in `continuous_bench_state.json` — tracks tested tasks and pass rates across restarts
|
|
18
|
-
6. **Lock file** prevents concurrent runs
|
|
19
|
-
|
|
20
|
-
If the computer restarts, the improvement process resumes automatically. No human intervention needed.
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## Objective
|
|
25
|
-
|
|
26
|
-
Build Drydock into a best-in-class local coding agent, measured by SWE-bench Verified pass rate.
|
|
27
|
-
|
|
28
|
-
| | Value |
|
|
29
|
-
|---|---|
|
|
30
|
-
| **Baseline (Mar 15)** | 60.6% files-match (154/254 tasks) |
|
|
31
|
-
| **Post-fix (Mar 23)** | ~47% on previously-impossible tasks; 0 crashes |
|
|
32
|
-
| **Target** | 80%+ |
|
|
33
|
-
| **Hardware** | 2x RTX 4060 Ti 16GB, devstral-24B-AWQ-4bit via vLLM, 128k context |
|
|
34
|
-
|
|
35
|
-
---
|
|
36
|
-
|
|
37
|
-
## Development Progress
|
|
38
|
-
|
|
39
|
-
### Phase 1: Baseline & Analysis (Mar 14–20)
|
|
40
|
-
|
|
41
|
-
1,138 task runs across 254 unique SWE-bench Verified tasks established the baseline.
|
|
42
|
-
|
|
43
|
-
**Baseline Performance:**
|
|
44
|
-
|
|
45
|
-
| Metric | Value |
|
|
46
|
-
|--------|-------|
|
|
47
|
-
| Unique tasks tested | 254 |
|
|
48
|
-
| Files match gold (best attempt) | 154/254 (60.6%) |
|
|
49
|
-
| Patch generated | 192/254 (75.6%) |
|
|
50
|
-
| No patch (timeout/loop kill) | 72 (28%) |
|
|
51
|
-
| No patch (gave up) | 27 (11%) |
|
|
52
|
-
| Wrong files edited | 38 (15%) |
|
|
53
|
-
| Message ordering crash | 23 (9%) |
|
|
54
|
-
|
|
55
|
-
**By Repository:**
|
|
56
|
-
|
|
57
|
-
| Repo | Pass Rate |
|
|
58
|
-
|------|-----------|
|
|
59
|
-
| flask | 100% (3/3) |
|
|
60
|
-
| xarray | 75% (9/12) |
|
|
61
|
-
| scikit-learn | 65% (13/20) |
|
|
62
|
-
| pytest | 62% (8/13) |
|
|
63
|
-
| sympy | 59% (24/41) |
|
|
64
|
-
| requests | 60% (3/5) |
|
|
65
|
-
| sphinx | 56% (9/16) |
|
|
66
|
-
| django | 54% (59/109) |
|
|
67
|
-
| matplotlib | 45% (5/11) |
|
|
68
|
-
| astropy | 44% (4/9) |
|
|
69
|
-
|
|
70
|
-
**Top Failure Modes Identified:**
|
|
71
|
-
|
|
72
|
-
1. **Message ordering crash (9%)** — vLLM/Mistral rejects `user` after `tool` messages
|
|
73
|
-
2. **Wrong file edited (15%)** — model edits test files or wrong source module
|
|
74
|
-
3. **Loop detection kills (28%)** — agent stopped before making an edit
|
|
75
|
-
4. **Describes fix but doesn't apply (11%)** — model writes prose instead of calling search_replace
|
|
76
|
-
|
|
77
|
-
### Phase 2: Core Agent Improvements (Mar 15–20)
|
|
78
|
-
|
|
79
|
-
10 features implemented in Drydock's source:
|
|
80
|
-
|
|
81
|
-
1. **Failure Recovery Middleware** — search_replace errors include RECOVERY hint telling model to re-read and retry
|
|
82
|
-
2. **Fuzzy search_replace Auto-Apply** — auto-applies matches >= 95% similarity when exact match fails
|
|
83
|
-
3. **grep Source-First Sorting** — source files sorted before test files in results
|
|
84
|
-
4. **Smarter Loop Detection** — tool-specific thresholds, investigation-aware warnings
|
|
85
|
-
5. **Diagnostic Subagent** — analyzes test failures, registered as builtin agent
|
|
86
|
-
6. **Planner Subagent** — pre-edit analysis, identifies target file/function
|
|
87
|
-
7. **"Never Edit Tests" Rule** — explicit in cli.md system prompt
|
|
88
|
-
8. **SWE-bench Workflow Prompt** — two-phase investigate-then-fix guidance
|
|
89
|
-
9. **.codeignore** — test dirs excluded from grep in SWE-bench worktrees
|
|
90
|
-
10. **Message Ordering Fix** — `_inject_system_note()` prevents user-after-tool crash
|
|
91
|
-
|
|
92
|
-
### Phase 3: Crash Elimination & Optimization (Mar 23)
|
|
93
|
-
|
|
94
|
-
Diagnosed and fixed the remaining crash modes. Ran validation batches (51 tasks total).
|
|
95
|
-
|
|
96
|
-
**Fixes applied:**
|
|
97
|
-
|
|
98
|
-
| Fix | Impact |
|
|
99
|
-
|-----|--------|
|
|
100
|
-
| `_sanitize_message_ordering()` safety net | Eliminated 63+ message ordering crashes |
|
|
101
|
-
| Harness path update (mistral-vibe → drydock) | Eliminated 110+ empty output crashes |
|
|
102
|
-
| Middleware INJECT_MESSAGE safe injection | Prevented user-after-tool in middleware path |
|
|
103
|
-
| `_prune_repeated_tool_calls` MessageList bug | Fixed list replacement breaking downstream methods |
|
|
104
|
-
| Loop detection thresholds relaxed (WARNING 6→8, FORCE_STOP 20→25) | More room for legitimate investigation |
|
|
105
|
-
| Investigation tools count 0.3 per warning (was 0.5) | grep/read_file penalized less |
|
|
106
|
-
| Forced-edit nudge at 15 turns (was 20), repeats every 5 | Earlier intervention for stuck agents |
|
|
107
|
-
| Escalating text-without-action (3 levels) | Stronger nudges when model describes instead of fixing |
|
|
108
|
-
| ConversationLimitException exits 0 | Middleware stop is normal completion, not error |
|
|
109
|
-
|
|
110
|
-
**Validation Results:**
|
|
111
|
-
|
|
112
|
-
| Batch | Tasks | Files Match | Notes |
|
|
113
|
-
|-------|-------|-------------|-------|
|
|
114
|
-
| postfix_v1 | 21 (all never-passed) | 9/21 (43%) | Zero crashes |
|
|
115
|
-
| postfix_v2 | 30 (10 regression + 20 new) | 14/30 (47%) | Zero crashes, zero errors |
|
|
116
|
-
| **Newly passing** | 40 previously-impossible | **19/40 (48%)** | Tasks that never passed before |
|
|
117
|
-
|
|
118
|
-
**Regressions:** 6/10 previously-passing tasks failed — all due to model non-determinism (empty output, no edits made), not code changes.
|
|
119
|
-
|
|
120
|
-
### Phase 4: Conda/Pip Support & Rebrand (Mar 23)
|
|
121
|
-
|
|
122
|
-
- **Bash tool allowlist** — pip install, conda install/run/list, pytest, make, python -c all auto-approve
|
|
123
|
-
- **Conda environment detection** — `_get_conda_setup_script()` finds conda.sh and sets `BASH_ENV` so `conda activate` works in non-interactive subprocesses
|
|
124
|
-
- **Full rebrand** — Mistral Vibe → Drydock throughout CLI, TUI, docs, config
|
|
125
|
-
- **Published to GitHub** — https://github.com/fbobe321/drydock
|
|
126
|
-
|
|
127
|
-
### Phase 5: UX Overhaul & Regression Tests (Mar 24)
|
|
128
|
-
|
|
129
|
-
User-reported issues from real usage testing, all fixed:
|
|
130
|
-
|
|
131
|
-
| Fix | Details |
|
|
132
|
-
|-----|---------|
|
|
133
|
-
| Wave spinner | ~≈~ animation with ocean blue colors, replaces snake |
|
|
134
|
-
| .drydock config | Default config dir is ~/.drydock (falls back to ~/.vibe) |
|
|
135
|
-
| Double Ctrl-C to quit | Single cancels operation, double within 1s exits |
|
|
136
|
-
| --dangerously-skip-permissions | CLI flag for auto-approve from start |
|
|
137
|
-
| Nautical Easter eggs | Removed all French terms (chocolatine, Proust, etc.) |
|
|
138
|
-
| Slower state switching | Deque maxlen 2→5, no rapid flickering |
|
|
139
|
-
| Write file timeout | 30s anyio.fail_after on all file I/O (read, write, search_replace) |
|
|
140
|
-
| Binary file guard | write_file rejects .pptx/.xlsx/.pdf with guidance for python-pptx |
|
|
141
|
-
| pptx skill | Bundled create-presentation skill with template handling & verification |
|
|
142
|
-
| Bash abuse detection | Nudge after 10+ bash calls without editing |
|
|
143
|
-
| search_replace failure guidance | After 3+ failures, tells model to re-read the file |
|
|
144
|
-
| Alternating loop detection | Catches A→B→A→B→A→B→A→B patterns |
|
|
145
|
-
| Progressive budget warnings | Nudges at 50, 100, 150 tool calls |
|
|
146
|
-
| Ambiguous prompt guard | "test"/"check" → asks for clarification instead of exploring |
|
|
147
|
-
| Unknown tool error | Lists available tools (fixes "Ralph tool" hallucination) |
|
|
148
|
-
| SSL proxy for websearch | HTTPS_PROXY and SSL_CERT_FILE support |
|
|
149
|
-
| Message queuing | New input queued during agent work, processed after completion |
|
|
150
|
-
| Resume message fixed | Says "drydock --resume" not "vibe --resume" |
|
|
151
|
-
| Mouse scroll | MOUSE_SUPPORT enabled for chat window |
|
|
152
|
-
| Ocean blue onboarding | Welcome screen gradient updated from orange to blue |
|
|
153
|
-
|
|
154
|
-
### Phase 5b: Testing & CI (Mar 24)
|
|
155
|
-
|
|
156
|
-
- **76 regression tests** gating all deploys
|
|
157
|
-
- **Continuous SWE-bench loop** — 500/500 tasks tested, 49.0% pass rate (+9.4% from baseline)
|
|
158
|
-
- **vibe/ → drydock/** package rename (908 imports updated)
|
|
159
|
-
- **PyPI published** — drydock-cli v0.5.2
|
|
160
|
-
|
|
161
|
-
### Phase 6: GSD Integration & Performance (Mar 25)
|
|
162
|
-
|
|
163
|
-
GSD-inspired features (from [get-shit-done](https://github.com/gsd-build/get-shit-done)):
|
|
164
|
-
|
|
165
|
-
| Feature | Details |
|
|
166
|
-
|---------|---------|
|
|
167
|
-
| Tiered context warnings | 4 levels at 50/65/75/85% usage, debounced every 5 calls |
|
|
168
|
-
| Prompt injection guard | Detects role overrides, invisible Unicode, hidden instructions in file writes |
|
|
169
|
-
| Structured state file | `.drydock/state.md` persists task, files, decisions across sessions |
|
|
170
|
-
| Deviation handling rules | Auto-fix bugs/imports, ask user for architecture/scope decisions |
|
|
171
|
-
|
|
172
|
-
Performance and loop fixes:
|
|
173
|
-
|
|
174
|
-
| Fix | Details |
|
|
175
|
-
|-----|---------|
|
|
176
|
-
| Circuit breaker | Blocks exact same tool call after 2 attempts, returns cached result |
|
|
177
|
-
| Thinking flicker fix | Status words change every 4s, not every token |
|
|
178
|
-
| Conda env protection | Preserves user's active conda environment in subprocesses |
|
|
179
|
-
| `--insecure` / `-k` flag | Disables SSL verification for corporate proxy environments |
|
|
180
|
-
| `--consultant MODEL` flag | Allows calling a smarter model for single-turn advice when stuck |
|
|
181
|
-
| 81 regression tests | Circuit breaker, injection guard, state file, context tiers all tested |
|
|
182
|
-
|
|
183
|
-
---
|
|
184
|
-
|
|
185
|
-
## Architecture
|
|
186
|
-
|
|
187
|
-
```
|
|
188
|
-
drydock/
|
|
189
|
-
├── PRD.md ← This document
|
|
190
|
-
├── NOTICE ← Apache 2.0 attribution
|
|
191
|
-
├── vibe/core/
|
|
192
|
-
│ ├── agent_loop.py ← Loop detection, failure recovery, message ordering
|
|
193
|
-
│ ├── programmatic.py ← Programmatic/headless API entry point
|
|
194
|
-
│ ├── agents/models.py ← Agent profiles (diagnostic, planner, auto-approve)
|
|
195
|
-
│ ├── prompts/
|
|
196
|
-
│ │ ├── cli.md ← System prompt (SWE-bench rules, two-phase workflow)
|
|
197
|
-
│ │ ├── diagnostic.md ← Failure analysis prompt
|
|
198
|
-
│ │ └── planner.md ← Pre-edit analysis prompt
|
|
199
|
-
│ └── tools/builtins/
|
|
200
|
-
│ ├── bash.py ← Shell execution, conda/pip support, allowlist/denylist
|
|
201
|
-
│ ├── search_replace.py ← Fuzzy auto-apply, recovery hints
|
|
202
|
-
│ ├── grep.py ← Source-first sorting
|
|
203
|
-
│ └── task.py ← Subagent spawning
|
|
204
|
-
├── vibe/cli/
|
|
205
|
-
│ ├── entrypoint.py ← CLI entry point
|
|
206
|
-
│ └── textual_ui/ ← TUI (Textual-based)
|
|
207
|
-
└── vibe/setup/ ← Onboarding, trusted folders
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
### Key Technical Decisions
|
|
211
|
-
|
|
212
|
-
**Message ordering safety net (`_sanitize_message_ordering`):**
|
|
213
|
-
Runs before every `_chat()` and `_chat_streaming()` call. Scans the message list and merges any `user` messages that follow `tool` messages into the preceding tool result as `[SYSTEM: ...]` annotations. Also appends `"Continue."` if the last message is `assistant`. This is a belt-and-suspenders approach — the injection points should already be safe, but this catches edge cases.
|
|
214
|
-
|
|
215
|
-
**Loop detection philosophy:**
|
|
216
|
-
Investigation tools (grep, read_file) get a longer leash than action tools (bash, search_replace). The agent needs to explore before it can fix. Thresholds are tuned for SWE-bench tasks where 3-5 greps + 2-3 reads is typical before making an edit. Warnings escalate: soft nudge → strong directive → tool replacement → force stop.
|
|
217
|
-
|
|
218
|
-
**Conda in non-interactive shells:**
|
|
219
|
-
`conda activate` is a shell function defined in `.bashrc`, which isn't sourced for non-interactive `subprocess` commands. We detect the conda installation and set `BASH_ENV` to `conda.sh`, which bash sources before every non-interactive command.
|
|
220
|
-
|
|
221
|
-
---
|
|
222
|
-
|
|
223
|
-
## Lessons Learned
|
|
224
|
-
|
|
225
|
-
1. **Don't build parallel systems — improve the actual tool.** We wasted time building a custom `multi_agent/` pipeline. Every improvement should be a commit to Drydock's source.
|
|
226
|
-
|
|
227
|
-
2. **Monitoring without fixing is useless.** 797 watchdog restarts, zero code fixes. Crons must diagnose AND fix.
|
|
228
|
-
|
|
229
|
-
3. **LLM self-improvement doesn't work at 24B.** The auto-improve loop tried to use devstral to suggest code changes to its own pipeline. It never produced a valid improvement.
|
|
230
|
-
|
|
231
|
-
4. **Small batch sizes create noise.** 20-task batches have huge variance (15% to 62.5%). Need 50+ tasks per measurement.
|
|
232
|
-
|
|
233
|
-
5. **The biggest win was fixing a bug, not adding features.** The message ordering crash affected 9% of all tasks. Fixing that one bug was worth more than all the subagents and prompt changes combined.
|
|
234
|
-
|
|
235
|
-
6. **Non-determinism is real.** "Always-passing" tasks can fail on any given run. Don't chase regressions that are just model variance — run larger batches.
|
|
236
|
-
|
|
237
|
-
---
|
|
238
|
-
|
|
239
|
-
## Available Datasets
|
|
240
|
-
|
|
241
|
-
| Dataset | Instances | Status |
|
|
242
|
-
|---------|-----------|--------|
|
|
243
|
-
| SWE-bench Verified | 500 | Active — continuous benchmarking |
|
|
244
|
-
| SWE-bench Full | 2,294 | Batch file ready (`batch_full_2294.txt`) |
|
|
245
|
-
| SWE-bench Lite | 534 | Available on HuggingFace |
|
|
246
|
-
| SWE-bench Multimodal | 600 | Future (requires image support) |
|
|
247
|
-
| SWE-bench Multilingual | 300 | Future (requires multi-language support) |
|
|
248
|
-
|
|
249
|
-
---
|
|
250
|
-
|
|
251
|
-
## Next Steps
|
|
252
|
-
|
|
253
|
-
### P1: Reduce "no patch" failures
|
|
254
|
-
The model either gets loop-killed or talks instead of acting. Currently ~28% of tasks.
|
|
255
|
-
- Extended nudging to 5 attempts (implemented, converts 3/5 to passes)
|
|
256
|
-
- Diagnostic summary in stdout for analysis
|
|
257
|
-
- Investigate remaining zero-output tasks
|
|
258
|
-
|
|
259
|
-
### P2: Fix wrong source file selection
|
|
260
|
-
The model finds the right function name but in the wrong file. Currently ~11%.
|
|
261
|
-
- Source directory hints per repo (implemented for pytest, matplotlib, scikit-learn)
|
|
262
|
-
- Recovery hints on search_replace failure suggesting deeper module paths
|
|
263
|
-
|
|
264
|
-
### P3: Expand to full SWE-bench (2,294 tasks)
|
|
265
|
-
Batch file ready. Switch continuous_bench.sh to use `batch_full_2294.txt` once Verified coverage is complete.
|
|
266
|
-
|
|
267
|
-
### P4: Support more LLM backends
|
|
268
|
-
Currently optimized for devstral-24B via vLLM. Test with other models to understand which improvements are model-specific vs general.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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-0.6.3 → drydock_cli-0.6.4}/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-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/notifications/adapters/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{drydock_cli-0.6.3 → drydock_cli-0.6.4}/drydock/cli/textual_ui/notifications/ports/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|