drydock-cli 1.5.2__tar.gz → 1.5.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/PKG-INFO +1 -1
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/PRD.md +149 -17
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/agent_loop.py +22 -6
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/pyproject.toml +1 -1
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/scripts/deploy_to_github.sh +5 -2
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/scripts/publish_to_pypi.sh +22 -1
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/scripts/test_bank.sh +12 -2
- drydock_cli-1.5.4/scripts/test_full.sh +26 -0
- drydock_cli-1.5.2/scripts/test_full.sh +0 -17
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/.github/CODEOWNERS +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/.github/workflows/ci.yml +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/.github/workflows/release.yml +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/.gitignore +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/.pre-commit-config.yaml +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/.python-version +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/.typos.toml +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/.vscode/extensions.json +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/.vscode/launch.json +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/.vscode/settings.json +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/AGENTS.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/CHANGELOG.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/CLAUDE.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/CONTRIBUTING.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/Drydock_rebrand.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/LICENSE +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/NOTICE +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/README.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/action.yml +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/distribution/zed/LICENSE +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/distribution/zed/extension.toml +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/docs/README.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/docs/acp-setup.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/docs/proxy-setup.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/acp/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/acp/utils.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/cli.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/commands.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/agents/models.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/auth/github.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/consultant.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/hooks.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/llm/format.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/llm/types.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/logger.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/middleware.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/plan_session.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/plugins.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/programmatic.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/skills/models.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/slug.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/base.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/task_manager.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/types.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/core/utils.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/skills/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/whats_new.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock-acp.spec +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock_terms.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/flake.lock +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/flake.nix +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/scripts/README.md +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/scripts/backup.sh +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/scripts/bump_version.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/scripts/install.sh +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/scripts/monitor_test_battery.sh +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/scripts/prepare_release.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/scripts/test_smoke.sh +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/conftest.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/test_acp.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/test_bash.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/test_content.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/test_utils.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/backend/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/backend/test_backend.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/cli/test_commands.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/conftest.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/core/test_agents.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/core/test_slug.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/core/test_utils.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/e2e/common.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/e2e/conftest.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/mock/__init__.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/mock/utils.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/skills/conftest.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/skills/test_manager.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/skills/test_models.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/skills/test_parser.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_agent_backend.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_agent_stats.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_agents.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_bank_build.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_bank_debug.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_bank_prd.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_bank_tools.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_bank_update.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_build_projects.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_current_bugs.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_full_regression.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_history_manager.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_integration.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_loop_detection.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_message_id.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_message_merging.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_middleware.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_multi_agent.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_real_failures.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_real_issues.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_real_workflow.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_smoke.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_system_prompt.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_tagged_text.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_user_issues.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/test_workloads.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/testbank_helpers.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/tools/test_bash.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/tools/test_grep.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/tools/test_task.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-1.5.2 → drydock_cli-1.5.4}/uv.lock +0 -0
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
# DryDock — Local CLI Coding Agent
|
|
2
2
|
|
|
3
3
|
**Repository:** https://github.com/fbobe321/drydock
|
|
4
|
-
**PyPI:** https://pypi.org/project/drydock-cli/ (v1.5.
|
|
4
|
+
**PyPI:** https://pypi.org/project/drydock-cli/ (v1.5.3)
|
|
5
5
|
**License:** Apache 2.0 (fork of [mistralai/mistral-vibe](https://github.com/mistralai/mistral-vibe))
|
|
6
|
-
**Status:** Active development
|
|
6
|
+
**Status:** Active development
|
|
7
|
+
**Current version:** 1.5.3
|
|
8
|
+
**Hardware:** 2x RTX 4060 Ti 16GB, devstral-24B-AWQ-4bit via vLLM at localhost:8000
|
|
9
|
+
**Server:** remus (Ubuntu 22.04, user: bobef)
|
|
7
10
|
|
|
8
11
|
---
|
|
9
12
|
|
|
@@ -30,31 +33,143 @@ Scripts:
|
|
|
30
33
|
|
|
31
34
|
---
|
|
32
35
|
|
|
36
|
+
## Configuration Management
|
|
37
|
+
|
|
38
|
+
**CRITICAL: Every script and cron MUST follow these rules.**
|
|
39
|
+
|
|
40
|
+
### Python Path
|
|
41
|
+
All scripts use explicit Python path, never bare `python3`:
|
|
42
|
+
```bash
|
|
43
|
+
export PATH="/home/bobef/miniconda3/bin:$PATH"
|
|
44
|
+
PYTHON="/home/bobef/miniconda3/bin/python3"
|
|
45
|
+
```
|
|
46
|
+
**Why:** Cron environment doesn't inherit shell PATH. Bare `python3` resolves to `/usr/bin/python3` (system Python, no packages). This caused an 8-hour crash loop where the test battery restarted every 10 minutes and immediately failed.
|
|
47
|
+
|
|
48
|
+
### Version Tracking
|
|
49
|
+
- `pyproject.toml` is the single source of truth for version
|
|
50
|
+
- `publish_to_pypi.sh` creates git tags (`v1.5.3`, etc.)
|
|
51
|
+
- `publish_to_pypi.sh` runs post-publish integration test (install in venv, verify version)
|
|
52
|
+
- Test scripts log version before running
|
|
53
|
+
|
|
54
|
+
### Cron Jobs (DryDock)
|
|
55
|
+
| Schedule | Script | Purpose |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| 2 AM daily | `test_full.sh` | Nightly regression (smoke + real backend) |
|
|
58
|
+
| 3 AM daily | `backup.sh` | rsync to NAS |
|
|
59
|
+
| 4 AM daily | `deploy_to_github.sh` | Sync code to GitHub |
|
|
60
|
+
| Every 10 min | `monitor_test_battery.sh` | Monitor/restart long test runs |
|
|
61
|
+
|
|
62
|
+
### Pre-Publish Checklist
|
|
63
|
+
1. All smoke tests pass (169 tests)
|
|
64
|
+
2. Version bumped in pyproject.toml
|
|
65
|
+
3. Build succeeds
|
|
66
|
+
4. Upload to PyPI
|
|
67
|
+
5. Git tag created
|
|
68
|
+
6. Integration test: install from wheel in temp venv, verify version matches
|
|
69
|
+
7. Deploy to GitHub
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## File Locations (CRITICAL for session continuity)
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
/data3/drydock/ ← Main repo (git)
|
|
77
|
+
├── drydock/ ← Python package (source code)
|
|
78
|
+
│ ├── core/
|
|
79
|
+
│ │ ├── agent_loop.py ← THE most important file. Loop detection, circuit breaker, auto-delegation
|
|
80
|
+
│ │ ├── prompts/cli.md ← System prompt (debugging rules, tool usage, import rules)
|
|
81
|
+
│ │ ├── tools/builtins/ ← 24 builtin tools
|
|
82
|
+
│ │ ├── agents/ ← Subagent definitions (explore, diagnostic, planner)
|
|
83
|
+
│ │ └── skills/ ← Skill framework
|
|
84
|
+
│ ├── cli/textual_ui/app.py ← TUI application
|
|
85
|
+
│ └── skills/ ← 7 bundled skill markdown files
|
|
86
|
+
├── tests/
|
|
87
|
+
│ ├── test_smoke.py ← 20 fast tests (imports, branding, safety)
|
|
88
|
+
│ ├── test_loop_detection.py ← 38 loop/circuit breaker tests
|
|
89
|
+
│ ├── test_drydock_*.py ← ~100 regression tests
|
|
90
|
+
│ ├── test_bank_prd.py ← 15 PRD-driven tests (CORE usability tests)
|
|
91
|
+
│ ├── test_bank_prd_extended.py ← 50 extended PRD tests (overnight battery)
|
|
92
|
+
│ ├── test_bank_build.py ← 25 build tests
|
|
93
|
+
│ ├── test_bank_debug.py ← 20 debug tests
|
|
94
|
+
│ ├── test_bank_update.py ← 15 update tests
|
|
95
|
+
│ ├── test_bank_multiagent.py ← 10 multi-agent tests
|
|
96
|
+
│ ├── test_bank_tools.py ← 13 tool integration tests
|
|
97
|
+
│ └── testbank_helpers.py ← Shared test infrastructure
|
|
98
|
+
├── scripts/
|
|
99
|
+
│ ├── deploy_to_github.sh ← Clone GitHub, sync, push (daily 4 AM)
|
|
100
|
+
│ ├── publish_to_pypi.sh ← Tests → build → PyPI → tag → integration test
|
|
101
|
+
│ ├── test_full.sh ← Smoke + real backend regression (nightly 2 AM)
|
|
102
|
+
│ ├── test_bank.sh ← 83-test bank runner with category selection
|
|
103
|
+
│ ├── monitor_test_battery.sh ← Cron monitor: restart stuck tests, skip repeat failures
|
|
104
|
+
│ ├── backup.sh ← rsync to NAS (daily 3 AM)
|
|
105
|
+
│ └── install.sh ← User installation script
|
|
106
|
+
├── test_bank_results/ ← Test logs (overnight runs, partial results)
|
|
107
|
+
├── pyproject.toml ← Version, dependencies, build config
|
|
108
|
+
├── CLAUDE.md ← Instructions for AI assistants working on this repo
|
|
109
|
+
└── PRD.md ← This file
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
/data3/swe_bench_runs/ ← SWE-bench infrastructure (SEPARATE from drydock repo)
|
|
114
|
+
├── harness.py ← Runs drydock on SWE-bench tasks
|
|
115
|
+
├── continuous_bench.sh ← Continuous improvement loop (CURRENTLY PAUSED)
|
|
116
|
+
├── analyze_batch.py ← Post-batch analysis
|
|
117
|
+
├── auto_fix.py ← Auto-apply prompt fixes
|
|
118
|
+
└── monitor_health.sh ← Worktree cleanup (CURRENTLY PAUSED)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
~/.config/drydock/
|
|
123
|
+
├── github_token ← GitHub PAT for push/deploy
|
|
124
|
+
└── pypi_token ← PyPI API token for publishing
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Key Paths
|
|
128
|
+
- **vLLM server:** http://localhost:8000 (devstral-24B-AWQ-4bit)
|
|
129
|
+
- **NAS backup:** 192.168.50.183 via rsync
|
|
130
|
+
- **Conda env:** `/home/bobef/miniconda3/bin/python3` (ALWAYS use this, never bare `python3`)
|
|
131
|
+
- **Git remotes:** `drydock` → github.com/fbobe321/drydock, `origin` → github.com/mistralai/mistral-vibe
|
|
132
|
+
- **Main branch:** `main` (push to `drydock` remote, not `origin`)
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
33
136
|
## Test Suite
|
|
34
137
|
|
|
35
|
-
| Tier | File | Tests | Backend | Time | When |
|
|
36
|
-
|
|
138
|
+
| Tier | File(s) | Tests | Backend | Time | When |
|
|
139
|
+
|------|---------|-------|---------|------|------|
|
|
37
140
|
| **Smoke** | `test_smoke.py` | 20 | None | <1s | Every deploy |
|
|
141
|
+
| **Loop Detection** | `test_loop_detection.py` | 38 | None | <1s | Every deploy |
|
|
142
|
+
| **Regression** | `test_drydock_*.py` | ~100 | None | ~1min | Every deploy |
|
|
38
143
|
| **Full Regression** | `test_full_regression.py` | 13 | Real vLLM | 5-10 min | Nightly 2 AM |
|
|
144
|
+
| **PRD Battery** | `test_bank_prd.py` | 15 | Real vLLM | ~20 min | On demand |
|
|
145
|
+
| **Extended PRD** | `test_bank_prd_extended.py` | 50 | Real vLLM | ~3-6 hours | Overnight |
|
|
146
|
+
| **Build/Debug/Update** | `test_bank_*.py` | 83 | Real vLLM | ~90 min | On demand |
|
|
147
|
+
|
|
148
|
+
**Run commands:**
|
|
149
|
+
```bash
|
|
150
|
+
# Quick smoke (every change)
|
|
151
|
+
python3 -m pytest tests/test_smoke.py tests/test_loop_detection.py -q
|
|
152
|
+
|
|
153
|
+
# All fast tests (before commit)
|
|
154
|
+
python3 -m pytest tests/test_drydock_regression.py tests/test_drydock_tasks.py tests/test_loop_detection.py tests/test_smoke.py -q
|
|
155
|
+
|
|
156
|
+
# PRD battery (user-realistic, needs vLLM)
|
|
157
|
+
python3 -m pytest tests/test_bank_prd.py -v -s
|
|
158
|
+
|
|
159
|
+
# Overnight (needs vLLM, 3-6 hours)
|
|
160
|
+
nohup python3 -m pytest tests/test_bank_prd.py tests/test_bank_prd_extended.py -v --tb=short > test_bank_results/run.log 2>&1 &
|
|
161
|
+
```
|
|
39
162
|
|
|
40
163
|
---
|
|
41
164
|
|
|
42
|
-
##
|
|
165
|
+
## SWE-bench (CURRENTLY PAUSED)
|
|
43
166
|
|
|
44
|
-
|
|
45
|
-
|--------|----------|-------------|
|
|
46
|
-
| `continuous_bench.sh` | Always running | SWE-bench batches (20 tasks, 600s timeout) |
|
|
47
|
-
| `analyze_batch.py` | After each batch | Detects crash patterns, multi-file misses, test edits |
|
|
48
|
-
| `auto_fix.py` | After analysis | Applies safe prompt fixes based on patterns |
|
|
49
|
-
| `monitor_health.sh` | Every 30 min | Prunes worktrees, checks vLLM, disk space, pass rates |
|
|
50
|
-
| `deploy_to_github.sh` | Daily 4 AM | Smoke tests → push to GitHub |
|
|
51
|
-
| `backup.sh` | Daily 3 AM | rsync to NAS (192.168.50.183) |
|
|
52
|
-
| `@reboot` cron | On restart | Restarts bench loop after 2 min |
|
|
167
|
+
Infrastructure at `/data3/swe_bench_runs/` (not in drydock repo). Paused to focus on usability testing.
|
|
53
168
|
|
|
54
|
-
**Latest
|
|
169
|
+
**Latest results (Mar 28):**
|
|
55
170
|
- 2,220/2,294 unique tasks tested (97%)
|
|
56
|
-
-
|
|
57
|
-
-
|
|
171
|
+
- Pass rate: **39-42%** (up from 17% baseline)
|
|
172
|
+
- Crons removed — re-enable with `continuous_bench.sh` when ready
|
|
58
173
|
|
|
59
174
|
---
|
|
60
175
|
|
|
@@ -279,3 +394,20 @@ User reported DryDock was unusable — model looped 12+ times running the same c
|
|
|
279
394
|
Run with: `./scripts/test_bank.sh` (full) or `./scripts/test_bank.sh quick` (easy only, ~2h)
|
|
280
395
|
|
|
281
396
|
**Removed:** False-positive test file guard in search_replace that blocked any file in a directory containing "test" in its name.
|
|
397
|
+
|
|
398
|
+
### Phase 12 (Mar 29): Configuration Management + Auto-Delegation + PRD Tests
|
|
399
|
+
|
|
400
|
+
**Config management crisis:** Overnight test battery crashed for 8 hours because cron used system Python (no pytest). All scripts now use explicit `/home/bobef/miniconda3/bin/python3`.
|
|
401
|
+
|
|
402
|
+
**Auto-delegation:** Model wasn't using subagents despite prompt instructions. Fixed by injecting context automatically before the model's first turn:
|
|
403
|
+
- Project file listing (replaces explore subagent)
|
|
404
|
+
- Skill content injection (matches prompt keywords to skills)
|
|
405
|
+
- Planning prompt for complex builds (forces absolute imports, python3 -m)
|
|
406
|
+
|
|
407
|
+
**Circuit breaker reset:** After write_file/search_replace, circuit breaker history clears. Previously-failing commands can be retried after code changes.
|
|
408
|
+
|
|
409
|
+
**Post-success stop:** After 3 successful bash runs, model is told to stop testing and summarize.
|
|
410
|
+
|
|
411
|
+
**PRD-driven test bank:** 65 tests (15 core + 50 extended) that give DryDock a PRD and verify the built project RUNS. Core 15 pass at 100%.
|
|
412
|
+
|
|
413
|
+
**Relative import auto-fix:** When model gets "relative import with no known parent package", agent loop explains absolute imports vs python3 -m and forces search_replace.
|
|
@@ -193,6 +193,7 @@ class AgentLoop:
|
|
|
193
193
|
self._tool_call_history: dict[str, tuple[int, str]] = {}
|
|
194
194
|
self._consecutive_circuit_breaker_fires: int = 0
|
|
195
195
|
self._empty_responses: int = 0
|
|
196
|
+
self._successful_test_runs: int = 0
|
|
196
197
|
|
|
197
198
|
system_prompt = get_universal_system_prompt(
|
|
198
199
|
self.tool_manager, self.config, self.skill_manager, self.agent_manager
|
|
@@ -571,6 +572,10 @@ class AgentLoop:
|
|
|
571
572
|
first_edit = not has_made_edit
|
|
572
573
|
has_made_edit = True
|
|
573
574
|
bash_count = 0 # Reset on successful edit
|
|
575
|
+
# Reset circuit breaker — the world changed after an edit,
|
|
576
|
+
# so previously-failing commands may now succeed
|
|
577
|
+
self._tool_call_history.clear()
|
|
578
|
+
self._consecutive_circuit_breaker_fires = 0
|
|
574
579
|
# Track blast radius
|
|
575
580
|
try:
|
|
576
581
|
edit_args = json.loads(tc.function.arguments or "{}")
|
|
@@ -644,13 +649,13 @@ class AgentLoop:
|
|
|
644
649
|
consecutive_bash += 1
|
|
645
650
|
else:
|
|
646
651
|
break
|
|
647
|
-
if consecutive_bash >=
|
|
652
|
+
if consecutive_bash >= 3:
|
|
648
653
|
self._inject_system_note(
|
|
649
|
-
"You have run
|
|
650
|
-
"
|
|
651
|
-
"
|
|
652
|
-
"
|
|
653
|
-
"
|
|
654
|
+
"You have run 3+ bash commands in a row. "
|
|
655
|
+
"If your project is WORKING, you are DONE — tell the user the project "
|
|
656
|
+
"is complete and what commands they can use. "
|
|
657
|
+
"If it is FAILING, STOP running bash and use read_file + search_replace "
|
|
658
|
+
"to fix the code. Do NOT keep running the same test."
|
|
654
659
|
)
|
|
655
660
|
|
|
656
661
|
# Detect bash file creation (touch, echo >, cat <<)
|
|
@@ -1169,6 +1174,17 @@ class AgentLoop:
|
|
|
1169
1174
|
|
|
1170
1175
|
result_dict = result_model.model_dump()
|
|
1171
1176
|
text = "\n".join(f"{k}: {v}" for k, v in result_dict.items())
|
|
1177
|
+
|
|
1178
|
+
# After a successful bash test of built code, nudge to wrap up
|
|
1179
|
+
if tool_call.tool_name in ("bash", "run_command"):
|
|
1180
|
+
self._successful_test_runs += 1
|
|
1181
|
+
if self._successful_test_runs >= 3:
|
|
1182
|
+
self._inject_system_note(
|
|
1183
|
+
"Your project is WORKING. You have verified it successfully. "
|
|
1184
|
+
"STOP testing. Summarize what you built and tell the user "
|
|
1185
|
+
"how to use it. Do NOT run any more bash commands."
|
|
1186
|
+
)
|
|
1187
|
+
|
|
1172
1188
|
# Record for circuit breaker
|
|
1173
1189
|
self._circuit_breaker_record(tool_call, text)
|
|
1174
1190
|
self._handle_tool_response(
|
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
|
|
8
8
|
set -euo pipefail
|
|
9
9
|
|
|
10
|
+
export PATH="/home/bobef/miniconda3/bin:$PATH"
|
|
11
|
+
PYTHON="/home/bobef/miniconda3/bin/python3"
|
|
12
|
+
|
|
10
13
|
DRYDOCK_SRC="/data3/drydock"
|
|
11
14
|
GITHUB_REPO="https://github.com/fbobe321/drydock.git"
|
|
12
15
|
TOKEN_FILE="$HOME/.config/drydock/github_token"
|
|
@@ -37,8 +40,8 @@ AUTH_URL="https://${GITHUB_TOKEN}@github.com/fbobe321/drydock.git"
|
|
|
37
40
|
|
|
38
41
|
log "Running regression tests..."
|
|
39
42
|
cd "$DRYDOCK_SRC"
|
|
40
|
-
|
|
41
|
-
if !
|
|
43
|
+
$PYTHON -m pip install -q "pytest>=9.0" 2>/dev/null
|
|
44
|
+
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 tests/test_real_issues.py \
|
|
42
45
|
-p no:xdist -p no:cov --override-ini="addopts=" -q 2>&1; then
|
|
43
46
|
log "TESTS FAILED — deploy aborted. Fix the tests before deploying."
|
|
44
47
|
exit 1
|
|
@@ -9,7 +9,8 @@ set -euo pipefail
|
|
|
9
9
|
|
|
10
10
|
DRYDOCK_SRC="/data3/drydock"
|
|
11
11
|
TOKEN_FILE="$HOME/.config/drydock/pypi_token"
|
|
12
|
-
PYTHON="python3"
|
|
12
|
+
PYTHON="/home/bobef/miniconda3/bin/python3"
|
|
13
|
+
export PATH="/home/bobef/miniconda3/bin:$PATH"
|
|
13
14
|
|
|
14
15
|
cd "$DRYDOCK_SRC"
|
|
15
16
|
|
|
@@ -71,4 +72,24 @@ if [ -x "$DRYDOCK_SRC/scripts/deploy_to_github.sh" ]; then
|
|
|
71
72
|
"$DRYDOCK_SRC/scripts/deploy_to_github.sh" 2>&1 || log "GitHub deploy failed (non-fatal)"
|
|
72
73
|
fi
|
|
73
74
|
|
|
75
|
+
# --- Git tag ---
|
|
76
|
+
git tag -a "v$NEW_VERSION" -m "Release v$NEW_VERSION" 2>/dev/null || true
|
|
77
|
+
log "Tagged v$NEW_VERSION"
|
|
78
|
+
|
|
79
|
+
# --- Quick integration test (install in temp venv and verify) ---
|
|
80
|
+
log "Running integration test..."
|
|
81
|
+
TMPVENV=$(mktemp -d)
|
|
82
|
+
$PYTHON -m venv "$TMPVENV/venv" 2>/dev/null
|
|
83
|
+
if "$TMPVENV/venv/bin/pip" install -q "dist/drydock_cli-${NEW_VERSION}-py3-none-any.whl" 2>/dev/null; then
|
|
84
|
+
INSTALLED_VER=$("$TMPVENV/venv/bin/python3" -c "from importlib.metadata import version; print(version('drydock-cli'))" 2>/dev/null || echo "unknown")
|
|
85
|
+
if [ "$INSTALLED_VER" = "$NEW_VERSION" ]; then
|
|
86
|
+
log "Integration test PASSED: installed version $INSTALLED_VER matches"
|
|
87
|
+
else
|
|
88
|
+
log "WARNING: version mismatch — expected $NEW_VERSION, got $INSTALLED_VER"
|
|
89
|
+
fi
|
|
90
|
+
else
|
|
91
|
+
log "WARNING: integration test failed to install (non-fatal)"
|
|
92
|
+
fi
|
|
93
|
+
rm -rf "$TMPVENV"
|
|
94
|
+
|
|
74
95
|
log "Published drydock-cli $NEW_VERSION to PyPI"
|
|
@@ -14,9 +14,19 @@
|
|
|
14
14
|
set -euo pipefail
|
|
15
15
|
cd "$(dirname "$0")/.."
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
export PATH="/home/bobef/miniconda3/bin:$PATH"
|
|
18
|
+
PYTHON="/home/bobef/miniconda3/bin/python3"
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
$PYTHON -m pip install -q "pytest>=9.0" pytest-asyncio httpx 2>/dev/null
|
|
21
|
+
|
|
22
|
+
# Version gate — log what we're testing
|
|
23
|
+
VERSION=$($PYTHON -c "import tomli; print(tomli.load(open('pyproject.toml','rb'))['project']['version'])" 2>/dev/null || echo "unknown")
|
|
24
|
+
echo "Testing drydock source version: $VERSION"
|
|
25
|
+
echo "Python: $($PYTHON --version)"
|
|
26
|
+
echo "vLLM: $(curl -s http://localhost:8000/v1/models | python3 -c 'import json,sys; print(json.load(sys.stdin)["data"][0]["id"])' 2>/dev/null || echo 'NOT RUNNING')"
|
|
27
|
+
echo ""
|
|
28
|
+
|
|
29
|
+
COMMON_ARGS="-v -p no:xdist -p no:cov --override-ini=addopts="
|
|
20
30
|
CATEGORY="${1:-all}"
|
|
21
31
|
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
22
32
|
LOG_DIR="test_bank_results"
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# FULL REGRESSION — Run nightly or before releases (5-10 min)
|
|
3
|
+
# Requires vLLM at localhost:8000. Real backend, no mocks.
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
cd "$(dirname "$0")/.."
|
|
6
|
+
|
|
7
|
+
export PATH="/home/bobef/miniconda3/bin:$PATH"
|
|
8
|
+
PYTHON="/home/bobef/miniconda3/bin/python3"
|
|
9
|
+
|
|
10
|
+
$PYTHON -m pip install -q "pytest>=9.0" pytest-asyncio 2>/dev/null
|
|
11
|
+
|
|
12
|
+
VERSION=$(grep '^version' pyproject.toml | head -1 | sed 's/.*"\(.*\)".*/\1/')
|
|
13
|
+
echo "Drydock v$VERSION — $(date)"
|
|
14
|
+
echo "Python: $($PYTHON --version)"
|
|
15
|
+
echo ""
|
|
16
|
+
|
|
17
|
+
echo "=== SMOKE TESTS ==="
|
|
18
|
+
$PYTHON -m pytest tests/test_smoke.py -p no:xdist -p no:cov --override-ini="addopts=" -q
|
|
19
|
+
|
|
20
|
+
echo ""
|
|
21
|
+
echo "=== FULL REGRESSION (real backend) ==="
|
|
22
|
+
$PYTHON -m pytest tests/test_full_regression.py -v -p no:xdist -p no:cov --override-ini="addopts="
|
|
23
|
+
|
|
24
|
+
echo ""
|
|
25
|
+
echo "=== BUILD PROJECT TESTS (real backend, 30-60 min) ==="
|
|
26
|
+
$PYTHON -m pytest tests/test_build_projects.py -v -s -p no:xdist -p no:cov --override-ini="addopts="
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# FULL REGRESSION — Run nightly or before releases (5-10 min)
|
|
3
|
-
# Requires vLLM at localhost:8000. Real backend, no mocks.
|
|
4
|
-
set -euo pipefail
|
|
5
|
-
cd "$(dirname "$0")/.."
|
|
6
|
-
pip install -q "pytest>=9.0" pytest-asyncio 2>/dev/null
|
|
7
|
-
|
|
8
|
-
echo "=== SMOKE TESTS ==="
|
|
9
|
-
python3 -m pytest tests/test_smoke.py -p no:xdist -p no:cov --override-ini="addopts=" -q
|
|
10
|
-
|
|
11
|
-
echo ""
|
|
12
|
-
echo "=== FULL REGRESSION (real backend) ==="
|
|
13
|
-
python3 -m pytest tests/test_full_regression.py -v -p no:xdist -p no:cov --override-ini="addopts="
|
|
14
|
-
|
|
15
|
-
echo ""
|
|
16
|
-
echo "=== BUILD PROJECT TESTS (real backend, 30-60 min) ==="
|
|
17
|
-
python3 -m pytest tests/test_build_projects.py -v -s -p no:xdist -p no:cov --override-ini="addopts="
|
|
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-1.5.2 → drydock_cli-1.5.4}/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
|
|
File without changes
|
{drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/notifications/adapters/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/notifications/ports/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/chat_input/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/chat_input/container.py
RENAMED
|
File without changes
|
{drydock_cli-1.5.2 → drydock_cli-1.5.4}/drydock/cli/textual_ui/widgets/chat_input/text_area.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
|