drydock-cli 2.2.0__tar.gz → 2.2.2__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.2.2/CLAUDE.md +152 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/PKG-INFO +1 -1
- drydock_cli-2.2.2/PRD.md +81 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/app.py +3 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/agent_loop.py +39 -51
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/config/harness_files/_harness_manager.py +5 -1
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/pyproject.toml +1 -1
- drydock_cli-2.2.2/scripts/monitor_swebench.sh +40 -0
- drydock_cli-2.2.0/CLAUDE.md +0 -61
- drydock_cli-2.2.0/PRD.md +0 -594
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/.gitignore +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/.python-version +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/.typos.toml +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/.vscode/extensions.json +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/.vscode/launch.json +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/.vscode/settings.json +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/AGENTS.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/CHANGELOG.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/Drydock_rebrand.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/LICENSE +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/NOTICE +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/README.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/action.yml +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/docs/README.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/docs/acp-setup.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/logger.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/slug.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/task_manager.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/types.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/utils.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/whats_new.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock-acp.spec +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock_terms.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/flake.lock +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/flake.nix +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/scripts/README.md +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/scripts/auto_test_loop.sh +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/scripts/backup.sh +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/scripts/bump_version.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/scripts/install.sh +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/scripts/monitor_test_battery.sh +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/scripts/notify_release.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/scripts/overnight_agents_test.sh +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/scripts/prepare_release.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/scripts/test_bank.sh +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/scripts/test_full.sh +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/scripts/test_smoke.sh +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/conftest.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/e2e/common.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/mock/utils.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/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.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_agents.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_integration.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_message_id.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_middleware.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_smoke.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/test_workloads.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.2.0 → drydock_cli-2.2.2}/uv.lock +0 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Drydock Development Guide
|
|
2
|
+
|
|
3
|
+
## Project
|
|
4
|
+
|
|
5
|
+
Drydock is a local CLI coding agent (fork of mistral-vibe, Apache 2.0).
|
|
6
|
+
- **Repo:** https://github.com/fbobe321/drydock
|
|
7
|
+
- **PyPI:** https://pypi.org/project/drydock-cli/ (v2.2.1)
|
|
8
|
+
- **Goal:** Best-in-class SWE-bench Verified pass rate with local LLMs
|
|
9
|
+
- **Hardware:** 2x RTX 4060 Ti 16GB, devstral-24B-AWQ-4bit via vLLM at localhost:8000
|
|
10
|
+
- **Server:** remus (Ubuntu 22.04, user: bobef)
|
|
11
|
+
|
|
12
|
+
## Build & Test
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# Install
|
|
16
|
+
uv sync
|
|
17
|
+
|
|
18
|
+
# Run drydock CLI
|
|
19
|
+
uv run drydock
|
|
20
|
+
|
|
21
|
+
# Run programmatically (headless, for benchmarks)
|
|
22
|
+
python3 -c "import sys; sys.path.insert(0, '.'); from drydock.cli.entrypoint import main; main()" --agent auto-approve -p "your prompt"
|
|
23
|
+
|
|
24
|
+
# Run tests
|
|
25
|
+
uv run pytest tests/ -x -q --timeout=30
|
|
26
|
+
|
|
27
|
+
# Syntax check modified files
|
|
28
|
+
python3 -c "import ast; ast.parse(open('path/to/file.py').read())"
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Key Architecture
|
|
32
|
+
|
|
33
|
+
- `drydock/core/agent_loop.py` — Main agent loop. Loop detection, message ordering, tool execution. **Most changes go here.**
|
|
34
|
+
- `drydock/core/programmatic.py` — Headless API entry point used by SWE-bench harness
|
|
35
|
+
- `drydock/core/build_orchestrator.py` — Multi-phase build pipeline (currently disabled, model drives builds)
|
|
36
|
+
- `drydock/core/tools/builtins/bash.py` — Shell tool with allowlist/denylist, conda support
|
|
37
|
+
- `drydock/core/tools/builtins/search_replace.py` — File editing tool with fuzzy matching
|
|
38
|
+
- `drydock/core/prompts/cli.md` — System prompt (workflow, delegation, tool rules)
|
|
39
|
+
- `drydock/core/prompts/builder.md` — Minimal prompt for file builder subagents
|
|
40
|
+
- `drydock/core/system_prompt.py` — Builds system prompt, loads AGENTS.md/DRYDOCK.md
|
|
41
|
+
- `drydock/core/types.py` — `MessageList` (custom Sequence, use `.reset()` not `=[]`)
|
|
42
|
+
- `drydock/core/middleware.py` — Tiered context warnings, auto-compaction
|
|
43
|
+
- `drydock/core/agents/models.py` — Agent profiles (explore, diagnostic, planner, builder)
|
|
44
|
+
- `drydock/core/skills/manager.py` — Skill discovery and loading
|
|
45
|
+
- `drydock/cli/textual_ui/app.py` — TUI application
|
|
46
|
+
- `drydock/cli/commands.py` — Slash commands (/help, /setup-model, /consult, etc.)
|
|
47
|
+
|
|
48
|
+
## Critical Constraints
|
|
49
|
+
|
|
50
|
+
- **MessageList is not a plain list.** Never `self.messages = [...]`. Use `self.messages.reset([...])`.
|
|
51
|
+
- **vLLM/Mistral rejects `user` after `tool` messages.** `_sanitize_message_ordering()` runs before every LLM call. All injection must use `_inject_system_note()`.
|
|
52
|
+
- **`os._exit()` in programmatic.py** — necessary because async cleanup hangs. Ensure stdout is flushed before calling.
|
|
53
|
+
- **AGENTS.md is CRITICAL for devstral.** Without per-project instructions, the model loops on ls/bash. Auto-created by `_ensure_agents_md()`.
|
|
54
|
+
- **"Restate the goal" blocks tool calling.** Never ask the model to output text before its first tool call — it pre-empts the tool-calling mechanism.
|
|
55
|
+
- **Additive-only harness changes.** Every control flow modification (circuit breaker, orchestrator, nudges) caused regressions. Just inject better context before the agent loop.
|
|
56
|
+
- **Circuit breaker is disabled.** It blocked valid retries. Loop detection prunes duplicates and nudges instead. Never stops the session.
|
|
57
|
+
- **Loop detection never stops.** Only prunes repeated tool calls and injects guidance. The only hard stop is MAX_TOOL_TURNS (200).
|
|
58
|
+
|
|
59
|
+
## Mistral/devstral Tool Calling
|
|
60
|
+
|
|
61
|
+
- `tool_choice="auto"` (default): model decides whether to call a tool or respond with text
|
|
62
|
+
- Never ask for text before first tool call — blocks tool calling
|
|
63
|
+
- `tool_choice="required"` forces a tool call (useful for first-turn delegation)
|
|
64
|
+
- AGENTS.md anchors model behavior — without it, devstral loops
|
|
65
|
+
- Plan→Edit workflow: use plan mode first, then switch to accept-edits
|
|
66
|
+
|
|
67
|
+
## File Locations
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
/data3/drydock/ ← Main repo (git)
|
|
71
|
+
├── drydock/ ← Python package
|
|
72
|
+
│ ├── core/
|
|
73
|
+
│ │ ├── agent_loop.py ← THE most important file
|
|
74
|
+
│ │ ├── prompts/cli.md ← System prompt
|
|
75
|
+
│ │ ├── build_orchestrator.py ← Multi-phase builder (disabled)
|
|
76
|
+
│ │ ├── tools/builtins/ ← 24 builtin tools
|
|
77
|
+
│ │ ├── agents/ ← Subagent definitions
|
|
78
|
+
│ │ └── skills/ ← Skill framework
|
|
79
|
+
│ ├── cli/textual_ui/app.py ← TUI application
|
|
80
|
+
│ └── skills/ ← 7 bundled skills
|
|
81
|
+
├── tests/
|
|
82
|
+
│ ├── test_smoke.py ← 20 fast tests
|
|
83
|
+
│ ├── test_loop_detection.py ← 38 loop tests
|
|
84
|
+
│ ├── test_bank_prd.py ← 15 PRD-driven tests
|
|
85
|
+
│ └── testbank_helpers.py ← Shared test infrastructure
|
|
86
|
+
├── scripts/
|
|
87
|
+
│ ├── deploy_to_github.sh ← Daily push (4 AM)
|
|
88
|
+
│ ├── publish_to_pypi.sh ← Tests → build → PyPI → tag
|
|
89
|
+
│ ├── notify_release.py ← Telegram notifications
|
|
90
|
+
│ └── backup.sh ← rsync to NAS (3 AM)
|
|
91
|
+
└── test_bank_results/ ← Test logs
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
/data3/swe_bench_runs/ ← SWE-bench infrastructure (separate)
|
|
96
|
+
├── harness.py ← Runs drydock on SWE-bench tasks
|
|
97
|
+
├── continuous_bench.sh ← Continuous improvement loop
|
|
98
|
+
└── logs/ ← Batch results
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Configuration Management
|
|
102
|
+
|
|
103
|
+
**All scripts use explicit Python path:** `/home/bobef/miniconda3/bin/python3`
|
|
104
|
+
**Cron PATH doesn't inherit shell.** Every script exports PATH explicitly.
|
|
105
|
+
**User's DryDock install:** `/home/bobef/miniforge3/envs/drydock/bin/python3` (Python 3.14)
|
|
106
|
+
**Dev/test Python:** `/home/bobef/miniconda3/bin/python3` (Python 3.12)
|
|
107
|
+
**Config:** `~/.drydock/config.toml`
|
|
108
|
+
**Tokens:** `~/.config/drydock/github_token`, `~/.config/drydock/pypi_token`
|
|
109
|
+
**Git remotes:** `drydock` → github.com/fbobe321/drydock, `origin` → github.com/mistralai/mistral-vibe
|
|
110
|
+
|
|
111
|
+
## Deployment Process
|
|
112
|
+
|
|
113
|
+
1. Code → modify files
|
|
114
|
+
2. Syntax check → `python3 -c "import ast; ..."`
|
|
115
|
+
3. Tests → `pytest tests/test_smoke.py tests/test_loop_detection.py -q`
|
|
116
|
+
4. Commit → descriptive message
|
|
117
|
+
5. Publish → `./scripts/publish_to_pypi.sh` (tests → build → PyPI → tag → integration test → GitHub → Telegram)
|
|
118
|
+
6. Install on user's env → `/home/bobef/miniforge3/envs/drydock/bin/pip install --force-reinstall --no-deps --no-cache-dir drydock-cli==X.Y.Z`
|
|
119
|
+
|
|
120
|
+
## SWE-bench
|
|
121
|
+
|
|
122
|
+
- Current: 42% file match, 62% real patches (50-task eval)
|
|
123
|
+
- Target: 68% (devstral-small-2 published score)
|
|
124
|
+
- Harness at `/data3/swe_bench_runs/harness.py` uses DryDock directly
|
|
125
|
+
- AGENTS.md auto-created per task with bug-fix workflow
|
|
126
|
+
- Environment bootstrapping (Meta-Harness technique) gathers repo structure before first LLM call
|
|
127
|
+
- Test file edits stripped from patches before evaluation
|
|
128
|
+
|
|
129
|
+
## Key Learnings
|
|
130
|
+
|
|
131
|
+
1. AGENTS.md is essential — devstral loops without it
|
|
132
|
+
2. "Restate the goal" blocked tool calling for months — one line
|
|
133
|
+
3. Additive-only changes work best — control flow mods regress
|
|
134
|
+
4. The harness matters as much as the model (Meta-Harness paper)
|
|
135
|
+
5. Environment bootstrapping saves 2-4 exploratory turns
|
|
136
|
+
6. Plan→Edit workflow is Mistral's design, don't fight it
|
|
137
|
+
7. Circuit breaker was net negative — removed entirely
|
|
138
|
+
8. Loop detection should guide, never stop
|
|
139
|
+
9. Test the installed package, not source (different Python envs)
|
|
140
|
+
10. Never wait for full test runs — fix issues from early results
|
|
141
|
+
|
|
142
|
+
## When Compacting
|
|
143
|
+
|
|
144
|
+
Always preserve: the list of files modified in this session, any failing test output, current SWE-bench results, and the user's latest instructions.
|
|
145
|
+
|
|
146
|
+
## Style
|
|
147
|
+
|
|
148
|
+
- Python 3.12+, type hints, pathlib over os.path
|
|
149
|
+
- Match existing patterns in the codebase
|
|
150
|
+
- No unnecessary abstractions — keep fixes minimal
|
|
151
|
+
- Always run syntax check after editing .py files
|
|
152
|
+
- Don't add features beyond what was asked
|
drydock_cli-2.2.2/PRD.md
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# DryDock — Local CLI Coding Agent
|
|
2
|
+
|
|
3
|
+
**Repository:** https://github.com/fbobe321/drydock
|
|
4
|
+
**PyPI:** https://pypi.org/project/drydock-cli/ (v2.2.1)
|
|
5
|
+
**License:** Apache 2.0 (fork of [mistralai/mistral-vibe](https://github.com/mistralai/mistral-vibe))
|
|
6
|
+
|
|
7
|
+
## Vision
|
|
8
|
+
|
|
9
|
+
Best-in-class local coding agent. Build, debug, and ship software using local LLMs on consumer hardware.
|
|
10
|
+
|
|
11
|
+
## Current Status
|
|
12
|
+
|
|
13
|
+
- **Model:** devstral-24B-AWQ-4bit on 2x RTX 4060 Ti 16GB
|
|
14
|
+
- **SWE-bench Verified:** 42% file match (target: 68%)
|
|
15
|
+
- **Version:** 2.2.1
|
|
16
|
+
- **Users can:** Build projects from PRDs, fix bugs, review code, refactor
|
|
17
|
+
|
|
18
|
+
## Features
|
|
19
|
+
|
|
20
|
+
### Core
|
|
21
|
+
- 24 builtin tools (bash, grep, read_file, write_file, search_replace, etc.)
|
|
22
|
+
- 7 bundled skills (/investigate, /review, /ship, /batch, /simplify, /deep-research, /create-presentation)
|
|
23
|
+
- Multi-agent delegation (explore, diagnostic, planner subagents)
|
|
24
|
+
- Plan→Edit workflow (Mistral's designed pattern)
|
|
25
|
+
- AGENTS.md support (cross-tool standard, auto-created)
|
|
26
|
+
- Textual TUI with wave spinner, message queuing
|
|
27
|
+
|
|
28
|
+
### Local Model Support
|
|
29
|
+
- `/setup-model` command (vLLM, Ollama, LM Studio, custom)
|
|
30
|
+
- `--local` CLI flag for quick setup
|
|
31
|
+
- Auto-detect model name from server
|
|
32
|
+
|
|
33
|
+
### Safety
|
|
34
|
+
- Tool permission system (always/ask/never per tool)
|
|
35
|
+
- Loop guidance (never stops, only redirects)
|
|
36
|
+
- API error auto-recovery (retry after 10s)
|
|
37
|
+
|
|
38
|
+
## Install
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
pip install drydock-cli
|
|
42
|
+
drydock --local http://localhost:8000/v1
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Per-Project Instructions
|
|
46
|
+
|
|
47
|
+
DryDock loads instructions from these files in the project root:
|
|
48
|
+
- **AGENTS.md** — Cross-tool standard (recommended)
|
|
49
|
+
- **DRYDOCK.md** — DryDock-specific
|
|
50
|
+
- **.drydock/rules/*.md** — Modular rules
|
|
51
|
+
|
|
52
|
+
Auto-created if none exist. Essential for devstral to use subagents properly.
|
|
53
|
+
|
|
54
|
+
## Roadmap
|
|
55
|
+
|
|
56
|
+
### Near-term
|
|
57
|
+
- Reach 68% on SWE-bench Verified (from 42%)
|
|
58
|
+
- Static/dynamic prompt split for prefix caching
|
|
59
|
+
- Layered context compaction (4 fallback layers)
|
|
60
|
+
- Composable prompt sections (task-type specific)
|
|
61
|
+
- Background resource preloading
|
|
62
|
+
|
|
63
|
+
### Medium-term
|
|
64
|
+
- Real test execution in SWE-bench eval (not just file match)
|
|
65
|
+
- Repo-specific strategies (Django vs sympy vs sphinx)
|
|
66
|
+
- Draft-then-verify pattern for patches
|
|
67
|
+
- Windows Ctrl-C fix
|
|
68
|
+
|
|
69
|
+
### Long-term
|
|
70
|
+
- Support larger models as hardware improves
|
|
71
|
+
- Plugin marketplace for custom tools/skills
|
|
72
|
+
- Web dashboard for monitoring long runs
|
|
73
|
+
- Multi-model routing (different models for different tasks)
|
|
74
|
+
|
|
75
|
+
## Architecture Notes
|
|
76
|
+
|
|
77
|
+
See [CLAUDE.md](CLAUDE.md) for technical details, file locations, constraints, and development workflow.
|
|
78
|
+
|
|
79
|
+
## Legal
|
|
80
|
+
|
|
81
|
+
All code is original or forked from Apache 2.0 mistral-vibe. Architecture improvements are standard design patterns implemented from scratch. No proprietary code copied.
|
|
@@ -1706,6 +1706,9 @@ class VibeApp(App): # noqa: PLR0904
|
|
|
1706
1706
|
self.agent_loop.agent_profile
|
|
1707
1707
|
)
|
|
1708
1708
|
self._update_profile_widgets(new_profile)
|
|
1709
|
+
# Hide any active loading/spinner widget before switching mode
|
|
1710
|
+
# to prevent the old animation from showing behind the new spinner
|
|
1711
|
+
await self._remove_loading_widget()
|
|
1709
1712
|
if self._chat_input_container:
|
|
1710
1713
|
self._chat_input_container.switching_mode = True
|
|
1711
1714
|
|
|
@@ -699,15 +699,12 @@ class AgentLoop:
|
|
|
699
699
|
"Your NEXT action MUST be write_file to create a file or "
|
|
700
700
|
"search_replace to edit one. Do NOT run any more bash commands."
|
|
701
701
|
)
|
|
702
|
-
elif bash_count >= 10:
|
|
703
|
-
#
|
|
704
|
-
self._prune_repeated_tool_calls()
|
|
702
|
+
elif bash_count >= 10 and bash_count % 5 == 0:
|
|
703
|
+
# Nudge every 5 bash calls, never stop
|
|
705
704
|
self._inject_system_note(
|
|
706
|
-
"You have run
|
|
707
|
-
"
|
|
708
|
-
"ask the user what to do."
|
|
705
|
+
"You have run many bash commands. Consider using write_file "
|
|
706
|
+
"or search_replace to create/edit files."
|
|
709
707
|
)
|
|
710
|
-
bash_count = 6 # Reset partially so it doesn't re-trigger immediately
|
|
711
708
|
|
|
712
709
|
# 3-Strike Rule: search_replace keeps failing
|
|
713
710
|
if search_replace_failures >= 3:
|
|
@@ -765,7 +762,25 @@ class AgentLoop:
|
|
|
765
762
|
text_without_action += 1
|
|
766
763
|
# Always continue — don't let the agent exit without editing
|
|
767
764
|
should_break_loop = False
|
|
768
|
-
|
|
765
|
+
|
|
766
|
+
# Detect model claiming task is done without having edited anything
|
|
767
|
+
last_text_lower = (last_message.content or "").lower()
|
|
768
|
+
task_complete_phrases = [
|
|
769
|
+
"task completed", "task complete", "task is complete",
|
|
770
|
+
"task is done", "task has been completed",
|
|
771
|
+
"changes have been applied", "fix has been applied",
|
|
772
|
+
"the fix is complete", "issue is resolved",
|
|
773
|
+
]
|
|
774
|
+
claims_complete = any(p in last_text_lower for p in task_complete_phrases)
|
|
775
|
+
|
|
776
|
+
if claims_complete:
|
|
777
|
+
nudge_text = (
|
|
778
|
+
"You said the task is complete but NO code was actually changed. "
|
|
779
|
+
"Your search_replace call either failed or was never made. "
|
|
780
|
+
"Use read_file to read the target file, then use search_replace "
|
|
781
|
+
"to make your edit. Do NOT say the task is done until search_replace succeeds."
|
|
782
|
+
)
|
|
783
|
+
elif text_without_action == 1:
|
|
769
784
|
# Check if model already identified a TARGET in its text
|
|
770
785
|
last_text = (last_message.content or "").upper()
|
|
771
786
|
has_target = "TARGET:" in last_text or "FILE:" in last_text
|
|
@@ -795,9 +810,11 @@ class AgentLoop:
|
|
|
795
810
|
"Pick the most likely file and function, and make a minimal edit."
|
|
796
811
|
)
|
|
797
812
|
else:
|
|
798
|
-
#
|
|
799
|
-
|
|
800
|
-
|
|
813
|
+
# Keep nudging — never give up
|
|
814
|
+
nudge_text = (
|
|
815
|
+
"You MUST call a tool. Use grep to find the file, "
|
|
816
|
+
"read_file to read it, then search_replace to fix."
|
|
817
|
+
)
|
|
801
818
|
if nudge_text:
|
|
802
819
|
# Use _inject_system_note (appends to last tool/user message)
|
|
803
820
|
# User messages cause 'tool after user' ordering violations
|
|
@@ -824,55 +841,26 @@ class AgentLoop:
|
|
|
824
841
|
if nudge_text:
|
|
825
842
|
self._inject_system_note(nudge_text)
|
|
826
843
|
|
|
827
|
-
#
|
|
844
|
+
# Loop guidance — prune duplicates and nudge, NEVER stop
|
|
828
845
|
if not should_break_loop:
|
|
829
846
|
rep = self._check_tool_call_repetition()
|
|
830
|
-
if rep == "FORCE_STOP":
|
|
831
|
-
repeat_warnings += 1
|
|
832
|
-
logger.warning("Loop detected: same call %d+ times (redirect %d)", REPEAT_FORCE_STOP_THRESHOLD, repeat_warnings)
|
|
833
|
-
# Prune repeated calls and redirect — NEVER stop
|
|
834
|
-
self._prune_repeated_tool_calls()
|
|
835
|
-
if repeat_warnings <= 3:
|
|
836
|
-
self._inject_system_note(
|
|
837
|
-
"You are repeating the same action. Try a DIFFERENT approach:\n"
|
|
838
|
-
"- If searching: pick a different search term or file\n"
|
|
839
|
-
"- If testing: read the error and fix the code first\n"
|
|
840
|
-
"- If stuck: use task(agent='explore') to get a fresh perspective",
|
|
841
|
-
replace_last_tool=True,
|
|
842
|
-
)
|
|
843
|
-
else:
|
|
844
|
-
# After 3+ redirects, ask the user what to do
|
|
845
|
-
self._inject_system_note(
|
|
846
|
-
"You have been redirected multiple times for repeating actions. "
|
|
847
|
-
"Ask the user for clarification on what to do next.",
|
|
848
|
-
replace_last_tool=True,
|
|
849
|
-
)
|
|
850
|
-
elif rep and rep.startswith("WARNING"):
|
|
847
|
+
if rep == "FORCE_STOP" or (rep and rep.startswith("WARNING")):
|
|
851
848
|
stuck_tool = ""
|
|
852
|
-
if "|" in rep:
|
|
849
|
+
if rep and "|" in rep:
|
|
853
850
|
stuck_tool = rep.split("|", 1)[1]
|
|
854
|
-
is_investigation = not has_made_edit and stuck_tool in ("grep", "read_file")
|
|
855
|
-
if is_investigation:
|
|
856
|
-
repeat_warnings += 0.3
|
|
857
|
-
else:
|
|
858
|
-
repeat_warnings += 1
|
|
859
|
-
logger.warning("Repeated tool calls (warning %.1f, investigation=%s)", repeat_warnings, is_investigation)
|
|
860
851
|
|
|
861
|
-
# Prune
|
|
862
|
-
|
|
863
|
-
self._prune_repeated_tool_calls()
|
|
852
|
+
# Prune duplicate tool calls to give model fresh context
|
|
853
|
+
self._prune_repeated_tool_calls()
|
|
864
854
|
|
|
865
|
-
#
|
|
866
|
-
nudge = ""
|
|
855
|
+
# Gentle nudge — just suggest a different approach
|
|
856
|
+
nudge = "Try a different approach."
|
|
867
857
|
if stuck_tool in ("read_file",):
|
|
868
|
-
nudge = "
|
|
858
|
+
nudge = "You already read this. Try search_replace or a different file."
|
|
869
859
|
elif stuck_tool in ("grep",):
|
|
870
|
-
nudge = "
|
|
860
|
+
nudge = "Try a different search term or read a file you found."
|
|
871
861
|
elif stuck_tool in ("bash", "run_command"):
|
|
872
|
-
nudge = "
|
|
873
|
-
self._inject_system_note(
|
|
874
|
-
f"You are repeating the same tool call.{nudge} Try something different."
|
|
875
|
-
)
|
|
862
|
+
nudge = "If the command failed, read the error and fix the code."
|
|
863
|
+
self._inject_system_note(nudge)
|
|
876
864
|
|
|
877
865
|
# Extract tool-specific nudge
|
|
878
866
|
nudge = ""
|
{drydock_cli-2.2.0 → drydock_cli-2.2.2}/drydock/core/config/harness_files/_harness_manager.py
RENAMED
|
@@ -69,11 +69,15 @@ class HarnessFilesManager:
|
|
|
69
69
|
project_skills = Path.cwd() / ".drydock" / "skills"
|
|
70
70
|
if project_skills.is_dir():
|
|
71
71
|
dirs.append(project_skills)
|
|
72
|
-
# User skills in ~/.drydock/skills/
|
|
72
|
+
# User skills in ~/.drydock/skills/ (and ~/.vibe/skills/ for backward compat)
|
|
73
73
|
if "user" in self.sources:
|
|
74
74
|
d = GLOBAL_SKILLS_DIR.path
|
|
75
75
|
if d.is_dir():
|
|
76
76
|
dirs.append(d)
|
|
77
|
+
# Always check legacy ~/.vibe/skills/ in case migration didn't complete
|
|
78
|
+
legacy_skills = Path.home() / ".vibe" / "skills"
|
|
79
|
+
if legacy_skills.is_dir() and legacy_skills != d:
|
|
80
|
+
dirs.append(legacy_skills)
|
|
77
81
|
# Plugin skills
|
|
78
82
|
try:
|
|
79
83
|
from drydock.core.plugins import get_plugin_skill_dirs
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Monitor SWE-bench runs, analyze early results, report via Telegram
|
|
3
|
+
# Cron: */10 * * * * /data3/drydock/scripts/monitor_swebench.sh
|
|
4
|
+
|
|
5
|
+
set -uo pipefail
|
|
6
|
+
export PATH="/home/bobef/miniconda3/bin:$PATH"
|
|
7
|
+
PYTHON="/home/bobef/miniconda3/bin/python3"
|
|
8
|
+
DRYDOCK="/data3/drydock"
|
|
9
|
+
SWEBENCH="/data3/swe_bench_runs"
|
|
10
|
+
LOG="$SWEBENCH/logs/monitor_swebench.log"
|
|
11
|
+
|
|
12
|
+
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "$LOG"; }
|
|
13
|
+
|
|
14
|
+
# Find the latest running log
|
|
15
|
+
LATEST_LOG=$(ls -t $SWEBENCH/logs/v2*.log 2>/dev/null | head -1)
|
|
16
|
+
if [ -z "$LATEST_LOG" ]; then
|
|
17
|
+
exit 0
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
# Count completed tasks
|
|
21
|
+
DONE=$(grep -c "Files match:" "$LATEST_LOG" 2>/dev/null || echo 0)
|
|
22
|
+
MATCHES=$(grep -c "Files match: True" "$LATEST_LOG" 2>/dev/null || echo 0)
|
|
23
|
+
PATCHES=$(grep "Patch:" "$LATEST_LOG" 2>/dev/null | grep -v "0L\|1L" | wc -l)
|
|
24
|
+
TOTAL=$(grep -c "^\[" "$LATEST_LOG" 2>/dev/null | head -1 || echo 0)
|
|
25
|
+
|
|
26
|
+
if [ "$DONE" -eq 0 ]; then
|
|
27
|
+
exit 0
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
RATE=$((MATCHES * 100 / DONE))
|
|
31
|
+
|
|
32
|
+
log "Progress: $DONE done, $MATCHES matches ($RATE%), $PATCHES patches"
|
|
33
|
+
|
|
34
|
+
# Send Telegram update every 10 tasks
|
|
35
|
+
LAST_REPORTED=$(cat "$SWEBENCH/logs/.last_reported" 2>/dev/null || echo 0)
|
|
36
|
+
if [ "$DONE" -ge $((LAST_REPORTED + 10)) ]; then
|
|
37
|
+
$PYTHON "$DRYDOCK/scripts/notify_release.py" "swebench" "SWE-bench progress: $DONE tasks, $MATCHES file matches ($RATE%), $PATCHES patches. Log: $(basename $LATEST_LOG)"
|
|
38
|
+
echo "$DONE" > "$SWEBENCH/logs/.last_reported"
|
|
39
|
+
log "Sent Telegram update"
|
|
40
|
+
fi
|
drydock_cli-2.2.0/CLAUDE.md
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
# Drydock Development Guide
|
|
2
|
-
|
|
3
|
-
## Project
|
|
4
|
-
|
|
5
|
-
Drydock is a local CLI coding agent (fork of mistral-vibe, Apache 2.0).
|
|
6
|
-
- **Repo:** https://github.com/fbobe321/drydock
|
|
7
|
-
- **Goal:** Best-in-class SWE-bench Verified pass rate with local LLMs
|
|
8
|
-
- **Hardware:** 2x RTX 4060 Ti 16GB, devstral-24B-AWQ-4bit via vLLM at localhost:8000
|
|
9
|
-
|
|
10
|
-
## Build & Test
|
|
11
|
-
|
|
12
|
-
```bash
|
|
13
|
-
# Install
|
|
14
|
-
uv sync
|
|
15
|
-
|
|
16
|
-
# Run drydock CLI
|
|
17
|
-
uv run drydock
|
|
18
|
-
|
|
19
|
-
# Run programmatically (headless, for benchmarks)
|
|
20
|
-
python3 -c "import sys; sys.path.insert(0, '.'); from vibe.cli.entrypoint import main; main()" --agent auto-approve -p "your prompt"
|
|
21
|
-
|
|
22
|
-
# Run tests (note: pytest from swe-bench worktrees can pollute; use -p no:conftest if needed)
|
|
23
|
-
uv run pytest tests/ -x -q --timeout=30
|
|
24
|
-
|
|
25
|
-
# Syntax check modified files
|
|
26
|
-
python3 -c "import ast; ast.parse(open('path/to/file.py').read())"
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## Key Architecture
|
|
30
|
-
|
|
31
|
-
- `drydock/core/agent_loop.py` — Main agent loop. Loop detection, message ordering, tool execution. **Most changes go here.**
|
|
32
|
-
- `drydock/core/programmatic.py` — Headless API entry point used by SWE-bench harness
|
|
33
|
-
- `drydock/core/tools/builtins/bash.py` — Shell tool with allowlist/denylist, conda support
|
|
34
|
-
- `drydock/core/tools/builtins/search_replace.py` — File editing tool with fuzzy matching
|
|
35
|
-
- `drydock/core/prompts/cli.md` — System prompt (two-phase workflow, SWE-bench rules)
|
|
36
|
-
- `drydock/core/types.py` — `MessageList` (custom Sequence, use `.reset()` not `=[]`)
|
|
37
|
-
|
|
38
|
-
## Critical Constraints
|
|
39
|
-
|
|
40
|
-
- **MessageList is not a plain list.** Never `self.messages = [...]`. Use `self.messages.reset([...])`.
|
|
41
|
-
- **vLLM/Mistral rejects `user` after `tool` messages.** `_sanitize_message_ordering()` runs before every LLM call as safety net. All injection should use `_inject_system_note()`.
|
|
42
|
-
- **`os._exit()` in programmatic.py** — necessary because async cleanup hangs. Ensure stdout is flushed before calling.
|
|
43
|
-
- **Tests may fail due to stale SWE-bench worktrees** poisoning pytest. Use `python3 -c "import ast; ..."` for syntax checks instead.
|
|
44
|
-
|
|
45
|
-
## SWE-bench Infrastructure
|
|
46
|
-
|
|
47
|
-
Benchmarking scripts live at `/data3/swe_bench_runs/` (not in the drydock repo):
|
|
48
|
-
- `harness.py` — Runs drydock on SWE-bench tasks, captures patches
|
|
49
|
-
- `continuous_bench.sh` — Continuous improvement loop (cron @reboot + every 6h)
|
|
50
|
-
- `deploy_to_github.sh` → `/data3/drydock/scripts/` — Daily push to GitHub
|
|
51
|
-
|
|
52
|
-
## When Compacting
|
|
53
|
-
|
|
54
|
-
Always preserve: the list of files modified in this session, any failing test output, and the current task context from the PRD.
|
|
55
|
-
|
|
56
|
-
## Style
|
|
57
|
-
|
|
58
|
-
- Python 3.12+, type hints, pathlib over os.path
|
|
59
|
-
- Match existing patterns in the codebase
|
|
60
|
-
- No unnecessary abstractions — keep fixes minimal
|
|
61
|
-
- Always run syntax check after editing .py files
|