drydock-cli 2.6.38__tar.gz → 2.6.42__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- drydock_cli-2.6.42/.auto_release.lock +1 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/CLAUDE.md +59 -5
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/PKG-INFO +7 -7
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/README.md +6 -6
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/pyproject.toml +1 -1
- drydock_cli-2.6.42/scripts/comprehensive_loop.py +425 -0
- drydock_cli-2.6.42/scripts/oss_task_harness.py +368 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/ralph_loop.py +37 -18
- drydock_cli-2.6.38/.auto_release.lock +0 -1
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/.claude/scheduled_tasks.lock +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/.gitignore +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/.python-version +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/.typos.toml +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/.vscode/extensions.json +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/.vscode/launch.json +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/.vscode/settings.json +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/AGENTS.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/CHANGELOG.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/Drydock_rebrand.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/LICENSE +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/NOTICE +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/PRD.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/action.yml +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/docs/README.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/docs/acp-setup.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/agent_loop.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/logger.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/prompts/gemma4.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/slug.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/types.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/core/utils.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock/whats_new.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock-acp.spec +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/drydock_terms.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/flake.lock +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/flake.nix +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/README.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/auto_release.sh +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/auto_test_loop.sh +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/backup.sh +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/bump_version.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/discover_cli_tools.sh +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/install.sh +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/llm_balancer.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/monitor_swebench.sh +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/monitor_test_battery.sh +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/notify_release.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/overnight_agents_test.sh +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/prepare_release.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/shakedown.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/shakedown_interactive.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/shakedown_regression.sh +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/shakedown_suite.sh +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/shakedown_variance.sh +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/test_bank.sh +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/test_full.sh +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/test_smoke.sh +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/test_tui_path.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/tui_test.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/scripts/vllm_failover.sh +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/conftest.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/e2e/common.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/mock/utils.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_code_block_horizontal_scrolling/test_snapshot_allows_horizontal_scrolling_for_long_code_blocks.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_empty_assistant_before_reasoning/test_snapshot_empty_assistant_removed_when_reasoning_starts.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_agents.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_integration.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_message_id.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_middleware.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_smoke.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/test_workloads.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.6.38 → drydock_cli-2.6.42}/uv.lock +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
856954
|
|
@@ -483,6 +483,50 @@ v3 is a from-scratch rewrite using nano-claude-code as foundation. 4 core files,
|
|
|
483
483
|
are a better signal for whether drydock can handle real user work.
|
|
484
484
|
Easy PRDs were ceiling-ed out — all passing means you can't tell
|
|
485
485
|
what's broken.
|
|
486
|
+
31. **Harness bugs faked all previous pass rates.** (2026-04-12) The
|
|
487
|
+
shakedown harness typed prompts via PTY but never verified the TUI
|
|
488
|
+
actually accepted them. Result: 25 out of 28 prompts were silently
|
|
489
|
+
dropped per session — the TUI only saw the first 3-5 prompts, and
|
|
490
|
+
the harness counted assistant/tool messages from that ongoing work
|
|
491
|
+
as "condition met." Every "24/24 passed" was a lie. Fix: wait for
|
|
492
|
+
a NEW user-role message to appear in the session log after typing,
|
|
493
|
+
retry up to 3x if it doesn't. Also wait for TUI to go idle (6s no
|
|
494
|
+
new messages) before typing the next prompt.
|
|
495
|
+
32. **`pkg_works` via `--help` was the exact bug CLAUDE.md warns
|
|
496
|
+
against.** (2026-04-12) I reintroduced `python3 -m pkg --help` as
|
|
497
|
+
the pass criterion. Every PRD "passed." Actually only 3/11 worked
|
|
498
|
+
— the rest had broken imports, missing features, fake outputs.
|
|
499
|
+
Replace with `functional_tests.sh` per PRD that runs real feature
|
|
500
|
+
commands and checks real outputs (e.g., calculator must compute
|
|
501
|
+
23*47=1081, lang_interp must run let x=42; print(x*2) and output 84).
|
|
502
|
+
33. **Have the TUI run the tests, not the harness.** Externally
|
|
503
|
+
running `functional_tests.sh` tests the CODE, not drydock's
|
|
504
|
+
ability to test-and-fix. Real test: TUI runs tests via bash tool,
|
|
505
|
+
observes failures, reads failing files, applies fixes, iterates.
|
|
506
|
+
Harness only observes the session log for 'RESULT: X passed, Y failed'.
|
|
507
|
+
34. **RALPH loop works much better than pipelined prompts.** (2026-04-12)
|
|
508
|
+
`shakedown_interactive.py` with 24-30 prompts racing the TUI never
|
|
509
|
+
landed properly. `ralph_loop.py` with ONE prompt → wait for
|
|
510
|
+
completion → run tests → send failures back → iterate works great.
|
|
511
|
+
Got 10/11 packages to 100% test pass via this approach in one night.
|
|
512
|
+
35. **Auto-rollback on test regression is essential.** Gemma 4 26B with
|
|
513
|
+
only 4B active params regresses passing tests when trying to fix
|
|
514
|
+
failing ones. Snapshot the package dir before each fix iteration;
|
|
515
|
+
if score goes down, restore. Even with "don't break passing tests"
|
|
516
|
+
in the prompt, the model will destroy working code.
|
|
517
|
+
36. **Drydock takes 3-5 MINUTES to create a session dir after spawn.**
|
|
518
|
+
(2026-04-12) When GPU is busy from a prior run, drydock may take
|
|
519
|
+
up to 4 minutes before the session directory is even created. My
|
|
520
|
+
180s wait was timing out with 1 second to spare. Bumped to 300s.
|
|
521
|
+
37. **meta.json is only written at session EXIT.** (2026-04-12) Can't
|
|
522
|
+
match sessions by working_directory during an active session.
|
|
523
|
+
`find_session()` must match on directory creation time relative
|
|
524
|
+
to harness start, not meta.json content. messages.jsonl is also
|
|
525
|
+
inconsistently flushed during the session.
|
|
526
|
+
38. **NEVER use broad pkill/kill matching 'drydock'.** (2026-04-12) I
|
|
527
|
+
killed the user's active TUI session twice by doing
|
|
528
|
+
`ps aux | grep drydock | kill`. Only kill by tracked PIDs from
|
|
529
|
+
my own background tasks. User's TUI is also a drydock process.
|
|
486
530
|
|
|
487
531
|
## Testing
|
|
488
532
|
|
|
@@ -592,12 +636,22 @@ bash scripts/shakedown_suite.sh
|
|
|
592
636
|
- doc_qa: 22/24, 693s, pkg YES (2 steps timeout)
|
|
593
637
|
- prompt_optimizer: 24/24, 431s, pkg YES
|
|
594
638
|
- Autonomous mega-prompt: 4/5 pass, 1 flaky (eval_harness thinking stall)
|
|
595
|
-
- tool_agent: 155s, pkg YES
|
|
596
|
-
- stock_screener: 207s, pkg YES
|
|
597
|
-
- eval_harness: 669s timeout, pkg NO (model stalled on complex evaluator code)
|
|
598
|
-
- doc_qa: 174s, pkg YES
|
|
599
|
-
- prompt_optimizer: 210s, pkg YES
|
|
600
639
|
- Key fix: autonomous prompts now write cli.py FIRST + pkg_works condition
|
|
640
|
+
- **NOTE: These were fake pass rates. The harness was dropping 25/28 prompts
|
|
641
|
+
silently. Real results via functional_tests.sh (below) showed only 3/11
|
|
642
|
+
packages actually worked.**
|
|
643
|
+
|
|
644
|
+
*Functional test results (2026-04-12, post harness fixes, v2.6.38):*
|
|
645
|
+
- Ladder: 5-min, 15-min, 30-min, 60-min tiers (complexity, not duration)
|
|
646
|
+
- Session started: 29/49 tests passing (59%) via real functional_tests.sh
|
|
647
|
+
- Session ended: **49/52 tests passing (94%)** via ralph_loop.py
|
|
648
|
+
- doc_qa: 5/5, prompt_optimizer: 4/4, tool_agent: 5/5
|
|
649
|
+
- stock_screener: 4/4, eval_harness: 4/4, mini_db: 4/7
|
|
650
|
+
- site_gen: 5/5, lang_interp: 5/5, pkg_manager: 4/4
|
|
651
|
+
- web_frame: 4/4, build_sys: 5/5
|
|
652
|
+
- Only mini_db not at 100%: WHERE filter, UPDATE, DELETE don't work
|
|
653
|
+
- Key tooling: scripts/ralph_loop.py replaces shakedown_interactive.py
|
|
654
|
+
as the primary test harness. One big prompt, observe, fix, iterate.
|
|
601
655
|
|
|
602
656
|
*Small suite (older):*
|
|
603
657
|
- 4/4 (roman_converter, prime_tool, todo_list, codec) with functional
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 2.6.
|
|
3
|
+
Version: 2.6.42
|
|
4
4
|
Summary: Local-first CLI coding agent — tested with Gemma 4 26B via vLLM
|
|
5
5
|
Project-URL: Homepage, https://github.com/fbobe321/drydock
|
|
6
6
|
Project-URL: Repository, https://github.com/fbobe321/drydock
|
|
@@ -60,12 +60,12 @@ Description-Content-Type: text/markdown
|
|
|
60
60
|
[](https://github.com/fbobe321/drydock/blob/main/LICENSE)
|
|
61
61
|
|
|
62
62
|
```
|
|
63
|
-
____
|
|
64
|
-
| _ \ _ __ _ _
|
|
65
|
-
| | | | '__| | |
|
|
66
|
-
| |_| | | | |_|
|
|
67
|
-
|____/|_| \__,
|
|
68
|
-
|___/
|
|
63
|
+
____ ____ _
|
|
64
|
+
| _ \ _ __ _ _| _ \ ___ ___| | __
|
|
65
|
+
| | | | '__| | | | | | |/ _ \ / __| |/ /
|
|
66
|
+
| |_| | | | |_| | |_| | (_) | (__| <
|
|
67
|
+
|____/|_| \__, |____/ \___/ \___|_|\_\
|
|
68
|
+
|___/
|
|
69
69
|
```
|
|
70
70
|
|
|
71
71
|
**Local-first CLI coding agent. Chart your course. Execute with precision.**
|
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
[](https://github.com/fbobe321/drydock/blob/main/LICENSE)
|
|
5
5
|
|
|
6
6
|
```
|
|
7
|
-
____
|
|
8
|
-
| _ \ _ __ _ _
|
|
9
|
-
| | | | '__| | |
|
|
10
|
-
| |_| | | | |_|
|
|
11
|
-
|____/|_| \__,
|
|
12
|
-
|___/
|
|
7
|
+
____ ____ _
|
|
8
|
+
| _ \ _ __ _ _| _ \ ___ ___| | __
|
|
9
|
+
| | | | '__| | | | | | |/ _ \ / __| |/ /
|
|
10
|
+
| |_| | | | |_| | |_| | (_) | (__| <
|
|
11
|
+
|____/|_| \__, |____/ \___/ \___|_|\_\
|
|
12
|
+
|___/
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
**Local-first CLI coding agent. Chart your course. Execute with precision.**
|
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Comprehensive simulated-user loop — exercises ALL real-world coding skills.
|
|
3
|
+
|
|
4
|
+
Unlike ralph_loop (just build-test-fix), this walks the TUI through 9 phases
|
|
5
|
+
that mirror what a human engineer actually does:
|
|
6
|
+
|
|
7
|
+
1. Requirements Gathering and Planning
|
|
8
|
+
2. Writing New Code (Implementation)
|
|
9
|
+
3. Testing Code (unit tests, not just functional)
|
|
10
|
+
4. Code Reviews
|
|
11
|
+
5. Debugging and Troubleshooting
|
|
12
|
+
6. Maintaining Existing Codebases (refactoring)
|
|
13
|
+
7. Version Control Management
|
|
14
|
+
8. Documentation
|
|
15
|
+
9. Optimization
|
|
16
|
+
|
|
17
|
+
Each phase sends a prompt, waits for completion, optionally runs checks.
|
|
18
|
+
|
|
19
|
+
Usage:
|
|
20
|
+
python3 scripts/comprehensive_loop.py \\
|
|
21
|
+
--cwd /data3/drydock_test_projects/408_lang_interp \\
|
|
22
|
+
--pkg lang_interp
|
|
23
|
+
"""
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
import argparse
|
|
27
|
+
import json
|
|
28
|
+
import os
|
|
29
|
+
import re
|
|
30
|
+
import shutil
|
|
31
|
+
import subprocess
|
|
32
|
+
import sys
|
|
33
|
+
import time
|
|
34
|
+
from pathlib import Path
|
|
35
|
+
|
|
36
|
+
import pexpect
|
|
37
|
+
|
|
38
|
+
DRYDOCK_BIN = "/home/bobef/miniforge3/envs/drydock/bin/drydock"
|
|
39
|
+
SESSION_ROOT = Path.home() / ".vibe" / "logs" / "session"
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# ── Phase definitions ────────────────────────────────────────────────────
|
|
43
|
+
# Each phase: (name, prompt_template, max_wait_seconds, validation_fn)
|
|
44
|
+
# {pkg} is substituted with the package name.
|
|
45
|
+
|
|
46
|
+
PHASES = [
|
|
47
|
+
(
|
|
48
|
+
"1_plan",
|
|
49
|
+
"PHASE 1 — Requirements Gathering and Planning. "
|
|
50
|
+
"Read PRD.md carefully. Then create a file called PLAN.md that "
|
|
51
|
+
"contains: (a) the list of files you need to create with a brief "
|
|
52
|
+
"purpose for each, (b) the key algorithms or data structures, "
|
|
53
|
+
"(c) edge cases to handle, (d) your testing strategy. Do NOT "
|
|
54
|
+
"write any code yet — only PLAN.md.",
|
|
55
|
+
600,
|
|
56
|
+
lambda cwd, pkg: (cwd / "PLAN.md").exists(),
|
|
57
|
+
),
|
|
58
|
+
(
|
|
59
|
+
"2_build",
|
|
60
|
+
"PHASE 2 — Writing New Code (Implementation). "
|
|
61
|
+
"Now build the {pkg} package per PRD.md and your PLAN.md. Create "
|
|
62
|
+
"all files under {pkg}/. Write __init__.py, cli.py, __main__.py "
|
|
63
|
+
"FIRST so the package is importable, then add the module files. "
|
|
64
|
+
"Do NOT stop until every file from PLAN.md is written.",
|
|
65
|
+
1500,
|
|
66
|
+
lambda cwd, pkg: (cwd / pkg / "__main__.py").exists(),
|
|
67
|
+
),
|
|
68
|
+
(
|
|
69
|
+
"3_test",
|
|
70
|
+
"PHASE 3 — Testing Code. Create a tests/ directory. Write pytest-"
|
|
71
|
+
"style unit tests in tests/test_{pkg}.py that cover the main "
|
|
72
|
+
"public functions of your package. Aim for at least 5 test "
|
|
73
|
+
"functions. Run: `python3 -m pytest tests/` and confirm they pass. "
|
|
74
|
+
"If you can't run pytest, write them anyway as Python assertions.",
|
|
75
|
+
900,
|
|
76
|
+
lambda cwd, pkg: (cwd / "tests").exists() and any((cwd / "tests").iterdir()),
|
|
77
|
+
),
|
|
78
|
+
(
|
|
79
|
+
"4_review",
|
|
80
|
+
"PHASE 4 — Code Review. Read each file in {pkg}/ and identify: "
|
|
81
|
+
"(a) any code smells (duplication, long functions, unclear names), "
|
|
82
|
+
"(b) potential bugs or edge cases not handled, (c) places where "
|
|
83
|
+
"error handling is missing. Write your findings to REVIEW.md "
|
|
84
|
+
"with file:line references where applicable.",
|
|
85
|
+
600,
|
|
86
|
+
lambda cwd, pkg: (cwd / "REVIEW.md").exists(),
|
|
87
|
+
),
|
|
88
|
+
(
|
|
89
|
+
"5_debug",
|
|
90
|
+
"PHASE 5 — Debugging and Troubleshooting. Run `bash functional_tests.sh` "
|
|
91
|
+
"from this directory and look at any failures. For EACH failing test: "
|
|
92
|
+
"(a) read the failure message, (b) identify which source file is "
|
|
93
|
+
"responsible, (c) diagnose the root cause, (d) fix it with search_replace. "
|
|
94
|
+
"Then run functional_tests.sh again to verify the fix.",
|
|
95
|
+
1200,
|
|
96
|
+
lambda cwd, pkg: True, # validation is the functional test score
|
|
97
|
+
),
|
|
98
|
+
(
|
|
99
|
+
"6_refactor",
|
|
100
|
+
"PHASE 6 — Maintaining Existing Codebases. Look at the LARGEST file "
|
|
101
|
+
"in {pkg}/. Refactor it to: (a) extract helper functions where you "
|
|
102
|
+
"see duplication, (b) improve variable and function names, (c) add "
|
|
103
|
+
"type hints to public functions. Do NOT change behavior — ALL "
|
|
104
|
+
"existing tests (functional_tests.sh AND your unit tests) must "
|
|
105
|
+
"still pass after refactoring.",
|
|
106
|
+
900,
|
|
107
|
+
lambda cwd, pkg: True,
|
|
108
|
+
),
|
|
109
|
+
(
|
|
110
|
+
"7_git",
|
|
111
|
+
"PHASE 7 — Version Control Management. Run these bash commands: "
|
|
112
|
+
"(1) `git init` if not already a repo, (2) `git add .`, (3) "
|
|
113
|
+
"`git -c user.email=test@test.com -c user.name=Test commit -m 'Initial {pkg} implementation'`. "
|
|
114
|
+
"Then create a feature branch: `git checkout -b feature/docs`. "
|
|
115
|
+
"Confirm with `git log --oneline` and `git branch`.",
|
|
116
|
+
300,
|
|
117
|
+
lambda cwd, pkg: (cwd / ".git").exists(),
|
|
118
|
+
),
|
|
119
|
+
(
|
|
120
|
+
"8_docs",
|
|
121
|
+
"PHASE 8 — Documentation. Write README.md with: (1) one-line "
|
|
122
|
+
"project summary, (2) installation (pip install -e . or similar), "
|
|
123
|
+
"(3) usage examples with expected output, (4) API reference listing "
|
|
124
|
+
"main public functions/classes with their signatures. Also add "
|
|
125
|
+
"docstrings to any undocumented public functions in {pkg}/.",
|
|
126
|
+
600,
|
|
127
|
+
lambda cwd, pkg: (cwd / "README.md").exists()
|
|
128
|
+
and (cwd / "README.md").stat().st_size > 200,
|
|
129
|
+
),
|
|
130
|
+
(
|
|
131
|
+
"9_optimize",
|
|
132
|
+
"PHASE 9 — Optimization. Look at the code in {pkg}/ and identify "
|
|
133
|
+
"the function most likely to be a performance hotspot (inner loops, "
|
|
134
|
+
"repeated work, quadratic algorithms). Optimize it. Write a brief "
|
|
135
|
+
"OPTIMIZATION.md explaining: (a) which function you targeted, "
|
|
136
|
+
"(b) what was inefficient, (c) what you changed, (d) expected "
|
|
137
|
+
"impact. All tests must still pass.",
|
|
138
|
+
600,
|
|
139
|
+
lambda cwd, pkg: (cwd / "OPTIMIZATION.md").exists(),
|
|
140
|
+
),
|
|
141
|
+
]
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
class SessionWatcher:
|
|
145
|
+
def __init__(self, cwd: Path, since: float):
|
|
146
|
+
self.cwd = cwd.resolve()
|
|
147
|
+
self.since = since
|
|
148
|
+
self.session_dir: Path | None = None
|
|
149
|
+
self.messages: list[dict] = []
|
|
150
|
+
|
|
151
|
+
def find_session(self) -> Path | None:
|
|
152
|
+
if self.session_dir is not None:
|
|
153
|
+
return self.session_dir
|
|
154
|
+
if not SESSION_ROOT.exists():
|
|
155
|
+
return None
|
|
156
|
+
candidates = []
|
|
157
|
+
for entry in SESSION_ROOT.iterdir():
|
|
158
|
+
try:
|
|
159
|
+
if not entry.is_dir():
|
|
160
|
+
continue
|
|
161
|
+
if entry.stat().st_ctime < self.since - 2:
|
|
162
|
+
continue
|
|
163
|
+
candidates.append((entry.stat().st_ctime, entry))
|
|
164
|
+
except Exception:
|
|
165
|
+
continue
|
|
166
|
+
if not candidates:
|
|
167
|
+
return None
|
|
168
|
+
candidates.sort(reverse=True)
|
|
169
|
+
self.session_dir = candidates[0][1]
|
|
170
|
+
return self.session_dir
|
|
171
|
+
|
|
172
|
+
def refresh(self) -> int:
|
|
173
|
+
sd = self.find_session()
|
|
174
|
+
if sd is None:
|
|
175
|
+
return 0
|
|
176
|
+
msgs = []
|
|
177
|
+
for mf in sorted(sd.rglob("messages.jsonl")):
|
|
178
|
+
try:
|
|
179
|
+
for line in mf.read_text().strip().split("\n"):
|
|
180
|
+
if line.strip():
|
|
181
|
+
msgs.append(json.loads(line))
|
|
182
|
+
except Exception:
|
|
183
|
+
continue
|
|
184
|
+
self.messages = msgs
|
|
185
|
+
return len(msgs)
|
|
186
|
+
|
|
187
|
+
def count_users(self) -> int:
|
|
188
|
+
return sum(1 for m in self.messages if m.get("role") == "user")
|
|
189
|
+
|
|
190
|
+
def last_is_final_text(self) -> bool:
|
|
191
|
+
if not self.messages:
|
|
192
|
+
return False
|
|
193
|
+
last = self.messages[-1]
|
|
194
|
+
if last.get("role") != "assistant":
|
|
195
|
+
return False
|
|
196
|
+
tc = last.get("tool_calls") or []
|
|
197
|
+
content = (last.get("content") or "").strip()
|
|
198
|
+
return not tc and len(content) > 0
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def type_prompt(child, text: str) -> None:
|
|
202
|
+
for ch in text:
|
|
203
|
+
child.send(ch)
|
|
204
|
+
time.sleep(0.008)
|
|
205
|
+
time.sleep(0.3)
|
|
206
|
+
child.send("\r")
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def drain_pty(child, seconds: float = 1.0) -> None:
|
|
210
|
+
cycles = max(int(seconds / 0.1), 1)
|
|
211
|
+
for _ in range(cycles):
|
|
212
|
+
try:
|
|
213
|
+
child.expect(pexpect.TIMEOUT, timeout=0.1)
|
|
214
|
+
except pexpect.EOF:
|
|
215
|
+
break
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def wait_for_prompt_landing(child, watcher, initial_ucount, timeout=120):
|
|
219
|
+
deadline = time.time() + timeout
|
|
220
|
+
while time.time() < deadline:
|
|
221
|
+
drain_pty(child, 1.0)
|
|
222
|
+
watcher.refresh()
|
|
223
|
+
if watcher.count_users() > initial_ucount:
|
|
224
|
+
return True
|
|
225
|
+
time.sleep(0.5)
|
|
226
|
+
return False
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def wait_for_completion(child, watcher, max_wait=900, idle_threshold=180):
|
|
230
|
+
start = time.time()
|
|
231
|
+
last_count = len(watcher.messages)
|
|
232
|
+
last_change = time.time()
|
|
233
|
+
last_report = 0
|
|
234
|
+
while time.time() - start < max_wait:
|
|
235
|
+
drain_pty(child, 1.0)
|
|
236
|
+
if not child.isalive():
|
|
237
|
+
return "dead"
|
|
238
|
+
watcher.refresh()
|
|
239
|
+
now_count = len(watcher.messages)
|
|
240
|
+
if now_count != last_count:
|
|
241
|
+
last_count = now_count
|
|
242
|
+
last_change = time.time()
|
|
243
|
+
elapsed = int(time.time() - start)
|
|
244
|
+
if elapsed - last_report >= 30:
|
|
245
|
+
print(f" [{elapsed}s] msgs={now_count}")
|
|
246
|
+
last_report = elapsed
|
|
247
|
+
if watcher.last_is_final_text():
|
|
248
|
+
if time.time() - last_change >= 5:
|
|
249
|
+
return "done"
|
|
250
|
+
if time.time() - last_change >= idle_threshold:
|
|
251
|
+
return "idle"
|
|
252
|
+
time.sleep(1)
|
|
253
|
+
return "timeout"
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
def run_functional_tests(cwd: Path) -> tuple[int, int]:
|
|
257
|
+
ft = cwd / "functional_tests.sh"
|
|
258
|
+
if not ft.exists():
|
|
259
|
+
return 0, 0
|
|
260
|
+
try:
|
|
261
|
+
r = subprocess.run(["bash", str(ft)], cwd=str(cwd),
|
|
262
|
+
capture_output=True, text=True, timeout=120)
|
|
263
|
+
out = r.stdout + r.stderr
|
|
264
|
+
m = re.search(r"RESULT:\s*(\d+)\s+passed,\s*(\d+)\s+failed", out)
|
|
265
|
+
if m:
|
|
266
|
+
return int(m.group(1)), int(m.group(2))
|
|
267
|
+
except Exception:
|
|
268
|
+
pass
|
|
269
|
+
return 0, 0
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
def run_comprehensive(cwd: Path, pkg: str, skip_build: bool = False) -> dict:
|
|
273
|
+
"""Run the 9-phase comprehensive loop. Returns results dict."""
|
|
274
|
+
print(f"\n{'='*60}")
|
|
275
|
+
print(f" COMPREHENSIVE LOOP: {pkg}")
|
|
276
|
+
print(f" cwd: {cwd}")
|
|
277
|
+
print(f"{'='*60}\n")
|
|
278
|
+
|
|
279
|
+
# Restore PRD.md from master if available
|
|
280
|
+
master = cwd / "PRD.master.md"
|
|
281
|
+
if master.exists():
|
|
282
|
+
shutil.copy2(master, cwd / "PRD.md")
|
|
283
|
+
|
|
284
|
+
# Spawn TUI
|
|
285
|
+
start_time = time.time()
|
|
286
|
+
env = {**os.environ, "TERM": "xterm-256color", "COLUMNS": "120", "LINES": "30"}
|
|
287
|
+
log_path = Path(f"/tmp/comp_{pkg}_{int(start_time)}.tui.log")
|
|
288
|
+
child = pexpect.spawn(DRYDOCK_BIN, encoding="utf-8", timeout=5,
|
|
289
|
+
maxread=100000, env=env, cwd=str(cwd))
|
|
290
|
+
child.logfile_read = open(log_path, "w")
|
|
291
|
+
try:
|
|
292
|
+
child.expect([r">", r"Drydock", r"┌"], timeout=30)
|
|
293
|
+
except Exception:
|
|
294
|
+
pass
|
|
295
|
+
time.sleep(3)
|
|
296
|
+
try:
|
|
297
|
+
if "Trust this folder" in (child.before or ""):
|
|
298
|
+
child.send("\x1b[D")
|
|
299
|
+
time.sleep(0.2)
|
|
300
|
+
child.send("\r")
|
|
301
|
+
time.sleep(2)
|
|
302
|
+
except Exception:
|
|
303
|
+
pass
|
|
304
|
+
|
|
305
|
+
watcher = SessionWatcher(cwd, since=start_time)
|
|
306
|
+
results = []
|
|
307
|
+
|
|
308
|
+
try:
|
|
309
|
+
for phase_idx, (phase_name, prompt_tmpl, max_wait, validator) in enumerate(PHASES):
|
|
310
|
+
if skip_build and phase_name == "2_build":
|
|
311
|
+
print(f"\n─── Skipping phase {phase_name} (skip_build=True) ───")
|
|
312
|
+
continue
|
|
313
|
+
|
|
314
|
+
prompt = prompt_tmpl.format(pkg=pkg)
|
|
315
|
+
print(f"\n─── Phase {phase_idx + 1}/9: {phase_name} ───")
|
|
316
|
+
print(f" prompt: {prompt[:100]}...")
|
|
317
|
+
ucount = watcher.count_users()
|
|
318
|
+
|
|
319
|
+
type_prompt(child, prompt)
|
|
320
|
+
|
|
321
|
+
# On first phase, wait longer for session init
|
|
322
|
+
if phase_idx == 0:
|
|
323
|
+
print(f" Waiting for session...", end="", flush=True)
|
|
324
|
+
for i in range(300):
|
|
325
|
+
drain_pty(child, 1.0)
|
|
326
|
+
if watcher.find_session():
|
|
327
|
+
break
|
|
328
|
+
if i > 0 and i % 60 == 0:
|
|
329
|
+
print(f" ({i}s retype)", end="", flush=True)
|
|
330
|
+
type_prompt(child, prompt)
|
|
331
|
+
if watcher.find_session():
|
|
332
|
+
print(f" found: {watcher.session_dir.name}")
|
|
333
|
+
else:
|
|
334
|
+
print(f" NOT FOUND after 300s — aborting")
|
|
335
|
+
break
|
|
336
|
+
|
|
337
|
+
if not wait_for_prompt_landing(child, watcher, ucount, timeout=120):
|
|
338
|
+
print(f" ⚠ prompt didn't land — retrying once")
|
|
339
|
+
time.sleep(30)
|
|
340
|
+
type_prompt(child, prompt)
|
|
341
|
+
if not wait_for_prompt_landing(child, watcher, ucount, timeout=120):
|
|
342
|
+
print(f" ✕ prompt never landed — skipping phase")
|
|
343
|
+
results.append({"phase": phase_name, "status": "prompt_lost", "validation": False})
|
|
344
|
+
continue
|
|
345
|
+
|
|
346
|
+
print(f" prompt landed, waiting (max {max_wait}s, 3min idle)...")
|
|
347
|
+
status = wait_for_completion(child, watcher, max_wait=max_wait, idle_threshold=180)
|
|
348
|
+
elapsed = int(time.time() - start_time)
|
|
349
|
+
|
|
350
|
+
# Validate
|
|
351
|
+
try:
|
|
352
|
+
valid = validator(cwd, pkg)
|
|
353
|
+
except Exception as e:
|
|
354
|
+
valid = False
|
|
355
|
+
print(f" validator error: {e}")
|
|
356
|
+
|
|
357
|
+
p, f = run_functional_tests(cwd)
|
|
358
|
+
print(f" phase done: status={status}, validation={valid}, "
|
|
359
|
+
f"func_tests={p}/{p+f} (at {elapsed}s total)")
|
|
360
|
+
results.append({
|
|
361
|
+
"phase": phase_name,
|
|
362
|
+
"status": status,
|
|
363
|
+
"validation": valid,
|
|
364
|
+
"func_pass": p,
|
|
365
|
+
"func_fail": f,
|
|
366
|
+
"elapsed_total": elapsed,
|
|
367
|
+
})
|
|
368
|
+
|
|
369
|
+
finally:
|
|
370
|
+
try:
|
|
371
|
+
child.sendcontrol("c")
|
|
372
|
+
time.sleep(1)
|
|
373
|
+
child.terminate(force=True)
|
|
374
|
+
except Exception:
|
|
375
|
+
pass
|
|
376
|
+
|
|
377
|
+
total = int(time.time() - start_time)
|
|
378
|
+
phases_passed = sum(1 for r in results if r.get("validation"))
|
|
379
|
+
final_p, final_f = run_functional_tests(cwd)
|
|
380
|
+
|
|
381
|
+
print(f"\n{'='*60}")
|
|
382
|
+
print(f" COMPREHENSIVE RESULTS: {pkg}")
|
|
383
|
+
print(f" Total time: {total}s ({total/60:.1f}m)")
|
|
384
|
+
print(f" Phases completed: {len(results)}/9")
|
|
385
|
+
print(f" Phases validated: {phases_passed}/9")
|
|
386
|
+
print(f" Final functional tests: {final_p}/{final_p+final_f}")
|
|
387
|
+
print(f"{'='*60}")
|
|
388
|
+
for r in results:
|
|
389
|
+
v = "✓" if r.get("validation") else "✗"
|
|
390
|
+
print(f" {r['phase']}: {v} ({r.get('status')}, ft={r.get('func_pass', '?')}/"
|
|
391
|
+
f"{r.get('func_pass', 0) + r.get('func_fail', 0)})")
|
|
392
|
+
|
|
393
|
+
report = {
|
|
394
|
+
"pkg": pkg,
|
|
395
|
+
"total_seconds": total,
|
|
396
|
+
"phases": results,
|
|
397
|
+
"phases_validated": phases_passed,
|
|
398
|
+
"final_func_pass": final_p,
|
|
399
|
+
"final_func_fail": final_f,
|
|
400
|
+
}
|
|
401
|
+
out = Path(f"/tmp/comp_{pkg}_results.json")
|
|
402
|
+
with open(out, "w") as f:
|
|
403
|
+
json.dump(report, f, indent=2)
|
|
404
|
+
print(f"\n Report: {out}")
|
|
405
|
+
print(f" TUI log: {log_path}")
|
|
406
|
+
if watcher.session_dir:
|
|
407
|
+
print(f" Session: {watcher.session_dir}/messages.jsonl")
|
|
408
|
+
|
|
409
|
+
return report
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
def main() -> int:
|
|
413
|
+
parser = argparse.ArgumentParser()
|
|
414
|
+
parser.add_argument("--cwd", required=True)
|
|
415
|
+
parser.add_argument("--pkg", required=True)
|
|
416
|
+
parser.add_argument("--skip-build", action="store_true",
|
|
417
|
+
help="Skip phase 2 — assume code exists")
|
|
418
|
+
args = parser.parse_args()
|
|
419
|
+
report = run_comprehensive(Path(args.cwd).resolve(), args.pkg,
|
|
420
|
+
skip_build=args.skip_build)
|
|
421
|
+
return 0 if report["phases_validated"] >= 7 else 1
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
if __name__ == "__main__":
|
|
425
|
+
sys.exit(main())
|