drydock-cli 2.6.23__tar.gz → 2.6.26__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.26/.auto_release.lock +1 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/.gitignore +1 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/CLAUDE.md +221 -28
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/PKG-INFO +1 -1
- drydock_cli-2.6.26/PRD.md +216 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/agent_loop.py +146 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/agents/models.py +30 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/config/_settings.py +8 -0
- drydock_cli-2.6.26/drydock/core/prompts/builder.md +45 -0
- drydock_cli-2.6.26/drydock/core/prompts/gemma4.md +64 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/system_prompt.py +22 -14
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/task.py +15 -2
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/write_file.py +134 -2
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/pyproject.toml +1 -1
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/auto_release.sh +41 -14
- drydock_cli-2.6.26/scripts/shakedown.py +709 -0
- drydock_cli-2.6.26/scripts/shakedown_suite.sh +73 -0
- drydock_cli-2.6.26/scripts/shakedown_variance.sh +56 -0
- drydock_cli-2.6.26/tests/fixtures/doc_qa_system_prd.md +86 -0
- drydock_cli-2.6.23/.auto_release.lock +0 -1
- drydock_cli-2.6.23/PRD.md +0 -81
- drydock_cli-2.6.23/drydock/core/prompts/builder.md +0 -16
- drydock_cli-2.6.23/drydock/core/prompts/gemma4.md +0 -30
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/.python-version +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/.typos.toml +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/.vscode/extensions.json +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/.vscode/launch.json +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/.vscode/settings.json +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/AGENTS.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/CHANGELOG.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/Drydock_rebrand.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/LICENSE +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/NOTICE +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/README.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/action.yml +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/docs/README.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/docs/acp-setup.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/logger.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/slug.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/types.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/core/utils.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock/whats_new.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock-acp.spec +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/drydock_terms.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/flake.lock +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/flake.nix +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/log_analyzer/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/log_analyzer/__main__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/log_analyzer/analyzer.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/log_analyzer/cli.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/README.md +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/auto_test_loop.sh +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/backup.sh +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/bump_version.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/discover_cli_tools.sh +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/install.sh +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/llm_balancer.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/monitor_swebench.sh +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/monitor_test_battery.sh +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/notify_release.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/overnight_agents_test.sh +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/prepare_release.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/test_bank.sh +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/test_full.sh +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/test_smoke.sh +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/test_tui_path.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/tui_test.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/scripts/vllm_failover.sh +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/conftest.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/e2e/common.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/mock/utils.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/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.23 → drydock_cli-2.6.26}/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.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_agents.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_integration.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_message_id.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_middleware.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_smoke.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/test_workloads.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.6.23 → drydock_cli-2.6.26}/uv.lock +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
232271
|
|
@@ -4,17 +4,22 @@
|
|
|
4
4
|
|
|
5
5
|
Drydock is a local CLI coding agent (fork of mistral-vibe, Apache 2.0).
|
|
6
6
|
- **Repo:** https://github.com/fbobe321/drydock
|
|
7
|
-
- **PyPI:** https://pypi.org/project/drydock-cli/ (v2.
|
|
8
|
-
- **Goal:** Reliable TUI coding agent with local LLMs. PRD-driven project building
|
|
7
|
+
- **PyPI:** https://pypi.org/project/drydock-cli/ (v2.6.23 — v2.6.24 built but unreleased)
|
|
8
|
+
- **Goal:** Reliable TUI coding agent with local LLMs. PRD-driven project building.
|
|
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
|
-
- **
|
|
13
|
-
-
|
|
14
|
-
|
|
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
|
+
for the 10-project core set.
|
|
15
|
+
- **OLD harnesses you should NOT trust:** `scripts/tui_test.py` and
|
|
16
|
+
`core_tests_real.sh` count tool calls and `--help` and miss the things users
|
|
17
|
+
actually experience (loops the model ignores, hallucinated tool names that
|
|
18
|
+
hang the session, models that declare done with broken code, 2-minute
|
|
19
|
+
generation pauses). They produce passing scores while real usage fails.
|
|
15
20
|
- **Priority:** TUI experience first. Fix drydock bugs, don't simplify PRDs.
|
|
16
21
|
- **370 PRDs** at /data3/drydock_test_projects/ — the benchmark suite
|
|
17
|
-
- **Current version:** v2.
|
|
22
|
+
- **Current version:** v2.6.23 on PyPI / v2.6.24 built locally (unreleased)
|
|
18
23
|
|
|
19
24
|
## Build & Test
|
|
20
25
|
|
|
@@ -256,37 +261,217 @@ v3 is a from-scratch rewrite using nano-claude-code as foundation. 4 core files,
|
|
|
256
261
|
- ✅ Docker-based model serving (vLLM + Gemma 4)
|
|
257
262
|
- ✅ Multi-backend SWE-bench harness (v2/devstral + v3/gemma4)
|
|
258
263
|
- ✅ Thinking token filtering (Gemma 4 `<|channel>` leak)
|
|
264
|
+
- ✅ **Shakedown harness** (`scripts/shakedown.py`) — drives real TUI
|
|
265
|
+
via pexpect, watches live session log, types `STOP` interrupts,
|
|
266
|
+
judges on user-perceptible criteria
|
|
267
|
+
- ✅ **Shakedown suite** (`scripts/shakedown_suite.sh`) — 10 core
|
|
268
|
+
projects through the shakedown harness
|
|
269
|
+
- ✅ **`_check_main_module_entry`** in write_file.py — catches
|
|
270
|
+
`__main__.py` files that import `main` but never call it (the codec
|
|
271
|
+
silent-exit bug)
|
|
272
|
+
- ✅ **`_check_missing_sibling_imports`** in write_file.py — catches
|
|
273
|
+
`from .cli import CLI` when `cli.py` doesn't exist on disk yet (the
|
|
274
|
+
minivc unimportable-package bug)
|
|
275
|
+
- ✅ **Escalating dedup message** in write_file.py — 2nd+ identical-content
|
|
276
|
+
write to a path returns the actual current directory listing plus
|
|
277
|
+
concrete next-action suggestions, instead of abstract "move to next file"
|
|
278
|
+
- ✅ **Loop-detection wiring** in agent_loop.py — `_check_tool_call_repetition()`
|
|
279
|
+
was defined but never called; now fires from `_handle_tool_response()`
|
|
280
|
+
and injects an advisory nudge via `_inject_system_note()`, rate-limited
|
|
281
|
+
every 3 turns
|
|
282
|
+
- ✅ **`_truncate_old_tool_results`** in agent_loop.py — proactive
|
|
283
|
+
shrinkage of stale tool results before each LLM call; keeps the last
|
|
284
|
+
6 in full, truncates older ones > 800 bytes to head + footer + size
|
|
285
|
+
marker; idempotent
|
|
286
|
+
- ✅ **`_task_manager.py` rename** — TaskCreate/Update/List were
|
|
287
|
+
duplicates of the `todo` tool that confused Gemma 4 into hanging.
|
|
288
|
+
Underscore prefix excludes them from tool discovery
|
|
289
|
+
- ✅ **Trust dialog auto-dismissal** in shakedown.py
|
|
290
|
+
- ✅ **Pause flags** for both `auto_release.sh` and `watchdog.sh` so
|
|
291
|
+
manual debugging doesn't get its work overwritten
|
|
259
292
|
|
|
260
293
|
**Legal note:** All patterns are standard design concepts implemented from scratch. No proprietary code copied.
|
|
261
294
|
|
|
262
295
|
## Key Learnings
|
|
263
296
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
297
|
+
### Most-recent (debugging the user's worst session, April 2026)
|
|
298
|
+
|
|
299
|
+
1. **Test-harness counts are not user pain.** `tui_test.py` and
|
|
300
|
+
`core_tests_real.sh` reported 80% pass while real users saw drydock
|
|
301
|
+
loop, hang, and produce broken code. The harnesses were structurally
|
|
302
|
+
incapable of catching what users experience because they measure
|
|
303
|
+
tool-call counts and `--help` exit codes, not progress. Build pass
|
|
304
|
+
criteria around user-perceptible state instead. See `shakedown.py`.
|
|
305
|
+
2. **Gemma 4 ignores advisory nudges.** The model received the dedup
|
|
306
|
+
message ("File already has this exact content. Move to the NEXT file."),
|
|
307
|
+
the loop-detection system note, the missing-import warning, AND a
|
|
308
|
+
user-typed `STOP` interrupt — its own thinking tokens ACKNOWLEDGED
|
|
309
|
+
the loop ("The user is pointing out that I am in a loop... I should
|
|
310
|
+
move to the next file") — and kept writing the same file 10 times
|
|
311
|
+
anyway. The advisory-only rule is correct in principle, but Gemma 4
|
|
312
|
+
cannot reliably respond to it. Hard blocks on pure no-op duplicates
|
|
313
|
+
may eventually be necessary.
|
|
314
|
+
3. **The auto_release.sh cron silently reverts site-packages every 6 hours.**
|
|
315
|
+
It runs at 0/6/12/18, builds a wheel from `/data3/drydock`, uploads to
|
|
316
|
+
PyPI, and `pip install --force-reinstall`s into the user's env. Direct
|
|
317
|
+
edits to `site-packages/drydock/...` disappear at the next cron tick.
|
|
318
|
+
Pause via `touch /data3/drydock/.pause_auto_release`.
|
|
319
|
+
4. **`/data3/drydock` is in `sys.path`, but site-packages comes first.**
|
|
320
|
+
`import drydock; print(drydock.__file__)` lies depending on cwd. From
|
|
321
|
+
`/data3/drydock` it reports the source tree (cwd is `""` at index 0).
|
|
322
|
+
From any project cwd it reports site-packages. **Always validate
|
|
323
|
+
imports from a neutral cwd.**
|
|
324
|
+
5. **PRDs get contaminated across sessions.** The model edits `PRD.md`
|
|
325
|
+
during a session (adds "✅ Completed" status tables, chat-style
|
|
326
|
+
filler text). The next test run sees a "completed" PRD and either
|
|
327
|
+
declares done immediately or hallucinates fix actions. Snapshot
|
|
328
|
+
`PRD.master.md` before each run; the harness restores it automatically.
|
|
329
|
+
6. **Hallucinated tool names hang the session.** The model called
|
|
330
|
+
`ralph_repo_index({"directory": "."})` — a tool that doesn't exist.
|
|
331
|
+
`_build_tool_call_events()` had `if tool_class is None: continue` which
|
|
332
|
+
silently dropped the call. Drydock waited forever for a tool result
|
|
333
|
+
that never came. `resolve_tool_calls()` correctly emits a `FailedToolCall`
|
|
334
|
+
downstream — both code paths exist; verify which one the model is hitting.
|
|
335
|
+
7. **The "Trust this folder?" dialog blocks all input.** Drydock pops a
|
|
336
|
+
blocking modal the first time it opens an unfamiliar directory. The
|
|
337
|
+
harness used to type the user prompt blindly into it; the dialog ate
|
|
338
|
+
the keystrokes and drydock waited forever. The fix: detect the dialog
|
|
339
|
+
in pexpect output, send Left+Enter to answer Yes. The harness now does
|
|
340
|
+
this. The CLI should never strand users on a modal dialog.
|
|
341
|
+
8. **Context-bloat eats first-turn latency.** Drydock includes the system
|
|
342
|
+
prompt + 24 tool definitions + AGENTS.md auto-injection + user message
|
|
343
|
+
on every turn. With Gemma 4 `thinking="high"` the first response can
|
|
344
|
+
take 60–130 seconds even on a small project, because the model is
|
|
345
|
+
generating ~1000 thinking tokens at ~70 tok/s. `auto_compact_threshold`
|
|
346
|
+
defaults to 200K (higher than Gemma 4's 131K max context) so it never
|
|
347
|
+
fires. Lower it per-model, and rely on `_truncate_old_tool_results()`
|
|
348
|
+
to shrink stale `read_file` outputs proactively.
|
|
349
|
+
9. **`task_manager.py` (TaskCreate/Update/List) confused Gemma 4** — the
|
|
350
|
+
model mixed it up with the existing `todo` tool, called `task_update`
|
|
351
|
+
on a `todo` ID, hung waiting on the response. Renamed to
|
|
352
|
+
`_task_manager.py` so the auto-discovery loop in `tools/manager.py`
|
|
353
|
+
skips it (it skips files starting with `_`). The classes are still
|
|
354
|
+
importable for tests via the new module name.
|
|
355
|
+
10. **Variance is the rule, not the exception.** Same code, same prompt,
|
|
356
|
+
same model: codec passed in run 1 of the suite and triggered all 3
|
|
357
|
+
pain criteria in run 2. Always state both numbers honestly. Don't
|
|
358
|
+
cherry-pick the run that worked.
|
|
359
|
+
|
|
360
|
+
### Older but still relevant
|
|
361
|
+
|
|
362
|
+
11. **Test the TUI, not headless.** Headless passes mask real bugs. TUI
|
|
363
|
+
has different code paths (streaming, approval, render_path_prompt).
|
|
364
|
+
ALL testing through TUI via pexpect.
|
|
365
|
+
12. **Use PRDs for testing.** Concrete PRDs with expected files give
|
|
366
|
+
clear pass/fail. The 370-PRD suite is at /data3/drydock_test_projects/.
|
|
367
|
+
13. **Scaffold per model.** Weaker models need more guardrails
|
|
368
|
+
(non-streaming, fewer tools, simpler prompts). As models improve,
|
|
369
|
+
remove scaffolding.
|
|
370
|
+
14. **Streaming breaks Gemma 4 tool calls.** Non-streaming gets the
|
|
371
|
+
complete response so JSON args are valid. Set `enable_streaming=False`
|
|
372
|
+
when model is Gemma 4.
|
|
373
|
+
15. **Fewer tools = better for local models.** 24 builtins is already a
|
|
374
|
+
lot for Gemma 4. The auto-injected list of 39 user-installed CLI
|
|
375
|
+
tools makes it worse.
|
|
376
|
+
16. **Simple prompts win.** The 125-line `cli.md` with phases/delegation
|
|
377
|
+
confused Gemma 4. The 20-line `gemma4.md` ("ACT IMMEDIATELY") works.
|
|
378
|
+
17. **AGENTS.md essential for devstral, not needed for Gemma 4.**
|
|
379
|
+
18. **Circuit breaker was net negative — removed entirely.**
|
|
380
|
+
19. **Loop detection should guide, never stop.** Per the user's rule.
|
|
381
|
+
See learning #2 for the limit of this rule.
|
|
382
|
+
20. **Auto-read on failed edit, temperature bump on loops, failed-approach
|
|
383
|
+
accumulator** — additive context techniques that help.
|
|
280
384
|
|
|
281
385
|
## Testing
|
|
282
386
|
|
|
283
|
-
###
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
387
|
+
### Use `scripts/shakedown.py` — anything else lies
|
|
388
|
+
|
|
389
|
+
The `shakedown.py` harness is the only test infrastructure that catches what
|
|
390
|
+
real users experience. Older harnesses (`tui_test.py`, `core_tests_real.sh`,
|
|
391
|
+
`run_real_tests.sh`) measure tool counts and `--help` exit codes; they pass
|
|
392
|
+
while real users see loops and hangs.
|
|
393
|
+
|
|
394
|
+
**How it works:**
|
|
395
|
+
- Drives the real `drydock` TUI via pexpect (no headless mode)
|
|
396
|
+
- Sends a vague user-style prompt ("review the PRD and build the package")
|
|
397
|
+
- Polls the live `~/.vibe/logs/session/session_<id>/messages.jsonl` in parallel
|
|
398
|
+
- Watches for write loops, search_replace cascades, hallucinated-tool hangs
|
|
399
|
+
- Types simulated `STOP` interrupts when loops are detected, then tracks
|
|
400
|
+
whether the model OBEYS them
|
|
401
|
+
- Distinguishes three end-states:
|
|
402
|
+
- **Active turn** (any new message in the last 120s) → keep going
|
|
403
|
+
- **Done** (last assistant has text content with no tool call) → grace 30s, then PASS
|
|
404
|
+
- **Dead silence** (no new messages of any kind for 120s) → FAIL
|
|
405
|
+
- Resets the cwd between runs (restores `PRD.md` from `PRD.master.md` if present,
|
|
406
|
+
wipes the package dir and stale data dirs)
|
|
407
|
+
- Auto-handles the "Trust this folder?" dialog drydock pops on new directories
|
|
408
|
+
|
|
409
|
+
**Pass criteria (ALL must hold):**
|
|
410
|
+
1. NO write loops (≥3 identical-content writes to a path)
|
|
411
|
+
2. NO ignored user `STOP` interrupts
|
|
412
|
+
3. NO search_replace failure cascade (≥3 in a row)
|
|
413
|
+
4. `python3 -m <pkg> --help` actually works
|
|
414
|
+
5. Session under `MAX_SESSION_SECONDS` (default 600)
|
|
415
|
+
|
|
416
|
+
**Run a single project:**
|
|
288
417
|
|
|
289
|
-
|
|
418
|
+
```bash
|
|
419
|
+
PYTHONUNBUFFERED=1 python3 -u scripts/shakedown.py \
|
|
420
|
+
--cwd /data3/test_drydock \
|
|
421
|
+
--prompt "review the PRD and get started" \
|
|
422
|
+
--pkg doc_qa_system
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
**Run the 10-project core suite:**
|
|
426
|
+
|
|
427
|
+
```bash
|
|
428
|
+
bash scripts/shakedown_suite.sh
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
**Real-world results from the harness (after recent fixes):**
|
|
432
|
+
- 4/4 on the small suite (roman_converter, prime_tool, todo_list, codec)
|
|
433
|
+
with real functional verification: codec round-trips work, todo_list
|
|
434
|
+
workflow works, prime check works.
|
|
435
|
+
- Variance is real — codec passed in one suite run and FAILED with a
|
|
436
|
+
3-criteria loop in the next. Same code, same prompt. Document this when
|
|
437
|
+
reporting.
|
|
438
|
+
|
|
439
|
+
### Fixture: `tests/fixtures/doc_qa_system_prd.md`
|
|
440
|
+
|
|
441
|
+
The PRD that originally exposed the user's worst session (10 identical
|
|
442
|
+
`__init__.py` writes, hallucinated `ralph_repo_index` tool, contaminated
|
|
443
|
+
PRD across sessions, 13-min runtime) is checked in. Use it as the canary
|
|
444
|
+
case for any harness work.
|
|
445
|
+
|
|
446
|
+
### Two cron pause flags you should know about
|
|
447
|
+
|
|
448
|
+
Both crons silently overwrite work mid-debug. Pause them when iterating:
|
|
449
|
+
|
|
450
|
+
```bash
|
|
451
|
+
touch /data3/drydock_test_projects/.pause_watchdog # stops watchdog.sh
|
|
452
|
+
touch /data3/drydock/.pause_auto_release # stops auto_release.sh
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
`auto_release.sh` runs at 0/6/12/18, builds a wheel from `/data3/drydock`,
|
|
456
|
+
uploads to PyPI, and `pip install --force-reinstall`s it into the user's env.
|
|
457
|
+
That overwrites any direct site-packages edits. **If your fix doesn't
|
|
458
|
+
survive the next cron run, it's because you only edited `/data3/drydock` —
|
|
459
|
+
auto_release rebuilds from there but ALSO replaces site-packages.** Commit
|
|
460
|
+
your fix to source AND verify it landed via `git log --oneline -5` before
|
|
461
|
+
expecting persistence.
|
|
462
|
+
|
|
463
|
+
### Why direct site-packages edits keep disappearing
|
|
464
|
+
|
|
465
|
+
`/home/bobef/miniforge3/envs/drydock/lib/python3.14/site-packages` comes
|
|
466
|
+
before `/data3/drydock` in `sys.path` from a project cwd, even though the
|
|
467
|
+
`_drydock.pth` file adds `/data3/drydock`. So a sanity check from
|
|
468
|
+
`/data3/drydock` (`import drydock; print(drydock.__file__)`) lies — it
|
|
469
|
+
reports `/data3/drydock/drydock/__init__.py` because cwd-`""` is at index 0.
|
|
470
|
+
From `/data3/drydock_test_projects/X` it reports the site-packages path.
|
|
471
|
+
**Always test imports from a neutral cwd**, OR commit to source AND let
|
|
472
|
+
auto_release rebuild.
|
|
473
|
+
|
|
474
|
+
### Test Levels (kept for reference, but the shakedown harness covers all of them)
|
|
290
475
|
1. **Build test (--help):** package runs — MEANINGLESS alone
|
|
291
476
|
2. **Functional test:** PRD test cases verified with correct output — THE REAL TEST
|
|
292
477
|
3. **Acceptance test:** specific expected outputs verified
|
|
@@ -298,6 +483,14 @@ v3 is a from-scratch rewrite using nano-claude-code as foundation. 4 core files,
|
|
|
298
483
|
- Safety mechanisms must be ADVISORY not BLOCKING
|
|
299
484
|
- NEVER add circuit breakers that prevent legitimate work
|
|
300
485
|
- The model should be able to answer questions without being forced to edit files
|
|
486
|
+
- **NEVER trust an old harness's pass result.** If `tui_test.py` or
|
|
487
|
+
`core_tests_real.sh` says PASS, run the same project through
|
|
488
|
+
`shakedown.py` to confirm. The old harnesses count `--help` and
|
|
489
|
+
silently miss the things users hate.
|
|
490
|
+
- **Always reset PRDs between runs.** The model edits PRD.md (adds
|
|
491
|
+
"✅ Completed" status tables, chat-style filler) and contaminates
|
|
492
|
+
subsequent test runs. The harness restores from `PRD.master.md`
|
|
493
|
+
automatically if present.
|
|
301
494
|
|
|
302
495
|
## When Compacting
|
|
303
496
|
|
|
@@ -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.
|