drydock-cli 2.6.29__tar.gz → 2.6.30__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.6.29 → drydock_cli-2.6.30}/PKG-INFO +129 -61
- drydock_cli-2.6.30/README.md +270 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/agent_loop.py +64 -7
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/pyproject.toml +6 -3
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/shakedown.py +4 -3
- drydock_cli-2.6.30/scripts/shakedown_interactive.py +449 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/uv.lock +1 -1
- drydock_cli-2.6.29/README.md +0 -202
- drydock_cli-2.6.29/log_analyzer/__init__.py +0 -2
- drydock_cli-2.6.29/log_analyzer/__main__.py +0 -9
- drydock_cli-2.6.29/log_analyzer/analyzer.py +0 -48
- drydock_cli-2.6.29/log_analyzer/cli.py +0 -40
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/.gitignore +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/.python-version +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/.typos.toml +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/.vscode/extensions.json +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/.vscode/launch.json +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/.vscode/settings.json +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/AGENTS.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/CHANGELOG.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/CLAUDE.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/Drydock_rebrand.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/LICENSE +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/NOTICE +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/PRD.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/action.yml +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/docs/README.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/docs/acp-setup.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/logger.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/prompts/gemma4.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/slug.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/types.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/core/utils.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock/whats_new.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock-acp.spec +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/drydock_terms.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/flake.lock +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/flake.nix +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/README.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/auto_release.sh +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/auto_test_loop.sh +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/backup.sh +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/bump_version.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/discover_cli_tools.sh +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/install.sh +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/llm_balancer.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/monitor_swebench.sh +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/monitor_test_battery.sh +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/notify_release.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/overnight_agents_test.sh +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/prepare_release.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/shakedown_regression.sh +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/shakedown_suite.sh +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/shakedown_variance.sh +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/test_bank.sh +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/test_full.sh +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/test_smoke.sh +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/test_tui_path.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/tui_test.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/scripts/vllm_failover.sh +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/conftest.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/e2e/common.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/mock/utils.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/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.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_agents.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_integration.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_message_id.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_middleware.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_smoke.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/test_workloads.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.6.29 → drydock_cli-2.6.30}/tests/update_notifier/test_whats_new.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 2.6.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 2.6.30
|
|
4
|
+
Summary: Local-first CLI coding agent — tested with Gemma 4 26B via vLLM
|
|
5
5
|
Project-URL: Homepage, https://github.com/fbobe321/drydock
|
|
6
6
|
Project-URL: Repository, https://github.com/fbobe321/drydock
|
|
7
7
|
Project-URL: Issues, https://github.com/fbobe321/drydock/issues
|
|
@@ -10,7 +10,7 @@ Author: Drydock contributors, Mistral AI (original)
|
|
|
10
10
|
License: Apache-2.0
|
|
11
11
|
License-File: LICENSE
|
|
12
12
|
License-File: NOTICE
|
|
13
|
-
Keywords: ai,cli,coding-assistant,developer-tools,drydock,llm,
|
|
13
|
+
Keywords: ai,cli,coding-assistant,developer-tools,drydock,gemma,llm,local-llm,tui,vllm
|
|
14
14
|
Classifier: Development Status :: 5 - Production/Stable
|
|
15
15
|
Classifier: Intended Audience :: Developers
|
|
16
16
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
@@ -60,41 +60,123 @@ Description-Content-Type: text/markdown
|
|
|
60
60
|
[](https://github.com/fbobe321/drydock/blob/main/LICENSE)
|
|
61
61
|
|
|
62
62
|
```
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
\_________________/
|
|
70
|
-
~~~~ ~~~ ~~~~ ~~~ ~~~~
|
|
71
|
-
~~~ ~~~~ ~~~ ~~~ ~~~
|
|
63
|
+
____ _ _
|
|
64
|
+
| _ \ _ __ _ _ __| | ___ ___ | | __
|
|
65
|
+
| | | | '__| | | |/ _` |/ _ \ / __|| |/ /
|
|
66
|
+
| |_| | | | |_| | (_| | (_) | (__ | <
|
|
67
|
+
|____/|_| \__, |\__,_|\___/ \___||_|\_\
|
|
68
|
+
|___/
|
|
72
69
|
```
|
|
73
70
|
|
|
74
|
-
**
|
|
71
|
+
**Local-first CLI coding agent. Chart your course. Execute with precision.**
|
|
75
72
|
|
|
76
|
-
DryDock is a
|
|
73
|
+
DryDock is a TUI coding assistant designed to work with **local LLMs**. It provides a conversational interface to your codebase — explore, modify, build, and test projects through natural language and a powerful set of tools.
|
|
77
74
|
|
|
78
|
-
> [!
|
|
79
|
-
> DryDock
|
|
75
|
+
> [!IMPORTANT]
|
|
76
|
+
> DryDock is tested and optimized for **Gemma 4 26B-A4B** (26B MoE, 4B active parameters) served via vLLM. Other models and providers are supported (Mistral, OpenAI, Anthropic, Ollama) but are not as thoroughly tested. If you use a different model, expect to tune prompts and tool settings.
|
|
80
77
|
|
|
81
|
-
|
|
78
|
+
## Tested Hardware + Model
|
|
79
|
+
|
|
80
|
+
| Component | Spec |
|
|
81
|
+
|-----------|------|
|
|
82
|
+
| GPUs | 2x NVIDIA RTX 4060 Ti 16GB |
|
|
83
|
+
| Model | [Gemma-4-26B-A4B-it-AWQ-4bit](https://huggingface.co/casperhansen/gemma-4-26b-a4b-it-AWQ-4bit) |
|
|
84
|
+
| Serving | vLLM (Docker image `vllm/vllm-openai:gemma4`) |
|
|
85
|
+
| Performance | ~70 tok/s, 131K context, 0% timeouts |
|
|
86
|
+
| Active params | 4B per token (MoE architecture — fast inference) |
|
|
87
|
+
|
|
88
|
+
### Install the model
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# Download the model weights (requires HuggingFace access)
|
|
92
|
+
pip install huggingface-hub
|
|
93
|
+
huggingface-cli download casperhansen/gemma-4-26b-a4b-it-AWQ-4bit \
|
|
94
|
+
--local-dir /path/to/models/Gemma-4-26B-A4B-it-AWQ-4bit
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Start vLLM
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
docker run -d \
|
|
101
|
+
--gpus all \
|
|
102
|
+
--name gemma4 \
|
|
103
|
+
-p 8000:8000 \
|
|
104
|
+
-v /path/to/models:/models \
|
|
105
|
+
--ipc=host \
|
|
106
|
+
vllm/vllm-openai:gemma4 \
|
|
107
|
+
--model /models/Gemma-4-26B-A4B-it-AWQ-4bit \
|
|
108
|
+
--quantization compressed-tensors \
|
|
109
|
+
--tensor-parallel-size 2 \
|
|
110
|
+
--max-model-len 131072 \
|
|
111
|
+
--max-num-seqs 2 \
|
|
112
|
+
--gpu-memory-utilization 0.95 \
|
|
113
|
+
--kv-cache-dtype fp8 \
|
|
114
|
+
--served-model-name gemma4 \
|
|
115
|
+
--trust-remote-code \
|
|
116
|
+
--tool-call-parser gemma4 \
|
|
117
|
+
--enable-auto-tool-choice \
|
|
118
|
+
--attention-backend TRITON_ATTN
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Key flags:
|
|
122
|
+
- `--tensor-parallel-size 2` — split across 2 GPUs
|
|
123
|
+
- `--kv-cache-dtype fp8` — reduce KV cache memory for longer contexts
|
|
124
|
+
- `--tool-call-parser gemma4` + `--enable-auto-tool-choice` — required for Gemma 4 tool calling
|
|
125
|
+
- `--max-num-seqs 2` — limit concurrent requests (prevents OOM on 16GB GPUs)
|
|
126
|
+
|
|
127
|
+
Verify the model is running:
|
|
128
|
+
```bash
|
|
129
|
+
curl http://localhost:8000/v1/models
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Configure DryDock
|
|
133
|
+
|
|
134
|
+
```toml
|
|
135
|
+
# ~/.drydock/config.toml
|
|
136
|
+
[models.gemma4]
|
|
137
|
+
name = "gemma4"
|
|
138
|
+
provider = "generic-openai"
|
|
139
|
+
alias = "gemma4"
|
|
140
|
+
temperature = 0.2
|
|
141
|
+
thinking = "high"
|
|
142
|
+
|
|
143
|
+
[providers.generic-openai]
|
|
144
|
+
api_base = "http://localhost:8000/v1"
|
|
145
|
+
api_style = "openai"
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## Install
|
|
82
149
|
|
|
83
150
|
```bash
|
|
84
151
|
pip install drydock-cli
|
|
85
152
|
```
|
|
86
153
|
|
|
87
154
|
Or with uv:
|
|
88
|
-
|
|
89
155
|
```bash
|
|
90
156
|
uv tool install drydock-cli
|
|
91
157
|
```
|
|
92
158
|
|
|
159
|
+
## Quick Start
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
cd your-project/
|
|
163
|
+
drydock
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
First run creates a config at `~/.drydock/config.toml` and prompts for your provider setup.
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
> Review the PRD and build the package
|
|
170
|
+
```
|
|
171
|
+
|
|
93
172
|
## Features
|
|
94
173
|
|
|
95
|
-
- **
|
|
96
|
-
- **
|
|
97
|
-
- **
|
|
174
|
+
- **TUI Interface**: Full terminal UI with streaming output, tool approval, and session management.
|
|
175
|
+
- **Adaptive Thinking**: Automatically adjusts reasoning depth per turn — full thinking for planning, fast mode for file writes.
|
|
176
|
+
- **Powerful Toolset**: Read, write, and patch files. Execute shell commands. Search code with `grep`. Delegate to subagents.
|
|
177
|
+
- **Project-Aware**: Scans project structure, loads `AGENTS.md` / `DRYDOCK.md` for context.
|
|
178
|
+
- **Subagent Delegation**: Large tasks can be delegated to builder/planner/explorer subagents with isolated context.
|
|
179
|
+
- **Loop Detection**: Advisory-only detection that nudges the model away from repetitive actions without blocking.
|
|
98
180
|
- **Conda/Pip Support**: Auto-approves `pip install`, `conda install`, `pytest`, and other dev commands.
|
|
99
181
|
- **Bundled Skills**: Ships with skills like `create-presentation` for PowerPoint generation.
|
|
100
182
|
- **MCP Support**: Connect Model Context Protocol servers for extended capabilities.
|
|
@@ -111,21 +193,16 @@ uv tool install drydock-cli
|
|
|
111
193
|
drydock --agent plan
|
|
112
194
|
```
|
|
113
195
|
|
|
114
|
-
|
|
196
|
+
### Gemma 4 Optimizations
|
|
115
197
|
|
|
116
|
-
|
|
198
|
+
DryDock includes several optimizations specifically tuned for Gemma 4:
|
|
117
199
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
3. Start chatting:
|
|
125
|
-
|
|
126
|
-
```
|
|
127
|
-
> Can you find all TODO comments in this project?
|
|
128
|
-
```
|
|
200
|
+
- **Simplified prompt** (`gemma4.md`): 20-line system prompt instead of 125 lines. Complex prompts cause Gemma 4 to plan instead of act.
|
|
201
|
+
- **Non-streaming mode**: Streaming breaks Gemma 4 tool call JSON parsing. DryDock automatically disables streaming for Gemma 4.
|
|
202
|
+
- **Thinking token filtering**: Gemma 4 leaks `<|channel>thought<channel|>` tokens into text output. DryDock strips these before storing in context.
|
|
203
|
+
- **Adaptive thinking**: Full thinking for planning (turn 1) and error recovery. Thinking OFF for routine file writes — eliminates 30-120s hangs between files.
|
|
204
|
+
- **search_replace resilience**: Auto-detects already-applied edits, infers missing file paths, fuzzy-matches whitespace differences.
|
|
205
|
+
- **Reduced tool set**: Disables tools that confuse Gemma 4 (`ask_user_question`, `task_create`, etc.).
|
|
129
206
|
|
|
130
207
|
## Usage
|
|
131
208
|
|
|
@@ -153,10 +230,6 @@ drydock --prompt "Analyze the codebase" --max-turns 5 --output json
|
|
|
153
230
|
drydock --dangerously-skip-permissions -p "Fix all lint errors"
|
|
154
231
|
```
|
|
155
232
|
|
|
156
|
-
### Trust Folder System
|
|
157
|
-
|
|
158
|
-
DryDock includes a trust folder system. When you run DryDock in a directory with a `.drydock` folder, it asks you to confirm trust. Managed via `~/.drydock/trusted_folders.toml`.
|
|
159
|
-
|
|
160
233
|
## Configuration
|
|
161
234
|
|
|
162
235
|
DryDock is configured via `config.toml`. It looks first in `./.drydock/config.toml`, then `~/.drydock/config.toml`.
|
|
@@ -175,11 +248,10 @@ Keys are saved to `~/.drydock/.env`.
|
|
|
175
248
|
Set a smarter model for the `/consult` command:
|
|
176
249
|
|
|
177
250
|
```toml
|
|
178
|
-
# In ~/.drydock/config.toml
|
|
179
251
|
consultant_model = "gemini-2.5-pro"
|
|
180
252
|
```
|
|
181
253
|
|
|
182
|
-
The consultant provides read-only advice — it never calls tools. Use `/consult <question>` to ask it.
|
|
254
|
+
The consultant provides read-only advice — it never calls tools. Use `/consult <question>` to ask it.
|
|
183
255
|
|
|
184
256
|
### Custom Agents
|
|
185
257
|
|
|
@@ -192,18 +264,6 @@ system_prompt_id = "redteam"
|
|
|
192
264
|
disabled_tools = ["search_replace", "write_file"]
|
|
193
265
|
```
|
|
194
266
|
|
|
195
|
-
```bash
|
|
196
|
-
drydock --agent redteam
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
### Custom Prompts
|
|
200
|
-
|
|
201
|
-
Create markdown files in `~/.drydock/prompts/`:
|
|
202
|
-
|
|
203
|
-
```toml
|
|
204
|
-
system_prompt_id = "my_custom_prompt"
|
|
205
|
-
```
|
|
206
|
-
|
|
207
267
|
### Skills
|
|
208
268
|
|
|
209
269
|
DryDock discovers skills from:
|
|
@@ -222,13 +282,27 @@ command = "uvx"
|
|
|
222
282
|
args = ["mcp-server-fetch"]
|
|
223
283
|
```
|
|
224
284
|
|
|
225
|
-
|
|
285
|
+
## Testing
|
|
286
|
+
|
|
287
|
+
DryDock uses a **shakedown harness** (`scripts/shakedown.py`) that drives the real TUI via pexpect and judges on user-perceptible criteria — not tool-call counts.
|
|
226
288
|
|
|
227
289
|
```bash
|
|
228
|
-
|
|
290
|
+
# Single project test
|
|
291
|
+
python3 scripts/shakedown.py \
|
|
292
|
+
--cwd /path/to/project \
|
|
293
|
+
--prompt "review the PRD and build the package" \
|
|
294
|
+
--pkg package_name
|
|
295
|
+
|
|
296
|
+
# Interactive back-and-forth test
|
|
297
|
+
python3 scripts/shakedown_interactive.py \
|
|
298
|
+
--cwd /path/to/project \
|
|
299
|
+
--pkg package_name
|
|
300
|
+
|
|
301
|
+
# Full regression suite (370 PRDs)
|
|
302
|
+
bash scripts/shakedown_suite.sh
|
|
229
303
|
```
|
|
230
304
|
|
|
231
|
-
|
|
305
|
+
Pass criteria: no write loops, no ignored interrupts, no search_replace cascades, package executes, session finishes within time budget.
|
|
232
306
|
|
|
233
307
|
## Slash Commands
|
|
234
308
|
|
|
@@ -242,12 +316,6 @@ drydock --resume abc123 # Resume specific session
|
|
|
242
316
|
drydock --workdir /path/to/dir # Set working directory
|
|
243
317
|
```
|
|
244
318
|
|
|
245
|
-
## Resources
|
|
246
|
-
|
|
247
|
-
- [CHANGELOG](CHANGELOG.md)
|
|
248
|
-
- [CONTRIBUTING](CONTRIBUTING.md)
|
|
249
|
-
- [ACP Setup](docs/acp-setup.md) — Editor/IDE integration
|
|
250
|
-
|
|
251
319
|
## License
|
|
252
320
|
|
|
253
321
|
Copyright 2025 Mistral AI (original work)
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
# DryDock
|
|
2
|
+
|
|
3
|
+
[](https://www.python.org/downloads/release/python-3120/)
|
|
4
|
+
[](https://github.com/fbobe321/drydock/blob/main/LICENSE)
|
|
5
|
+
|
|
6
|
+
```
|
|
7
|
+
____ _ _
|
|
8
|
+
| _ \ _ __ _ _ __| | ___ ___ | | __
|
|
9
|
+
| | | | '__| | | |/ _` |/ _ \ / __|| |/ /
|
|
10
|
+
| |_| | | | |_| | (_| | (_) | (__ | <
|
|
11
|
+
|____/|_| \__, |\__,_|\___/ \___||_|\_\
|
|
12
|
+
|___/
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
**Local-first CLI coding agent. Chart your course. Execute with precision.**
|
|
16
|
+
|
|
17
|
+
DryDock is a TUI coding assistant designed to work with **local LLMs**. It provides a conversational interface to your codebase — explore, modify, build, and test projects through natural language and a powerful set of tools.
|
|
18
|
+
|
|
19
|
+
> [!IMPORTANT]
|
|
20
|
+
> DryDock is tested and optimized for **Gemma 4 26B-A4B** (26B MoE, 4B active parameters) served via vLLM. Other models and providers are supported (Mistral, OpenAI, Anthropic, Ollama) but are not as thoroughly tested. If you use a different model, expect to tune prompts and tool settings.
|
|
21
|
+
|
|
22
|
+
## Tested Hardware + Model
|
|
23
|
+
|
|
24
|
+
| Component | Spec |
|
|
25
|
+
|-----------|------|
|
|
26
|
+
| GPUs | 2x NVIDIA RTX 4060 Ti 16GB |
|
|
27
|
+
| Model | [Gemma-4-26B-A4B-it-AWQ-4bit](https://huggingface.co/casperhansen/gemma-4-26b-a4b-it-AWQ-4bit) |
|
|
28
|
+
| Serving | vLLM (Docker image `vllm/vllm-openai:gemma4`) |
|
|
29
|
+
| Performance | ~70 tok/s, 131K context, 0% timeouts |
|
|
30
|
+
| Active params | 4B per token (MoE architecture — fast inference) |
|
|
31
|
+
|
|
32
|
+
### Install the model
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# Download the model weights (requires HuggingFace access)
|
|
36
|
+
pip install huggingface-hub
|
|
37
|
+
huggingface-cli download casperhansen/gemma-4-26b-a4b-it-AWQ-4bit \
|
|
38
|
+
--local-dir /path/to/models/Gemma-4-26B-A4B-it-AWQ-4bit
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Start vLLM
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
docker run -d \
|
|
45
|
+
--gpus all \
|
|
46
|
+
--name gemma4 \
|
|
47
|
+
-p 8000:8000 \
|
|
48
|
+
-v /path/to/models:/models \
|
|
49
|
+
--ipc=host \
|
|
50
|
+
vllm/vllm-openai:gemma4 \
|
|
51
|
+
--model /models/Gemma-4-26B-A4B-it-AWQ-4bit \
|
|
52
|
+
--quantization compressed-tensors \
|
|
53
|
+
--tensor-parallel-size 2 \
|
|
54
|
+
--max-model-len 131072 \
|
|
55
|
+
--max-num-seqs 2 \
|
|
56
|
+
--gpu-memory-utilization 0.95 \
|
|
57
|
+
--kv-cache-dtype fp8 \
|
|
58
|
+
--served-model-name gemma4 \
|
|
59
|
+
--trust-remote-code \
|
|
60
|
+
--tool-call-parser gemma4 \
|
|
61
|
+
--enable-auto-tool-choice \
|
|
62
|
+
--attention-backend TRITON_ATTN
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Key flags:
|
|
66
|
+
- `--tensor-parallel-size 2` — split across 2 GPUs
|
|
67
|
+
- `--kv-cache-dtype fp8` — reduce KV cache memory for longer contexts
|
|
68
|
+
- `--tool-call-parser gemma4` + `--enable-auto-tool-choice` — required for Gemma 4 tool calling
|
|
69
|
+
- `--max-num-seqs 2` — limit concurrent requests (prevents OOM on 16GB GPUs)
|
|
70
|
+
|
|
71
|
+
Verify the model is running:
|
|
72
|
+
```bash
|
|
73
|
+
curl http://localhost:8000/v1/models
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Configure DryDock
|
|
77
|
+
|
|
78
|
+
```toml
|
|
79
|
+
# ~/.drydock/config.toml
|
|
80
|
+
[models.gemma4]
|
|
81
|
+
name = "gemma4"
|
|
82
|
+
provider = "generic-openai"
|
|
83
|
+
alias = "gemma4"
|
|
84
|
+
temperature = 0.2
|
|
85
|
+
thinking = "high"
|
|
86
|
+
|
|
87
|
+
[providers.generic-openai]
|
|
88
|
+
api_base = "http://localhost:8000/v1"
|
|
89
|
+
api_style = "openai"
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Install
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
pip install drydock-cli
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Or with uv:
|
|
99
|
+
```bash
|
|
100
|
+
uv tool install drydock-cli
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Quick Start
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
cd your-project/
|
|
107
|
+
drydock
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
First run creates a config at `~/.drydock/config.toml` and prompts for your provider setup.
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
> Review the PRD and build the package
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Features
|
|
117
|
+
|
|
118
|
+
- **TUI Interface**: Full terminal UI with streaming output, tool approval, and session management.
|
|
119
|
+
- **Adaptive Thinking**: Automatically adjusts reasoning depth per turn — full thinking for planning, fast mode for file writes.
|
|
120
|
+
- **Powerful Toolset**: Read, write, and patch files. Execute shell commands. Search code with `grep`. Delegate to subagents.
|
|
121
|
+
- **Project-Aware**: Scans project structure, loads `AGENTS.md` / `DRYDOCK.md` for context.
|
|
122
|
+
- **Subagent Delegation**: Large tasks can be delegated to builder/planner/explorer subagents with isolated context.
|
|
123
|
+
- **Loop Detection**: Advisory-only detection that nudges the model away from repetitive actions without blocking.
|
|
124
|
+
- **Conda/Pip Support**: Auto-approves `pip install`, `conda install`, `pytest`, and other dev commands.
|
|
125
|
+
- **Bundled Skills**: Ships with skills like `create-presentation` for PowerPoint generation.
|
|
126
|
+
- **MCP Support**: Connect Model Context Protocol servers for extended capabilities.
|
|
127
|
+
- **Safety First**: Tool execution approval with `--dangerously-skip-permissions` for full auto-approve.
|
|
128
|
+
|
|
129
|
+
### Built-in Agents
|
|
130
|
+
|
|
131
|
+
- **`default`**: Standard agent that requires approval for tool executions.
|
|
132
|
+
- **`plan`**: Read-only agent for exploration and planning.
|
|
133
|
+
- **`accept-edits`**: Auto-approves file edits only.
|
|
134
|
+
- **`auto-approve`**: Auto-approves all tool executions.
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
drydock --agent plan
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Gemma 4 Optimizations
|
|
141
|
+
|
|
142
|
+
DryDock includes several optimizations specifically tuned for Gemma 4:
|
|
143
|
+
|
|
144
|
+
- **Simplified prompt** (`gemma4.md`): 20-line system prompt instead of 125 lines. Complex prompts cause Gemma 4 to plan instead of act.
|
|
145
|
+
- **Non-streaming mode**: Streaming breaks Gemma 4 tool call JSON parsing. DryDock automatically disables streaming for Gemma 4.
|
|
146
|
+
- **Thinking token filtering**: Gemma 4 leaks `<|channel>thought<channel|>` tokens into text output. DryDock strips these before storing in context.
|
|
147
|
+
- **Adaptive thinking**: Full thinking for planning (turn 1) and error recovery. Thinking OFF for routine file writes — eliminates 30-120s hangs between files.
|
|
148
|
+
- **search_replace resilience**: Auto-detects already-applied edits, infers missing file paths, fuzzy-matches whitespace differences.
|
|
149
|
+
- **Reduced tool set**: Disables tools that confuse Gemma 4 (`ask_user_question`, `task_create`, etc.).
|
|
150
|
+
|
|
151
|
+
## Usage
|
|
152
|
+
|
|
153
|
+
### Interactive Mode
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
drydock # Start interactive session
|
|
157
|
+
drydock "Fix the login bug" # Start with a prompt
|
|
158
|
+
drydock --continue # Resume last session
|
|
159
|
+
drydock --resume abc123 # Resume specific session
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**Keyboard shortcuts:**
|
|
163
|
+
- `Ctrl+C` — Cancel current operation (double-tap to quit)
|
|
164
|
+
- `Shift+Tab` — Toggle auto-approve mode
|
|
165
|
+
- `Ctrl+O` — Toggle tool output
|
|
166
|
+
- `Ctrl+G` — Open external editor
|
|
167
|
+
- `@` — File path autocompletion
|
|
168
|
+
- `!command` — Run shell command directly
|
|
169
|
+
|
|
170
|
+
### Programmatic Mode
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
drydock --prompt "Analyze the codebase" --max-turns 5 --output json
|
|
174
|
+
drydock --dangerously-skip-permissions -p "Fix all lint errors"
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Configuration
|
|
178
|
+
|
|
179
|
+
DryDock is configured via `config.toml`. It looks first in `./.drydock/config.toml`, then `~/.drydock/config.toml`.
|
|
180
|
+
|
|
181
|
+
### API Key
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
drydock --setup # Interactive setup
|
|
185
|
+
export MISTRAL_API_KEY="your_key" # Or set env var
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
Keys are saved to `~/.drydock/.env`.
|
|
189
|
+
|
|
190
|
+
### Consultant Model
|
|
191
|
+
|
|
192
|
+
Set a smarter model for the `/consult` command:
|
|
193
|
+
|
|
194
|
+
```toml
|
|
195
|
+
consultant_model = "gemini-2.5-pro"
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
The consultant provides read-only advice — it never calls tools. Use `/consult <question>` to ask it.
|
|
199
|
+
|
|
200
|
+
### Custom Agents
|
|
201
|
+
|
|
202
|
+
Create agent configs in `~/.drydock/agents/`:
|
|
203
|
+
|
|
204
|
+
```toml
|
|
205
|
+
# ~/.drydock/agents/redteam.toml
|
|
206
|
+
active_model = "devstral-2"
|
|
207
|
+
system_prompt_id = "redteam"
|
|
208
|
+
disabled_tools = ["search_replace", "write_file"]
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Skills
|
|
212
|
+
|
|
213
|
+
DryDock discovers skills from:
|
|
214
|
+
1. Custom paths in `config.toml` via `skill_paths`
|
|
215
|
+
2. Project `.drydock/skills/` or `.agents/skills/`
|
|
216
|
+
3. Global `~/.drydock/skills/`
|
|
217
|
+
4. Bundled skills (shipped with the package)
|
|
218
|
+
|
|
219
|
+
### MCP Servers
|
|
220
|
+
|
|
221
|
+
```toml
|
|
222
|
+
[[mcp_servers]]
|
|
223
|
+
name = "fetch_server"
|
|
224
|
+
transport = "stdio"
|
|
225
|
+
command = "uvx"
|
|
226
|
+
args = ["mcp-server-fetch"]
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Testing
|
|
230
|
+
|
|
231
|
+
DryDock uses a **shakedown harness** (`scripts/shakedown.py`) that drives the real TUI via pexpect and judges on user-perceptible criteria — not tool-call counts.
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
# Single project test
|
|
235
|
+
python3 scripts/shakedown.py \
|
|
236
|
+
--cwd /path/to/project \
|
|
237
|
+
--prompt "review the PRD and build the package" \
|
|
238
|
+
--pkg package_name
|
|
239
|
+
|
|
240
|
+
# Interactive back-and-forth test
|
|
241
|
+
python3 scripts/shakedown_interactive.py \
|
|
242
|
+
--cwd /path/to/project \
|
|
243
|
+
--pkg package_name
|
|
244
|
+
|
|
245
|
+
# Full regression suite (370 PRDs)
|
|
246
|
+
bash scripts/shakedown_suite.sh
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Pass criteria: no write loops, no ignored interrupts, no search_replace cascades, package executes, session finishes within time budget.
|
|
250
|
+
|
|
251
|
+
## Slash Commands
|
|
252
|
+
|
|
253
|
+
Type `/help` in the input for available commands. Create custom slash commands via the skills system.
|
|
254
|
+
|
|
255
|
+
## Session Management
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
drydock --continue # Continue last session
|
|
259
|
+
drydock --resume abc123 # Resume specific session
|
|
260
|
+
drydock --workdir /path/to/dir # Set working directory
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## License
|
|
264
|
+
|
|
265
|
+
Copyright 2025 Mistral AI (original work)
|
|
266
|
+
Copyright 2026 DryDock contributors (modifications)
|
|
267
|
+
|
|
268
|
+
Licensed under the Apache License, Version 2.0. See [LICENSE](LICENSE) for details.
|
|
269
|
+
|
|
270
|
+
DryDock is a fork of [mistralai/mistral-vibe](https://github.com/mistralai/mistral-vibe) (Apache 2.0). See [NOTICE](NOTICE) for attribution.
|
|
@@ -1420,6 +1420,56 @@ class AgentLoop:
|
|
|
1420
1420
|
if self.messages and self.messages[-1].role == Role.assistant:
|
|
1421
1421
|
self.messages.append(LLMMessage(role=Role.user, content="Continue."))
|
|
1422
1422
|
|
|
1423
|
+
def _choose_thinking_level(self, active_model: Any) -> str:
|
|
1424
|
+
"""Adapt thinking level based on conversation state.
|
|
1425
|
+
|
|
1426
|
+
Thinking is expensive for Gemma 4 (~70 tok/s). Using "high" on
|
|
1427
|
+
every turn causes 30-120s hangs between file writes. Instead:
|
|
1428
|
+
|
|
1429
|
+
HIGH — first response, user messages, planning/complex decisions
|
|
1430
|
+
LOW — after tool errors (debug, but keep it brief)
|
|
1431
|
+
OFF — after successful tool results, system notes (just act)
|
|
1432
|
+
"""
|
|
1433
|
+
base = active_model.thinking
|
|
1434
|
+
if base in ("off", ""):
|
|
1435
|
+
return base # thinking disabled entirely — respect that
|
|
1436
|
+
|
|
1437
|
+
# Only adapt for local models where thinking is slow
|
|
1438
|
+
if "gemma" not in active_model.name.lower():
|
|
1439
|
+
return base
|
|
1440
|
+
|
|
1441
|
+
# Early conversation (first few turns): full thinking for planning
|
|
1442
|
+
# The model needs to understand the task and make a plan.
|
|
1443
|
+
if len(self.messages) <= 4:
|
|
1444
|
+
return base
|
|
1445
|
+
|
|
1446
|
+
# Look at the last message to decide
|
|
1447
|
+
last = self.messages[-1] if self.messages else None
|
|
1448
|
+
if last is None:
|
|
1449
|
+
return base
|
|
1450
|
+
|
|
1451
|
+
if last.role == Role.user:
|
|
1452
|
+
content = str(last.content or "")
|
|
1453
|
+
# System note / loop nudge → act immediately
|
|
1454
|
+
if "[SYSTEM" in content:
|
|
1455
|
+
return "off"
|
|
1456
|
+
# Real user message → full thinking (they're asking something new)
|
|
1457
|
+
return base
|
|
1458
|
+
|
|
1459
|
+
if last.role == Role.tool:
|
|
1460
|
+
content = str(last.content or "")
|
|
1461
|
+
# Tool error → think about the fix (but not too long)
|
|
1462
|
+
if "<tool_error>" in content or "error" in content.lower()[:100]:
|
|
1463
|
+
return "low"
|
|
1464
|
+
# read_file result → might need to reason about the code
|
|
1465
|
+
if "content:" in content[:50] and len(content) > 500:
|
|
1466
|
+
return "low"
|
|
1467
|
+
# Successful write/bash → just keep going
|
|
1468
|
+
return "off"
|
|
1469
|
+
|
|
1470
|
+
# Default: configured level
|
|
1471
|
+
return base
|
|
1472
|
+
|
|
1423
1473
|
async def _chat(self, max_tokens: int | None = None) -> LLMChunk:
|
|
1424
1474
|
_t0 = time.perf_counter()
|
|
1425
1475
|
self._sanitize_message_ordering()
|
|
@@ -1439,16 +1489,20 @@ class AgentLoop:
|
|
|
1439
1489
|
_t1 - _t0, _t2 - _t1, n_msgs, n_tools,
|
|
1440
1490
|
)
|
|
1441
1491
|
|
|
1492
|
+
# Adaptive thinking: reduce thinking on routine turns
|
|
1493
|
+
original_thinking = active_model.thinking
|
|
1494
|
+
active_model.thinking = self._choose_thinking_level(active_model)
|
|
1495
|
+
if active_model.thinking != original_thinking:
|
|
1496
|
+
logger.info(
|
|
1497
|
+
"[THINKING] %s → %s (last msg role=%s)",
|
|
1498
|
+
original_thinking, active_model.thinking,
|
|
1499
|
+
self.messages[-1].role if self.messages else "?",
|
|
1500
|
+
)
|
|
1501
|
+
|
|
1442
1502
|
try:
|
|
1443
1503
|
start_time = time.perf_counter()
|
|
1444
1504
|
# Use temperature override if set (loop detection bumps it)
|
|
1445
1505
|
temp = active_model.temperature
|
|
1446
|
-
# Cap max_tokens for Gemma 4 to prevent infinite thinking loops.
|
|
1447
|
-
# Without a cap, the model can generate 100K+ thinking tokens
|
|
1448
|
-
# (filling the 131K context), hanging for 20+ minutes per turn.
|
|
1449
|
-
effective_max_tokens = max_tokens
|
|
1450
|
-
if effective_max_tokens is None and "gemma" in active_model.name.lower():
|
|
1451
|
-
effective_max_tokens = 8192
|
|
1452
1506
|
result = await self.backend.complete(
|
|
1453
1507
|
model=active_model,
|
|
1454
1508
|
messages=self.messages,
|
|
@@ -1456,7 +1510,7 @@ class AgentLoop:
|
|
|
1456
1510
|
tools=available_tools,
|
|
1457
1511
|
tool_choice=tool_choice,
|
|
1458
1512
|
extra_headers=self._get_extra_headers(provider),
|
|
1459
|
-
max_tokens=
|
|
1513
|
+
max_tokens=max_tokens,
|
|
1460
1514
|
metadata=self.entrypoint_metadata.model_dump()
|
|
1461
1515
|
if self.entrypoint_metadata
|
|
1462
1516
|
else None,
|
|
@@ -1488,6 +1542,9 @@ class AgentLoop:
|
|
|
1488
1542
|
raise RuntimeError(
|
|
1489
1543
|
f"API error from {provider.name} (model: {active_model.name}): {e}"
|
|
1490
1544
|
) from e
|
|
1545
|
+
finally:
|
|
1546
|
+
# Restore thinking level so the config stays clean
|
|
1547
|
+
active_model.thinking = original_thinking
|
|
1491
1548
|
|
|
1492
1549
|
async def _chat_streaming(
|
|
1493
1550
|
self, max_tokens: int | None = None
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "drydock-cli"
|
|
3
|
-
version = "2.6.
|
|
4
|
-
description = "
|
|
3
|
+
version = "2.6.30"
|
|
4
|
+
description = "Local-first CLI coding agent — tested with Gemma 4 26B via vLLM"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
7
7
|
license = { text = "Apache-2.0" }
|
|
@@ -11,9 +11,12 @@ keywords = [
|
|
|
11
11
|
"cli",
|
|
12
12
|
"coding-assistant",
|
|
13
13
|
"drydock",
|
|
14
|
-
"nautical",
|
|
15
14
|
"llm",
|
|
16
15
|
"developer-tools",
|
|
16
|
+
"gemma",
|
|
17
|
+
"vllm",
|
|
18
|
+
"local-llm",
|
|
19
|
+
"tui",
|
|
17
20
|
]
|
|
18
21
|
classifiers = [
|
|
19
22
|
"Development Status :: 5 - Production/Stable",
|