drydock-cli 2.6.72__tar.gz → 2.6.74__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.74/.auto_release.lock +1 -0
- drydock_cli-2.6.74/MODEL_SHORTCOMINGS.md +224 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/PKG-INFO +1 -1
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/pyproject.toml +1 -1
- drydock_cli-2.6.74/scripts/meta_ralph_loop.py +376 -0
- drydock_cli-2.6.74/worked_examples/README.md +21 -0
- drydock_cli-2.6.74/worked_examples/lookup.json +10 -0
- drydock_cli-2.6.74/worked_examples/sql_parser.py +358 -0
- drydock_cli-2.6.72/.auto_release.lock +0 -1
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/.claude/scheduled_tasks.lock +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/.github/CODEOWNERS +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/.github/DISCUSSION_TEMPLATE/ideas.yml +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/.github/workflows/build-and-upload.yml +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/.github/workflows/ci.yml +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/.github/workflows/issue-labeler.yml +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/.github/workflows/release.yml +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/.gitignore +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/.pre-commit-config.yaml +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/.python-version +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/.typos.toml +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/.vscode/extensions.json +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/.vscode/launch.json +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/.vscode/settings.json +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/AGENTS.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/CHANGELOG.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/CLAUDE.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/CONTRIBUTING.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/Drydock_rebrand.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/LICENSE +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/NOTICE +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/PRD.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/README.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/action.yml +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/distribution/zed/LICENSE +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/distribution/zed/extension.toml +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/distribution/zed/icons/mistral_vibe.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/docs/README.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/docs/acp-setup.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/docs/proxy-setup.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/acp/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/acp/acp_agent_loop.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/acp/acp_logger.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/acp/entrypoint.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/acp/tools/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/acp/tools/base.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/acp/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/acp/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/acp/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/acp/tools/builtins/todo.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/acp/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/acp/tools/session_update.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/acp/utils.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/autocompletion/base.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/autocompletion/path_completion.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/autocompletion/slash_command.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/cli.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/clipboard.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/commands.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/entrypoint.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/history_manager.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/plan_offer/adapters/http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/plan_offer/decide_plan_offer.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/plan_offer/ports/whoami_gateway.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/terminal_setup.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/ansi_markdown.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/app.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/app.tcss +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/external_editor.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/handlers/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/handlers/event_handler.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/notifications/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/notifications/adapters/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/notifications/adapters/textual_notification_adapter.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/notifications/ports/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/notifications/ports/notification_port.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/approval_app.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/banner/banner.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/banner/petit_chat.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/braille_renderer.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/chat_input/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/chat_input/body.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/chat_input/completion_manager.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/chat_input/completion_popup.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/chat_input/container.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/chat_input/text_area.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/compact.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/config_app.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/context_progress.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/load_more.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/loading.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/messages.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/no_markup_static.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/path_display.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/proxy_setup_app.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/question_app.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/session_picker.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/spinner.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/status_message.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/teleport_message.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/tool_widgets.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/tools.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/widgets/vscode_compat.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/windowing/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/windowing/history.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/windowing/history_windowing.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/textual_ui/windowing/state.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/update_notifier/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/update_notifier/adapters/filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/update_notifier/adapters/github_update_gateway.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/update_notifier/adapters/pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/update_notifier/ports/update_cache_repository.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/update_notifier/ports/update_gateway.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/update_notifier/update.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/cli/update_notifier/whats_new.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/agent_loop.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/agents/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/agents/manager.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/agents/models.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/auth/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/auth/crypto.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/auth/github.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/autocompletion/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/autocompletion/completers.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/autocompletion/file_indexer/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/autocompletion/file_indexer/ignore_rules.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/autocompletion/file_indexer/indexer.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/autocompletion/file_indexer/store.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/autocompletion/file_indexer/watcher.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/autocompletion/fuzzy.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/autocompletion/path_prompt.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/autocompletion/path_prompt_adapter.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/build_orchestrator.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/config/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/config/_settings.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/config/harness_files/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/config/harness_files/_harness_manager.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/config/harness_files/_paths.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/consultant.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/drydock_states.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/hooks.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/llm/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/llm/backend/anthropic.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/llm/backend/base.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/llm/backend/factory.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/llm/backend/generic.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/llm/backend/mistral.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/llm/backend/reasoning_adapter.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/llm/backend/vertex.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/llm/exceptions.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/llm/format.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/llm/message_utils.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/llm/types.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/logger.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/middleware.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/output_formatters.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/paths/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/paths/_local_config_walk.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/paths/_vibe_home.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/paths/conventions.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/plan_session.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/plugins.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/programmatic.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/prompts/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/prompts/builder.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/prompts/cli.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/prompts/compact.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/prompts/dangerous_directory.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/prompts/diagnostic.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/prompts/explore.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/prompts/gemma4.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/prompts/planner.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/prompts/project_context.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/prompts/tests.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/proxy_setup.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/session/agent_memory.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/session/checkpoints.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/session/session_loader.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/session/session_logger.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/session/session_migration.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/session/state_file.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/session_checker.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/skills/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/skills/manager.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/skills/models.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/skills/parser.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/slug.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/system_prompt.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/telemetry/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/telemetry/send.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/teleport/errors.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/teleport/git.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/teleport/nuage.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/teleport/teleport.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/teleport/types.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/base.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/_task_manager.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/ask_user_question.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/bash.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/cron.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/exit_plan_mode.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/glob_tool.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/grep.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/invoke_skill.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/lsp.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/mcp_resources.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/notebook_edit.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/powershell.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/ask_user_question.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/bash.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/cron.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/glob.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/grep.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/invoke_skill.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/lsp.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/mcp_resources.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/notebook_edit.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/powershell.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/read_file.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/search_replace.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/swe_bench.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/task.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/task_manager.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/todo.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/tool_search.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/webfetch.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/websearch.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/worktree.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/prompts/write_file.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/read_file.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/search_replace.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/task.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/todo.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/tool_search.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/webfetch.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/websearch.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/worktree.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/builtins/write_file.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/injection_guard.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/manager.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/mcp/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/mcp/registry.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/mcp/tools.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/mcp_sampling.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/ui.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/tools/utils.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/trusted_folders.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/types.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/core/utils.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/setup/onboarding/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/setup/onboarding/base.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/setup/onboarding/onboarding.tcss +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/setup/onboarding/screens/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/setup/onboarding/screens/api_key.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/setup/onboarding/screens/welcome.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/setup/trusted_folders/trust_folder_dialog.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/setup/trusted_folders/trust_folder_dialog.tcss +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/api-design/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/batch/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/commit-code/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/context-summary/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/create-presentation/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/deep-research/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/deploy/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/diff-review/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/doc-gen/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/explain-code/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/explore-code/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/fix-issue/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/git-ops/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/init-project/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/investigate/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/loop/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/migrate/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/perf-analyze/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/plan-impl/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/pr-review/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/refactor/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/regex-help/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/review/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/security-review/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/ship/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/simplify/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/skills/test-verify/SKILL.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock/whats_new.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock-acp.spec +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/drydock_terms.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/flake.lock +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/flake.nix +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/README.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/auto_release.sh +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/auto_test_loop.sh +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/backup.sh +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/bump_version.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/comprehensive_loop.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/deploy_to_github.sh +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/discover_cli_tools.sh +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/install.sh +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/llm_balancer.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/monitor_swebench.sh +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/monitor_test_battery.sh +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/notify_release.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/oss_task_harness.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/overnight_agents_test.sh +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/prepare_release.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/publish_to_pypi.sh +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/ralph_loop.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/shakedown.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/shakedown_interactive.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/shakedown_regression.sh +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/shakedown_suite.sh +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/shakedown_variance.sh +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/telegram_bot.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/test_bank.sh +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/test_full.sh +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/test_smoke.sh +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/test_tui_path.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/tui_test.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/scripts/vllm_failover.sh +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/conftest.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/test_acp.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/test_agent_thought.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/test_bash.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/test_compact_session_updates.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/test_content.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/test_initialize.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/test_list_sessions.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/test_load_session.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/test_multi_session.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/test_new_session.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/test_proxy_setup_acp.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/test_read_file.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/test_search_replace.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/test_set_config_option.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/test_set_mode.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/test_set_model.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/test_tool_call_session_update.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/test_utils.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/acp/test_write_file.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/autocompletion/test_file_indexer.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/autocompletion/test_fuzzy.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/autocompletion/test_path_completer_fuzzy.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/autocompletion/test_path_completer_recursive.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/autocompletion/test_path_completion_controller.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/autocompletion/test_path_prompt_transformer.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/autocompletion/test_slash_command_controller.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/autocompletion/test_ui_chat_autocompletion.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/backend/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/backend/data/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/backend/data/fireworks.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/backend/data/mistral.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/backend/test_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/backend/test_backend.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/backend/test_reasoning_adapter.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/backend/test_vertex_anthropic_adapter.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/cli/plan_offer/adapters/fake_whoami_gateway.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/cli/plan_offer/test_decide_plan_offer.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/cli/plan_offer/test_http_whoami_gateway.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/cli/test_bell_notifications.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/cli/test_braille_renderer.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/cli/test_clipboard.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/cli/test_commands.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/cli/test_copy_shortcuts.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/cli/test_external_editor.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/cli/test_no_markup_static.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/cli/test_question_app.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/cli/test_spinner.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/cli/test_switching_mode.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/cli/test_ui_clipboard_notifications.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/cli/test_ui_session_incremental_renderer.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/cli/test_ui_session_resume.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/cli/test_ui_skill_dispatch.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/cli/textual_ui/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/cli/textual_ui/test_session_picker.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/conftest.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/core/test_agents.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/core/test_auth_crypto.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/core/test_auth_github.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/core/test_config_load_dotenv.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/core/test_config_paths.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/core/test_config_resolution.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/core/test_file_logging.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/core/test_plan_session.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/core/test_proxy_setup.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/core/test_slug.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/core/test_telemetry_send.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/core/test_teleport_git.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/core/test_teleport_nuage.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/core/test_teleport_service.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/core/test_trusted_folders.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/core/test_utils.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/e2e/common.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/e2e/conftest.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/e2e/mock_server.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/e2e/test_cli_tui_onboarding.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/e2e/test_cli_tui_streaming.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/e2e/test_cli_tui_tool_approval.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/fixtures/doc_qa_system_prd.md +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/mock/__init__.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/mock/mock_backend_factory.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/mock/mock_entrypoint.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/mock/utils.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/onboarding/test_run_onboarding.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/onboarding/test_ui_onboarding.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/session/test_session_loader.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/session/test_session_logger.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/session/test_session_migration.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/skills/conftest.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/skills/test_manager.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/skills/test_models.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/skills/test_parser.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_collapsed.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_ask_user_question/test_snapshot_ask_user_question_expanded.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_basic_conversation/test_snapshot_shows_basic_conversation.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/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.72 → drydock_cli-2.6.74}/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.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_accept_edits_mode.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_auto_approve_mode.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_to_plan_mode.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_cycle_wraps_to_default.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_modes/test_snapshot_default_mode.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_pending.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_parallel_tool_calls/test_snapshot_parallel_tool_calls_resolved.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_cancel_discards_changes.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_edit_existing_values.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_empty.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_initial_with_values.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_error.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_proxy_setup/test_snapshot_proxy_setup_save_new_values.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_answer_first_advance.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_first_answered_checkmark.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_initial.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_left_wraps.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_navigate_right.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_question_tab_to_second.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_initial.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_mixed_selection.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_navigate_to_submit.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_other_with_text.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_first.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_toggle_multiple.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_multi_select_untoggle.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_initial.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_down.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_other.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_to_third_option.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_navigate_up_wraps.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_question_app/test_snapshot_question_app_other_typing.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_buffered_reasoning_yields_before_content.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_interleaved_reasoning.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_reasoning_content/test_snapshot_shows_reasoning_content_expanded.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_release_update_notification/test_snapshot_shows_release_update_notification.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_session_resume/test_snapshot_shows_resumed_session_messages.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_partial.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_streaming_tool_call/test_snapshot_tool_call_updated.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_cancel_selected.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_multiple_commits.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_push_confirmation_single_commit.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_complete.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_auth_required.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_checking_git.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_complete.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_error.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_pushing.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_sending_token.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_teleport/test_snapshot_teleport_status_starting_workflow.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_no_plan_message.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_switch_message.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_upgrade_message.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/__snapshots__/test_ui_snapshot_whats_new/test_snapshot_shows_whats_new_message.svg +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/base_snapshot_test_app.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/conftest.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/snap_compare.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_ask_user_question.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_basic_conversation.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_code_block_horizontal_scrolling.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_empty_assistant_before_reasoning.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_modes.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_parallel_tool_calls.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_proxy_setup.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_question_app.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_reasoning_content.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_release_update_notification.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_session_resume.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_streaming_tool_call.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_teleport.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/snapshots/test_ui_snapshot_whats_new.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/stubs/fake_backend.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/stubs/fake_client.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/stubs/fake_tool.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_agent_auto_compact.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_agent_backend.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_agent_observer_streaming.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_agent_stats.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_agent_tasks.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_agent_tool_call.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_agents.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_bank_build.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_bank_debug.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_bank_multiagent.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_bank_prd.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_bank_prd_extended.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_bank_tools.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_bank_update.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_build_projects.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_cli_programmatic_preload.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_current_bugs.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_drydock_regression.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_drydock_tasks.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_full_regression.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_history_manager.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_integration.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_loop_detection.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_message_id.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_message_merging.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_middleware.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_multi_agent.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_real_failures.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_real_issues.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_real_workflow.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_reasoning_content.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_smoke.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_system_prompt.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_tagged_text.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_tool_args.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_ui_external_editor.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_ui_input_history.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_user_issues.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/test_workloads.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/testbank_helpers.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/tools/test_ask_user_question.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/tools/test_bash.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/tools/test_exit_plan_mode.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/tools/test_grep.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/tools/test_invoke_context.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/tools/test_manager_get_tool_config.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/tools/test_mcp.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/tools/test_mcp_sampling.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/tools/test_task.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/tools/test_ui_bash_execution.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/tools/test_webfetch.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/tools/test_websearch.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/update_notifier/adapters/fake_update_cache_repository.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/update_notifier/adapters/fake_update_gateway.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/update_notifier/test_do_update.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/update_notifier/test_filesystem_update_cache_repository.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/update_notifier/test_github_update_gateway.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/update_notifier/test_pypi_update_gateway.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/update_notifier/test_ui_update_notification.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/update_notifier/test_update_use_case.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/tests/update_notifier/test_whats_new.py +0 -0
- {drydock_cli-2.6.72 → drydock_cli-2.6.74}/uv.lock +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
962444
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# Gemma 4 26B-A4B Shortcomings Log
|
|
2
|
+
|
|
3
|
+
Running list of model-level limitations observed in real drydock use, with
|
|
4
|
+
concrete evidence. Intent: inform future LoRA fine-tuning + Deep Noir
|
|
5
|
+
steering datasets. Each entry is a pattern, NOT a one-off bug.
|
|
6
|
+
|
|
7
|
+
Last updated: 2026-04-12
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. Catastrophic tool-arg malformation → destructive side effects
|
|
12
|
+
|
|
13
|
+
**Pattern:** Model sends `search_replace` with `content` + `new_string` keys
|
|
14
|
+
but no `search` / `old_string`. Drydock's raw-code-fallback (before my fix)
|
|
15
|
+
overwrote entire files with fragments.
|
|
16
|
+
|
|
17
|
+
**Evidence:** ACE v1 cli.py nuked from 5171 chars → 16-char fragment. Session
|
|
18
|
+
`20260412_162052_ee34fefb` msg #61. Lost 120 lines of working code.
|
|
19
|
+
|
|
20
|
+
**Candidate training signal:**
|
|
21
|
+
- Positive: model sends `{search: "...", replace: "..."}` or proper
|
|
22
|
+
`<<<<<<< SEARCH` blocks.
|
|
23
|
+
- Negative: model sends raw code in `content` expecting a file overwrite.
|
|
24
|
+
|
|
25
|
+
**Harness mitigation already in place:** refuse overwrites that shrink file
|
|
26
|
+
by >50%. Still, the model should learn to format tool calls correctly.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 2. Scaffolding without wiring
|
|
31
|
+
|
|
32
|
+
**Pattern:** Model adds a new parameter to a public function's signature +
|
|
33
|
+
adds the implementation in the callee, but doesn't update the intermediate
|
|
34
|
+
call site that connects them. Tests pass for surface checks (signature
|
|
35
|
+
inspection) but the feature is non-functional at runtime.
|
|
36
|
+
|
|
37
|
+
**Evidence:**
|
|
38
|
+
- tabulate `row_count_in_header`: added to `tabulate()` signature and to
|
|
39
|
+
`_format_table()` logic, but `tabulate()` never passes the new arg to
|
|
40
|
+
`_format_table()`. Feature non-functional; tests pass because the test
|
|
41
|
+
just checked the signature.
|
|
42
|
+
- Session: `session_20260412_105528_30d43609`.
|
|
43
|
+
|
|
44
|
+
**Root cause hypothesis:** Model doesn't trace execution path end-to-end.
|
|
45
|
+
Treats each file as independent.
|
|
46
|
+
|
|
47
|
+
**Candidate training signal:** Traces where model correctly chases a
|
|
48
|
+
parameter through the full call graph vs traces where it stops at surface.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 3. Subtle logic bugs undiagnosed after N iterations
|
|
53
|
+
|
|
54
|
+
**Pattern:** Model produces plausible-looking code with a subtle bug.
|
|
55
|
+
Running tests fails. Model tries rewriting the whole file rather than
|
|
56
|
+
tracing the specific failure.
|
|
57
|
+
|
|
58
|
+
**Evidence:**
|
|
59
|
+
- **mini_db parser**: `_parse_select_body()` consumed `WHERE` as a table
|
|
60
|
+
alias because alias detection only excluded `JOIN` from the list of
|
|
61
|
+
SQL keywords. Fix was one line. Model made 4 iterations (~20 min)
|
|
62
|
+
without finding it.
|
|
63
|
+
- **tool_agent log whitelist**: `if self.verbose or level in ["THINK",
|
|
64
|
+
"PLAN", "TOOL"]:` — missing `"ANSWER"`. One-character fix. Model ran
|
|
65
|
+
3 iterations without finding it.
|
|
66
|
+
|
|
67
|
+
**Common trait:** Bug is in a data structure / enum / list that the model
|
|
68
|
+
didn't reason about. It could SEE the line but didn't mentally trace
|
|
69
|
+
which levels were allowed.
|
|
70
|
+
|
|
71
|
+
**Candidate training signal:** Worked examples of "run the failing test,
|
|
72
|
+
identify the exact line that produces wrong output, trace the data flow,
|
|
73
|
+
fix only that line."
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## 4. Inheritance blindness across packages
|
|
78
|
+
|
|
79
|
+
**Pattern:** When a class inherits from a parent in a different package,
|
|
80
|
+
the model looks for attributes/methods in the child class's file. Doesn't
|
|
81
|
+
think to follow the inheritance chain to the parent package.
|
|
82
|
+
|
|
83
|
+
**Evidence:**
|
|
84
|
+
- **Flask `request.is_xml`**: Model read `src/flask/wrappers.py` 13 times
|
|
85
|
+
looking for `is_json` to pattern-match from. But `is_json` is in
|
|
86
|
+
werkzeug's `Request` (parent class). Model gave up without writing
|
|
87
|
+
anything. With an explicit hint in the task ("is_json is in werkzeug"),
|
|
88
|
+
model solved it in 61s.
|
|
89
|
+
|
|
90
|
+
**Candidate training signal:** Traces where model correctly uses grep to
|
|
91
|
+
find a name in parent-class packages (`grep -r "def is_json" site-packages/`)
|
|
92
|
+
vs traces where it re-reads the same file.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 5. Regression during targeted fixes
|
|
97
|
+
|
|
98
|
+
**Pattern:** Asked to fix failure X, model rewrites unrelated passing code
|
|
99
|
+
and breaks it. Advisory "don't break passing tests" in prompt doesn't help.
|
|
100
|
+
|
|
101
|
+
**Evidence:**
|
|
102
|
+
- **site_gen**: 4/5 tests passing. Asked to fix the 5th (title render).
|
|
103
|
+
Model rewrote the template engine from scratch, lost 4 passing tests
|
|
104
|
+
→ 0/5. Required manual rollback.
|
|
105
|
+
- This happened repeatedly until I added rollback to ralph_loop.
|
|
106
|
+
|
|
107
|
+
**Harness mitigation:** Auto-rollback on score regression (snapshot before,
|
|
108
|
+
restore if tests go down). Critical safety net.
|
|
109
|
+
|
|
110
|
+
**Candidate training signal:** Traces with minimal targeted patches
|
|
111
|
+
(`search_replace` with 3-line blocks) vs traces with full-file rewrites.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 6. Blindness to own stuckness
|
|
116
|
+
|
|
117
|
+
**Pattern:** Model rewrites the same file multiple times identically when
|
|
118
|
+
tests fail. Doesn't recognize the rewrites aren't helping; doesn't try a
|
|
119
|
+
different approach. When dedup block fires after 3 identical writes,
|
|
120
|
+
sometimes workaround by renaming the file (e.g. `feedback_new.py`).
|
|
121
|
+
|
|
122
|
+
**Evidence:**
|
|
123
|
+
- ACE v1 session msg #23, #25, #27: three identical writes of `feedback.py`.
|
|
124
|
+
Then msg #29: renamed to `feedback_new.py` to bypass dedup.
|
|
125
|
+
- mini_db: 100 search_replace calls, 65 failed. Model kept trying the
|
|
126
|
+
same pattern instead of switching approaches.
|
|
127
|
+
|
|
128
|
+
**Candidate training signal:** Traces where model after N failed attempts
|
|
129
|
+
tries: `bash` to run the failing command, `web_search` for the error,
|
|
130
|
+
`read_file` on a different related file, or explicitly changes approach.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 7. Doesn't use web_search even when enabled
|
|
135
|
+
|
|
136
|
+
**Pattern:** Model has `web_search` tool available but doesn't reach for
|
|
137
|
+
it when stuck, even for standard errors that have obvious online solutions.
|
|
138
|
+
|
|
139
|
+
**Evidence:**
|
|
140
|
+
- mini_db session (after web tools were enabled): 100 search_replace fails,
|
|
141
|
+
0 web_search calls. Model stayed in local-only failure loop.
|
|
142
|
+
|
|
143
|
+
**Mitigation attempted:** `gemma4.md` prompt now explicitly says "use
|
|
144
|
+
web_search when stuck 2+ iterations on same error." Need to verify it
|
|
145
|
+
actually happens in practice.
|
|
146
|
+
|
|
147
|
+
**Candidate training signal:** Strong — positive examples of "tried X,
|
|
148
|
+
failed, googled error, found answer, fixed" vs "tried X 5x, never googled."
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 8. Hallucinated tool names
|
|
153
|
+
|
|
154
|
+
**Pattern:** Model calls tool names that don't exist, e.g.
|
|
155
|
+
`ralph_repo_index`, `list_mcp_resources`, `repo_index`.
|
|
156
|
+
|
|
157
|
+
**Evidence:** mini_db v1 session called `ralph_repo_index` 5 times. Each
|
|
158
|
+
returned "Unknown tool" error. Model kept trying.
|
|
159
|
+
|
|
160
|
+
**Harness mitigation:** `_IGNORE_TOOLS` list silently drops known
|
|
161
|
+
hallucinations to reduce error spam.
|
|
162
|
+
|
|
163
|
+
**Candidate training signal:** Ground all tool calls to only names that
|
|
164
|
+
exist in the current tool list.
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## 9. Empty response / thinking stall
|
|
169
|
+
|
|
170
|
+
**Pattern:** After a tool result, model generates `[thinking]` tokens but
|
|
171
|
+
no `content` or `tool_calls` — returns an empty assistant message. Appears
|
|
172
|
+
idle to the harness.
|
|
173
|
+
|
|
174
|
+
**Evidence:** ACE v2 iter 5 "idle" status at 966s with no message activity.
|
|
175
|
+
Also observed in earlier 5-min tier runs pre-fix.
|
|
176
|
+
|
|
177
|
+
**Harness mitigation:** `_truncate_old_tool_results` in agent_loop +
|
|
178
|
+
thinking-stall nudge. Partial fix — still observed in harder PRDs.
|
|
179
|
+
|
|
180
|
+
**Candidate training signal:** Eliminate empty assistant responses. Every
|
|
181
|
+
response should either have `content` or `tool_calls`.
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## 10. Weak reasoning about performance / abstract tasks
|
|
186
|
+
|
|
187
|
+
**Pattern:** Optimization phase of comprehensive_loop consistently fails
|
|
188
|
+
("idle" status). Code review phase also struggles. These phases require
|
|
189
|
+
abstract reasoning about hotspots, trade-offs, priorities.
|
|
190
|
+
|
|
191
|
+
**Evidence:** comp_loop across 3 packages:
|
|
192
|
+
- doc_qa: 9/9 phases passed (including optimize — simple PRD)
|
|
193
|
+
- stock_screener: 8/9 (optimize failed — went idle)
|
|
194
|
+
- tool_agent: 5/9 (multiple phases failed, optimize was one)
|
|
195
|
+
|
|
196
|
+
**Candidate training signal:** Traces of optimization reasoning:
|
|
197
|
+
"Profile showed X is hot; it's O(n²); rewrite as O(n log n); measure."
|
|
198
|
+
Currently the model treats "optimize" as too vague.
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Harness / tooling shortcomings (non-model, but relevant)
|
|
203
|
+
|
|
204
|
+
These are harness bugs I found — fixing them made the model LOOK better:
|
|
205
|
+
|
|
206
|
+
- A. `search_replace` destructive overwrite (FIXED v2.6.67)
|
|
207
|
+
- B. `write_file` didn't catch bare `raise` (FIXED v2.6.69)
|
|
208
|
+
- C. `builder` subagent missing `web_search`/`web_fetch` (FIXED v2.6.71)
|
|
209
|
+
- D. `_IGNORE_TOOLS` missing common hallucinations (FIXED v2.6.71)
|
|
210
|
+
- E. ralph_loop false-positive baseline → wrong prompt (FIXED v2.6.71)
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## Scoring suggested for training dataset
|
|
215
|
+
|
|
216
|
+
Label each trace-step with outcome:
|
|
217
|
+
- `good`: tool call succeeded + moved toward passing tests
|
|
218
|
+
- `regression`: broke a previously-passing test
|
|
219
|
+
- `wasted`: no progress on pass rate
|
|
220
|
+
- `stuck`: repeated same action N times with no change
|
|
221
|
+
- `recovered`: was stuck, used web_search/web_fetch/read_file to unblock
|
|
222
|
+
|
|
223
|
+
Fine-tune on `good` and `recovered`. Filter out `wasted` and the parts of
|
|
224
|
+
traces after a `regression` or `stuck` episode.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: drydock-cli
|
|
3
|
-
Version: 2.6.
|
|
3
|
+
Version: 2.6.74
|
|
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
|
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Meta-RALPH loop — escalating sample+retry with stuck detection.
|
|
3
|
+
|
|
4
|
+
Wraps ralph_loop's iteration logic with three escalation stages:
|
|
5
|
+
|
|
6
|
+
Stage 1 Standard iteration (one sample per fix prompt).
|
|
7
|
+
Stage 2 Best-of-3 sampling when progress stalls. Each sample runs
|
|
8
|
+
from a clean snapshot of the last good state; fastest winner
|
|
9
|
+
wins (first sample that improves tests is kept, others
|
|
10
|
+
discarded).
|
|
11
|
+
Stage 3 Stuck mode: inject a system note telling the TUI to:
|
|
12
|
+
- web_search the specific error
|
|
13
|
+
- consult worked_examples/ for the relevant pattern
|
|
14
|
+
- try a fundamentally different approach, not another rewrite
|
|
15
|
+
|
|
16
|
+
Key difference from ralph_loop: when a fix iteration doesn't improve
|
|
17
|
+
tests, we don't just roll back — we respawn the drydock TUI fresh and
|
|
18
|
+
try again. Each new session re-reads the PRD and functional_tests from
|
|
19
|
+
scratch, getting a different response trajectory (the model is
|
|
20
|
+
stochastic enough that a fresh session produces different code).
|
|
21
|
+
|
|
22
|
+
Usage:
|
|
23
|
+
python3 scripts/meta_ralph_loop.py \\
|
|
24
|
+
--cwd /data3/drydock_test_projects/406_mini_db \\
|
|
25
|
+
--pkg mini_db \\
|
|
26
|
+
--max-stages 3 \\
|
|
27
|
+
--samples-per-stage 3
|
|
28
|
+
"""
|
|
29
|
+
from __future__ import annotations
|
|
30
|
+
|
|
31
|
+
import argparse
|
|
32
|
+
import json
|
|
33
|
+
import os
|
|
34
|
+
import re
|
|
35
|
+
import shutil
|
|
36
|
+
import subprocess
|
|
37
|
+
import sys
|
|
38
|
+
import time
|
|
39
|
+
from pathlib import Path
|
|
40
|
+
|
|
41
|
+
import pexpect
|
|
42
|
+
|
|
43
|
+
DRYDOCK_BIN = "/home/bobef/miniforge3/envs/drydock/bin/drydock"
|
|
44
|
+
SESSION_ROOT = Path.home() / ".vibe" / "logs" / "session"
|
|
45
|
+
WORKED_EXAMPLES_DIR = Path("/data3/drydock/worked_examples")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# ── Reuse the SessionWatcher and helpers from ralph_loop ──
|
|
49
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
50
|
+
from ralph_loop import ( # type: ignore
|
|
51
|
+
SessionWatcher, type_prompt, drain_pty,
|
|
52
|
+
wait_for_prompt_landing, wait_for_completion,
|
|
53
|
+
run_functional_tests, snapshot_package, restore_snapshot,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def find_worked_example(cwd: Path, pkg: str, failure_output: str) -> tuple[str, str] | None:
|
|
58
|
+
"""Find the best-matching worked example for the current task.
|
|
59
|
+
|
|
60
|
+
Returns (file_path, summary) or None. Keyword-matches against the
|
|
61
|
+
PRD text + last failure output.
|
|
62
|
+
"""
|
|
63
|
+
lookup = WORKED_EXAMPLES_DIR / "lookup.json"
|
|
64
|
+
if not lookup.exists():
|
|
65
|
+
return None
|
|
66
|
+
try:
|
|
67
|
+
data = json.loads(lookup.read_text())
|
|
68
|
+
except Exception:
|
|
69
|
+
return None
|
|
70
|
+
|
|
71
|
+
# Collect search corpus: PRD + failure output + package name
|
|
72
|
+
corpus_parts = [pkg]
|
|
73
|
+
for fn in ("PRD.md", "PRD.master.md"):
|
|
74
|
+
p = cwd / fn
|
|
75
|
+
if p.exists():
|
|
76
|
+
corpus_parts.append(p.read_text(errors="ignore"))
|
|
77
|
+
if failure_output:
|
|
78
|
+
corpus_parts.append(failure_output)
|
|
79
|
+
corpus = " ".join(corpus_parts).lower()
|
|
80
|
+
|
|
81
|
+
best = None
|
|
82
|
+
best_score = 0
|
|
83
|
+
for entry in data.get("examples", []):
|
|
84
|
+
score = sum(1 for kw in entry.get("keywords", [])
|
|
85
|
+
if kw.lower() in corpus)
|
|
86
|
+
if score > best_score:
|
|
87
|
+
best = entry
|
|
88
|
+
best_score = score
|
|
89
|
+
|
|
90
|
+
if not best or best_score < 2:
|
|
91
|
+
return None
|
|
92
|
+
|
|
93
|
+
fp = WORKED_EXAMPLES_DIR / best["file"]
|
|
94
|
+
if not fp.exists():
|
|
95
|
+
return None
|
|
96
|
+
return str(fp), best.get("summary", "")
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def spawn_drydock(cwd: Path, log_path: Path) -> pexpect.spawn:
|
|
100
|
+
env = {**os.environ, "TERM": "xterm-256color", "COLUMNS": "120", "LINES": "30"}
|
|
101
|
+
child = pexpect.spawn(DRYDOCK_BIN, encoding="utf-8", timeout=5,
|
|
102
|
+
maxread=100000, env=env, cwd=str(cwd))
|
|
103
|
+
child.logfile_read = open(log_path, "w")
|
|
104
|
+
try:
|
|
105
|
+
child.expect([r">", r"Drydock", r"┌"], timeout=30)
|
|
106
|
+
except Exception:
|
|
107
|
+
pass
|
|
108
|
+
time.sleep(3)
|
|
109
|
+
try:
|
|
110
|
+
if "Trust this folder" in (child.before or ""):
|
|
111
|
+
child.send("\x1b[D")
|
|
112
|
+
time.sleep(0.2)
|
|
113
|
+
child.send("\r")
|
|
114
|
+
time.sleep(2)
|
|
115
|
+
except Exception:
|
|
116
|
+
pass
|
|
117
|
+
return child
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def terminate_drydock(child: pexpect.spawn) -> None:
|
|
121
|
+
try:
|
|
122
|
+
child.sendcontrol("c")
|
|
123
|
+
time.sleep(0.5)
|
|
124
|
+
child.terminate(force=True)
|
|
125
|
+
except Exception:
|
|
126
|
+
pass
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def run_single_session(cwd: Path, pkg: str, prompt: str,
|
|
130
|
+
max_wait: int = 1200,
|
|
131
|
+
idle_threshold: int = 180) -> tuple[int, int, str]:
|
|
132
|
+
"""Spawn drydock, send ONE prompt, wait for it to finish,
|
|
133
|
+
return (test_pass, test_fail, output_tail)."""
|
|
134
|
+
log_path = Path(f"/tmp/meta_ralph_{pkg}_{int(time.time())}.log")
|
|
135
|
+
start_time = time.time()
|
|
136
|
+
child = spawn_drydock(cwd, log_path)
|
|
137
|
+
watcher = SessionWatcher(cwd, since=start_time)
|
|
138
|
+
|
|
139
|
+
try:
|
|
140
|
+
type_prompt(child, prompt)
|
|
141
|
+
|
|
142
|
+
# Wait for session to appear
|
|
143
|
+
for i in range(300):
|
|
144
|
+
drain_pty(child, 1.0)
|
|
145
|
+
if watcher.find_session():
|
|
146
|
+
break
|
|
147
|
+
if i > 0 and i % 60 == 0:
|
|
148
|
+
time.sleep(2)
|
|
149
|
+
type_prompt(child, prompt)
|
|
150
|
+
if not watcher.find_session():
|
|
151
|
+
return 0, 999, "session never appeared"
|
|
152
|
+
|
|
153
|
+
# Wait for prompt to land
|
|
154
|
+
if not wait_for_prompt_landing(child, watcher, 0, timeout=90):
|
|
155
|
+
time.sleep(5)
|
|
156
|
+
type_prompt(child, prompt)
|
|
157
|
+
if not wait_for_prompt_landing(child, watcher, 0, timeout=90):
|
|
158
|
+
return 0, 999, "prompt did not land"
|
|
159
|
+
|
|
160
|
+
# Wait for drydock to finish responding
|
|
161
|
+
wait_for_completion(child, watcher, max_wait=max_wait,
|
|
162
|
+
idle_threshold=idle_threshold)
|
|
163
|
+
finally:
|
|
164
|
+
terminate_drydock(child)
|
|
165
|
+
|
|
166
|
+
p, f, out = run_functional_tests(cwd)
|
|
167
|
+
return p, f, out
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def best_of_n(cwd: Path, pkg: str, base_prompt: str, n: int,
|
|
171
|
+
current_best_pass: int, current_best_fail: int,
|
|
172
|
+
current_best_out: str,
|
|
173
|
+
snap: Path) -> tuple[int, int, str, Path]:
|
|
174
|
+
"""Try the prompt N times, keeping the best result.
|
|
175
|
+
|
|
176
|
+
Between samples, restore the package from `snap`. If any sample
|
|
177
|
+
strictly improves test_pass count, return immediately (fastest win).
|
|
178
|
+
|
|
179
|
+
Returns (best_pass, best_fail, best_output, best_snap). If no sample
|
|
180
|
+
improves, returns the input values unchanged (callers can still
|
|
181
|
+
distinguish 'no progress' from 'all tests pass').
|
|
182
|
+
"""
|
|
183
|
+
for i in range(n):
|
|
184
|
+
print(f" [sample {i+1}/{n}]")
|
|
185
|
+
# Restore package from snapshot so each sample starts clean
|
|
186
|
+
restore_snapshot(cwd, pkg, snap)
|
|
187
|
+
|
|
188
|
+
p, f, out = run_single_session(cwd, pkg, base_prompt,
|
|
189
|
+
max_wait=1200,
|
|
190
|
+
idle_threshold=180)
|
|
191
|
+
print(f" → {p}/{p+f} tests pass")
|
|
192
|
+
|
|
193
|
+
if p > current_best_pass:
|
|
194
|
+
# Win! Snapshot this state and return immediately.
|
|
195
|
+
new_snap = snapshot_package(cwd, pkg)
|
|
196
|
+
print(f" [new best: {p}, keeping]")
|
|
197
|
+
return p, f, out, new_snap
|
|
198
|
+
|
|
199
|
+
# No sample beat current best — restore snap and return UNCHANGED
|
|
200
|
+
restore_snapshot(cwd, pkg, snap)
|
|
201
|
+
return current_best_pass, current_best_fail, current_best_out, snap
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def make_stuck_prompt(pkg: str, cwd: Path, failure_output: str) -> str:
|
|
205
|
+
"""Build the stage-3 'stuck' prompt with web_search + worked-example hints."""
|
|
206
|
+
# Extract FAIL lines
|
|
207
|
+
fail_lines = [ln for ln in (failure_output or "").split("\n")
|
|
208
|
+
if ln.startswith("FAIL:")][:5]
|
|
209
|
+
fail_text = "\n".join(fail_lines)
|
|
210
|
+
|
|
211
|
+
# Look up a worked example
|
|
212
|
+
example_path = None
|
|
213
|
+
example_summary = ""
|
|
214
|
+
matched = find_worked_example(cwd, pkg, failure_output)
|
|
215
|
+
if matched:
|
|
216
|
+
example_path, example_summary = matched
|
|
217
|
+
|
|
218
|
+
prompt = (
|
|
219
|
+
f"You've tried fixing the failures multiple times without progress. "
|
|
220
|
+
f"Current failures:\n\n{fail_text}\n\n"
|
|
221
|
+
f"DO SOMETHING DIFFERENT. Ideas:\n"
|
|
222
|
+
f"- Use `web_search` to look up the exact error message or the "
|
|
223
|
+
f"technique you're trying (e.g. 'python sql tokenizer example').\n"
|
|
224
|
+
f"- Use `web_fetch` to read a Stack Overflow answer or docs page.\n"
|
|
225
|
+
f"- Read a DIFFERENT source file than the one you've been rewriting — "
|
|
226
|
+
f"the bug may be upstream.\n"
|
|
227
|
+
)
|
|
228
|
+
if example_path:
|
|
229
|
+
prompt += (
|
|
230
|
+
f"\nA WORKED EXAMPLE is available at {example_path}\n"
|
|
231
|
+
f"Summary: {example_summary}\n"
|
|
232
|
+
f"Read it with read_file and use the STRUCTURE (not the exact "
|
|
233
|
+
f"code) to guide your fix.\n"
|
|
234
|
+
)
|
|
235
|
+
prompt += (
|
|
236
|
+
f"\nThen apply ONE targeted search_replace to fix ONE failure at a "
|
|
237
|
+
f"time. Do NOT rewrite whole files. Do NOT ask me for confirmation."
|
|
238
|
+
)
|
|
239
|
+
return prompt
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
def meta_ralph(cwd: Path, pkg: str, max_stages: int = 3,
|
|
243
|
+
samples_per_stage: int = 3) -> dict:
|
|
244
|
+
"""Main meta-RALPH loop."""
|
|
245
|
+
print(f"\n{'='*60}")
|
|
246
|
+
print(f" META-RALPH: {pkg}")
|
|
247
|
+
print(f" cwd: {cwd}")
|
|
248
|
+
print(f" max stages: {max_stages}, samples/stage: {samples_per_stage}")
|
|
249
|
+
print(f"{'='*60}\n")
|
|
250
|
+
|
|
251
|
+
# Restore PRD.md
|
|
252
|
+
master = cwd / "PRD.master.md"
|
|
253
|
+
if master.exists():
|
|
254
|
+
shutil.copy2(master, cwd / "PRD.md")
|
|
255
|
+
|
|
256
|
+
start_time = time.time()
|
|
257
|
+
stages_log = []
|
|
258
|
+
|
|
259
|
+
# ── STAGE 1: Initial build (single sample, standard prompt) ──
|
|
260
|
+
print(f"─── STAGE 1: Initial build ───")
|
|
261
|
+
pkg_init = cwd / pkg / "__init__.py"
|
|
262
|
+
if pkg_init.exists():
|
|
263
|
+
initial_prompt = (
|
|
264
|
+
f"Look at the existing {pkg}/ directory and functional_tests.sh. "
|
|
265
|
+
f"Fix any failing tests with targeted search_replace patches."
|
|
266
|
+
)
|
|
267
|
+
else:
|
|
268
|
+
initial_prompt = (
|
|
269
|
+
f"Read PRD.md AND functional_tests.sh. Build the {pkg} package. "
|
|
270
|
+
f"Your CLI must conform to functional_tests.sh exactly. "
|
|
271
|
+
f"Create ALL files from the PRD. Write __init__.py, cli.py, "
|
|
272
|
+
f"__main__.py FIRST."
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
p, f, out = run_single_session(cwd, pkg, initial_prompt,
|
|
276
|
+
max_wait=1500, idle_threshold=180)
|
|
277
|
+
print(f" Stage 1 result: {p}/{p+f} tests pass")
|
|
278
|
+
best_pass = p
|
|
279
|
+
best_fail = f
|
|
280
|
+
best_out = out
|
|
281
|
+
best_snap = snapshot_package(cwd, pkg)
|
|
282
|
+
stages_log.append({"stage": 1, "pass": p, "fail": f, "strategy": "single_build"})
|
|
283
|
+
|
|
284
|
+
# Early exit if perfect
|
|
285
|
+
if best_fail == 0 and best_pass > 0:
|
|
286
|
+
print(f"\n ✓ All tests pass! Done at stage 1.")
|
|
287
|
+
return _report(cwd, pkg, start_time, stages_log, best_pass, best_fail)
|
|
288
|
+
|
|
289
|
+
# ── STAGE 2: best-of-N sampling ──
|
|
290
|
+
if max_stages >= 2:
|
|
291
|
+
print(f"\n─── STAGE 2: best-of-{samples_per_stage} sampling ───")
|
|
292
|
+
fail_lines = "\n".join(ln for ln in out.split("\n")
|
|
293
|
+
if ln.startswith("FAIL:"))[:1500]
|
|
294
|
+
fix_prompt = (
|
|
295
|
+
f"Tests are failing:\n{fail_lines}\n\n"
|
|
296
|
+
f"Make TARGETED search_replace patches. Do not rewrite working files. "
|
|
297
|
+
f"Do not break currently-passing tests. Run bash functional_tests.sh "
|
|
298
|
+
f"when you think you're done."
|
|
299
|
+
)
|
|
300
|
+
p, f, out, best_snap = best_of_n(
|
|
301
|
+
cwd, pkg, fix_prompt, samples_per_stage,
|
|
302
|
+
best_pass, best_fail, best_out, best_snap,
|
|
303
|
+
)
|
|
304
|
+
print(f" Stage 2 result: {p}/{p+f} tests pass")
|
|
305
|
+
best_pass, best_fail, best_out = p, f, out
|
|
306
|
+
stages_log.append({
|
|
307
|
+
"stage": 2, "pass": p, "fail": f,
|
|
308
|
+
"strategy": f"best_of_{samples_per_stage}",
|
|
309
|
+
})
|
|
310
|
+
if best_fail == 0 and best_pass > 0:
|
|
311
|
+
print(f"\n ✓ All tests pass! Done at stage 2.")
|
|
312
|
+
return _report(cwd, pkg, start_time, stages_log, best_pass, best_fail)
|
|
313
|
+
|
|
314
|
+
# ── STAGE 3: stuck mode with web_search + worked example ──
|
|
315
|
+
if max_stages >= 3:
|
|
316
|
+
print(f"\n─── STAGE 3: stuck mode (web_search + worked example) ───")
|
|
317
|
+
stuck_prompt = make_stuck_prompt(pkg, cwd, best_out)
|
|
318
|
+
# One sample at a time; don't rollback — the stuck mode is a
|
|
319
|
+
# last-ditch effort, any improvement is worth keeping.
|
|
320
|
+
p, f, out = run_single_session(cwd, pkg, stuck_prompt,
|
|
321
|
+
max_wait=1800, idle_threshold=240)
|
|
322
|
+
print(f" Stage 3 result: {p}/{p+f} tests pass")
|
|
323
|
+
if p > best_pass:
|
|
324
|
+
best_pass, best_fail, best_out = p, f, out
|
|
325
|
+
best_snap = snapshot_package(cwd, pkg)
|
|
326
|
+
else:
|
|
327
|
+
restore_snapshot(cwd, pkg, best_snap)
|
|
328
|
+
stages_log.append({
|
|
329
|
+
"stage": 3, "pass": p, "fail": f, "strategy": "stuck_mode",
|
|
330
|
+
})
|
|
331
|
+
|
|
332
|
+
return _report(cwd, pkg, start_time, stages_log, best_pass, best_fail)
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
def _report(cwd: Path, pkg: str, start_time: float, stages_log: list,
|
|
336
|
+
best_pass: int, best_fail: int) -> dict:
|
|
337
|
+
total = int(time.time() - start_time)
|
|
338
|
+
print(f"\n{'='*60}")
|
|
339
|
+
print(f" META-RALPH RESULTS: {pkg}")
|
|
340
|
+
print(f" Total time: {total}s ({total/60:.1f}m)")
|
|
341
|
+
for s in stages_log:
|
|
342
|
+
print(f" stage {s['stage']}: {s['pass']}/{s['pass']+s['fail']} "
|
|
343
|
+
f"({s['strategy']})")
|
|
344
|
+
print(f"\n FINAL: {best_pass}/{best_pass+best_fail} tests pass")
|
|
345
|
+
print(f"{'='*60}\n")
|
|
346
|
+
|
|
347
|
+
report = {
|
|
348
|
+
"pkg": pkg,
|
|
349
|
+
"total_seconds": total,
|
|
350
|
+
"stages": stages_log,
|
|
351
|
+
"final_pass": best_pass,
|
|
352
|
+
"final_fail": best_fail,
|
|
353
|
+
}
|
|
354
|
+
out_path = Path(f"/tmp/meta_ralph_{pkg}_results.json")
|
|
355
|
+
with open(out_path, "w") as f:
|
|
356
|
+
json.dump(report, f, indent=2)
|
|
357
|
+
print(f" Report: {out_path}")
|
|
358
|
+
return report
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
def main() -> int:
|
|
362
|
+
parser = argparse.ArgumentParser()
|
|
363
|
+
parser.add_argument("--cwd", required=True)
|
|
364
|
+
parser.add_argument("--pkg", required=True)
|
|
365
|
+
parser.add_argument("--max-stages", type=int, default=3)
|
|
366
|
+
parser.add_argument("--samples-per-stage", type=int, default=3)
|
|
367
|
+
args = parser.parse_args()
|
|
368
|
+
report = meta_ralph(
|
|
369
|
+
Path(args.cwd).resolve(), args.pkg,
|
|
370
|
+
args.max_stages, args.samples_per_stage,
|
|
371
|
+
)
|
|
372
|
+
return 0 if report["final_fail"] == 0 else 1
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
if __name__ == "__main__":
|
|
376
|
+
sys.exit(main())
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Worked Examples
|
|
2
|
+
|
|
3
|
+
Canonical skeletons for hard problems Gemma 4 consistently struggles with.
|
|
4
|
+
When drydock gets stuck on a difficult algorithm, the meta_ralph_loop
|
|
5
|
+
auto-injects the relevant example as a hint.
|
|
6
|
+
|
|
7
|
+
## Files
|
|
8
|
+
|
|
9
|
+
| File | Use when PRD needs |
|
|
10
|
+
|---|---|
|
|
11
|
+
| `sql_parser.py` | Tokenizer + recursive-descent for SELECT/INSERT/UPDATE/DELETE |
|
|
12
|
+
| `tree_interp.py` | Tree-walking interpreter with env, closures, control flow |
|
|
13
|
+
| `depgraph.py` | Topological sort + cycle detection for dependency resolution |
|
|
14
|
+
| `btree.py` | B-tree insert/search/serialize |
|
|
15
|
+
| `recursive_parser.py` | Generic recursive descent pattern |
|
|
16
|
+
| `subprocess_sandbox.py` | Subprocess with timeout, stdin JSON, stdout JSON |
|
|
17
|
+
|
|
18
|
+
## Lookup
|
|
19
|
+
|
|
20
|
+
`lookup.json` maps PRD keywords to relevant example files. The stuck
|
|
21
|
+
detector greps the PRD/failing-test output and surfaces the best match.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "Maps PRD keywords to worked-example files. The stuck detector matches keywords against the PRD text + failing test output and surfaces the best-scoring example.",
|
|
3
|
+
"examples": [
|
|
4
|
+
{
|
|
5
|
+
"file": "sql_parser.py",
|
|
6
|
+
"keywords": ["sql", "select from", "insert into", "where", "update set", "delete from", "tokenizer", "recursive descent", "query parser"],
|
|
7
|
+
"summary": "SQL tokenizer + recursive-descent parser. Handles SELECT/INSERT/UPDATE/DELETE + WHERE. Shows the critical alias-vs-keyword detection pattern."
|
|
8
|
+
}
|
|
9
|
+
]
|
|
10
|
+
}
|