drydock-cli 2.2.1__tar.gz → 2.2.3__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.3/CLAUDE.md +180 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/PKG-INFO +1 -1
- drydock_cli-2.2.3/PRD.md +81 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/app.py +3 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/agent_loop.py +53 -14
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/config/harness_files/_harness_manager.py +5 -1
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/system_prompt.py +20 -14
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/pyproject.toml +1 -1
- drydock_cli-2.2.3/scripts/monitor_swebench.sh +40 -0
- drydock_cli-2.2.1/CLAUDE.md +0 -61
- drydock_cli-2.2.1/PRD.md +0 -594
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.gitignore +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.python-version +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.typos.toml +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.vscode/extensions.json +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.vscode/launch.json +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/.vscode/settings.json +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/AGENTS.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/CHANGELOG.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/Drydock_rebrand.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/LICENSE +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/NOTICE +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/README.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/action.yml +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/docs/README.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/docs/acp-setup.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/logger.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/slug.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/task_manager.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/types.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/core/utils.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock/whats_new.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock-acp.spec +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/drydock_terms.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/flake.lock +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/flake.nix +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/README.md +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/auto_test_loop.sh +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/backup.sh +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/bump_version.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/install.sh +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/monitor_test_battery.sh +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/notify_release.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/overnight_agents_test.sh +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/prepare_release.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/test_bank.sh +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/test_full.sh +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/scripts/test_smoke.sh +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/conftest.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/e2e/common.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/mock/utils.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/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.1 → drydock_cli-2.2.3}/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.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_agents.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_integration.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_message_id.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_middleware.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_smoke.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/test_workloads.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.2.1 → drydock_cli-2.2.3}/uv.lock +0 -0
|
@@ -0,0 +1,180 @@
|
|
|
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
|
+
|
|
128
|
+
## Improvement Backlog (from research papers + industry analysis)
|
|
129
|
+
|
|
130
|
+
**Meta-Harness (arXiv:2603.28052) — still TODO:**
|
|
131
|
+
- Execution trace logging (full prompts + tool calls per task for failure diagnosis)
|
|
132
|
+
- Repo-specific routing (different strategies per SWE-bench repo)
|
|
133
|
+
- Draft-then-verify (generate patch, verify against tests before committing)
|
|
134
|
+
- Contrastive examples (similar bugs with different fixes)
|
|
135
|
+
- Pareto frontier tracking (accuracy vs token cost)
|
|
136
|
+
|
|
137
|
+
**Industry design patterns — still TODO:**
|
|
138
|
+
- Parallel tool execution (multiple independent tool calls per turn)
|
|
139
|
+
- Background memory consolidation (clean context during idle time)
|
|
140
|
+
- Three-tier memory system (index + topics + archives)
|
|
141
|
+
- Frustration detection (regex-based, adjust approach when user is stuck)
|
|
142
|
+
- Extended reasoning allocation (detect complex tasks, give more compute)
|
|
143
|
+
- Git safety guards (stash before destructive ops)
|
|
144
|
+
|
|
145
|
+
**Implemented:**
|
|
146
|
+
- ✅ Static/dynamic prompt split (prefix caching)
|
|
147
|
+
- ✅ AGENTS.md auto-creation
|
|
148
|
+
- ✅ Environment bootstrapping
|
|
149
|
+
- ✅ Additive-only harness changes
|
|
150
|
+
- ✅ Permission denial feedback (suggest alternatives)
|
|
151
|
+
- ✅ "Task Completed" false claim detection
|
|
152
|
+
- ✅ Loop guidance (never stops, only redirects)
|
|
153
|
+
- ✅ Composable prompt (static first, dynamic after)
|
|
154
|
+
|
|
155
|
+
**Legal note:** All patterns are standard design concepts implemented from scratch. No proprietary code copied.
|
|
156
|
+
|
|
157
|
+
## Key Learnings
|
|
158
|
+
|
|
159
|
+
1. AGENTS.md is essential — devstral loops without it
|
|
160
|
+
2. "Restate the goal" blocked tool calling for months — one line
|
|
161
|
+
3. Additive-only changes work best — control flow mods regress
|
|
162
|
+
4. The harness matters as much as the model (Meta-Harness paper)
|
|
163
|
+
5. Environment bootstrapping saves 2-4 exploratory turns
|
|
164
|
+
6. Plan→Edit workflow is Mistral's design, don't fight it
|
|
165
|
+
7. Circuit breaker was net negative — removed entirely
|
|
166
|
+
8. Loop detection should guide, never stop
|
|
167
|
+
9. Test the installed package, not source (different Python envs)
|
|
168
|
+
10. Never wait for full test runs — fix issues from early results
|
|
169
|
+
|
|
170
|
+
## When Compacting
|
|
171
|
+
|
|
172
|
+
Always preserve: the list of files modified in this session, any failing test output, current SWE-bench results, and the user's latest instructions.
|
|
173
|
+
|
|
174
|
+
## Style
|
|
175
|
+
|
|
176
|
+
- Python 3.12+, type hints, pathlib over os.path
|
|
177
|
+
- Match existing patterns in the codebase
|
|
178
|
+
- No unnecessary abstractions — keep fixes minimal
|
|
179
|
+
- Always run syntax check after editing .py files
|
|
180
|
+
- Don't add features beyond what was asked
|
drydock_cli-2.2.3/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
|
|
|
@@ -762,22 +762,47 @@ class AgentLoop:
|
|
|
762
762
|
text_without_action += 1
|
|
763
763
|
# Always continue — don't let the agent exit without editing
|
|
764
764
|
should_break_loop = False
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
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:
|
|
784
|
+
last_text = (last_message.content or "").lower()
|
|
785
|
+
# Detect model asking for confirmation instead of acting
|
|
786
|
+
is_asking = any(kw in last_text for kw in (
|
|
787
|
+
"standing by", "waiting for", "please provide",
|
|
788
|
+
"what would you like", "how can i help",
|
|
789
|
+
"what should i", "do you want me to",
|
|
790
|
+
))
|
|
791
|
+
if is_asking:
|
|
792
|
+
nudge_text = (
|
|
793
|
+
"DO NOT ask for confirmation. Act NOW. "
|
|
794
|
+
"If there is a PRD.md, implement it with write_file. "
|
|
795
|
+
"If there is code, read it with read_file and fix bugs with search_replace. "
|
|
796
|
+
"Call a tool on your next response."
|
|
797
|
+
)
|
|
798
|
+
elif "TARGET:" in last_text.upper() or "FILE:" in last_text.upper():
|
|
770
799
|
nudge_text = (
|
|
771
|
-
"Good — you identified the target. Now
|
|
772
|
-
"use read_file to read the target function, then search_replace to fix it. "
|
|
773
|
-
"Do NOT describe the fix — apply it with search_replace."
|
|
800
|
+
"Good — you identified the target. Now use read_file then search_replace."
|
|
774
801
|
)
|
|
775
802
|
else:
|
|
776
803
|
nudge_text = (
|
|
777
804
|
"You responded with text but did not call any tools. "
|
|
778
|
-
"
|
|
779
|
-
"If you are unsure of the exact text, use read_file on the target function ONCE, "
|
|
780
|
-
"then immediately search_replace."
|
|
805
|
+
"Call write_file, read_file, or search_replace NOW."
|
|
781
806
|
)
|
|
782
807
|
elif text_without_action == 2:
|
|
783
808
|
nudge_text = (
|
|
@@ -792,9 +817,11 @@ class AgentLoop:
|
|
|
792
817
|
"Pick the most likely file and function, and make a minimal edit."
|
|
793
818
|
)
|
|
794
819
|
else:
|
|
795
|
-
#
|
|
796
|
-
|
|
797
|
-
|
|
820
|
+
# Keep nudging — never give up
|
|
821
|
+
nudge_text = (
|
|
822
|
+
"You MUST call a tool. Use grep to find the file, "
|
|
823
|
+
"read_file to read it, then search_replace to fix."
|
|
824
|
+
)
|
|
798
825
|
if nudge_text:
|
|
799
826
|
# Use _inject_system_note (appends to last tool/user message)
|
|
800
827
|
# User messages cause 'tool after user' ordering violations
|
|
@@ -1126,6 +1153,16 @@ class AgentLoop:
|
|
|
1126
1153
|
CancellationReason.TOOL_SKIPPED, tool_call.tool_name
|
|
1127
1154
|
)
|
|
1128
1155
|
)
|
|
1156
|
+
# Add alternative suggestions so model can adjust strategy
|
|
1157
|
+
alternatives = {
|
|
1158
|
+
"write_file": "Try search_replace to modify existing files.",
|
|
1159
|
+
"search_replace": "Try write_file to create the file, or read_file first to get exact text.",
|
|
1160
|
+
"bash": "Try read_file + search_replace for code changes.",
|
|
1161
|
+
"task": "Try grep + read_file to explore manually.",
|
|
1162
|
+
}
|
|
1163
|
+
alt = alternatives.get(tool_call.tool_name, "")
|
|
1164
|
+
if alt:
|
|
1165
|
+
skip_reason += f"\n\n{alt}"
|
|
1129
1166
|
yield ToolResultEvent(
|
|
1130
1167
|
tool_name=tool_call.tool_name,
|
|
1131
1168
|
tool_class=tool_call.tool_class,
|
|
@@ -1761,6 +1798,8 @@ class AgentLoop:
|
|
|
1761
1798
|
try:
|
|
1762
1799
|
agents_md.write_text(
|
|
1763
1800
|
"# Project Instructions\n\n"
|
|
1801
|
+
"DO NOT ask for confirmation. DO NOT wait for instructions. ACT IMMEDIATELY.\n"
|
|
1802
|
+
"If there is a PRD.md, implement it. If there is code, work on it.\n\n"
|
|
1764
1803
|
"## Workflow\n"
|
|
1765
1804
|
"When building a project:\n"
|
|
1766
1805
|
"1. Use `task(agent=\"planner\")` to create an implementation plan first\n"
|
{drydock_cli-2.2.1 → drydock_cli-2.2.3}/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
|
|
@@ -246,30 +246,35 @@ def get_universal_system_prompt(
|
|
|
246
246
|
skill_manager: SkillManager,
|
|
247
247
|
agent_manager: AgentManager,
|
|
248
248
|
) -> str:
|
|
249
|
-
|
|
249
|
+
# === STATIC SECTIONS (identical per session — prefix-cached by vLLM) ===
|
|
250
|
+
# These MUST come first and be identical across requests for cache hits.
|
|
251
|
+
static_sections = [config.system_prompt]
|
|
250
252
|
|
|
251
253
|
if config.include_commit_signature:
|
|
252
|
-
|
|
254
|
+
static_sections.append(_add_commit_signature())
|
|
253
255
|
|
|
254
256
|
if config.include_model_info:
|
|
255
|
-
|
|
257
|
+
static_sections.append(f"Your model name is: `{config.active_model}`")
|
|
256
258
|
|
|
257
259
|
if config.include_prompt_detail:
|
|
258
|
-
|
|
260
|
+
static_sections.append(_get_os_system_prompt())
|
|
259
261
|
tool_prompts = []
|
|
260
262
|
for tool_class in tool_manager.available_tools.values():
|
|
261
263
|
if prompt := tool_class.get_tool_prompt():
|
|
262
264
|
tool_prompts.append(prompt)
|
|
263
265
|
if tool_prompts:
|
|
264
|
-
|
|
266
|
+
static_sections.append("\n---\n".join(tool_prompts))
|
|
265
267
|
|
|
266
268
|
skills_section = _get_available_skills_section(skill_manager)
|
|
267
269
|
if skills_section:
|
|
268
|
-
|
|
270
|
+
static_sections.append(skills_section)
|
|
269
271
|
|
|
270
272
|
subagents_section = _get_available_subagents_section(agent_manager)
|
|
271
273
|
if subagents_section:
|
|
272
|
-
|
|
274
|
+
static_sections.append(subagents_section)
|
|
275
|
+
|
|
276
|
+
# === DYNAMIC SECTIONS (change per project/directory) ===
|
|
277
|
+
dynamic_sections = []
|
|
273
278
|
|
|
274
279
|
if config.include_project_context:
|
|
275
280
|
is_dangerous, reason = is_dangerous_directory()
|
|
@@ -283,20 +288,21 @@ def get_universal_system_prompt(
|
|
|
283
288
|
config=config.project_context, root_path=Path.cwd()
|
|
284
289
|
).get_full_context()
|
|
285
290
|
|
|
286
|
-
|
|
291
|
+
dynamic_sections.append(context)
|
|
287
292
|
|
|
288
293
|
project_doc = get_harness_files_manager().load_project_doc(
|
|
289
294
|
config.project_context.max_doc_bytes
|
|
290
295
|
)
|
|
291
296
|
if project_doc.strip():
|
|
292
|
-
|
|
297
|
+
dynamic_sections.append(project_doc)
|
|
293
298
|
|
|
294
|
-
# Load DRYDOCK.md per-project instructions
|
|
295
|
-
|
|
296
|
-
if
|
|
297
|
-
|
|
299
|
+
# Load AGENTS.md / DRYDOCK.md per-project instructions
|
|
300
|
+
project_instructions = _load_project_instructions()
|
|
301
|
+
if project_instructions:
|
|
302
|
+
dynamic_sections.append(f"## Project Instructions\n\n{project_instructions}")
|
|
298
303
|
|
|
299
|
-
|
|
304
|
+
# Static first (prefix cached), then dynamic
|
|
305
|
+
return "\n\n".join(static_sections + dynamic_sections)
|
|
300
306
|
|
|
301
307
|
|
|
302
308
|
def _load_project_instructions(max_bytes: int = 16_000) -> str:
|
|
@@ -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.1/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
|