drydock-cli 3.1.33__tar.gz → 3.1.34__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-3.1.33/drydock_cli.egg-info → drydock_cli-3.1.34}/PKG-INFO +1 -1
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/swarm.py +31 -10
- {drydock_cli-3.1.33 → drydock_cli-3.1.34/drydock_cli.egg-info}/PKG-INFO +1 -1
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/pyproject.toml +1 -1
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_swarm.py +44 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/LICENSE +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/NOTICE +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/README.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/__init__.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/__main__.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/advisor.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/agent.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/asr.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/bash_safety.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/bottleneck.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/budget.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/__init__.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/document-canvas.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/fiar-assess.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/fiar-cap.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/fiar-evidence.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/fiar-readiness.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/ml-data.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/ml-debug.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/ml-finetune.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/ml-metrics.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/ml-rl.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/ml-train.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/nist-ai-rmf.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/nist-csf.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/rmf-categorize.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/rmf-control.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/rmf-poam.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/rmf-review.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/stig-assess.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/builtin_skills/stig-remediate.md +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/capacity.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/cci.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/cli.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/comms/__init__.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/comms/attention.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/comms/channels.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/comms/events.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/compaction.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/config.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/detect.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/doccanvas.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/eratchet.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/events.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/extract.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/fiar.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/gittools.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/graphrag.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/groundtruth.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/guards.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/jobs.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/loop_detect.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/mcp.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/mission.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/mission_cli.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/mission_run.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/pdfredbox.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/phases.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/poam.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/predictions.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/progress.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/providers.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/ratchet.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/recipes.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/recovery.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/resume.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/rmf.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/rmf_graph.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/skills.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/stig.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/subagents.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/suggest.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/task_state.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/tool_policy.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/tool_registry.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/tool_result.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/tool_select.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/tool_validate.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/tools/__init__.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/trajectory.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/tui/__init__.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/tui/app.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/tui/approval.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/tui/messages.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/tui/widgets.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/tuning.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/verification.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock/web.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock_cli.egg-info/SOURCES.txt +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock_cli.egg-info/dependency_links.txt +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock_cli.egg-info/entry_points.txt +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock_cli.egg-info/requires.txt +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/drydock_cli.egg-info/top_level.txt +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/setup.cfg +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_advisor.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_approval.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_asr.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_back_command.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_bash_background.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_bash_binary_output.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_bash_crossplatform.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_bash_output_bounding.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_bash_process_group.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_bash_safety.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_bash_sanitize.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_bash_shell.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_bash_stdin.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_bash_stop_partial.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_bash_timeout_network.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_bash_timeout_param.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_bottleneck.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_budget.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_capacity.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_cci.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_cli_agents.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_comms.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_compact_command.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_compaction.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_config.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_config_migration.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_context_limit_config.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_context_limit_issue25.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_criteria_coverage.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_cycling_detection.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_declared_deps.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_degenerate_argument.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_detect.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_dispatch.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_doccanvas.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_e2e_connected.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_edit_replace_all.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_edit_thrash_and_compaction.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_effort_governor.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_empty_response.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_eratchet.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_events.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_extract.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_failure_loop.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_fiar.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_first_run_setup.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_gittools.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_glob_edit_edges.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_graphify_example.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_graphrag.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_graphrag_quoted_path.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_graphrag_sqlite.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_grep_and_read_robust.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_groundtruth_predictions.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_guards_and_tools.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_hallucinated_tools.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_jobs.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_knowledge_tool_available.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_leaked_tool_call.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_loop_detect.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_main_api_key.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_mcp.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_mission.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_mission_cli.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_mission_run.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_model_registry.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_oneshot_unreachable.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_overthink_interrupt.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_pdfredbox.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_phases.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_plan_autocontinue.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_poam.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_progress.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_providers_unreachable.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_ratchet.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_ratchet_offer.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_read_index.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_recipes.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_recovery.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_recovery_config.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_recovery_integration.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_repeated_outcome.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_repetition_interrupt.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_resume_events.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_resume_restore.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_resume_snapshot.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_rmf.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_rmf_graph.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_rmf_stig_graph.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_rolling_plan.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_runaway_repetition.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_screenshot.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_server_probe.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_skills.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_sqlite_events.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_stall_retry.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_stig.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_stop.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_streaming_newlines.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_subagent.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_subagents.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_suggest.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_system_prompt_help.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_task_state.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_timeline.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_todo.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_tool_arg_coercion.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_tool_arg_coercion_more.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_tool_arg_parsing.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_tool_canonical.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_tool_policy.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_tool_result.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_tool_select.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_tool_validate.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_tools_undo.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_trajectory.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_tui.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_tuning.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_verification_gate.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_viewimage.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_vision_input.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_web_tools.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_windows_shell.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_worker_subagent.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_write_content_coerce.py +0 -0
- {drydock_cli-3.1.33 → drydock_cli-3.1.34}/tests/test_xccdf.py +0 -0
|
@@ -693,17 +693,18 @@ def _peer_notes(candidates: list[Candidate], limit: int = 8) -> str:
|
|
|
693
693
|
each attempt's verdict + verified score + one-line summary, so a reader builds on the
|
|
694
694
|
partials and avoids repeating the failures. Only summaries cross between agents, never
|
|
695
695
|
full transcripts (§8 — preserve independence while still comparing notes)."""
|
|
696
|
+
# Rank strongest-first so the reader sees the best partial at the top, and explicitly flag
|
|
697
|
+
# it as the base to EXTEND — the actionable core of cross-pollination (§14): don't restart
|
|
698
|
+
# from scratch, continue the leading partial (and skip the failed approaches below it).
|
|
699
|
+
ranked = sorted(candidates, key=lambda c: (c.tests_passed, c.tests_total), reverse=True)[:limit]
|
|
696
700
|
lines = []
|
|
697
|
-
for c in
|
|
701
|
+
for i, c in enumerate(ranked):
|
|
698
702
|
score = f"{c.tests_passed}/{c.tests_total}" if c.tests_total else "unverified"
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
elif c.tests_passed:
|
|
702
|
-
verdict = "partial"
|
|
703
|
-
else:
|
|
704
|
-
verdict = "failed"
|
|
703
|
+
solved = bool(c.tests_total and c.tests_passed >= c.tests_total)
|
|
704
|
+
verdict = "SOLVED" if solved else ("partial" if c.tests_passed else "failed")
|
|
705
705
|
summ = (c.summary or "").strip().splitlines()[0][:160] if c.summary else "(no summary)"
|
|
706
|
-
|
|
706
|
+
tag = " ⟵ STRONGEST partial — EXTEND this approach" if (i == 0 and c.tests_passed and not solved) else ""
|
|
707
|
+
lines.append(f"- {c.agent} [{verdict} {score}]{tag}: {summ}")
|
|
707
708
|
return "\n".join(lines)
|
|
708
709
|
|
|
709
710
|
|
|
@@ -971,6 +972,11 @@ def run_cli(argv: list, config: dict | None = None) -> int:
|
|
|
971
972
|
p.add_argument("--max-turns", type=int, default=40)
|
|
972
973
|
p.add_argument("--max-tool-calls", type=int, default=40)
|
|
973
974
|
p.add_argument("--max-workers", type=int, default=None, help="max concurrent workers")
|
|
975
|
+
p.add_argument("--share", action="store_true",
|
|
976
|
+
help="blackboard cross-pollination: run in waves; later agents read peers' "
|
|
977
|
+
"verified attempts and build on partials instead of repeating failures")
|
|
978
|
+
p.add_argument("--waves", type=int, default=2,
|
|
979
|
+
help="number of waves when --share is set (wave 0 explores blind; default 2)")
|
|
974
980
|
try:
|
|
975
981
|
args = p.parse_args(argv)
|
|
976
982
|
except SystemExit as e:
|
|
@@ -986,12 +992,27 @@ def run_cli(argv: list, config: dict | None = None) -> int:
|
|
|
986
992
|
return 1
|
|
987
993
|
|
|
988
994
|
print(f"⚓ Drydock swarm — {args.agents} agents on: {objective}")
|
|
989
|
-
print(" (isolated git worktrees, independent verification, evidence-based judging)
|
|
995
|
+
print(" (isolated git worktrees, independent verification, evidence-based judging)"
|
|
996
|
+
+ (f"\n 🔗 shared communication ON — {args.waves} waves, peers' notes cross the "
|
|
997
|
+
"blackboard\n" if args.share else "\n"))
|
|
998
|
+
|
|
999
|
+
def _on(kind: str, d: dict) -> None:
|
|
1000
|
+
if kind == "share":
|
|
1001
|
+
print(f" 🔗 wave {d.get('wave')}: {d.get('agents')} agent(s) reading peers' notes")
|
|
1002
|
+
elif kind == "worker_done":
|
|
1003
|
+
print(f" · {d.get('agent')}: {'ok' if d.get('ok') else 'failed'}"
|
|
1004
|
+
+ (f" ({d.get('files')} files)" if d.get('files') else ""))
|
|
1005
|
+
elif kind == "verified":
|
|
1006
|
+
print(f" ✓ {d.get('candidate')}: {d.get('passed')}/{d.get('total')} ({d.get('status')})")
|
|
1007
|
+
elif kind == "judge":
|
|
1008
|
+
print(f" ⚖ winner={d.get('agent') or '—'} converged={d.get('converged')}")
|
|
1009
|
+
|
|
990
1010
|
try:
|
|
991
1011
|
res = run_swarm(cwd, objective, agents=args.agents, base_config=config,
|
|
992
1012
|
base_ref=args.base_ref, verify_cmd=args.verify, fitness=args.fitness,
|
|
993
1013
|
max_turns=args.max_turns, max_tool_calls=args.max_tool_calls,
|
|
994
|
-
max_workers=args.max_workers
|
|
1014
|
+
max_workers=args.max_workers, share=args.share, waves=args.waves,
|
|
1015
|
+
on_event=_on)
|
|
995
1016
|
except ValueError as e:
|
|
996
1017
|
print(f"Error: {e}")
|
|
997
1018
|
return 1
|
|
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
|
|
|
7
7
|
# PyPI distribution name is drydock-cli (the established install name, continued
|
|
8
8
|
# from the retired v2 fork); the import package + CLI command stay `drydock`.
|
|
9
9
|
name = "drydock-cli"
|
|
10
|
-
version = "3.1.
|
|
10
|
+
version = "3.1.34"
|
|
11
11
|
description = "Drydock — a local, provider-agnostic terminal coding agent for local LLMs"
|
|
12
12
|
readme = "README.md"
|
|
13
13
|
requires-python = ">=3.11"
|
|
@@ -313,6 +313,26 @@ def test_share_injects_peer_notes_into_later_waves(tmp_path):
|
|
|
313
313
|
assert any("agent-1" in s and "SOLVED" in s for s in seen)
|
|
314
314
|
|
|
315
315
|
|
|
316
|
+
def test_peer_notes_rank_and_flag_strongest_partial():
|
|
317
|
+
from drydock.swarm import Candidate, _peer_notes
|
|
318
|
+
cands = [
|
|
319
|
+
Candidate(id="c1", agent="agent-1", summary="tried A", tests_passed=1, tests_total=6),
|
|
320
|
+
Candidate(id="c2", agent="agent-2", summary="tried B", tests_passed=4, tests_total=6),
|
|
321
|
+
Candidate(id="c3", agent="agent-3", summary="tried C", tests_passed=0, tests_total=6),
|
|
322
|
+
]
|
|
323
|
+
notes = _peer_notes(cands)
|
|
324
|
+
first_line = notes.splitlines()[0]
|
|
325
|
+
assert "agent-2" in first_line and "EXTEND this approach" in first_line # strongest partial, ranked first + flagged
|
|
326
|
+
assert notes.index("agent-2") < notes.index("agent-1") < notes.index("agent-3") # ranked by score
|
|
327
|
+
assert "EXTEND" not in notes.split("agent-1")[1].split("\n")[0] # only the leader is flagged
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
def test_peer_notes_no_flag_when_already_solved():
|
|
331
|
+
from drydock.swarm import Candidate, _peer_notes
|
|
332
|
+
notes = _peer_notes([Candidate(id="c1", agent="a1", summary="done", tests_passed=6, tests_total=6)])
|
|
333
|
+
assert "SOLVED" in notes and "EXTEND" not in notes # nothing to extend if it's fully solved
|
|
334
|
+
|
|
335
|
+
|
|
316
336
|
def test_no_share_means_no_peer_notes(tmp_path):
|
|
317
337
|
import threading
|
|
318
338
|
repo = _init_repo(tmp_path / "repo")
|
|
@@ -398,6 +418,30 @@ def test_cli_solve_requires_git_repo(tmp_path, capsys):
|
|
|
398
418
|
assert "git" in capsys.readouterr().out.lower()
|
|
399
419
|
|
|
400
420
|
|
|
421
|
+
def test_cli_share_flag_reaches_run_swarm(tmp_path, monkeypatch):
|
|
422
|
+
repo = _init_repo(tmp_path / "repo")
|
|
423
|
+
captured = {}
|
|
424
|
+
|
|
425
|
+
def fake_run_swarm(cwd, objective, **kw):
|
|
426
|
+
captured.update(objective=objective, **kw)
|
|
427
|
+
return swarm.SwarmResult(swarm_id="s", objective=objective, root="r",
|
|
428
|
+
converged=False, winner=None, candidates=[])
|
|
429
|
+
monkeypatch.setattr(swarm, "run_swarm", fake_run_swarm)
|
|
430
|
+
rc = swarm.run_cli(["fix the bug", "--agents", "4", "--share", "--waves", "3"], {"cwd": repo})
|
|
431
|
+
assert rc == 0
|
|
432
|
+
assert captured["share"] is True and captured["waves"] == 3 # cross-pollination reachable via CLI
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
def test_cli_default_is_blind_parallel(tmp_path, monkeypatch):
|
|
436
|
+
repo = _init_repo(tmp_path / "repo")
|
|
437
|
+
captured = {}
|
|
438
|
+
monkeypatch.setattr(swarm, "run_swarm",
|
|
439
|
+
lambda cwd, objective, **kw: captured.update(kw) or
|
|
440
|
+
swarm.SwarmResult("s", objective, "r", False, None, []))
|
|
441
|
+
swarm.run_cli(["fix it"], {"cwd": repo})
|
|
442
|
+
assert captured["share"] is False # default unchanged (blind parallel)
|
|
443
|
+
|
|
444
|
+
|
|
401
445
|
def test_cli_solve_empty_objective(tmp_path):
|
|
402
446
|
repo = _init_repo(tmp_path / "repo")
|
|
403
447
|
assert swarm.run_cli([], {"cwd": repo}) == 1
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|