drydock-cli 0.7.1__tar.gz → 0.7.2__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-0.7.1 → drydock_cli-0.7.2}/PKG-INFO +12 -1
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/README.md +11 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/app.py +8 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/agent_loop.py +1 -1
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/consultant.py +7 -1
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/prompts/cli.md +1 -1
- drydock_cli-0.7.2/drydock/skills/deep-research/SKILL.md +57 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/pyproject.toml +2 -1
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/scripts/deploy_to_github.sh +1 -1
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/scripts/publish_to_pypi.sh +1 -1
- drydock_cli-0.7.2/tests/test_user_issues.py +259 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.github/CODEOWNERS +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.github/workflows/ci.yml +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.github/workflows/release.yml +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.gitignore +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.pre-commit-config.yaml +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.python-version +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.typos.toml +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.vscode/extensions.json +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.vscode/launch.json +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/.vscode/settings.json +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/AGENTS.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/CHANGELOG.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/CLAUDE.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/CONTRIBUTING.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/Drydock_rebrand.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/LICENSE +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/NOTICE +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/PRD.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/action.yml +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/distribution/zed/LICENSE +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/distribution/zed/extension.toml +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/docs/README.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/docs/acp-setup.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/docs/proxy-setup.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/acp/utils.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/cli.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/commands.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/agents/models.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/auth/github.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/format.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/llm/types.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/logger.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/middleware.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/plan_session.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/programmatic.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/skills/models.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/slug.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/base.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/types.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/core/utils.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/skills/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/whats_new.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock-acp.spec +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock_terms.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/flake.lock +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/flake.nix +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/scripts/README.md +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/scripts/bump_version.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/scripts/install.sh +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/scripts/prepare_release.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/conftest.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_acp.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_bash.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_content.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_utils.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/backend/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/backend/test_backend.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_commands.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/conftest.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_agents.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_slug.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/core/test_utils.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/e2e/common.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/e2e/conftest.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/mock/__init__.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/mock/utils.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/skills/conftest.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/skills/test_manager.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/skills/test_models.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/skills/test_parser.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_agent_backend.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_agent_stats.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_agents.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_history_manager.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_integration.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_loop_detection.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_message_id.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_message_merging.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_middleware.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_system_prompt.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_tagged_text.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_bash.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_grep.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_task.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-0.7.1 → drydock_cli-0.7.2}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.2
|
|
4
4
|
Summary: Drydock — nautical CLI coding agent
|
|
5
5
|
Project-URL: Homepage, https://github.com/fbobe321/drydock
|
|
6
6
|
Project-URL: Repository, https://github.com/fbobe321/drydock
|
|
@@ -168,6 +168,17 @@ export MISTRAL_API_KEY="your_key" # Or set env var
|
|
|
168
168
|
|
|
169
169
|
Keys are saved to `~/.drydock/.env`.
|
|
170
170
|
|
|
171
|
+
### Consultant Model
|
|
172
|
+
|
|
173
|
+
Set a smarter model for the `/consult` command:
|
|
174
|
+
|
|
175
|
+
```toml
|
|
176
|
+
# In ~/.drydock/config.toml
|
|
177
|
+
consultant_model = "gemini-2.5-pro"
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
The consultant provides read-only advice — it never calls tools. Use `/consult <question>` to ask it. The response appears in your conversation so the local model can see it.
|
|
181
|
+
|
|
171
182
|
### Custom Agents
|
|
172
183
|
|
|
173
184
|
Create agent configs in `~/.drydock/agents/`:
|
|
@@ -114,6 +114,17 @@ export MISTRAL_API_KEY="your_key" # Or set env var
|
|
|
114
114
|
|
|
115
115
|
Keys are saved to `~/.drydock/.env`.
|
|
116
116
|
|
|
117
|
+
### Consultant Model
|
|
118
|
+
|
|
119
|
+
Set a smarter model for the `/consult` command:
|
|
120
|
+
|
|
121
|
+
```toml
|
|
122
|
+
# In ~/.drydock/config.toml
|
|
123
|
+
consultant_model = "gemini-2.5-pro"
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
The consultant provides read-only advice — it never calls tools. Use `/consult <question>` to ask it. The response appears in your conversation so the local model can see it.
|
|
127
|
+
|
|
117
128
|
### Custom Agents
|
|
118
129
|
|
|
119
130
|
Create agent configs in `~/.drydock/agents/`:
|
|
@@ -977,10 +977,18 @@ class VibeApp(App): # noqa: PLR0904
|
|
|
977
977
|
|
|
978
978
|
try:
|
|
979
979
|
from drydock.core.consultant import ask_consultant
|
|
980
|
+
# Build conversation history for context
|
|
981
|
+
history_lines = []
|
|
982
|
+
for msg in self.agent_loop.messages[-10:]: # Last 10 messages
|
|
983
|
+
if msg.role.value in ("user", "assistant") and msg.content:
|
|
984
|
+
history_lines.append(f"[{msg.role.value}]: {msg.content[:200]}")
|
|
985
|
+
conversation_history = "\n".join(history_lines)
|
|
986
|
+
|
|
980
987
|
advice = await ask_consultant(
|
|
981
988
|
question,
|
|
982
989
|
config=self.agent_loop.config,
|
|
983
990
|
model=consultant_model,
|
|
991
|
+
conversation_history=conversation_history,
|
|
984
992
|
)
|
|
985
993
|
|
|
986
994
|
if not advice or advice.startswith("(Consultant unavailable"):
|
|
@@ -1518,7 +1518,7 @@ class AgentLoop:
|
|
|
1518
1518
|
|
|
1519
1519
|
last_msg = self.messages[-1]
|
|
1520
1520
|
if last_msg.role is Role.tool:
|
|
1521
|
-
empty_assistant_msg = LLMMessage(role=Role.assistant, content="
|
|
1521
|
+
empty_assistant_msg = LLMMessage(role=Role.assistant, content="Continuing...")
|
|
1522
1522
|
self.messages.append(empty_assistant_msg)
|
|
1523
1523
|
|
|
1524
1524
|
def _reset_session(self) -> None:
|
|
@@ -28,6 +28,7 @@ async def ask_consultant(
|
|
|
28
28
|
question: str,
|
|
29
29
|
config: object | None = None,
|
|
30
30
|
model: str | None = None,
|
|
31
|
+
conversation_history: str = "",
|
|
31
32
|
) -> str:
|
|
32
33
|
"""Ask the consultant model a question using DryDock's backend.
|
|
33
34
|
|
|
@@ -52,10 +53,15 @@ async def ask_consultant(
|
|
|
52
53
|
if not model_name:
|
|
53
54
|
return ""
|
|
54
55
|
|
|
56
|
+
history_section = ""
|
|
57
|
+
if conversation_history:
|
|
58
|
+
history_section = f"\nCONVERSATION CONTEXT (recent messages):\n{conversation_history[:3000]}\n"
|
|
59
|
+
|
|
55
60
|
prompt = (
|
|
56
61
|
"You are a senior software engineering consultant. An AI coding agent is "
|
|
57
62
|
"asking for your advice. Give concise, actionable guidance. Do NOT provide "
|
|
58
|
-
"code unless specifically asked — just say WHAT to do and WHERE to look.\n
|
|
63
|
+
"code unless specifically asked — just say WHAT to do and WHERE to look.\n"
|
|
64
|
+
f"{history_section}\n"
|
|
59
65
|
f"QUESTION:\n{question}"
|
|
60
66
|
)
|
|
61
67
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
You are
|
|
1
|
+
You are DryDock, a CLI coding agent. You interact with a local codebase through tools. You have no internet access.
|
|
2
2
|
CRITICAL: Users complain you are too verbose. Your responses must be minimal. Most tasks need <100 words. Code speaks for itself.
|
|
3
3
|
|
|
4
4
|
Skills are markdown files in your skill directories, NOT tools or agents. To use a skill:
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: deep-research
|
|
3
|
+
description: Deep research a topic using web search, code exploration, and multi-step analysis. Produces a structured report.
|
|
4
|
+
user-invocable: true
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- bash
|
|
7
|
+
- grep
|
|
8
|
+
- read_file
|
|
9
|
+
- webfetch
|
|
10
|
+
- websearch
|
|
11
|
+
- write_file
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Deep Research
|
|
15
|
+
|
|
16
|
+
Conduct thorough research on a topic and produce a structured report.
|
|
17
|
+
|
|
18
|
+
## Workflow
|
|
19
|
+
|
|
20
|
+
1. **Clarify scope**: What exactly needs to be researched? Ask if unclear.
|
|
21
|
+
2. **Web search**: Use `websearch` for current information, articles, docs.
|
|
22
|
+
3. **Code exploration**: Use `grep` and `read_file` to find relevant code patterns.
|
|
23
|
+
4. **Cross-reference**: Compare web findings with codebase reality.
|
|
24
|
+
5. **Write report**: Produce a structured markdown report with findings.
|
|
25
|
+
|
|
26
|
+
## Report Template
|
|
27
|
+
|
|
28
|
+
Write the report to `research_report.md`:
|
|
29
|
+
|
|
30
|
+
```markdown
|
|
31
|
+
# Research: [Topic]
|
|
32
|
+
|
|
33
|
+
## Summary
|
|
34
|
+
One paragraph overview of findings.
|
|
35
|
+
|
|
36
|
+
## Key Findings
|
|
37
|
+
- Finding 1 with source
|
|
38
|
+
- Finding 2 with source
|
|
39
|
+
- Finding 3 with source
|
|
40
|
+
|
|
41
|
+
## Code Analysis
|
|
42
|
+
Relevant code patterns found in the codebase.
|
|
43
|
+
|
|
44
|
+
## Recommendations
|
|
45
|
+
Actionable next steps based on research.
|
|
46
|
+
|
|
47
|
+
## Sources
|
|
48
|
+
- [Source 1](url)
|
|
49
|
+
- [Source 2](url)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Rules
|
|
53
|
+
|
|
54
|
+
- Always cite sources (URLs for web, file:line for code)
|
|
55
|
+
- If websearch fails (SSL/network), fall back to code-only analysis
|
|
56
|
+
- Keep the report under 500 lines
|
|
57
|
+
- Focus on actionable findings, not background
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "drydock-cli"
|
|
3
|
-
version = "0.7.
|
|
3
|
+
version = "0.7.2"
|
|
4
4
|
description = "Drydock — nautical CLI coding agent"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.12"
|
|
@@ -76,6 +76,7 @@ include = ["drydock/"]
|
|
|
76
76
|
|
|
77
77
|
[tool.hatch.build.targets.wheel.force-include]
|
|
78
78
|
"drydock/skills/create-presentation" = "drydock/skills/create-presentation"
|
|
79
|
+
"drydock/skills/deep-research" = "drydock/skills/deep-research"
|
|
79
80
|
|
|
80
81
|
|
|
81
82
|
[project.scripts]
|
|
@@ -37,7 +37,7 @@ AUTH_URL="https://${GITHUB_TOKEN}@github.com/fbobe321/drydock.git"
|
|
|
37
37
|
|
|
38
38
|
log "Running regression tests..."
|
|
39
39
|
cd "$DRYDOCK_SRC"
|
|
40
|
-
if ! python3 -m pytest tests/test_drydock_regression.py tests/test_drydock_tasks.py tests/test_loop_detection.py tests/test_agent_tasks.py tests/test_integration.py \
|
|
40
|
+
if ! python3 -m pytest tests/test_drydock_regression.py tests/test_drydock_tasks.py tests/test_loop_detection.py tests/test_agent_tasks.py tests/test_integration.py tests/test_user_issues.py \
|
|
41
41
|
-p no:xdist -p no:cov --override-ini="addopts=" -q 2>&1; then
|
|
42
42
|
log "TESTS FAILED — deploy aborted. Fix the tests before deploying."
|
|
43
43
|
exit 1
|
|
@@ -25,7 +25,7 @@ PYPI_TOKEN=$(cat "$TOKEN_FILE")
|
|
|
25
25
|
|
|
26
26
|
# --- Run tests ---
|
|
27
27
|
log "Running regression tests..."
|
|
28
|
-
if ! $PYTHON -m pytest tests/test_drydock_regression.py tests/test_drydock_tasks.py tests/test_loop_detection.py tests/test_agent_tasks.py tests/test_integration.py \
|
|
28
|
+
if ! $PYTHON -m pytest tests/test_drydock_regression.py tests/test_drydock_tasks.py tests/test_loop_detection.py tests/test_agent_tasks.py tests/test_integration.py tests/test_user_issues.py \
|
|
29
29
|
-p no:xdist -p no:cov --override-ini="addopts=" -q 2>&1; then
|
|
30
30
|
log "TESTS FAILED — publish aborted."
|
|
31
31
|
exit 1
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
"""Tests for user-reported issues.
|
|
2
|
+
|
|
3
|
+
Each test should FAIL before the fix, proving the issue exists.
|
|
4
|
+
After fixing, all should pass.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import inspect
|
|
10
|
+
import os
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from types import SimpleNamespace
|
|
13
|
+
from unittest.mock import patch
|
|
14
|
+
|
|
15
|
+
import pytest
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# ============================================================================
|
|
19
|
+
# Issue 1: "DryDock" branding — should be DryDock not Drydock everywhere
|
|
20
|
+
# ============================================================================
|
|
21
|
+
|
|
22
|
+
class TestBranding:
|
|
23
|
+
def test_readme_says_drydock_capital(self):
|
|
24
|
+
readme = Path(__file__).parent.parent / "README.md"
|
|
25
|
+
content = readme.read_text()
|
|
26
|
+
# Title should be "# DryDock" not "# Drydock"
|
|
27
|
+
assert "# DryDock" in content
|
|
28
|
+
|
|
29
|
+
def test_system_prompt_says_drydock(self):
|
|
30
|
+
prompt = Path(__file__).parent.parent / "drydock" / "core" / "prompts" / "cli.md"
|
|
31
|
+
content = prompt.read_text()
|
|
32
|
+
# Should say "DryDock" not "Drydock" as the product name
|
|
33
|
+
assert "DryDock" in content
|
|
34
|
+
|
|
35
|
+
def test_loading_widget_says_drydock(self):
|
|
36
|
+
from drydock.cli.textual_ui.widgets.loading import LoadingWidget
|
|
37
|
+
widget = LoadingWidget.__new__(LoadingWidget)
|
|
38
|
+
status = widget._get_default_status()
|
|
39
|
+
# Anchor emoji is fine, but product references should be DryDock
|
|
40
|
+
assert status # Just verify it doesn't crash
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
# ============================================================================
|
|
44
|
+
# Issue 5: What conda env is pip using? Should preserve user's env
|
|
45
|
+
# ============================================================================
|
|
46
|
+
|
|
47
|
+
class TestCondaEnv:
|
|
48
|
+
def test_bash_env_preserves_active_conda(self):
|
|
49
|
+
"""If user has CONDA_DEFAULT_ENV set, bash should preserve it."""
|
|
50
|
+
from drydock.core.tools.builtins.bash import _get_base_env
|
|
51
|
+
with patch.dict(os.environ, {"CONDA_DEFAULT_ENV": "myproject", "CONDA_EXE": "/opt/conda/bin/conda"}):
|
|
52
|
+
env = _get_base_env()
|
|
53
|
+
# BASH_ENV should reference the user's env, not just base
|
|
54
|
+
if "BASH_ENV" in env:
|
|
55
|
+
bash_env_content = Path(env["BASH_ENV"]).read_text() if Path(env["BASH_ENV"]).exists() else ""
|
|
56
|
+
# Should activate the user's env, not just source conda.sh
|
|
57
|
+
assert "myproject" in bash_env_content or "CONDA_DEFAULT_ENV" in str(env)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
# ============================================================================
|
|
61
|
+
# Issue 6: Circuit breaker shows message but still repeats
|
|
62
|
+
# ============================================================================
|
|
63
|
+
|
|
64
|
+
class TestCircuitBreakerEnforcement:
|
|
65
|
+
def test_circuit_breaker_blocks_not_just_warns(self):
|
|
66
|
+
"""After 2 identical calls, the 3rd must return an ERROR, not execute."""
|
|
67
|
+
from drydock.core.agent_loop import AgentLoop
|
|
68
|
+
from drydock.core.types import MessageList
|
|
69
|
+
|
|
70
|
+
al = object.__new__(AgentLoop)
|
|
71
|
+
al.messages = MessageList()
|
|
72
|
+
al._tool_call_history = {}
|
|
73
|
+
|
|
74
|
+
tc = SimpleNamespace(tool_name="bash", args_dict={"command": "ls -ltr"})
|
|
75
|
+
al._circuit_breaker_record(tc, "file1.py")
|
|
76
|
+
al._circuit_breaker_record(tc, "file1.py")
|
|
77
|
+
|
|
78
|
+
result = al._circuit_breaker_check(tc)
|
|
79
|
+
assert result is not None, "Circuit breaker should block"
|
|
80
|
+
assert "CIRCUIT BREAKER" in result
|
|
81
|
+
# The blocked message should tell the model to STOP, not just warn
|
|
82
|
+
assert "STOP" in result or "Do NOT" in result or "MUST" in result
|
|
83
|
+
|
|
84
|
+
def test_circuit_breaker_resets_for_new_conversation(self):
|
|
85
|
+
"""Circuit breaker should reset between conversations, not cache forever."""
|
|
86
|
+
from drydock.core.agent_loop import AgentLoop
|
|
87
|
+
from drydock.core.types import MessageList
|
|
88
|
+
|
|
89
|
+
al = object.__new__(AgentLoop)
|
|
90
|
+
al.messages = MessageList()
|
|
91
|
+
al._tool_call_history = {}
|
|
92
|
+
|
|
93
|
+
tc = SimpleNamespace(tool_name="bash", args_dict={"command": "ls"})
|
|
94
|
+
al._circuit_breaker_record(tc, "r1")
|
|
95
|
+
al._circuit_breaker_record(tc, "r1")
|
|
96
|
+
assert al._circuit_breaker_check(tc) is not None # Blocked
|
|
97
|
+
|
|
98
|
+
# Simulate new conversation — history should be clearable
|
|
99
|
+
al._tool_call_history.clear()
|
|
100
|
+
assert al._circuit_breaker_check(tc) is None # Unblocked
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
# ============================================================================
|
|
104
|
+
# Issue 7: "Understood" after errors then stops
|
|
105
|
+
# ============================================================================
|
|
106
|
+
|
|
107
|
+
class TestUnderstoodBug:
|
|
108
|
+
def test_no_understood_in_agent(self):
|
|
109
|
+
"""The agent should not inject 'Understood.' which causes premature stops."""
|
|
110
|
+
from drydock.core.agent_loop import AgentLoop
|
|
111
|
+
src = inspect.getsource(AgentLoop)
|
|
112
|
+
# "Understood." was causing the model to think conversation ended
|
|
113
|
+
assert "Understood" not in src, \
|
|
114
|
+
"'Understood' found in agent_loop — should use 'Continuing...' instead"
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
# ============================================================================
|
|
118
|
+
# Issue 10: Circuit breaker too sensitive — same command later should be OK
|
|
119
|
+
# ============================================================================
|
|
120
|
+
|
|
121
|
+
class TestCircuitBreakerSensitivity:
|
|
122
|
+
def test_circuit_breaker_should_have_decay(self):
|
|
123
|
+
"""The circuit breaker should eventually allow re-running a command."""
|
|
124
|
+
from drydock.core.agent_loop import AgentLoop
|
|
125
|
+
from drydock.core.types import MessageList
|
|
126
|
+
|
|
127
|
+
al = object.__new__(AgentLoop)
|
|
128
|
+
al.messages = MessageList()
|
|
129
|
+
al._tool_call_history = {}
|
|
130
|
+
|
|
131
|
+
tc = SimpleNamespace(tool_name="bash", args_dict={"command": "git status"})
|
|
132
|
+
al._circuit_breaker_record(tc, "clean")
|
|
133
|
+
al._circuit_breaker_record(tc, "clean")
|
|
134
|
+
assert al._circuit_breaker_check(tc) is not None # Blocked
|
|
135
|
+
|
|
136
|
+
# After clearing (simulating passage of time / new task), should work again
|
|
137
|
+
al._tool_call_history.clear()
|
|
138
|
+
assert al._circuit_breaker_check(tc) is None
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
# ============================================================================
|
|
142
|
+
# Issue 11: /consult needs to show which model is being used
|
|
143
|
+
# ============================================================================
|
|
144
|
+
|
|
145
|
+
class TestConsultModelDisplay:
|
|
146
|
+
def test_consult_handler_shows_model_name(self):
|
|
147
|
+
"""The /consult response should include the model name."""
|
|
148
|
+
from drydock.cli.textual_ui.app import VibeApp
|
|
149
|
+
src = inspect.getsource(VibeApp._consult_command)
|
|
150
|
+
# Should display which model is being used
|
|
151
|
+
assert "consultant_model" in src or "model" in src
|
|
152
|
+
|
|
153
|
+
def test_consult_help_shows_config_instructions(self):
|
|
154
|
+
"""Typing /consult with no args should show how to configure."""
|
|
155
|
+
from drydock.cli.textual_ui.app import VibeApp
|
|
156
|
+
src = inspect.getsource(VibeApp._consult_command)
|
|
157
|
+
assert "config.toml" in src or "consultant_model" in src
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
# ============================================================================
|
|
161
|
+
# Issue 12: SSL error on websearch — should use -k / DRYDOCK_INSECURE
|
|
162
|
+
# ============================================================================
|
|
163
|
+
|
|
164
|
+
class TestWebSearchSSL:
|
|
165
|
+
def test_websearch_respects_insecure_flag(self):
|
|
166
|
+
"""WebSearch should check DRYDOCK_INSECURE env var."""
|
|
167
|
+
from drydock.core.tools.builtins.websearch import WebSearch
|
|
168
|
+
src = inspect.getsource(WebSearch)
|
|
169
|
+
assert "DRYDOCK_INSECURE" in src or "insecure" in src.lower() or "verify" in src
|
|
170
|
+
|
|
171
|
+
def test_webfetch_respects_insecure_flag(self):
|
|
172
|
+
"""WebFetch should check DRYDOCK_INSECURE env var."""
|
|
173
|
+
from drydock.core.tools.builtins.webfetch import WebFetch
|
|
174
|
+
src = inspect.getsource(WebFetch)
|
|
175
|
+
assert "DRYDOCK_INSECURE" in src
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
# ============================================================================
|
|
179
|
+
# Issue 14: Config.toml consultant_model setup
|
|
180
|
+
# ============================================================================
|
|
181
|
+
|
|
182
|
+
class TestConsultantConfig:
|
|
183
|
+
def test_config_has_consultant_model_field(self):
|
|
184
|
+
"""VibeConfig should have consultant_model field."""
|
|
185
|
+
from drydock.core.config import VibeConfig
|
|
186
|
+
assert hasattr(VibeConfig, "model_fields")
|
|
187
|
+
assert "consultant_model" in VibeConfig.model_fields
|
|
188
|
+
|
|
189
|
+
def test_consultant_model_documented_in_readme(self):
|
|
190
|
+
"""README should mention how to set consultant_model."""
|
|
191
|
+
readme = Path(__file__).parent.parent / "README.md"
|
|
192
|
+
content = readme.read_text()
|
|
193
|
+
assert "consultant_model" in content or "consultant" in content.lower()
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
# ============================================================================
|
|
197
|
+
# Issue 15: Auto-consult agent — model should ask consultant when stuck
|
|
198
|
+
# ============================================================================
|
|
199
|
+
|
|
200
|
+
class TestAutoConsult:
|
|
201
|
+
def test_circuit_breaker_suggests_consult(self):
|
|
202
|
+
"""When circuit breaker fires, it should mention /consult."""
|
|
203
|
+
from drydock.core.agent_loop import AgentLoop
|
|
204
|
+
from drydock.core.types import MessageList
|
|
205
|
+
|
|
206
|
+
al = object.__new__(AgentLoop)
|
|
207
|
+
al.messages = MessageList()
|
|
208
|
+
al._tool_call_history = {}
|
|
209
|
+
|
|
210
|
+
tc = SimpleNamespace(tool_name="bash", args_dict={"command": "ls"})
|
|
211
|
+
al._circuit_breaker_record(tc, "output")
|
|
212
|
+
al._circuit_breaker_record(tc, "output")
|
|
213
|
+
result = al._circuit_breaker_check(tc)
|
|
214
|
+
# Should suggest using /consult or mention consultant
|
|
215
|
+
assert "/consult" in result or "consultant" in result.lower() or "different" in result.lower()
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
# ============================================================================
|
|
219
|
+
# Issue 16: /consult should include conversation history
|
|
220
|
+
# ============================================================================
|
|
221
|
+
|
|
222
|
+
class TestConsultHistory:
|
|
223
|
+
def test_consult_sends_context(self):
|
|
224
|
+
"""/consult handler should send conversation context to consultant."""
|
|
225
|
+
from drydock.core.consultant import ask_consultant
|
|
226
|
+
src = inspect.getsource(ask_consultant)
|
|
227
|
+
# Should accept and use context/conversation history
|
|
228
|
+
assert "context" in src or "messages" in src or "history" in src
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
# ============================================================================
|
|
232
|
+
# Issue 17: Deep research skill should exist
|
|
233
|
+
# ============================================================================
|
|
234
|
+
|
|
235
|
+
class TestDeepResearchSkill:
|
|
236
|
+
def test_research_skill_exists(self):
|
|
237
|
+
"""A deep-research skill should be bundled."""
|
|
238
|
+
skills_dir = Path(__file__).parent.parent / "drydock" / "skills"
|
|
239
|
+
skill_dirs = [d.name for d in skills_dir.iterdir() if d.is_dir()] if skills_dir.exists() else []
|
|
240
|
+
has_research = any("research" in d for d in skill_dirs)
|
|
241
|
+
assert has_research, f"No research skill found. Available: {skill_dirs}"
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
# ============================================================================
|
|
245
|
+
# Issue 18: Not using agents — explore/diagnostic agents should be utilized
|
|
246
|
+
# ============================================================================
|
|
247
|
+
|
|
248
|
+
class TestAgentsAvailable:
|
|
249
|
+
def test_explore_agent_registered(self):
|
|
250
|
+
"""The 'explore' agent should be registered."""
|
|
251
|
+
from drydock.core.agents.models import BuiltinAgentName
|
|
252
|
+
assert hasattr(BuiltinAgentName, "EXPLORE") or "explore" in dir(BuiltinAgentName)
|
|
253
|
+
|
|
254
|
+
def test_system_prompt_mentions_agents(self):
|
|
255
|
+
"""System prompt should tell the model about available agents."""
|
|
256
|
+
prompt = Path(__file__).parent.parent / "drydock" / "core" / "prompts" / "cli.md"
|
|
257
|
+
content = prompt.read_text()
|
|
258
|
+
has_agent_ref = "agent" in content.lower() or "subagent" in content.lower() or "task" in content.lower()
|
|
259
|
+
assert has_agent_ref
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/notifications/adapters/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{drydock_cli-0.7.1 → drydock_cli-0.7.2}/drydock/cli/textual_ui/notifications/ports/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|