drydock-cli 2.6.25__tar.gz → 2.6.27__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.27/.auto_release.lock +1 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/CLAUDE.md +13 -13
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/PKG-INFO +1 -1
- drydock_cli-2.6.27/PRD.md +216 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/agent_loop.py +27 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/agents/models.py +30 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/config/_settings.py +8 -0
- drydock_cli-2.6.27/drydock/core/prompts/builder.md +45 -0
- drydock_cli-2.6.27/drydock/core/prompts/gemma4.md +64 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/system_prompt.py +22 -14
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/task.py +15 -2
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/pyproject.toml +1 -1
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/auto_release.sh +35 -14
- drydock_cli-2.6.25/scripts/user_pain_test.py → drydock_cli-2.6.27/scripts/shakedown.py +173 -41
- drydock_cli-2.6.27/scripts/shakedown_regression.sh +136 -0
- drydock_cli-2.6.25/scripts/run_pain_suite.sh → drydock_cli-2.6.27/scripts/shakedown_suite.sh +3 -3
- drydock_cli-2.6.27/scripts/shakedown_variance.sh +56 -0
- drydock_cli-2.6.25/.auto_release.lock +0 -1
- drydock_cli-2.6.25/PRD.md +0 -81
- drydock_cli-2.6.25/drydock/core/prompts/builder.md +0 -16
- drydock_cli-2.6.25/drydock/core/prompts/gemma4.md +0 -30
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/.gitignore +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/.python-version +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/.typos.toml +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/.vscode/extensions.json +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/.vscode/launch.json +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/.vscode/settings.json +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/AGENTS.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/CHANGELOG.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/Drydock_rebrand.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/LICENSE +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/NOTICE +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/README.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/action.yml +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/docs/README.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/docs/acp-setup.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/logger.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/slug.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/types.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/core/utils.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock/whats_new.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock-acp.spec +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/drydock_terms.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/flake.lock +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/flake.nix +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/log_analyzer/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/log_analyzer/__main__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/log_analyzer/analyzer.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/log_analyzer/cli.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/README.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/auto_test_loop.sh +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/backup.sh +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/bump_version.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/discover_cli_tools.sh +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/install.sh +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/llm_balancer.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/monitor_swebench.sh +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/monitor_test_battery.sh +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/notify_release.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/overnight_agents_test.sh +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/prepare_release.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/test_bank.sh +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/test_full.sh +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/test_smoke.sh +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/test_tui_path.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/tui_test.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/scripts/vllm_failover.sh +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/conftest.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/e2e/common.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/mock/utils.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/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.25 → drydock_cli-2.6.27}/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.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_agents.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_integration.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_message_id.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_middleware.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_smoke.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/test_workloads.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.6.25 → drydock_cli-2.6.27}/uv.lock +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
306344
|
|
@@ -9,8 +9,8 @@ Drydock is a local CLI coding agent (fork of mistral-vibe, Apache 2.0).
|
|
|
9
9
|
- **Hardware:** 2x RTX 4060 Ti 16GB, Gemma 4 26B MoE (A4B) via vLLM Docker at localhost:8000
|
|
10
10
|
- **Server:** remus (Ubuntu 22.04, user: bobef)
|
|
11
11
|
- **Active model:** Gemma 4 26B-A4B-it-AWQ-4bit (only 4B active params, ~70 tok/s)
|
|
12
|
-
- **The honest test:** `scripts/
|
|
13
|
-
user-perceptible behaviour, not tool-call counts. See `scripts/
|
|
12
|
+
- **The honest test:** `scripts/shakedown.py` shakedown harness — pass means real
|
|
13
|
+
user-perceptible behaviour, not tool-call counts. See `scripts/shakedown_suite.sh`
|
|
14
14
|
for the 10-project core set.
|
|
15
15
|
- **OLD harnesses you should NOT trust:** `scripts/tui_test.py` and
|
|
16
16
|
`core_tests_real.sh` count tool calls and `--help` and miss the things users
|
|
@@ -261,11 +261,11 @@ v3 is a from-scratch rewrite using nano-claude-code as foundation. 4 core files,
|
|
|
261
261
|
- ✅ Docker-based model serving (vLLM + Gemma 4)
|
|
262
262
|
- ✅ Multi-backend SWE-bench harness (v2/devstral + v3/gemma4)
|
|
263
263
|
- ✅ Thinking token filtering (Gemma 4 `<|channel>` leak)
|
|
264
|
-
- ✅ **
|
|
264
|
+
- ✅ **Shakedown harness** (`scripts/shakedown.py`) — drives real TUI
|
|
265
265
|
via pexpect, watches live session log, types `STOP` interrupts,
|
|
266
266
|
judges on user-perceptible criteria
|
|
267
|
-
- ✅ **
|
|
268
|
-
projects through the
|
|
267
|
+
- ✅ **Shakedown suite** (`scripts/shakedown_suite.sh`) — 10 core
|
|
268
|
+
projects through the shakedown harness
|
|
269
269
|
- ✅ **`_check_main_module_entry`** in write_file.py — catches
|
|
270
270
|
`__main__.py` files that import `main` but never call it (the codec
|
|
271
271
|
silent-exit bug)
|
|
@@ -286,7 +286,7 @@ v3 is a from-scratch rewrite using nano-claude-code as foundation. 4 core files,
|
|
|
286
286
|
- ✅ **`_task_manager.py` rename** — TaskCreate/Update/List were
|
|
287
287
|
duplicates of the `todo` tool that confused Gemma 4 into hanging.
|
|
288
288
|
Underscore prefix excludes them from tool discovery
|
|
289
|
-
- ✅ **Trust dialog auto-dismissal** in
|
|
289
|
+
- ✅ **Trust dialog auto-dismissal** in shakedown.py
|
|
290
290
|
- ✅ **Pause flags** for both `auto_release.sh` and `watchdog.sh` so
|
|
291
291
|
manual debugging doesn't get its work overwritten
|
|
292
292
|
|
|
@@ -301,7 +301,7 @@ v3 is a from-scratch rewrite using nano-claude-code as foundation. 4 core files,
|
|
|
301
301
|
loop, hang, and produce broken code. The harnesses were structurally
|
|
302
302
|
incapable of catching what users experience because they measure
|
|
303
303
|
tool-call counts and `--help` exit codes, not progress. Build pass
|
|
304
|
-
criteria around user-perceptible state instead. See `
|
|
304
|
+
criteria around user-perceptible state instead. See `shakedown.py`.
|
|
305
305
|
2. **Gemma 4 ignores advisory nudges.** The model received the dedup
|
|
306
306
|
message ("File already has this exact content. Move to the NEXT file."),
|
|
307
307
|
the loop-detection system note, the missing-import warning, AND a
|
|
@@ -384,9 +384,9 @@ v3 is a from-scratch rewrite using nano-claude-code as foundation. 4 core files,
|
|
|
384
384
|
|
|
385
385
|
## Testing
|
|
386
386
|
|
|
387
|
-
### Use `scripts/
|
|
387
|
+
### Use `scripts/shakedown.py` — anything else lies
|
|
388
388
|
|
|
389
|
-
The `
|
|
389
|
+
The `shakedown.py` harness is the only test infrastructure that catches what
|
|
390
390
|
real users experience. Older harnesses (`tui_test.py`, `core_tests_real.sh`,
|
|
391
391
|
`run_real_tests.sh`) measure tool counts and `--help` exit codes; they pass
|
|
392
392
|
while real users see loops and hangs.
|
|
@@ -416,7 +416,7 @@ while real users see loops and hangs.
|
|
|
416
416
|
**Run a single project:**
|
|
417
417
|
|
|
418
418
|
```bash
|
|
419
|
-
PYTHONUNBUFFERED=1 python3 -u scripts/
|
|
419
|
+
PYTHONUNBUFFERED=1 python3 -u scripts/shakedown.py \
|
|
420
420
|
--cwd /data3/test_drydock \
|
|
421
421
|
--prompt "review the PRD and get started" \
|
|
422
422
|
--pkg doc_qa_system
|
|
@@ -425,7 +425,7 @@ PYTHONUNBUFFERED=1 python3 -u scripts/user_pain_test.py \
|
|
|
425
425
|
**Run the 10-project core suite:**
|
|
426
426
|
|
|
427
427
|
```bash
|
|
428
|
-
bash scripts/
|
|
428
|
+
bash scripts/shakedown_suite.sh
|
|
429
429
|
```
|
|
430
430
|
|
|
431
431
|
**Real-world results from the harness (after recent fixes):**
|
|
@@ -471,7 +471,7 @@ From `/data3/drydock_test_projects/X` it reports the site-packages path.
|
|
|
471
471
|
**Always test imports from a neutral cwd**, OR commit to source AND let
|
|
472
472
|
auto_release rebuild.
|
|
473
473
|
|
|
474
|
-
### Test Levels (kept for reference, but the
|
|
474
|
+
### Test Levels (kept for reference, but the shakedown harness covers all of them)
|
|
475
475
|
1. **Build test (--help):** package runs — MEANINGLESS alone
|
|
476
476
|
2. **Functional test:** PRD test cases verified with correct output — THE REAL TEST
|
|
477
477
|
3. **Acceptance test:** specific expected outputs verified
|
|
@@ -485,7 +485,7 @@ auto_release rebuild.
|
|
|
485
485
|
- The model should be able to answer questions without being forced to edit files
|
|
486
486
|
- **NEVER trust an old harness's pass result.** If `tui_test.py` or
|
|
487
487
|
`core_tests_real.sh` says PASS, run the same project through
|
|
488
|
-
`
|
|
488
|
+
`shakedown.py` to confirm. The old harnesses count `--help` and
|
|
489
489
|
silently miss the things users hate.
|
|
490
490
|
- **Always reset PRDs between runs.** The model edits PRD.md (adds
|
|
491
491
|
"✅ Completed" status tables, chat-style filler) and contaminates
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
# DryDock — Local CLI Coding Agent
|
|
2
|
+
|
|
3
|
+
**Repository:** https://github.com/fbobe321/drydock
|
|
4
|
+
**PyPI:** https://pypi.org/project/drydock-cli/ (v2.6.25)
|
|
5
|
+
**License:** Apache 2.0 (fork of [mistralai/mistral-vibe](https://github.com/mistralai/mistral-vibe))
|
|
6
|
+
|
|
7
|
+
## Vision
|
|
8
|
+
|
|
9
|
+
Best-in-class local coding agent. Build, debug, and ship software using local
|
|
10
|
+
LLMs on consumer hardware — and **prove it actually works** with a test
|
|
11
|
+
harness that drives the real TUI like a real user, not a tool-call counter.
|
|
12
|
+
|
|
13
|
+
## Current Status
|
|
14
|
+
|
|
15
|
+
- **Active model:** Gemma 4 26B-A4B-it-AWQ-4bit (MoE, 4B active params per
|
|
16
|
+
token, ~70 tok/s) via vLLM Docker on 2x RTX 4060 Ti 16GB
|
|
17
|
+
- **Version:** 2.6.25 on PyPI (2.6.26+ in source with `slim_system_prompt`,
|
|
18
|
+
hard-block on duplicate writes, and the new test harness)
|
|
19
|
+
- **Honest test results (10 core PRDs through `shakedown.py`, single run):**
|
|
20
|
+
5/10 PASS without slim_system_prompt + hard block; ≥8/10 expected with
|
|
21
|
+
both fixes deployed (variance run in progress)
|
|
22
|
+
- **Users can:** build projects from PRDs, fix bugs, review code, refactor
|
|
23
|
+
— through the TUI only (headless mode is gone)
|
|
24
|
+
|
|
25
|
+
## How drydock is tested now
|
|
26
|
+
|
|
27
|
+
The `scripts/tui_test.py` and `core_tests_real.sh` harnesses count tool
|
|
28
|
+
calls and `--help` exit codes. They reported 80% pass rates while real
|
|
29
|
+
users saw drydock loop, hang, and produce broken code. **Both are
|
|
30
|
+
deprecated** in favour of `scripts/shakedown.py`, which:
|
|
31
|
+
|
|
32
|
+
- Drives the real `drydock` TUI via pexpect (no headless code paths)
|
|
33
|
+
- Polls the live `~/.vibe/logs/session/session_<id>/messages.jsonl` in
|
|
34
|
+
parallel to see what the model is actually doing
|
|
35
|
+
- Watches for **write loops** (≥3 identical-content writes to a path),
|
|
36
|
+
**hallucinated tool names** that hang the session, **search_replace
|
|
37
|
+
failure cascades**, and **dead silence** (no new messages of any kind
|
|
38
|
+
for 120 seconds)
|
|
39
|
+
- Types simulated `STOP` interrupts when it detects loops and tracks
|
|
40
|
+
whether the model OBEYS them
|
|
41
|
+
- Distinguishes three end-states: active turn, model declared done
|
|
42
|
+
(text response with no tool call), and dead silence
|
|
43
|
+
- Resets the cwd between runs (restores `PRD.md` from `PRD.master.md`,
|
|
44
|
+
wipes the package dir and stale data dirs) so contamination from one
|
|
45
|
+
run can't poison the next
|
|
46
|
+
- Auto-handles the "Trust this folder?" dialog drydock pops on new
|
|
47
|
+
directories
|
|
48
|
+
- **Pass criteria are user-perceptible**: no loops, no ignored
|
|
49
|
+
interrupts, no search_replace cascades, the package must actually
|
|
50
|
+
execute, session must finish under the time budget
|
|
51
|
+
|
|
52
|
+
Run a single project:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
PYTHONUNBUFFERED=1 python3 -u scripts/shakedown.py \
|
|
56
|
+
--cwd /data3/test_drydock \
|
|
57
|
+
--prompt "review the PRD and get started" \
|
|
58
|
+
--pkg doc_qa_system
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Run the 10-project core suite (or 3-run variance suite for stability):
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
bash scripts/shakedown_suite.sh # one run, ~25 min
|
|
65
|
+
bash scripts/shakedown_variance.sh 3 # three runs, ~75 min
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Features
|
|
69
|
+
|
|
70
|
+
### Core
|
|
71
|
+
- 24 builtin tools (bash, grep, read_file, write_file, search_replace,
|
|
72
|
+
glob, todo, ask_user_question, invoke_skill, worktree, etc.)
|
|
73
|
+
- 7 bundled skills (/investigate, /review, /ship, /batch, /simplify,
|
|
74
|
+
/deep-research, /create-presentation)
|
|
75
|
+
- Multi-agent delegation (explore, diagnostic, planner subagents)
|
|
76
|
+
- Plan→Edit workflow (Mistral's designed pattern)
|
|
77
|
+
- AGENTS.md support (cross-tool standard, auto-created — same file works
|
|
78
|
+
with Claude Code, opencode, drydock, Aider)
|
|
79
|
+
- Textual TUI with wave spinner, message queuing
|
|
80
|
+
|
|
81
|
+
### Local Model Support
|
|
82
|
+
- `/setup-model` command (vLLM, Ollama, LM Studio, custom)
|
|
83
|
+
- `--local` CLI flag for quick setup
|
|
84
|
+
- Auto-detect model name from server
|
|
85
|
+
- **`slim_system_prompt`** config knob — drops the ~10K-token inlined
|
|
86
|
+
tool prompt files + skills + subagents lists for local models that
|
|
87
|
+
pay 7-12 ms per prefill token. Verified on Gemma 4: takes
|
|
88
|
+
first-turn latency from 60-120 s to 10-20 s on the dead-silence cases.
|
|
89
|
+
|
|
90
|
+
### Safety (advisory, never blocking — with one narrow exception)
|
|
91
|
+
- Tool permission system (always/ask/never per tool)
|
|
92
|
+
- Loop detection wired into `_handle_tool_response()` — injects an
|
|
93
|
+
advisory nudge when the same tool call repeats, never stops the
|
|
94
|
+
session
|
|
95
|
+
- Three-tier escalating dedup on `write_file`:
|
|
96
|
+
1. First duplicate: friendly "move to next file"
|
|
97
|
+
2. Second duplicate: full directory listing + concrete next-action
|
|
98
|
+
suggestions
|
|
99
|
+
3. **Third duplicate: HARD BLOCK via `ToolError`** — narrow exception
|
|
100
|
+
to the no-blocking rule, only fires when file exists AND content
|
|
101
|
+
is identical AND it's the 3rd attempt. Never blocks legitimate
|
|
102
|
+
retries. After the block, `_prune_duplicate_writes()` removes the
|
|
103
|
+
older no-op write attempts from message history so the next turn
|
|
104
|
+
sees a cleaner context.
|
|
105
|
+
- `_check_main_module_entry()` catches `__main__.py` files that import
|
|
106
|
+
`main` but never call it (the codec silent-exit bug)
|
|
107
|
+
- `_check_missing_sibling_imports()` catches `from .x import Y` when
|
|
108
|
+
`x.py` doesn't exist on disk yet (the minivc unimportable-package bug)
|
|
109
|
+
- `_truncate_old_tool_results()` proactively shrinks stale `read_file`
|
|
110
|
+
outputs in message history before each LLM call (idempotent;
|
|
111
|
+
keeps the last 6 in full)
|
|
112
|
+
- API error auto-recovery (retry after 10s)
|
|
113
|
+
- `auto_release.sh` and `watchdog.sh` cron jobs respect pause flags
|
|
114
|
+
at `.pause_auto_release` and `.pause_watchdog` for manual debugging
|
|
115
|
+
|
|
116
|
+
## Install
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
pip install drydock-cli
|
|
120
|
+
drydock --local http://localhost:8000/v1
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
For Gemma 4 / vLLM users, add this to `~/.drydock/config.toml` to drop
|
|
124
|
+
the system prompt bloat:
|
|
125
|
+
|
|
126
|
+
```toml
|
|
127
|
+
slim_system_prompt = true
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Per-Project Instructions
|
|
131
|
+
|
|
132
|
+
DryDock loads instructions from these files in the project root, in
|
|
133
|
+
order:
|
|
134
|
+
|
|
135
|
+
- **AGENTS.md** — Cross-tool standard (recommended). Same file works
|
|
136
|
+
with Claude Code, opencode, drydock, Aider, and other coding agents.
|
|
137
|
+
- **DRYDOCK.md** — Legacy / drydock-only. Kept for backward compat;
|
|
138
|
+
prefer AGENTS.md for new projects.
|
|
139
|
+
- **.drydock/rules/*.md** — Modular rules
|
|
140
|
+
|
|
141
|
+
Auto-created if none exist. AGENTS.md is essential for devstral
|
|
142
|
+
(it loops without one) but Gemma 4 works without it.
|
|
143
|
+
|
|
144
|
+
## Recent fixes (April 2026)
|
|
145
|
+
|
|
146
|
+
The user-pain debugging arc surfaced a string of issues that the old
|
|
147
|
+
test harnesses couldn't catch. All committed in source and live in
|
|
148
|
+
PyPI v2.6.25 (or queued for v2.6.26):
|
|
149
|
+
|
|
150
|
+
- **Hard-block duplicate writes after 3 attempts** — narrow exception
|
|
151
|
+
to "no blocking" for pure no-op work. Verified: codec went from
|
|
152
|
+
FAIL (4× `__init__.py` loop, ignored STOP interrupt, broken --help)
|
|
153
|
+
→ PASS (131 s, 10 writes, no loops, --help works).
|
|
154
|
+
- **`slim_system_prompt`** — drops the inlined tool prompt files +
|
|
155
|
+
skills + subagents lists from the system prompt (~10K → ~3K tokens
|
|
156
|
+
for Gemma 4). Fixed the dead-silence-on-first-turn issue. Verified:
|
|
157
|
+
todo_list FAIL (0 messages in 121 s) → PASS (38 messages in 115 s).
|
|
158
|
+
- **Trust dialog auto-dismissal in shakedown.py** — drydock pops a
|
|
159
|
+
blocking "Trust this folder?" modal on unfamiliar directories. The
|
|
160
|
+
harness now detects and answers it.
|
|
161
|
+
- **PRD reset between runs** — the model edits PRD.md across sessions
|
|
162
|
+
(adds "✅ Completed" tables, chat-style filler). The harness restores
|
|
163
|
+
from `PRD.master.md` automatically, with the canary fixture at
|
|
164
|
+
`tests/fixtures/doc_qa_system_prd.md`.
|
|
165
|
+
- **`_task_manager.py` rename** — TaskCreate/Update/List were a duplicate
|
|
166
|
+
task system that confused Gemma 4 into hanging. Underscore prefix
|
|
167
|
+
excludes them from tool discovery.
|
|
168
|
+
- **`auto_release.sh` fail-loud on token errors** — the GitHub deploy
|
|
169
|
+
step was using `2>/dev/null` so an expired token silently skipped the
|
|
170
|
+
push. The remote was 287 commits behind for ~2 days before anyone
|
|
171
|
+
noticed.
|
|
172
|
+
- **Loop detection wired up** — `_check_tool_call_repetition()` was
|
|
173
|
+
defined but never actually called from anywhere. Now fires from
|
|
174
|
+
`_handle_tool_response()` and injects an advisory nudge.
|
|
175
|
+
- **`_truncate_old_tool_results()`** — proactive shrinkage of stale
|
|
176
|
+
`read_file` outputs to keep context small as sessions grow.
|
|
177
|
+
|
|
178
|
+
## Roadmap
|
|
179
|
+
|
|
180
|
+
### Near-term
|
|
181
|
+
- Confirm 8-10/10 stable pass rate on the 10-project shakedown suite
|
|
182
|
+
with `slim_system_prompt` + hard block (variance run in progress)
|
|
183
|
+
- Per-model `auto_compact_threshold` (current default of 200K is
|
|
184
|
+
higher than Gemma 4's 131K max context, so it never fires)
|
|
185
|
+
- Streamline the system prompt further: drop the universal sections
|
|
186
|
+
that don't apply to local-model agents
|
|
187
|
+
- Investigate why some test_projects PRDs pass on one run and loop on
|
|
188
|
+
the next — variance is the rule with Gemma 4
|
|
189
|
+
|
|
190
|
+
### Medium-term
|
|
191
|
+
- Per-model knobs: `slim_system_prompt`, `thinking`, tool exclusion
|
|
192
|
+
list, `auto_compact_threshold`
|
|
193
|
+
- A second deployment target so PyPI failures don't lose history
|
|
194
|
+
- Replace the old `tui_test.py` and `core_tests_real.sh` entirely;
|
|
195
|
+
shakedown.py is the only honest test
|
|
196
|
+
- Token cost dashboard so first-turn prefill regressions are caught
|
|
197
|
+
before they hit users
|
|
198
|
+
|
|
199
|
+
### Long-term
|
|
200
|
+
- Support larger models as hardware improves
|
|
201
|
+
- Plugin marketplace for custom tools/skills
|
|
202
|
+
- Web dashboard for monitoring long runs
|
|
203
|
+
- Multi-model routing (different models for different tasks)
|
|
204
|
+
|
|
205
|
+
## Architecture Notes
|
|
206
|
+
|
|
207
|
+
See [CLAUDE.md](CLAUDE.md) for technical details, file locations,
|
|
208
|
+
constraints, lessons learned, and the development workflow including
|
|
209
|
+
the `.pause_auto_release` / `.pause_watchdog` flags you'll want during
|
|
210
|
+
manual debugging.
|
|
211
|
+
|
|
212
|
+
## Legal
|
|
213
|
+
|
|
214
|
+
All code is original or forked from Apache 2.0 mistral-vibe.
|
|
215
|
+
Architecture improvements are standard design patterns implemented from
|
|
216
|
+
scratch. No proprietary code copied.
|
|
@@ -483,16 +483,22 @@ class AgentLoop:
|
|
|
483
483
|
# === AUTO-CONTEXT ===
|
|
484
484
|
# Auto-explore project files + inject relevant skill for the task type.
|
|
485
485
|
# The model handles everything with subagents (v2.0.0 fixed delegation).
|
|
486
|
+
_ar_t0 = time.perf_counter()
|
|
486
487
|
await self._auto_route_task(user_msg)
|
|
488
|
+
_ar_t1 = time.perf_counter()
|
|
489
|
+
logger.warning("[TIMING] _auto_route_task: %.2fs", _ar_t1 - _ar_t0)
|
|
487
490
|
|
|
488
491
|
try:
|
|
489
492
|
should_break_loop = False
|
|
490
493
|
tool_turns = 0
|
|
491
494
|
api_error_count = 0
|
|
492
495
|
has_made_edit = False # Track if model has used search_replace/write_file
|
|
496
|
+
logger.warning("[TIMING] entering conversation while loop")
|
|
493
497
|
while not should_break_loop:
|
|
494
498
|
# Loop protection: prevent infinite tool-call loops
|
|
495
499
|
tool_turns += 1
|
|
500
|
+
_wt0 = time.perf_counter()
|
|
501
|
+
logger.warning("[TIMING] turn %d: starting", tool_turns)
|
|
496
502
|
if tool_turns > MAX_TOOL_TURNS:
|
|
497
503
|
yield AssistantEvent(
|
|
498
504
|
content=f"\n\n[Maximum tool call limit ({MAX_TOOL_TURNS}) reached. Stopping.]\n",
|
|
@@ -508,9 +514,12 @@ class AgentLoop:
|
|
|
508
514
|
"stop and ask the user for clarification."
|
|
509
515
|
)
|
|
510
516
|
|
|
517
|
+
_mw0 = time.perf_counter()
|
|
511
518
|
result = await self.middleware_pipeline.run_before_turn(
|
|
512
519
|
self._get_context()
|
|
513
520
|
)
|
|
521
|
+
_mw1 = time.perf_counter()
|
|
522
|
+
logger.warning("[TIMING] turn %d: middleware=%.2fs action=%s", tool_turns, _mw1 - _mw0, result.action)
|
|
514
523
|
async for event in self._handle_middleware_result(result):
|
|
515
524
|
yield event
|
|
516
525
|
|
|
@@ -521,11 +530,13 @@ class AgentLoop:
|
|
|
521
530
|
user_cancelled = False
|
|
522
531
|
try:
|
|
523
532
|
force_stopped = False
|
|
533
|
+
logger.warning("[TIMING] turn %d: calling _perform_llm_turn", tool_turns)
|
|
524
534
|
async for event in self._perform_llm_turn():
|
|
525
535
|
if is_user_cancellation_event(event):
|
|
526
536
|
user_cancelled = True
|
|
527
537
|
if isinstance(event, AssistantEvent) and event.stopped_by_middleware:
|
|
528
538
|
force_stopped = True
|
|
539
|
+
logger.warning("[TIMING] turn %d: yielding event type=%s", tool_turns, type(event).__name__)
|
|
529
540
|
yield event
|
|
530
541
|
await self._save_messages()
|
|
531
542
|
if force_stopped:
|
|
@@ -1372,13 +1383,23 @@ class AgentLoop:
|
|
|
1372
1383
|
self.messages.append(LLMMessage(role=Role.user, content="Continue."))
|
|
1373
1384
|
|
|
1374
1385
|
async def _chat(self, max_tokens: int | None = None) -> LLMChunk:
|
|
1386
|
+
_t0 = time.perf_counter()
|
|
1375
1387
|
self._sanitize_message_ordering()
|
|
1388
|
+
_t1 = time.perf_counter()
|
|
1376
1389
|
|
|
1377
1390
|
active_model = self.config.get_active_model()
|
|
1378
1391
|
provider = self.config.get_provider_for_model(active_model)
|
|
1379
1392
|
|
|
1380
1393
|
available_tools = self.format_handler.get_available_tools(self.tool_manager)
|
|
1381
1394
|
tool_choice = self.format_handler.get_tool_choice()
|
|
1395
|
+
_t2 = time.perf_counter()
|
|
1396
|
+
|
|
1397
|
+
n_msgs = len(self.messages)
|
|
1398
|
+
n_tools = len(available_tools) if available_tools else 0
|
|
1399
|
+
logger.info(
|
|
1400
|
+
"[TIMING] _chat start: sanitize=%.2fs prep=%.2fs msgs=%d tools=%d",
|
|
1401
|
+
_t1 - _t0, _t2 - _t1, n_msgs, n_tools,
|
|
1402
|
+
)
|
|
1382
1403
|
|
|
1383
1404
|
try:
|
|
1384
1405
|
start_time = time.perf_counter()
|
|
@@ -1398,6 +1419,12 @@ class AgentLoop:
|
|
|
1398
1419
|
)
|
|
1399
1420
|
end_time = time.perf_counter()
|
|
1400
1421
|
|
|
1422
|
+
logger.info(
|
|
1423
|
+
"[TIMING] backend.complete returned in %.2fs (prompt=%s completion=%s)",
|
|
1424
|
+
end_time - start_time,
|
|
1425
|
+
result.usage.prompt_tokens if result.usage else "?",
|
|
1426
|
+
result.usage.completion_tokens if result.usage else "?",
|
|
1427
|
+
)
|
|
1401
1428
|
if result.usage is None:
|
|
1402
1429
|
raise AgentLoopLLMResponseError(
|
|
1403
1430
|
"Usage data missing in non-streaming completion response"
|
|
@@ -43,6 +43,7 @@ class BuiltinAgentName(StrEnum):
|
|
|
43
43
|
EXPLORE = "explore"
|
|
44
44
|
DIAGNOSTIC = "diagnostic"
|
|
45
45
|
PLANNER = "planner"
|
|
46
|
+
BUILDER = "builder"
|
|
46
47
|
|
|
47
48
|
|
|
48
49
|
@dataclass(frozen=True)
|
|
@@ -223,6 +224,34 @@ PLANNER = AgentProfile(
|
|
|
223
224
|
},
|
|
224
225
|
)
|
|
225
226
|
|
|
227
|
+
BUILDER = AgentProfile(
|
|
228
|
+
name=BuiltinAgentName.BUILDER,
|
|
229
|
+
display_name="Builder",
|
|
230
|
+
description=(
|
|
231
|
+
"Subagent that creates an entire Python package from a PRD. Use this "
|
|
232
|
+
"when the user gives you a PRD with 4+ files to write — delegating "
|
|
233
|
+
"keeps the main agent's context small and lets the builder iterate "
|
|
234
|
+
"in its own scratch space. Has read_file, write_file, search_replace, "
|
|
235
|
+
"glob, and bash. Returns a short summary listing the files created "
|
|
236
|
+
"and whether `python3 -m <pkg> --help` worked. Up to 40 turns."
|
|
237
|
+
),
|
|
238
|
+
safety=AgentSafety.DESTRUCTIVE,
|
|
239
|
+
agent_type=AgentType.SUBAGENT,
|
|
240
|
+
max_turns=40,
|
|
241
|
+
overrides={
|
|
242
|
+
"enabled_tools": [
|
|
243
|
+
"read_file", "write_file", "search_replace",
|
|
244
|
+
"glob", "grep", "bash",
|
|
245
|
+
],
|
|
246
|
+
"system_prompt_id": "builder",
|
|
247
|
+
"tools": {
|
|
248
|
+
"write_file": {"permission": "always"},
|
|
249
|
+
"search_replace": {"permission": "always"},
|
|
250
|
+
"bash": {"permission": "always"},
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
)
|
|
254
|
+
|
|
226
255
|
BUILTIN_AGENTS: dict[str, AgentProfile] = {
|
|
227
256
|
BuiltinAgentName.DEFAULT: DEFAULT,
|
|
228
257
|
BuiltinAgentName.PLAN: PLAN,
|
|
@@ -231,4 +260,5 @@ BUILTIN_AGENTS: dict[str, AgentProfile] = {
|
|
|
231
260
|
BuiltinAgentName.EXPLORE: EXPLORE,
|
|
232
261
|
BuiltinAgentName.DIAGNOSTIC: DIAGNOSTIC,
|
|
233
262
|
BuiltinAgentName.PLANNER: PLANNER,
|
|
263
|
+
BuiltinAgentName.BUILDER: BUILDER,
|
|
234
264
|
}
|
|
@@ -305,6 +305,14 @@ class VibeConfig(BaseSettings):
|
|
|
305
305
|
include_model_info: bool = True
|
|
306
306
|
include_project_context: bool = True
|
|
307
307
|
include_prompt_detail: bool = True
|
|
308
|
+
# When True, the system prompt drops the inlined per-tool prompt files
|
|
309
|
+
# (~6500 tokens for the 24 builtin tools) AND the available skills /
|
|
310
|
+
# subagents listings. The model still receives the OpenAI tool function
|
|
311
|
+
# schemas via the `tools` field of the API call. Recommended for local
|
|
312
|
+
# models like Gemma 4 where every prefill token costs ~7-12 ms and the
|
|
313
|
+
# bloated default system prompt (~10K tokens) causes 60-120s first-turn
|
|
314
|
+
# latency. Defaults False for backward compatibility.
|
|
315
|
+
slim_system_prompt: bool = False
|
|
308
316
|
enable_update_checks: bool = True
|
|
309
317
|
enable_auto_update: bool = True
|
|
310
318
|
enable_notifications: bool = True
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
You are the Builder subagent. Your job is to build an entire Python package
|
|
2
|
+
from a PRD with NO further input from the user.
|
|
3
|
+
|
|
4
|
+
You have these tools and nothing else:
|
|
5
|
+
read_file, write_file, search_replace, glob, grep, bash
|
|
6
|
+
|
|
7
|
+
Workflow
|
|
8
|
+
|
|
9
|
+
1. Read PRD.md (or the spec file you were pointed at).
|
|
10
|
+
2. Create EVERY file the PRD lists. Start with __init__.py and __main__.py,
|
|
11
|
+
then the modules they import from. Use write_file once per file with the
|
|
12
|
+
COMPLETE contents. Use ABSOLUTE imports: `from package_name.module import X`,
|
|
13
|
+
never relative imports.
|
|
14
|
+
3. After writing all files, run `python3 -m <package_name> --help` once.
|
|
15
|
+
4. If --help fails, read the traceback, identify the file/line, fix it with
|
|
16
|
+
search_replace, then re-run `--help`.
|
|
17
|
+
5. If a subcommand from the PRD is mentioned, run it once to verify it works.
|
|
18
|
+
6. STOP after the package executes cleanly. Do not test edge cases the PRD
|
|
19
|
+
does not require. Do not refactor.
|
|
20
|
+
|
|
21
|
+
Hard rules
|
|
22
|
+
|
|
23
|
+
- One write_file per file. Never write the same file twice unless you're
|
|
24
|
+
fixing a verified bug. The framework will hard-block a third identical
|
|
25
|
+
no-op write — if you see "BLOCKED:" in a tool result, write a different
|
|
26
|
+
file or run bash, never the same one again.
|
|
27
|
+
- Every file you `import .X` from MUST be created. The framework will warn
|
|
28
|
+
you if `__init__.py` references a module that doesn't exist on disk.
|
|
29
|
+
- `__main__.py` MUST actually CALL the entry function:
|
|
30
|
+
from package.cli import main
|
|
31
|
+
if __name__ == "__main__":
|
|
32
|
+
main()
|
|
33
|
+
Importing `main` without calling it produces a silent-exit package.
|
|
34
|
+
- Never read a file you wrote yourself in this session — you already know
|
|
35
|
+
what's in it. Reading wastes context.
|
|
36
|
+
- Never run `pytest` or write tests unless the PRD explicitly asks for tests.
|
|
37
|
+
- Never `pip install` anything unless the PRD names a third-party dependency
|
|
38
|
+
AND you've verified it isn't already importable.
|
|
39
|
+
|
|
40
|
+
Result
|
|
41
|
+
|
|
42
|
+
When you stop, your final tool call should be a `bash` that ran
|
|
43
|
+
`python3 -m <pkg> --help` and exited 0. The framework summarizes your run
|
|
44
|
+
back to the main agent automatically — you do NOT need to write a summary
|
|
45
|
+
yourself.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
You are DryDock, a CLI coding agent. You write code, fix bugs, and build projects.
|
|
2
|
+
|
|
3
|
+
ACT IMMEDIATELY. Your FIRST response must be a tool call — not text. Do NOT explain, plan, or ask. Call a tool NOW.
|
|
4
|
+
|
|
5
|
+
Your tools: read_file, write_file, search_replace, grep, glob, bash, task.
|
|
6
|
+
|
|
7
|
+
DELEGATION (only for genuinely large tasks)
|
|
8
|
+
|
|
9
|
+
For tasks that need you to write 6+ source files OR have subdirectories
|
|
10
|
+
(e.g. "build the X package from PRD.md" with multiple subpackages),
|
|
11
|
+
DELEGATE the build to a subagent so the main agent's context stays small.
|
|
12
|
+
The Gemma 4 main loop slows down with bigger context — subagents work in
|
|
13
|
+
their own scratch space.
|
|
14
|
+
|
|
15
|
+
task(agent="builder", task="Read PRD.md and build the entire <pkg> package. "
|
|
16
|
+
"Write every file the PRD lists. Verify "
|
|
17
|
+
"python3 -m <pkg> --help works. Stop when "
|
|
18
|
+
"the package executes cleanly.")
|
|
19
|
+
|
|
20
|
+
For codebase exploration on an existing repo:
|
|
21
|
+
task(agent="explore", task="Find where <function> is defined")
|
|
22
|
+
|
|
23
|
+
For debugging a test failure or traceback:
|
|
24
|
+
task(agent="diagnostic", task="A bash command failed with this traceback: ... "
|
|
25
|
+
"Find the bug and report the file:line.")
|
|
26
|
+
|
|
27
|
+
For multi-module changes that need a plan first:
|
|
28
|
+
task(agent="planner", task="Plan the change: ...")
|
|
29
|
+
|
|
30
|
+
DO NOT delegate trivial work. Most PRDs are small — build them directly.
|
|
31
|
+
Rules of thumb:
|
|
32
|
+
- 1-5 files, no subdirs → BUILD INLINE. Do not call task.
|
|
33
|
+
- 6+ files OR subdirectories OR multiple subpackages → DELEGATE to builder.
|
|
34
|
+
- Editing an existing file or fixing a known bug → BUILD INLINE.
|
|
35
|
+
- "Where does function X live?" → DELEGATE to explore.
|
|
36
|
+
|
|
37
|
+
When in doubt, build inline. A wasted delegation costs 60-90 seconds of
|
|
38
|
+
extra context loading.
|
|
39
|
+
|
|
40
|
+
Workflow for building from a PRD or spec (when NOT delegating):
|
|
41
|
+
1. Read the spec file
|
|
42
|
+
2. Create each file with write_file — start with __init__.py and __main__.py
|
|
43
|
+
3. After all files, verify with bash: ls package_name/ to confirm all files exist
|
|
44
|
+
4. Test with bash: python3 -m package_name --help
|
|
45
|
+
5. Test each subcommand from the PRD to verify it works
|
|
46
|
+
6. Fix any errors
|
|
47
|
+
|
|
48
|
+
Workflow for fixing bugs:
|
|
49
|
+
1. Grep for the function/class mentioned
|
|
50
|
+
2. Read the source file
|
|
51
|
+
3. Fix with search_replace
|
|
52
|
+
4. Verify the fix
|
|
53
|
+
|
|
54
|
+
Rules:
|
|
55
|
+
- Create files immediately. Do not plan or discuss — write code.
|
|
56
|
+
- Use absolute imports for Python packages
|
|
57
|
+
- Always create __init__.py and __main__.py for packages
|
|
58
|
+
- Keep responses under 50 words. Code speaks for itself.
|
|
59
|
+
- NEVER ask "would you like me to proceed" or "shall I continue" — JUST DO IT.
|
|
60
|
+
- After creating/editing a file, move to the next one. Do not stop.
|
|
61
|
+
- Follow the EXACT CLI interface specified in the PRD. Match argument names, subcommands, and flags exactly.
|
|
62
|
+
- Every subcommand in the PRD must have a working handler — not just argparse registration.
|
|
63
|
+
- After creating files, run python3 -m package_name [subcommand] to verify each one works.
|
|
64
|
+
- If a write_file result says "BLOCKED:" you've called it 3+ times with identical content. STOP that path. Write a DIFFERENT file or run bash. Never retry the blocked write.
|
|
@@ -258,20 +258,28 @@ def get_universal_system_prompt(
|
|
|
258
258
|
|
|
259
259
|
if config.include_prompt_detail:
|
|
260
260
|
static_sections.append(_get_os_system_prompt())
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
261
|
+
|
|
262
|
+
# slim_system_prompt drops the heaviest static sections — tool
|
|
263
|
+
# prompt files, skills list, subagents list — that bloat the prompt
|
|
264
|
+
# to ~10K tokens for local models. The OpenAI tool function schemas
|
|
265
|
+
# still go to the model via the API `tools` field, so capability
|
|
266
|
+
# is preserved; only the inlined examples and best-practices docs
|
|
267
|
+
# are skipped.
|
|
268
|
+
if not getattr(config, "slim_system_prompt", False):
|
|
269
|
+
tool_prompts = []
|
|
270
|
+
for tool_class in tool_manager.available_tools.values():
|
|
271
|
+
if prompt := tool_class.get_tool_prompt():
|
|
272
|
+
tool_prompts.append(prompt)
|
|
273
|
+
if tool_prompts:
|
|
274
|
+
static_sections.append("\n---\n".join(tool_prompts))
|
|
275
|
+
|
|
276
|
+
skills_section = _get_available_skills_section(skill_manager)
|
|
277
|
+
if skills_section:
|
|
278
|
+
static_sections.append(skills_section)
|
|
279
|
+
|
|
280
|
+
subagents_section = _get_available_subagents_section(agent_manager)
|
|
281
|
+
if subagents_section:
|
|
282
|
+
static_sections.append(subagents_section)
|
|
275
283
|
|
|
276
284
|
# === DYNAMIC SECTIONS (change per project/directory) ===
|
|
277
285
|
dynamic_sections = []
|
|
@@ -51,8 +51,21 @@ class TaskResult(BaseModel):
|
|
|
51
51
|
|
|
52
52
|
|
|
53
53
|
class TaskToolConfig(BaseToolConfig):
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
# ALWAYS instead of ASK because the subagent is itself sandboxed by
|
|
55
|
+
# its own per-tool permissions (see e.g. BUILDER's overrides). Asking
|
|
56
|
+
# the user to approve every delegation defeats the purpose of subagents
|
|
57
|
+
# — the model can't iterate without blocking on a TUI dialog the
|
|
58
|
+
# automated harness can't dismiss. Per-subagent profiles are the right
|
|
59
|
+
# place to control which tools they're allowed to call.
|
|
60
|
+
permission: ToolPermission = ToolPermission.ALWAYS
|
|
61
|
+
allowlist: list[str] = Field(
|
|
62
|
+
default=[
|
|
63
|
+
BuiltinAgentName.EXPLORE,
|
|
64
|
+
BuiltinAgentName.DIAGNOSTIC,
|
|
65
|
+
BuiltinAgentName.PLANNER,
|
|
66
|
+
BuiltinAgentName.BUILDER,
|
|
67
|
+
]
|
|
68
|
+
)
|
|
56
69
|
|
|
57
70
|
|
|
58
71
|
class Task(
|