drydock-cli 2.2.2__tar.gz → 2.2.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- drydock_cli-2.2.4/CLAUDE.md +282 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/PKG-INFO +1 -1
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/agent_loop.py +29 -10
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/system_prompt.py +20 -14
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/pyproject.toml +1 -1
- drydock_cli-2.2.2/CLAUDE.md +0 -152
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.gitignore +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.python-version +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.typos.toml +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.vscode/extensions.json +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.vscode/launch.json +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/.vscode/settings.json +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/AGENTS.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/CHANGELOG.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/Drydock_rebrand.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/LICENSE +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/NOTICE +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/PRD.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/README.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/action.yml +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/docs/README.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/docs/acp-setup.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/logger.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/slug.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/task_manager.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/types.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/core/utils.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock/whats_new.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock-acp.spec +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/drydock_terms.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/flake.lock +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/flake.nix +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/README.md +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/auto_test_loop.sh +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/backup.sh +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/bump_version.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/install.sh +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/monitor_swebench.sh +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/monitor_test_battery.sh +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/notify_release.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/overnight_agents_test.sh +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/prepare_release.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/test_bank.sh +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/test_full.sh +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/scripts/test_smoke.sh +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/conftest.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/e2e/common.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/mock/utils.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/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.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_agents.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_integration.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_message_id.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_middleware.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_smoke.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/test_workloads.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.2.2 → drydock_cli-2.2.4}/uv.lock +0 -0
|
@@ -0,0 +1,282 @@
|
|
|
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 for v2, v3.0.0 for v3)
|
|
8
|
+
- **Goal:** Best-in-class SWE-bench Verified pass rate with local LLMs
|
|
9
|
+
- **Hardware:** 2x RTX 4060 Ti 16GB, Gemma 4 26B MoE (A4B) via vLLM Docker at localhost:8000
|
|
10
|
+
- **Server:** remus (Ubuntu 22.04, user: bobef)
|
|
11
|
+
- **Active model:** Gemma 4 26B-A4B-it-AWQ-4bit (replaced devstral-24B — 3-4x faster, better results)
|
|
12
|
+
- **Active codebase:** DryDock v3 at `/data3/drydock-v3/` (clean rewrite)
|
|
13
|
+
|
|
14
|
+
## Build & Test
|
|
15
|
+
|
|
16
|
+
### DryDock v3 (active)
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
# Install (minimal deps: only openai>=1.0)
|
|
20
|
+
cd /data3/drydock-v3 && pip install -e .
|
|
21
|
+
|
|
22
|
+
# Run drydock CLI (defaults to gemma4 model)
|
|
23
|
+
python -m drydock
|
|
24
|
+
python -m drydock --model gemma4
|
|
25
|
+
|
|
26
|
+
# Run programmatically (headless, for benchmarks)
|
|
27
|
+
PYTHONPATH=/data3/drydock-v3 python3 -c "import sys; sys.path.insert(0, '/data3/drydock-v3'); from drydock.cli import main; main()"
|
|
28
|
+
|
|
29
|
+
# Start Gemma 4 model server
|
|
30
|
+
bash /data3/Models/start_gemma4.sh
|
|
31
|
+
|
|
32
|
+
# Check model is running
|
|
33
|
+
curl http://localhost:8000/v1/models
|
|
34
|
+
|
|
35
|
+
# Syntax check modified files
|
|
36
|
+
python3 -c "import ast; ast.parse(open('path/to/file.py').read())"
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### DryDock v2 (legacy)
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# Install
|
|
43
|
+
uv sync
|
|
44
|
+
|
|
45
|
+
# Run drydock CLI
|
|
46
|
+
uv run drydock
|
|
47
|
+
|
|
48
|
+
# Run programmatically (headless, for benchmarks)
|
|
49
|
+
python3 -c "import sys; sys.path.insert(0, '.'); from drydock.cli.entrypoint import main; main()" --agent auto-approve -p "your prompt"
|
|
50
|
+
|
|
51
|
+
# Run tests
|
|
52
|
+
uv run pytest tests/ -x -q --timeout=30
|
|
53
|
+
|
|
54
|
+
# Syntax check modified files
|
|
55
|
+
python3 -c "import ast; ast.parse(open('path/to/file.py').read())"
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Key Architecture
|
|
59
|
+
|
|
60
|
+
### DryDock v3 (active — clean rewrite at `/data3/drydock-v3/`)
|
|
61
|
+
|
|
62
|
+
v3 is a from-scratch rewrite using nano-claude-code as foundation. 4 core files, ~750 lines total. Provider-agnostic, works with any OpenAI-compatible endpoint.
|
|
63
|
+
|
|
64
|
+
- `drydock/agent.py` — Core agent loop (161 lines). Multi-turn tool calling, event-driven. **Most changes go here.**
|
|
65
|
+
- `drydock/providers.py` — LLM abstraction (209 lines). Provider registry (vLLM, Ollama, LM Studio, OpenAI, Anthropic). Streams responses, filters Gemma 4 thinking tokens.
|
|
66
|
+
- `drydock/tool_registry.py` — Tool plugin system (46 lines). Register/execute tools by name.
|
|
67
|
+
- `drydock/tools/__init__.py` — 6 built-in tools (258 lines): Read, Write, Edit, Bash, Glob, Grep
|
|
68
|
+
- `drydock/cli.py` — CLI entry point (213 lines). Default model: gemma4.
|
|
69
|
+
- `drydock/compaction.py` — Two-tier context management (119 lines). Normal compaction + emergency compaction on 400 errors.
|
|
70
|
+
|
|
71
|
+
### DryDock v2 (legacy at `/data3/drydock/`)
|
|
72
|
+
|
|
73
|
+
- `drydock/core/agent_loop.py` — Main agent loop. Loop detection, message ordering, tool execution.
|
|
74
|
+
- `drydock/core/programmatic.py` — Headless API entry point used by SWE-bench harness
|
|
75
|
+
- `drydock/core/build_orchestrator.py` — Multi-phase build pipeline (currently disabled, model drives builds)
|
|
76
|
+
- `drydock/core/tools/builtins/bash.py` — Shell tool with allowlist/denylist, conda support
|
|
77
|
+
- `drydock/core/tools/builtins/search_replace.py` — File editing tool with fuzzy matching
|
|
78
|
+
- `drydock/core/prompts/cli.md` — System prompt (workflow, delegation, tool rules)
|
|
79
|
+
- `drydock/core/prompts/builder.md` — Minimal prompt for file builder subagents
|
|
80
|
+
- `drydock/core/system_prompt.py` — Builds system prompt, loads AGENTS.md/DRYDOCK.md
|
|
81
|
+
- `drydock/core/types.py` — `MessageList` (custom Sequence, use `.reset()` not `=[]`)
|
|
82
|
+
- `drydock/core/middleware.py` — Tiered context warnings, auto-compaction
|
|
83
|
+
- `drydock/core/agents/models.py` — Agent profiles (explore, diagnostic, planner, builder)
|
|
84
|
+
- `drydock/core/skills/manager.py` — Skill discovery and loading
|
|
85
|
+
- `drydock/cli/textual_ui/app.py` — TUI application
|
|
86
|
+
- `drydock/cli/commands.py` — Slash commands (/help, /setup-model, /consult, etc.)
|
|
87
|
+
|
|
88
|
+
## Critical Constraints
|
|
89
|
+
|
|
90
|
+
### v3 Constraints
|
|
91
|
+
- **Gemma 4 leaks thinking tokens.** The model emits `<|channel>thought<channel|>` tokens that must be filtered out. `providers.py` strips these via regex before displaying output.
|
|
92
|
+
- **Two-tier compaction.** Normal compaction truncates old tool results. Emergency compaction triggers on 400 errors (context overflow) with aggressive truncation.
|
|
93
|
+
- **Provider-agnostic design.** No model-specific hacks in the agent loop. All model quirks handled in `providers.py`.
|
|
94
|
+
|
|
95
|
+
### v2 Constraints (still apply to v2 codebase)
|
|
96
|
+
- **MessageList is not a plain list.** Never `self.messages = [...]`. Use `self.messages.reset([...])`.
|
|
97
|
+
- **vLLM/Mistral rejects `user` after `tool` messages.** `_sanitize_message_ordering()` runs before every LLM call. All injection must use `_inject_system_note()`.
|
|
98
|
+
- **`os._exit()` in programmatic.py** — necessary because async cleanup hangs. Ensure stdout is flushed before calling.
|
|
99
|
+
- **AGENTS.md is CRITICAL for devstral.** Without per-project instructions, the model loops on ls/bash. Auto-created by `_ensure_agents_md()`.
|
|
100
|
+
|
|
101
|
+
### Shared Constraints
|
|
102
|
+
- **"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.
|
|
103
|
+
- **Additive-only harness changes.** Every control flow modification (circuit breaker, orchestrator, nudges) caused regressions. Just inject better context before the agent loop.
|
|
104
|
+
- **Circuit breaker is disabled.** It blocked valid retries. Loop detection prunes duplicates and nudges instead. Never stops the session.
|
|
105
|
+
- **Loop detection never stops.** Only prunes repeated tool calls and injects guidance. The only hard stop is MAX_TOOL_TURNS (200).
|
|
106
|
+
|
|
107
|
+
## Gemma 4 Tool Calling (v3 — active)
|
|
108
|
+
|
|
109
|
+
- **Model:** Gemma-4-26B-A4B-it-AWQ-4bit (26B MoE, only 4B active params per token)
|
|
110
|
+
- **Serving:** vLLM Docker image `vllm/vllm-openai:gemma4` with `--tool-call-parser gemma4 --enable-auto-tool-choice`
|
|
111
|
+
- **Start script:** `/data3/Models/start_gemma4.sh` (Docker: 2 GPU tensor parallel, 131K context, fp8 KV cache)
|
|
112
|
+
- **Performance:** 3-4x faster than devstral-24B, 0% timeouts on SWE-bench, 70% file match (vs 60% devstral)
|
|
113
|
+
- **Thinking tokens:** Model leaks `<|channel>thought<channel|>` — filtered in `providers.py` via regex
|
|
114
|
+
- **Tool choice:** `tool_choice="auto"` (default), model natively decides tool vs text
|
|
115
|
+
- **No AGENTS.md dependency:** Gemma 4 does not loop without AGENTS.md (unlike devstral)
|
|
116
|
+
- **Docker management:** `docker stop gemma4 && docker rm gemma4` to restart
|
|
117
|
+
|
|
118
|
+
## Mistral/devstral Tool Calling (v2 — legacy)
|
|
119
|
+
|
|
120
|
+
- `tool_choice="auto"` (default): model decides whether to call a tool or respond with text
|
|
121
|
+
- Never ask for text before first tool call — blocks tool calling
|
|
122
|
+
- `tool_choice="required"` forces a tool call (useful for first-turn delegation)
|
|
123
|
+
- AGENTS.md anchors model behavior — without it, devstral loops
|
|
124
|
+
- Plan→Edit workflow: use plan mode first, then switch to accept-edits
|
|
125
|
+
|
|
126
|
+
## File Locations
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
/data3/drydock-v3/ ← DryDock v3 (active, clean rewrite)
|
|
130
|
+
├── drydock/ ← Python package (~750 lines total)
|
|
131
|
+
│ ├── agent.py ← Core agent loop (THE most important file)
|
|
132
|
+
│ ├── providers.py ← LLM abstraction (vLLM, Ollama, etc.)
|
|
133
|
+
│ ├── tool_registry.py ← Tool plugin system
|
|
134
|
+
│ ├── tools/__init__.py ← 6 built-in tools (Read, Write, Edit, Bash, Glob, Grep)
|
|
135
|
+
│ ├── cli.py ← CLI entry point
|
|
136
|
+
│ ├── compaction.py ← Two-tier context management
|
|
137
|
+
│ ├── memory/ ← Memory system
|
|
138
|
+
│ └── skills/ ← Skill framework
|
|
139
|
+
├── scripts/
|
|
140
|
+
│ └── monitor.sh ← Process monitor (restarts Gemma 4 if needed)
|
|
141
|
+
├── logs/ ← Runtime logs
|
|
142
|
+
├── pyproject.toml ← v3.0.0, depends only on openai>=1.0
|
|
143
|
+
└── AGENTS.md ← Project instructions
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
/data3/drydock/ ← DryDock v2 (legacy, original codebase)
|
|
148
|
+
├── drydock/ ← Python package
|
|
149
|
+
│ ├── core/
|
|
150
|
+
│ │ ├── agent_loop.py ← v2 agent loop
|
|
151
|
+
│ │ ├── prompts/cli.md ← System prompt
|
|
152
|
+
│ │ ├── build_orchestrator.py ← Multi-phase builder (disabled)
|
|
153
|
+
│ │ ├── tools/builtins/ ← 24 builtin tools
|
|
154
|
+
│ │ ├── agents/ ← Subagent definitions
|
|
155
|
+
│ │ └── skills/ ← Skill framework
|
|
156
|
+
│ ├── cli/textual_ui/app.py ← TUI application
|
|
157
|
+
│ └── skills/ ← 7 bundled skills
|
|
158
|
+
├── tests/
|
|
159
|
+
│ ├── test_smoke.py ← 20 fast tests
|
|
160
|
+
│ ├── test_loop_detection.py ← 38 loop tests
|
|
161
|
+
│ ├── test_bank_prd.py ← 15 PRD-driven tests
|
|
162
|
+
│ └── testbank_helpers.py ← Shared test infrastructure
|
|
163
|
+
├── scripts/
|
|
164
|
+
│ ├── deploy_to_github.sh ← Daily push (4 AM)
|
|
165
|
+
│ ├── publish_to_pypi.sh ← Tests → build → PyPI → tag
|
|
166
|
+
│ ├── notify_release.py ← Telegram notifications
|
|
167
|
+
│ └── backup.sh ← rsync to NAS (3 AM)
|
|
168
|
+
└── test_bank_results/ ← Test logs
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
/data3/swe_bench_runs/ ← SWE-bench infrastructure (separate)
|
|
173
|
+
├── harness.py ← Runs drydock on SWE-bench tasks (supports v2 + v3 backends)
|
|
174
|
+
├── continuous_bench.sh ← Continuous improvement loop (v2/devstral)
|
|
175
|
+
├── continuous_gemma4.sh ← Continuous improvement loop (v3/Gemma 4, 20-task batches)
|
|
176
|
+
└── logs/ ← Batch results
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
/data3/Models/ ← Model files and startup scripts
|
|
181
|
+
├── Gemma-4-26B-A4B-it-AWQ-4bit/ ← Gemma 4 model weights
|
|
182
|
+
└── start_gemma4.sh ← Docker startup (vLLM + Gemma 4)
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Configuration Management
|
|
186
|
+
|
|
187
|
+
**All scripts use explicit Python path:** `/home/bobef/miniconda3/bin/python3`
|
|
188
|
+
**Cron PATH doesn't inherit shell.** Every script exports PATH explicitly.
|
|
189
|
+
**User's DryDock install:** `/home/bobef/miniforge3/envs/drydock/bin/python3` (Python 3.14)
|
|
190
|
+
**Dev/test Python:** `/home/bobef/miniconda3/bin/python3` (Python 3.12)
|
|
191
|
+
**Config:** `~/.drydock/config.toml`
|
|
192
|
+
**Tokens:** `~/.config/drydock/github_token`, `~/.config/drydock/pypi_token`
|
|
193
|
+
**Git remotes:** `drydock` → github.com/fbobe321/drydock, `origin` → github.com/mistralai/mistral-vibe
|
|
194
|
+
|
|
195
|
+
## Deployment Process
|
|
196
|
+
|
|
197
|
+
1. Code → modify files
|
|
198
|
+
2. Syntax check → `python3 -c "import ast; ..."`
|
|
199
|
+
3. Tests → `pytest tests/test_smoke.py tests/test_loop_detection.py -q`
|
|
200
|
+
4. Commit → descriptive message
|
|
201
|
+
5. Publish → `./scripts/publish_to_pypi.sh` (tests → build → PyPI → tag → integration test → GitHub → Telegram)
|
|
202
|
+
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`
|
|
203
|
+
|
|
204
|
+
## SWE-bench
|
|
205
|
+
|
|
206
|
+
### Current Results (Gemma 4 + DryDock v3)
|
|
207
|
+
- **70% file match** (vs 60% devstral v2), 0% timeouts, 8x faster per task
|
|
208
|
+
- Harness at `/data3/swe_bench_runs/harness.py` supports both v2 (devstral) and v3 (gemma4) backends
|
|
209
|
+
- Continuous bench loop: `/data3/swe_bench_runs/continuous_gemma4.sh` (20-task batches with Telegram updates)
|
|
210
|
+
- AGENTS.md auto-created per task with bug-fix workflow
|
|
211
|
+
- Environment bootstrapping (Meta-Harness technique) gathers repo structure before first LLM call
|
|
212
|
+
|
|
213
|
+
### Previous Results (devstral + DryDock v2)
|
|
214
|
+
- 42% file match, 62% real patches (50-task eval)
|
|
215
|
+
- Target was 68% (devstral-small-2 published score)
|
|
216
|
+
- Continuous bench loop: `/data3/swe_bench_runs/continuous_bench.sh`
|
|
217
|
+
|
|
218
|
+
## Improvement Backlog (from research papers + industry analysis)
|
|
219
|
+
|
|
220
|
+
**Meta-Harness (arXiv:2603.28052) — still TODO:**
|
|
221
|
+
- Execution trace logging (full prompts + tool calls per task for failure diagnosis)
|
|
222
|
+
- Repo-specific routing (different strategies per SWE-bench repo)
|
|
223
|
+
- Draft-then-verify (generate patch, verify against tests before committing)
|
|
224
|
+
- Contrastive examples (similar bugs with different fixes)
|
|
225
|
+
- Pareto frontier tracking (accuracy vs token cost)
|
|
226
|
+
|
|
227
|
+
**Industry design patterns — still TODO:**
|
|
228
|
+
- Parallel tool execution (multiple independent tool calls per turn)
|
|
229
|
+
- Background memory consolidation (clean context during idle time)
|
|
230
|
+
- Three-tier memory system (index + topics + archives)
|
|
231
|
+
- Frustration detection (regex-based, adjust approach when user is stuck)
|
|
232
|
+
- Extended reasoning allocation (detect complex tasks, give more compute)
|
|
233
|
+
- Git safety guards (stash before destructive ops)
|
|
234
|
+
|
|
235
|
+
**Implemented:**
|
|
236
|
+
- ✅ Static/dynamic prompt split (prefix caching)
|
|
237
|
+
- ✅ AGENTS.md auto-creation
|
|
238
|
+
- ✅ Environment bootstrapping
|
|
239
|
+
- ✅ Additive-only harness changes
|
|
240
|
+
- ✅ Permission denial feedback (suggest alternatives)
|
|
241
|
+
- ✅ "Task Completed" false claim detection
|
|
242
|
+
- ✅ Loop guidance (never stops, only redirects)
|
|
243
|
+
- ✅ Composable prompt (static first, dynamic after)
|
|
244
|
+
- ✅ DryDock v3 clean rewrite (provider-agnostic, ~750 lines)
|
|
245
|
+
- ✅ Gemma 4 MoE model (3-4x faster, 70% file match)
|
|
246
|
+
- ✅ Two-tier context compaction (normal + emergency on 400 errors)
|
|
247
|
+
- ✅ Docker-based model serving (vLLM + Gemma 4)
|
|
248
|
+
- ✅ Multi-backend SWE-bench harness (v2/devstral + v3/gemma4)
|
|
249
|
+
- ✅ Thinking token filtering (Gemma 4 `<|channel>` leak)
|
|
250
|
+
|
|
251
|
+
**Legal note:** All patterns are standard design concepts implemented from scratch. No proprietary code copied.
|
|
252
|
+
|
|
253
|
+
## Key Learnings
|
|
254
|
+
|
|
255
|
+
1. AGENTS.md is essential — devstral loops without it (Gemma 4 does not have this problem)
|
|
256
|
+
2. "Restate the goal" blocked tool calling for months — one line
|
|
257
|
+
3. Additive-only changes work best — control flow mods regress
|
|
258
|
+
4. The harness matters as much as the model (Meta-Harness paper)
|
|
259
|
+
5. Environment bootstrapping saves 2-4 exploratory turns
|
|
260
|
+
6. Plan→Edit workflow is Mistral's design, don't fight it
|
|
261
|
+
7. Circuit breaker was net negative — removed entirely
|
|
262
|
+
8. Loop detection should guide, never stop
|
|
263
|
+
9. Test the installed package, not source (different Python envs)
|
|
264
|
+
10. Never wait for full test runs — fix issues from early results
|
|
265
|
+
11. Clean rewrites beat incremental fixes — v3 (~750 lines) outperforms v2 (~5000+ lines)
|
|
266
|
+
12. Model choice matters more than agent complexity — Gemma 4 MoE gives 3-4x speed + better accuracy than devstral
|
|
267
|
+
13. Gemma 4 leaks thinking tokens (`<|channel>thought<channel|>`) — must filter in provider layer
|
|
268
|
+
14. Two-tier compaction (normal + emergency on 400) is more robust than single-tier
|
|
269
|
+
15. Provider-agnostic design enables fast model switching — v3 works with any OpenAI-compatible endpoint
|
|
270
|
+
16. Docker-based model serving (vLLM) is more reliable than bare-metal — easier restarts, GPU management
|
|
271
|
+
|
|
272
|
+
## When Compacting
|
|
273
|
+
|
|
274
|
+
Always preserve: the list of files modified in this session, any failing test output, current SWE-bench results, and the user's latest instructions.
|
|
275
|
+
|
|
276
|
+
## Style
|
|
277
|
+
|
|
278
|
+
- Python 3.12+, type hints, pathlib over os.path
|
|
279
|
+
- Match existing patterns in the codebase
|
|
280
|
+
- No unnecessary abstractions — keep fixes minimal
|
|
281
|
+
- Always run syntax check after editing .py files
|
|
282
|
+
- Don't add features beyond what was asked
|
|
@@ -781,21 +781,28 @@ class AgentLoop:
|
|
|
781
781
|
"to make your edit. Do NOT say the task is done until search_replace succeeds."
|
|
782
782
|
)
|
|
783
783
|
elif text_without_action == 1:
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
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:
|
|
788
792
|
nudge_text = (
|
|
789
|
-
"
|
|
790
|
-
"
|
|
791
|
-
"
|
|
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():
|
|
799
|
+
nudge_text = (
|
|
800
|
+
"Good — you identified the target. Now use read_file then search_replace."
|
|
792
801
|
)
|
|
793
802
|
else:
|
|
794
803
|
nudge_text = (
|
|
795
804
|
"You responded with text but did not call any tools. "
|
|
796
|
-
"
|
|
797
|
-
"If you are unsure of the exact text, use read_file on the target function ONCE, "
|
|
798
|
-
"then immediately search_replace."
|
|
805
|
+
"Call write_file, read_file, or search_replace NOW."
|
|
799
806
|
)
|
|
800
807
|
elif text_without_action == 2:
|
|
801
808
|
nudge_text = (
|
|
@@ -1146,6 +1153,16 @@ class AgentLoop:
|
|
|
1146
1153
|
CancellationReason.TOOL_SKIPPED, tool_call.tool_name
|
|
1147
1154
|
)
|
|
1148
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}"
|
|
1149
1166
|
yield ToolResultEvent(
|
|
1150
1167
|
tool_name=tool_call.tool_name,
|
|
1151
1168
|
tool_class=tool_call.tool_class,
|
|
@@ -1781,6 +1798,8 @@ class AgentLoop:
|
|
|
1781
1798
|
try:
|
|
1782
1799
|
agents_md.write_text(
|
|
1783
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"
|
|
1784
1803
|
"## Workflow\n"
|
|
1785
1804
|
"When building a project:\n"
|
|
1786
1805
|
"1. Use `task(agent=\"planner\")` to create an implementation plan first\n"
|
|
@@ -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:
|
drydock_cli-2.2.2/CLAUDE.md
DELETED
|
@@ -1,152 +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
|
-
- **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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|