code-mower 1.1.2__tar.gz → 1.2.0__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.
- {code_mower-1.1.2 → code_mower-1.2.0}/PKG-INFO +63 -29
- {code_mower-1.1.2 → code_mower-1.2.0}/README.md +62 -28
- {code_mower-1.1.2 → code_mower-1.2.0}/pyproject.toml +1 -1
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/__init__.py +1 -1
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/board.py +11 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/events.py +29 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/controller.py +29 -3
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/package_manifest.py +1 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/release_campaigns.py +37 -2
- code_mower-1.2.0/src/code_mower/session.py +322 -0
- code_mower-1.2.0/src/code_mower/session_lease.py +515 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower.egg-info/PKG-INFO +63 -29
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower.egg-info/SOURCES.txt +3 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/workflows/builder-provenance.yml.j2 +1 -1
- code_mower-1.2.0/tests/test_board_lease.py +152 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_controller.py +121 -1
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_jira_adoption.py +6 -4
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_participant_sessions.py +101 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_release_campaigns.py +65 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_release_hygiene.py +85 -45
- code_mower-1.2.0/tests/test_session_lease.py +786 -0
- code_mower-1.2.0/tests/test_supervised_pilot_contract.py +104 -0
- code_mower-1.1.2/src/code_mower/session.py +0 -154
- code_mower-1.1.2/tests/test_supervised_pilot_contract.py +0 -61
- {code_mower-1.1.2 → code_mower-1.2.0}/CODE_OF_CONDUCT.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/LICENSE +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/MANIFEST.in +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/NOTICE +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/SUPPORT.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/requirements/requirements.txt +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/setup.cfg +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/adapters/__init__.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/adapters/_base.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/adapters/cursor_bugbot.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/adapters/gitar.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/adapters/greptile.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/adapters/qodo.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/antigravity_sdk_probe.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/audit_handoff_log.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/audit_labeler_lib.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/audit_limits.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/audit_progress.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/blind_review_artifacts.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/blind_review_coordinator.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/board_store.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/bootstrap.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/builder_experiment.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/builder_runs.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/__init__.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/arms.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/auto_discovery.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/commands.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/context_inputs.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/corpus.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/effect_report.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/evidence.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/evidence_report.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/identity.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/metrics.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/overlap.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/planning.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/policy.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/results.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/run_results.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/run_status.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/runner.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/truth.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/calibration/value_report.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/campaign_adapters.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/campaign_discovery.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/checks.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/claude_audit_pr.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/claude_cli_bounce.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/claude_cli_environment.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/clear_stale.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cli.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/__init__.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/adoption_runs.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/bundle.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/doctor.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/dogfood.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/endpoints.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/errors.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/export.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/finding_outcomes.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/git_metadata.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/manifest.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/operations.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/pr_outcomes.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/productivity.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/productivity_windows.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/reports.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/setup.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/tokens.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/upload.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/cloud_client/work_types.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/code_mower_calibration.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/code_mower_context_packs.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/code_mower_merge.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/code_mower_telemetry.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/codex_audit_env_preflight.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/codex_audit_pr.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/codex_audit_schema_smoke.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/codex_audit_verdict.schema.json +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/config.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/decisions.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/devin_api.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/devin_cli_audit_pr.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/__init__.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/adoption.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/audit_limits.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/campaign_auth.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/cloud.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/common.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/github.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_actions.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_api.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_branch.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_config.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_human_token.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_provider.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_repo.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/github_trusted_authors.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/groups.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/jira.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/models.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/output.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/presets.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/privacy.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_env.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_probe.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/providers.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/registry.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/runner.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/runtime.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/doctor_checks/supervised_pilot.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/file_locks.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/gate_health.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/gemini_cli_audit_pr.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/git_identity.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/grok_build_audit_pr.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/hermes_cli_audit_pr.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/init.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/jira_cloud.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/jira_mutations.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/jira_pr_sync.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/lane_configs/__init__.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/lane_configs/aider.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/lane_configs/claude.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/lane_configs/codex.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/lane_configs/devin.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/lane_configs/devin_cli.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/lane_configs/gemini_cli.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/lane_configs/grok_build.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/lane_configs/hermes_cli.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/lane_configs/local_llm.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/lane_configs/muse_cli.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/lane_delivery.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/lane_status.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/local_llm_audit_pr.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/local_llm_bakeoff.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/local_llm_calibration.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/local_llm_profiles.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/migration.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/migration_install.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/migration_mirror.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/migration_readiness.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/migration_rehearsal.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/muse_cli_audit_pr.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/next_steps.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/package.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/package_content.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/package_paths.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/package_rendering.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/package_static.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/participants.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/plan_context.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/productivity_report.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/prompts.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/provider_credentials.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/provider_registry.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/provider_runners/__init__.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/provider_runners/comments.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/provider_runners/exit_codes.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/provider_runners/git.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/provider_runners/github_auth.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/provider_runners/github_pr.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/provider_runners/pr_worktree.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/provider_runners/process.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/provider_runners/repo_paths.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/provider_runners/text_schema.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/provider_runners/workspace.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/providers/__init__.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/providers/local_cli.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/providers/provenance.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/release_qualify.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/release_readiness.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/reviewer_metrics.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/reviewer_spend.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/saas_reviewer_labeler.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/secrets.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/builder-experiment.example.json +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/calibration-corpus.example.json +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/calibration-corpus.json +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/code-mower.example.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/context-packs.example.json +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/lane_prompts/operability.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/lanes/README.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/lanes/claude.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/lanes/codex.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/lanes/cursor.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/lanes/devin.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/lanes/generic.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/product-support/code_mower +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/product-support/run_devin_cli_audit_pr.sh +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/product-support/status_report.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/providers.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/reviewer-spend.example.json +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/tracker_contract.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/tracker_queue.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/trailer_comment_labeler.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/versioning.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/work_orders.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower/workflow_actionlint.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower.egg-info/dependency_links.txt +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower.egg-info/entry_points.txt +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower.egg-info/requires.txt +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/src/code_mower.egg-info/top_level.txt +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/builder-experiment.example.json +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/calibration-corpus.example.json +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/calibration-corpus.json +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/code-mower.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/context-packs.example.json +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/cursor/BUGBOT.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/lanes/README.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/lanes/claude.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/lanes/codex.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/lanes/cursor.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/lanes/devin.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/lanes/generic.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/providers/acp_bridge.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/providers/aider.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/providers/antigravity_cli.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/providers/claude_audit.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/providers/claude_review.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/providers/coderabbit_cli.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/providers/codex.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/providers/cursor_bugbot.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/providers/cursor_cloud_agent.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/providers/devin.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/providers/devin_cli.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/providers/gemini_cli.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/providers/gitar.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/providers/greptile.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/providers/hermes_cli.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/providers/local_llm.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/providers/muse_cli.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/providers/qodo.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/providers.yml +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/reviewer-spend.example.json +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/reviewer-value-report.example.md +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_adoption_diagnostics.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_adoption_result_semantics.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_adoption_run_contract.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_antigravity_cli_audit_pr.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_antigravity_sdk_probe.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_audit_comment_posture.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_audit_limits.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_board.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_builder_experiment.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_builder_identity.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_builder_runs.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_calibration_effect_report.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_calibration_truth.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_campaign_adapters.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_campaign_discovery.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_campaign_gh_auth_and_issue_binding_817.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_campaign_retry_evidence_711.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_checks.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_claude_audit_pr.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_claude_cli_bounce.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_clear_stale.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_cloud_client.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_cloud_git_metadata.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_cloud_manifest.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_cloud_reports.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_coderabbit_cli_audit_pr.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_codex_audit_env_preflight.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_codex_audit_pr.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_decision_audit_integration.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_decisions.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_devin_api.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_devin_builder_lane.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_devin_cli_audit_pr.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_devin_provider_contract.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_doctor_actions_cost_summary.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_doctor_actions_failure_selection.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_doctor_boundaries.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_doctor_campaign_auth.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_doctor_campaign_readiness.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_doctor_github_checks.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_doctor_output.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_doctor_privacy.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_doctor_provider_env_required.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_doctor_provider_env_tokens.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_doctor_provider_local_audit_setup.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_doctor_provider_probe.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_doctor_provider_review_hygiene.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_doctor_registry.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_doctor_runtime.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_doctor_self_hosted_runner.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_doctor_supervised_pilot.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_file_locks.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_fork_pr_guard.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_gate_automerge.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_gate_health.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_hosted_dispatch_profile.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_init_actionlint.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_init_build_loop.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_jira_cloud.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_jira_mutations.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_jira_pr_sync.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_lane_delivery_contract.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_lane_status.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_local_llm_github_helpers.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_migration_rehearsal.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_migration_setup_drift.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_next_steps.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_package_install_failure_taxonomy.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_plan_context.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_pr_outcome_contract.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_pr_outcome_coverage.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_productivity_metrics_contract.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_productivity_report.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_productivity_windows.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_prompts.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_provider_credentials.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_provider_fixture_contracts.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_provider_local_cli.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_provider_runners_comments.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_provider_runners_git.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_provider_runners_github_pr.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_provider_runners_pr_worktree.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_provider_runners_process.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_provider_runners_repo_paths.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_provider_runners_text_schema.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_provider_runners_workspace.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_release_qualify.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_remote_qualification_failure_reason_819.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_reviewer_finding_outcome_contract.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_reviewer_metrics_core.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_reviewer_spend.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_tracker_config.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_tracker_contract.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_tracker_queue.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_trailer_comment_labeler.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_work_orders.py +0 -0
- {code_mower-1.1.2 → code_mower-1.2.0}/tests/test_work_type_contract.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-mower
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.2.0
|
|
4
4
|
Summary: Multi-reviewer AI code audit orchestration
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Project-URL: Homepage, https://github.com/codemower-ai/code-mower
|
|
@@ -34,9 +34,9 @@ Code Mower helps teams set up AI peer-programmer and reviewer lanes on real
|
|
|
34
34
|
GitHub pull requests, then measure which builders and reviewers are useful on
|
|
35
35
|
their actual codebase.
|
|
36
36
|
|
|
37
|
-
Code Mower
|
|
38
|
-
teams willing to calibrate reviewers.
|
|
39
|
-
gate.
|
|
37
|
+
The current Code Mower release line is supervised-pilot,
|
|
38
|
+
bring-your-own-agent-loop software for teams willing to calibrate reviewers.
|
|
39
|
+
It is not a drop-in unattended merge gate.
|
|
40
40
|
|
|
41
41
|
The short version:
|
|
42
42
|
|
|
@@ -55,6 +55,11 @@ Code Mower is local-first. The OSS tool works without the hosted service.
|
|
|
55
55
|
Default cloud bundles exclude source code, raw diffs, raw model transcripts,
|
|
56
56
|
raw stdout/stderr, auth output, and secrets.
|
|
57
57
|
|
|
58
|
+
Documentation on `main` follows the source on `main`. If you install the
|
|
59
|
+
published `code-mower==1.2.0` package, use the documentation from the matching
|
|
60
|
+
[`v1.2.0` tag](https://github.com/codemower-ai/code-mower/tree/v1.2.0) so the
|
|
61
|
+
commands and package stay aligned as development continues.
|
|
62
|
+
|
|
58
63
|
## Design Principles
|
|
59
64
|
|
|
60
65
|
Code Mower should feel like an engineering tool, not a demo harness:
|
|
@@ -188,10 +193,12 @@ When a team wants the same operator picture on CodeMower.com, run
|
|
|
188
193
|
zero-report, metadata-only mirror event, then add `--yes` only after review.
|
|
189
194
|
The v1.0 supervised-pilot automation and event boundary is defined in
|
|
190
195
|
[Supervised Pilot Contract](docs/supervised-pilot-contract.md).
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
196
|
+
`code-mower controller run --repo OWNER/REPO` is the dry-run-first policy
|
|
197
|
+
check: it selects the current dispatch/merge/owner-action decision from
|
|
198
|
+
metadata, can write a sanitized event with `--event-file`, and does not mutate
|
|
199
|
+
GitHub state. Its modes change policy evaluation and evidence requirements;
|
|
200
|
+
the generated workflows and provider transports own any separately authorized
|
|
201
|
+
mutation.
|
|
195
202
|
|
|
196
203
|
## See The Value Shape First
|
|
197
204
|
|
|
@@ -245,7 +252,7 @@ agent report its actual host posture, exact installed version, doctor result,
|
|
|
245
252
|
Board URL, and any owner-only click-list before it mutates the repo.
|
|
246
253
|
|
|
247
254
|
The current package-index announcement entry point is the tagged
|
|
248
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.
|
|
255
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.2.0/docs/try-in-10-minutes.md)
|
|
249
256
|
guide. The v1.0 supervised-pilot release includes the native Board, the
|
|
250
257
|
controller dry-run and policy contract, adoption and upgrade hardening from
|
|
251
258
|
recent install rehearsals, package-index release checks, provider-diversity
|
|
@@ -310,14 +317,26 @@ reports `running` / `waiting_for_user`, so a finished informational Devin
|
|
|
310
317
|
attempt is no longer recorded as owner-blocked. An explicit terminal API
|
|
311
318
|
failure and a `waiting_for_approval` session still take precedence over any
|
|
312
319
|
structured output.
|
|
320
|
+
The v1.0.15 patch makes productivity current-state metrics prefer live GitHub
|
|
321
|
+
state over historical Board snapshots and distinguishes historical evidence in
|
|
322
|
+
reports.
|
|
313
323
|
The v1.1 release adds optional Jira Cloud work tracking while keeping GitHub
|
|
314
324
|
pull requests, checks, and merge gates authoritative. Jira setup starts
|
|
315
325
|
read-only; mutation requires both explicit configuration and an explicit
|
|
316
326
|
apply command. Controller queue visibility, Board, and PR-to-Jira milestones
|
|
317
327
|
share the same bounded metadata contract, and GitHub-only repositories keep
|
|
318
328
|
their existing behavior and generated workflows.
|
|
319
|
-
|
|
320
|
-
|
|
329
|
+
The v1.1.1 patch hardens hosted release qualification with authenticated GitHub
|
|
330
|
+
fallback, durable campaign issue binding, persistent trusted result authors,
|
|
331
|
+
and bounded remote install failure reasons. The v1.1.2 patch keeps large Jira
|
|
332
|
+
queues inside the response budget and adds a narrow issue-type discovery
|
|
333
|
+
fallback when Jira's create-metadata inventory returns 404.
|
|
334
|
+
|
|
335
|
+
The v1.2 release gives every orchestrator host the same Jira authority brief,
|
|
336
|
+
adds a local single-orchestrator session lease with Board visibility, records
|
|
337
|
+
controller orchestrator telemetry, qualifies Cursor against the Codex/Claude
|
|
338
|
+
orchestrator contract, and makes hosted release qualification reproduce the
|
|
339
|
+
validated local result command exactly.
|
|
321
340
|
|
|
322
341
|
## What Calibration Does And Does Not Prove
|
|
323
342
|
|
|
@@ -348,7 +367,7 @@ Provider-contract baseline for the next release train:
|
|
|
348
367
|
|
|
349
368
|
For release verification,
|
|
350
369
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
351
|
-
the package-index procedure for `v1.
|
|
370
|
+
the package-index procedure for `v1.2.0` / `code-mower==1.2.0`. The
|
|
352
371
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
353
372
|
After publication, [Release Qualification](docs/release-qualification.md)
|
|
354
373
|
coordinates provider-specific install and operational checks without treating
|
|
@@ -542,8 +561,8 @@ measurement work.
|
|
|
542
561
|
|
|
543
562
|
## Installation Status
|
|
544
563
|
|
|
545
|
-
The current package-index release baseline is `v1.
|
|
546
|
-
install spec `code-mower==1.
|
|
564
|
+
The current package-index release baseline is `v1.2.0`, with pinned package
|
|
565
|
+
install spec `code-mower==1.2.0`. Release evidence is recorded on the GitHub
|
|
547
566
|
release and in the first-user install rehearsal. The public repository is
|
|
548
567
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
549
568
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -584,11 +603,14 @@ first so local work exercises the same package entrypoint users install.
|
|
|
584
603
|
|
|
585
604
|
## Docs Map
|
|
586
605
|
|
|
606
|
+
### Start And Operate
|
|
607
|
+
|
|
587
608
|
- [Install And Bootstrap](docs/install.md)
|
|
588
609
|
- [Upgrade An Existing Repository](docs/upgrade-existing-repo.md)
|
|
589
610
|
- [Try Code Mower In 10 Minutes](docs/try-in-10-minutes.md)
|
|
590
611
|
- [Build Loop In 30 Minutes](docs/build-loop-in-30-minutes.md)
|
|
591
612
|
- [Quickstart Reference](docs/quickstart.md)
|
|
613
|
+
- [Participants And Sessions](docs/sessions.md)
|
|
592
614
|
- [Orchestrator Prompt Pack](docs/orchestrator-prompt-pack.md)
|
|
593
615
|
- [Planning And Work Orders](docs/planning-work-orders.md)
|
|
594
616
|
- [Builder Providers: Grok And Cursor](docs/builders-grok-cursor.md)
|
|
@@ -604,11 +626,31 @@ first so local work exercises the same package entrypoint users install.
|
|
|
604
626
|
- [GitHub Setup](docs/github-setup.md)
|
|
605
627
|
- [Jira Cloud Setup](docs/jira-cloud-setup.md)
|
|
606
628
|
- [Jira Adoption Rehearsal](docs/jira-adoption-rehearsal.md)
|
|
629
|
+
- [Work Tracker Data Contract](docs/tracker-data-contract.md)
|
|
630
|
+
- [Release Qualification](docs/release-qualification.md)
|
|
631
|
+
- [Launch Command Surface](docs/launch-command-surface.md)
|
|
632
|
+
- [Troubleshooting](docs/troubleshooting.md)
|
|
633
|
+
|
|
634
|
+
### Trust, Architecture, And Evidence
|
|
635
|
+
|
|
636
|
+
- [Architecture](docs/architecture.md)
|
|
637
|
+
- [Lane Promotion Policy](docs/lane-promotion-policy.md)
|
|
638
|
+
- [Cloud Sharing](docs/cloud-sharing.md)
|
|
639
|
+
- [Cloud Data Contract](docs/cloud-data-contract.md)
|
|
640
|
+
- [Board Data Contract](docs/board-data-contract.md)
|
|
641
|
+
- [Privacy And Threat Model](docs/privacy-threat-model.md)
|
|
642
|
+
- [Current State And Roadmap](docs/current-state-and-roadmap.md)
|
|
643
|
+
- [Public Release Checklist](docs/public-release-checklist.md)
|
|
644
|
+
- [PyPI Release Runbook](docs/pypi-release.md)
|
|
645
|
+
- [Sample Doctor Output](docs/sample-doctor-output.md)
|
|
607
646
|
- [First Run Transcript](docs/first-run-transcript.md)
|
|
608
647
|
- [First-User Demo Transcript](docs/first-user-demo-transcript.md)
|
|
609
648
|
- [First-User Install Rehearsal](docs/first-user-install-rehearsal.md)
|
|
610
|
-
- [
|
|
611
|
-
- [
|
|
649
|
+
- [Demo Calibration Example](examples/demo-calibration/README.md)
|
|
650
|
+
- [Board Demo Rehearsal](examples/board-demo/README.md)
|
|
651
|
+
|
|
652
|
+
### History And Release Records
|
|
653
|
+
|
|
612
654
|
- [v0.6 Truth Baseline](docs/v06-truth-baseline.md)
|
|
613
655
|
- [v0.6 Release Notes](docs/v06-release-notes.md)
|
|
614
656
|
- [v0.8 Release Notes](docs/v08-release-notes.md)
|
|
@@ -629,23 +671,15 @@ first so local work exercises the same package entrypoint users install.
|
|
|
629
671
|
- [v1.0.13 Release Notes](docs/v1013-release-notes.md)
|
|
630
672
|
- [v1.0.14 Release Notes](docs/v1014-release-notes.md)
|
|
631
673
|
- [v1.0.15 Release Notes](docs/v1015-release-notes.md)
|
|
674
|
+
- [v1.1 Release Notes](docs/v11-release-notes.md)
|
|
632
675
|
- [v1.1.1 Release Notes](docs/v111-release-notes.md)
|
|
633
676
|
- [v1.1.2 Release Notes](docs/v112-release-notes.md)
|
|
634
|
-
- [v1.
|
|
677
|
+
- [v1.2 Release Notes](docs/v12-release-notes.md)
|
|
635
678
|
- [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
|
|
636
679
|
- [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
- [Sample Doctor Output](docs/sample-doctor-output.md)
|
|
641
|
-
- [Architecture](docs/architecture.md)
|
|
642
|
-
- [Lane Promotion Policy](docs/lane-promotion-policy.md)
|
|
643
|
-
- [Cloud Sharing](docs/cloud-sharing.md)
|
|
644
|
-
- [Cloud Data Contract](docs/cloud-data-contract.md)
|
|
645
|
-
- [Board Data Contract](docs/board-data-contract.md)
|
|
646
|
-
- [Privacy And Threat Model](docs/privacy-threat-model.md)
|
|
647
|
-
- [Current State And Roadmap](docs/current-state-and-roadmap.md)
|
|
648
|
-
- [Public Release Checklist](docs/public-release-checklist.md)
|
|
680
|
+
|
|
681
|
+
### Project
|
|
682
|
+
|
|
649
683
|
- [Changelog](CHANGELOG.md)
|
|
650
684
|
- [Contributing](CONTRIBUTING.md)
|
|
651
685
|
- [Support](SUPPORT.md)
|
|
@@ -4,9 +4,9 @@ Code Mower helps teams set up AI peer-programmer and reviewer lanes on real
|
|
|
4
4
|
GitHub pull requests, then measure which builders and reviewers are useful on
|
|
5
5
|
their actual codebase.
|
|
6
6
|
|
|
7
|
-
Code Mower
|
|
8
|
-
teams willing to calibrate reviewers.
|
|
9
|
-
gate.
|
|
7
|
+
The current Code Mower release line is supervised-pilot,
|
|
8
|
+
bring-your-own-agent-loop software for teams willing to calibrate reviewers.
|
|
9
|
+
It is not a drop-in unattended merge gate.
|
|
10
10
|
|
|
11
11
|
The short version:
|
|
12
12
|
|
|
@@ -25,6 +25,11 @@ Code Mower is local-first. The OSS tool works without the hosted service.
|
|
|
25
25
|
Default cloud bundles exclude source code, raw diffs, raw model transcripts,
|
|
26
26
|
raw stdout/stderr, auth output, and secrets.
|
|
27
27
|
|
|
28
|
+
Documentation on `main` follows the source on `main`. If you install the
|
|
29
|
+
published `code-mower==1.2.0` package, use the documentation from the matching
|
|
30
|
+
[`v1.2.0` tag](https://github.com/codemower-ai/code-mower/tree/v1.2.0) so the
|
|
31
|
+
commands and package stay aligned as development continues.
|
|
32
|
+
|
|
28
33
|
## Design Principles
|
|
29
34
|
|
|
30
35
|
Code Mower should feel like an engineering tool, not a demo harness:
|
|
@@ -158,10 +163,12 @@ When a team wants the same operator picture on CodeMower.com, run
|
|
|
158
163
|
zero-report, metadata-only mirror event, then add `--yes` only after review.
|
|
159
164
|
The v1.0 supervised-pilot automation and event boundary is defined in
|
|
160
165
|
[Supervised Pilot Contract](docs/supervised-pilot-contract.md).
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
166
|
+
`code-mower controller run --repo OWNER/REPO` is the dry-run-first policy
|
|
167
|
+
check: it selects the current dispatch/merge/owner-action decision from
|
|
168
|
+
metadata, can write a sanitized event with `--event-file`, and does not mutate
|
|
169
|
+
GitHub state. Its modes change policy evaluation and evidence requirements;
|
|
170
|
+
the generated workflows and provider transports own any separately authorized
|
|
171
|
+
mutation.
|
|
165
172
|
|
|
166
173
|
## See The Value Shape First
|
|
167
174
|
|
|
@@ -215,7 +222,7 @@ agent report its actual host posture, exact installed version, doctor result,
|
|
|
215
222
|
Board URL, and any owner-only click-list before it mutates the repo.
|
|
216
223
|
|
|
217
224
|
The current package-index announcement entry point is the tagged
|
|
218
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.
|
|
225
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.2.0/docs/try-in-10-minutes.md)
|
|
219
226
|
guide. The v1.0 supervised-pilot release includes the native Board, the
|
|
220
227
|
controller dry-run and policy contract, adoption and upgrade hardening from
|
|
221
228
|
recent install rehearsals, package-index release checks, provider-diversity
|
|
@@ -280,14 +287,26 @@ reports `running` / `waiting_for_user`, so a finished informational Devin
|
|
|
280
287
|
attempt is no longer recorded as owner-blocked. An explicit terminal API
|
|
281
288
|
failure and a `waiting_for_approval` session still take precedence over any
|
|
282
289
|
structured output.
|
|
290
|
+
The v1.0.15 patch makes productivity current-state metrics prefer live GitHub
|
|
291
|
+
state over historical Board snapshots and distinguishes historical evidence in
|
|
292
|
+
reports.
|
|
283
293
|
The v1.1 release adds optional Jira Cloud work tracking while keeping GitHub
|
|
284
294
|
pull requests, checks, and merge gates authoritative. Jira setup starts
|
|
285
295
|
read-only; mutation requires both explicit configuration and an explicit
|
|
286
296
|
apply command. Controller queue visibility, Board, and PR-to-Jira milestones
|
|
287
297
|
share the same bounded metadata contract, and GitHub-only repositories keep
|
|
288
298
|
their existing behavior and generated workflows.
|
|
289
|
-
|
|
290
|
-
|
|
299
|
+
The v1.1.1 patch hardens hosted release qualification with authenticated GitHub
|
|
300
|
+
fallback, durable campaign issue binding, persistent trusted result authors,
|
|
301
|
+
and bounded remote install failure reasons. The v1.1.2 patch keeps large Jira
|
|
302
|
+
queues inside the response budget and adds a narrow issue-type discovery
|
|
303
|
+
fallback when Jira's create-metadata inventory returns 404.
|
|
304
|
+
|
|
305
|
+
The v1.2 release gives every orchestrator host the same Jira authority brief,
|
|
306
|
+
adds a local single-orchestrator session lease with Board visibility, records
|
|
307
|
+
controller orchestrator telemetry, qualifies Cursor against the Codex/Claude
|
|
308
|
+
orchestrator contract, and makes hosted release qualification reproduce the
|
|
309
|
+
validated local result command exactly.
|
|
291
310
|
|
|
292
311
|
## What Calibration Does And Does Not Prove
|
|
293
312
|
|
|
@@ -318,7 +337,7 @@ Provider-contract baseline for the next release train:
|
|
|
318
337
|
|
|
319
338
|
For release verification,
|
|
320
339
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
321
|
-
the package-index procedure for `v1.
|
|
340
|
+
the package-index procedure for `v1.2.0` / `code-mower==1.2.0`. The
|
|
322
341
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
323
342
|
After publication, [Release Qualification](docs/release-qualification.md)
|
|
324
343
|
coordinates provider-specific install and operational checks without treating
|
|
@@ -512,8 +531,8 @@ measurement work.
|
|
|
512
531
|
|
|
513
532
|
## Installation Status
|
|
514
533
|
|
|
515
|
-
The current package-index release baseline is `v1.
|
|
516
|
-
install spec `code-mower==1.
|
|
534
|
+
The current package-index release baseline is `v1.2.0`, with pinned package
|
|
535
|
+
install spec `code-mower==1.2.0`. Release evidence is recorded on the GitHub
|
|
517
536
|
release and in the first-user install rehearsal. The public repository is
|
|
518
537
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
519
538
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -554,11 +573,14 @@ first so local work exercises the same package entrypoint users install.
|
|
|
554
573
|
|
|
555
574
|
## Docs Map
|
|
556
575
|
|
|
576
|
+
### Start And Operate
|
|
577
|
+
|
|
557
578
|
- [Install And Bootstrap](docs/install.md)
|
|
558
579
|
- [Upgrade An Existing Repository](docs/upgrade-existing-repo.md)
|
|
559
580
|
- [Try Code Mower In 10 Minutes](docs/try-in-10-minutes.md)
|
|
560
581
|
- [Build Loop In 30 Minutes](docs/build-loop-in-30-minutes.md)
|
|
561
582
|
- [Quickstart Reference](docs/quickstart.md)
|
|
583
|
+
- [Participants And Sessions](docs/sessions.md)
|
|
562
584
|
- [Orchestrator Prompt Pack](docs/orchestrator-prompt-pack.md)
|
|
563
585
|
- [Planning And Work Orders](docs/planning-work-orders.md)
|
|
564
586
|
- [Builder Providers: Grok And Cursor](docs/builders-grok-cursor.md)
|
|
@@ -574,11 +596,31 @@ first so local work exercises the same package entrypoint users install.
|
|
|
574
596
|
- [GitHub Setup](docs/github-setup.md)
|
|
575
597
|
- [Jira Cloud Setup](docs/jira-cloud-setup.md)
|
|
576
598
|
- [Jira Adoption Rehearsal](docs/jira-adoption-rehearsal.md)
|
|
599
|
+
- [Work Tracker Data Contract](docs/tracker-data-contract.md)
|
|
600
|
+
- [Release Qualification](docs/release-qualification.md)
|
|
601
|
+
- [Launch Command Surface](docs/launch-command-surface.md)
|
|
602
|
+
- [Troubleshooting](docs/troubleshooting.md)
|
|
603
|
+
|
|
604
|
+
### Trust, Architecture, And Evidence
|
|
605
|
+
|
|
606
|
+
- [Architecture](docs/architecture.md)
|
|
607
|
+
- [Lane Promotion Policy](docs/lane-promotion-policy.md)
|
|
608
|
+
- [Cloud Sharing](docs/cloud-sharing.md)
|
|
609
|
+
- [Cloud Data Contract](docs/cloud-data-contract.md)
|
|
610
|
+
- [Board Data Contract](docs/board-data-contract.md)
|
|
611
|
+
- [Privacy And Threat Model](docs/privacy-threat-model.md)
|
|
612
|
+
- [Current State And Roadmap](docs/current-state-and-roadmap.md)
|
|
613
|
+
- [Public Release Checklist](docs/public-release-checklist.md)
|
|
614
|
+
- [PyPI Release Runbook](docs/pypi-release.md)
|
|
615
|
+
- [Sample Doctor Output](docs/sample-doctor-output.md)
|
|
577
616
|
- [First Run Transcript](docs/first-run-transcript.md)
|
|
578
617
|
- [First-User Demo Transcript](docs/first-user-demo-transcript.md)
|
|
579
618
|
- [First-User Install Rehearsal](docs/first-user-install-rehearsal.md)
|
|
580
|
-
- [
|
|
581
|
-
- [
|
|
619
|
+
- [Demo Calibration Example](examples/demo-calibration/README.md)
|
|
620
|
+
- [Board Demo Rehearsal](examples/board-demo/README.md)
|
|
621
|
+
|
|
622
|
+
### History And Release Records
|
|
623
|
+
|
|
582
624
|
- [v0.6 Truth Baseline](docs/v06-truth-baseline.md)
|
|
583
625
|
- [v0.6 Release Notes](docs/v06-release-notes.md)
|
|
584
626
|
- [v0.8 Release Notes](docs/v08-release-notes.md)
|
|
@@ -599,23 +641,15 @@ first so local work exercises the same package entrypoint users install.
|
|
|
599
641
|
- [v1.0.13 Release Notes](docs/v1013-release-notes.md)
|
|
600
642
|
- [v1.0.14 Release Notes](docs/v1014-release-notes.md)
|
|
601
643
|
- [v1.0.15 Release Notes](docs/v1015-release-notes.md)
|
|
644
|
+
- [v1.1 Release Notes](docs/v11-release-notes.md)
|
|
602
645
|
- [v1.1.1 Release Notes](docs/v111-release-notes.md)
|
|
603
646
|
- [v1.1.2 Release Notes](docs/v112-release-notes.md)
|
|
604
|
-
- [v1.
|
|
647
|
+
- [v1.2 Release Notes](docs/v12-release-notes.md)
|
|
605
648
|
- [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
|
|
606
649
|
- [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
- [Sample Doctor Output](docs/sample-doctor-output.md)
|
|
611
|
-
- [Architecture](docs/architecture.md)
|
|
612
|
-
- [Lane Promotion Policy](docs/lane-promotion-policy.md)
|
|
613
|
-
- [Cloud Sharing](docs/cloud-sharing.md)
|
|
614
|
-
- [Cloud Data Contract](docs/cloud-data-contract.md)
|
|
615
|
-
- [Board Data Contract](docs/board-data-contract.md)
|
|
616
|
-
- [Privacy And Threat Model](docs/privacy-threat-model.md)
|
|
617
|
-
- [Current State And Roadmap](docs/current-state-and-roadmap.md)
|
|
618
|
-
- [Public Release Checklist](docs/public-release-checklist.md)
|
|
650
|
+
|
|
651
|
+
### Project
|
|
652
|
+
|
|
619
653
|
- [Changelog](CHANGELOG.md)
|
|
620
654
|
- [Contributing](CONTRIBUTING.md)
|
|
621
655
|
- [Support](SUPPORT.md)
|
|
@@ -34,6 +34,7 @@ from . import controller
|
|
|
34
34
|
from . import lane_status
|
|
35
35
|
from . import productivity_report
|
|
36
36
|
from . import reviewer_spend
|
|
37
|
+
from . import session_lease
|
|
37
38
|
|
|
38
39
|
|
|
39
40
|
DEFAULT_HOST = "127.0.0.1"
|
|
@@ -235,6 +236,7 @@ def status_payload(
|
|
|
235
236
|
"interval_seconds": config.record_interval_seconds,
|
|
236
237
|
},
|
|
237
238
|
}
|
|
239
|
+
payload["orchestrator_lease"] = session_lease.observe_lease(start=config.repo_path)
|
|
238
240
|
payload["agent_adapters"] = agent_adapters_payload(config)
|
|
239
241
|
payload["release_campaigns"] = release_campaigns_payload(config)
|
|
240
242
|
payload["owner_queue"] = owner_queue_payload(payload)
|
|
@@ -275,6 +277,7 @@ def _recording_metadata(config: BoardConfig, status: str, **extra: Any) -> dict[
|
|
|
275
277
|
def _recordable_payload(payload: dict[str, Any]) -> dict[str, Any]:
|
|
276
278
|
snapshot = dict(payload)
|
|
277
279
|
snapshot.pop("productivity", None)
|
|
280
|
+
snapshot.pop("orchestrator_lease", None)
|
|
278
281
|
return snapshot
|
|
279
282
|
|
|
280
283
|
|
|
@@ -544,6 +547,7 @@ def _pending_status_payload(config: BoardConfig) -> dict[str, Any]:
|
|
|
544
547
|
"local_paths": "shown" if config.show_local_paths else "redacted",
|
|
545
548
|
"recording": {"enabled": config.record_events, "interval_seconds": config.record_interval_seconds},
|
|
546
549
|
}
|
|
550
|
+
payload["orchestrator_lease"] = session_lease.observe_lease(start=config.repo_path)
|
|
547
551
|
payload["agent_adapters"] = agent_adapters_payload(config)
|
|
548
552
|
payload["owner_queue"] = owner_queue_payload(payload)
|
|
549
553
|
payload["supervised_pilot"] = _supervised_disabled(
|
|
@@ -1302,6 +1306,7 @@ def render_board_html(config: BoardConfig) -> str:
|
|
|
1302
1306
|
<section><h2>Supervised Pilot</h2><div class="rows" id="supervised"></div></section>
|
|
1303
1307
|
<section><h2>Productivity</h2><div class="rows" id="productivity"></div></section>
|
|
1304
1308
|
<section><h2>Owner Queue</h2><div class="rows" id="owner"></div></section>
|
|
1309
|
+
<section><h2>Local Orchestrator Lease</h2><div class="rows" id="lease"></div></section>
|
|
1305
1310
|
<section><h2>Agent Cards</h2><div class="rows" id="agents"></div></section>
|
|
1306
1311
|
<section><h2>Release Campaigns</h2><div class="rows" id="campaigns"></div></section>
|
|
1307
1312
|
<section><h2>Open PRs</h2><div class="rows" id="prs"></div></section>
|
|
@@ -1368,7 +1373,13 @@ def render_board_html(config: BoardConfig) -> str:
|
|
|
1368
1373
|
function checks(list) {{
|
|
1369
1374
|
return (list || []).map(c => `<span class="${{stateClass(c.state)}}">${{esc(c.name)}}=${{esc(c.state)}}</span>`).join(", ") || '<span class="muted">none</span>';
|
|
1370
1375
|
}}
|
|
1376
|
+
function renderLease(lease) {{
|
|
1377
|
+
const messages = {{absent: "No orchestrator lease in this working copy.", expired: "Lease expired.", malformed: "Local lease is malformed.", unavailable: "Local lease is unavailable."}};
|
|
1378
|
+
const state = lease?.state || "unavailable";
|
|
1379
|
+
return `<div class="row"><div class="line">${{pill(state)}}<b>Provider: ${{esc(lease?.provider || "none")}}</b></div><div>Expires: ${{lease?.expires_at ? localTime(lease.expires_at) : "n/a"}}</div><div class="muted">${{esc(messages[state] || "Local orchestration lease is active.")}}</div></div>`;
|
|
1380
|
+
}}
|
|
1371
1381
|
function render(data) {{
|
|
1382
|
+
put("lease", renderLease(data.orchestrator_lease));
|
|
1372
1383
|
document.getElementById("repo").textContent = REPO;
|
|
1373
1384
|
const version = data.board?.version || {{}};
|
|
1374
1385
|
const servingVersion = version.serving_version || "unknown";
|
|
@@ -4,12 +4,14 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import datetime as dt
|
|
6
6
|
import json
|
|
7
|
+
import re
|
|
7
8
|
import subprocess
|
|
8
9
|
import uuid
|
|
9
10
|
from pathlib import Path
|
|
10
11
|
from typing import Any, Mapping
|
|
11
12
|
|
|
12
13
|
from code_mower import __version__
|
|
14
|
+
from code_mower.participants import PARTICIPANTS
|
|
13
15
|
from code_mower.provider_registry import REFERENCE_PROVIDERS
|
|
14
16
|
from code_mower.providers import (
|
|
15
17
|
build_code_mower_tool_provenance,
|
|
@@ -46,6 +48,13 @@ from .work_types import validate_work_type_metadata
|
|
|
46
48
|
|
|
47
49
|
|
|
48
50
|
EVENT_SCHEMA = "code_mower.benchmarkEvent.v1"
|
|
51
|
+
CONTROLLER_EVENT_TYPES = frozenset({
|
|
52
|
+
"controller_decision", "merge_decision", "queue_state_snapshot", "owner_intervention",
|
|
53
|
+
})
|
|
54
|
+
ORCHESTRATOR_PROVIDERS = frozenset(
|
|
55
|
+
name for name, participant in PARTICIPANTS.items() if participant.orchestrator
|
|
56
|
+
)
|
|
57
|
+
CUSTOM_ORCHESTRATOR_RE = re.compile(r"custom:[a-z][a-z0-9-]{0,63}")
|
|
49
58
|
AUTHORING_RUN_SCHEMA = "code_mower.authoringRun.v1"
|
|
50
59
|
CLOUD_EVENT_STRING_FIELDS = (
|
|
51
60
|
"schema",
|
|
@@ -358,6 +367,21 @@ def build_provider_catalog_snapshot_events(
|
|
|
358
367
|
return events
|
|
359
368
|
|
|
360
369
|
|
|
370
|
+
def validate_orchestrator_provider(value: Any) -> str:
|
|
371
|
+
"""Validate categorical host identity without echoing untrusted input."""
|
|
372
|
+
if not isinstance(value, str) or (
|
|
373
|
+
value not in ORCHESTRATOR_PROVIDERS
|
|
374
|
+
and CUSTOM_ORCHESTRATOR_RE.fullmatch(value) is None
|
|
375
|
+
):
|
|
376
|
+
raise CloudBundleError(
|
|
377
|
+
"orchestrator_provider must be a known orchestrator provider "
|
|
378
|
+
f"({', '.join(sorted(ORCHESTRATOR_PROVIDERS))}) or custom:<slug>; "
|
|
379
|
+
"slug must be 1-64 lowercase letters, digits, or hyphens, starting with a letter"
|
|
380
|
+
)
|
|
381
|
+
validate_metadata_payload({"orchestrator_provider": value})
|
|
382
|
+
return value
|
|
383
|
+
|
|
384
|
+
|
|
361
385
|
def validate_cloud_event(value: Any) -> dict[str, Any]:
|
|
362
386
|
"""Validate Code Mower's metadata-only cloud event boundary.
|
|
363
387
|
|
|
@@ -380,6 +404,11 @@ def validate_cloud_event(value: Any) -> dict[str, Any]:
|
|
|
380
404
|
for key in ("metrics", "dimensions", "tool"):
|
|
381
405
|
if not isinstance(value.get(key), dict):
|
|
382
406
|
raise CloudBundleError(f"structured event field {key} must be an object")
|
|
407
|
+
if (
|
|
408
|
+
value["event_type"] in CONTROLLER_EVENT_TYPES
|
|
409
|
+
and "orchestrator_provider" in value["dimensions"]
|
|
410
|
+
):
|
|
411
|
+
validate_orchestrator_provider(value["dimensions"]["orchestrator_provider"])
|
|
383
412
|
if value["event_type"] == PRODUCTIVITY_EVENT_TYPE:
|
|
384
413
|
validate_productivity_summary_payload(value)
|
|
385
414
|
if value["event_type"] == PR_OUTCOME_EVENT_TYPE:
|
|
@@ -17,7 +17,9 @@ from . import __version__
|
|
|
17
17
|
from . import config as code_mower_config
|
|
18
18
|
from . import lane_status, tracker_queue
|
|
19
19
|
from .cloud_client.errors import CloudBundleError
|
|
20
|
-
from .cloud_client.events import
|
|
20
|
+
from .cloud_client.events import (
|
|
21
|
+
EVENT_SCHEMA, normalize_event, utc_now, validate_cloud_event, validate_orchestrator_provider,
|
|
22
|
+
)
|
|
21
23
|
from .providers import build_code_mower_tool_provenance
|
|
22
24
|
|
|
23
25
|
|
|
@@ -52,6 +54,11 @@ class ControllerOptions:
|
|
|
52
54
|
auto_merge_enabled: bool = False
|
|
53
55
|
merge_token_ready: bool = False
|
|
54
56
|
issue_limit: int = 50
|
|
57
|
+
orchestrator_provider: str | None = None
|
|
58
|
+
|
|
59
|
+
def __post_init__(self) -> None:
|
|
60
|
+
if self.orchestrator_provider is not None:
|
|
61
|
+
validate_orchestrator_provider(self.orchestrator_provider)
|
|
55
62
|
|
|
56
63
|
|
|
57
64
|
def _text(value: Any) -> str:
|
|
@@ -618,6 +625,8 @@ def evaluate_controller_report(
|
|
|
618
625
|
"ready_issue_errors": list(issue_payload.get("errors") or []),
|
|
619
626
|
},
|
|
620
627
|
}
|
|
628
|
+
if options.orchestrator_provider is not None:
|
|
629
|
+
report["orchestrator_provider"] = options.orchestrator_provider
|
|
621
630
|
if tracker_queue.jira_enabled(config) and "tracker" in issue_payload:
|
|
622
631
|
report["tracker"] = issue_payload["tracker"]
|
|
623
632
|
return report
|
|
@@ -682,6 +691,10 @@ def build_controller_event(
|
|
|
682
691
|
"merge_method": _text(decision.get("merge_method")),
|
|
683
692
|
"would_mutate": bool(decision.get("would_mutate")),
|
|
684
693
|
}
|
|
694
|
+
if "orchestrator_provider" in report:
|
|
695
|
+
dimensions["orchestrator_provider"] = validate_orchestrator_provider(
|
|
696
|
+
report["orchestrator_provider"]
|
|
697
|
+
)
|
|
685
698
|
dimensions = {
|
|
686
699
|
key: value
|
|
687
700
|
for key, value in dimensions.items()
|
|
@@ -788,10 +801,14 @@ def render_text(report: Mapping[str, Any]) -> str:
|
|
|
788
801
|
f"Code Mower controller for {report.get('repo')}",
|
|
789
802
|
f"Generated: {report.get('generated_at')}",
|
|
790
803
|
f"Mode: {report.get('mode')}",
|
|
804
|
+
]
|
|
805
|
+
if "orchestrator_provider" in report:
|
|
806
|
+
lines.append(f"Orchestrator: {report['orchestrator_provider']}")
|
|
807
|
+
lines.extend([
|
|
791
808
|
"",
|
|
792
809
|
f"Decision: {decision.get('decision_state')}",
|
|
793
810
|
f"Next: {decision.get('next_action')}",
|
|
794
|
-
]
|
|
811
|
+
])
|
|
795
812
|
if decision.get("next_detail"):
|
|
796
813
|
lines.append(f"Detail: {decision.get('next_detail')}")
|
|
797
814
|
if decision.get("pr_number"):
|
|
@@ -852,6 +869,10 @@ def main(
|
|
|
852
869
|
run.add_argument("--auto-merge-enabled", action="store_true")
|
|
853
870
|
run.add_argument("--merge-token-ready", action="store_true")
|
|
854
871
|
run.add_argument("--issue-limit", type=int, default=50)
|
|
872
|
+
run.add_argument(
|
|
873
|
+
"--orchestrator", metavar="PROVIDER",
|
|
874
|
+
help="orchestrator provider (e.g. codex, claude, or custom:<slug>); overrides CODE_MOWER_HOST",
|
|
875
|
+
)
|
|
855
876
|
run.add_argument("--event-file", type=Path, default=None)
|
|
856
877
|
run.add_argument("--team-id", default="")
|
|
857
878
|
run.add_argument("--install-id", default="")
|
|
@@ -864,6 +885,7 @@ def main(
|
|
|
864
885
|
args = parser.parse_args(list(argv or ()))
|
|
865
886
|
if args.command != "run": # pragma: no cover - argparse validates commands.
|
|
866
887
|
raise AssertionError(f"unhandled controller command: {args.command}")
|
|
888
|
+
environ = os.environ if env is None else env
|
|
867
889
|
try:
|
|
868
890
|
options = ControllerOptions(
|
|
869
891
|
repo=args.repo,
|
|
@@ -872,6 +894,10 @@ def main(
|
|
|
872
894
|
auto_merge_enabled=args.auto_merge_enabled,
|
|
873
895
|
merge_token_ready=args.merge_token_ready,
|
|
874
896
|
issue_limit=args.issue_limit,
|
|
897
|
+
orchestrator_provider=(
|
|
898
|
+
args.orchestrator if args.orchestrator is not None
|
|
899
|
+
else environ.get("CODE_MOWER_HOST")
|
|
900
|
+
),
|
|
875
901
|
)
|
|
876
902
|
config = code_mower_config.load_config(args.config)
|
|
877
903
|
jira_reader = tracker_queue.resolve_jira_queue_reader(
|
|
@@ -885,7 +911,7 @@ def main(
|
|
|
885
911
|
config_dir=(
|
|
886
912
|
Path(args.provider_config_dir) if args.provider_config_dir else None
|
|
887
913
|
),
|
|
888
|
-
env=
|
|
914
|
+
env=environ,
|
|
889
915
|
timeout_seconds=args.http_timeout,
|
|
890
916
|
client_factory=jira_client_factory,
|
|
891
917
|
)
|
|
@@ -277,6 +277,7 @@ PACKAGE_FILES = (
|
|
|
277
277
|
("src/code_mower/lane_delivery.py", "src/code_mower/lane_delivery.py", "core"),
|
|
278
278
|
("src/code_mower/participants.py", "src/code_mower/participants.py", "core"),
|
|
279
279
|
("src/code_mower/session.py", "src/code_mower/session.py", "core"),
|
|
280
|
+
("src/code_mower/session_lease.py", "src/code_mower/session_lease.py", "core"),
|
|
280
281
|
("src/code_mower/lane_status.py", "src/code_mower/lane_status.py", "core"),
|
|
281
282
|
("tools/code_mower_package.py", "src/code_mower/package.py", "core"),
|
|
282
283
|
("tools/code_mower_package_content.py", "src/code_mower/package_content.py", "core"),
|
|
@@ -9,6 +9,7 @@ import json
|
|
|
9
9
|
import math
|
|
10
10
|
import os
|
|
11
11
|
import re
|
|
12
|
+
import shlex
|
|
12
13
|
import shutil
|
|
13
14
|
import subprocess
|
|
14
15
|
import sys
|
|
@@ -2269,6 +2270,36 @@ def _dispatch_github_comment(
|
|
|
2269
2270
|
else f" The embedded `adoption_result` must report `qualification_context` "
|
|
2270
2271
|
f"`{qualification_context}` with an empty `starting_version`."
|
|
2271
2272
|
)
|
|
2273
|
+
qualify_argv = [
|
|
2274
|
+
"code-mower",
|
|
2275
|
+
"release",
|
|
2276
|
+
"qualify",
|
|
2277
|
+
"--release-tag",
|
|
2278
|
+
release_tag,
|
|
2279
|
+
"--package-spec",
|
|
2280
|
+
package_spec,
|
|
2281
|
+
"--package-source",
|
|
2282
|
+
package_source,
|
|
2283
|
+
"--qualification-context",
|
|
2284
|
+
qualification_context,
|
|
2285
|
+
]
|
|
2286
|
+
if starting_version:
|
|
2287
|
+
qualify_argv.extend(["--starting-version", starting_version])
|
|
2288
|
+
qualify_argv.extend(
|
|
2289
|
+
[
|
|
2290
|
+
"--provider",
|
|
2291
|
+
provider,
|
|
2292
|
+
"--executor",
|
|
2293
|
+
provider,
|
|
2294
|
+
"--repo-slug",
|
|
2295
|
+
repo_slug,
|
|
2296
|
+
"--output",
|
|
2297
|
+
"adoption-result.json",
|
|
2298
|
+
"--execute",
|
|
2299
|
+
"--json",
|
|
2300
|
+
]
|
|
2301
|
+
)
|
|
2302
|
+
qualify_command = shlex.join(qualify_argv)
|
|
2272
2303
|
body = (
|
|
2273
2304
|
f"### Code Mower Release Qualification Dispatch\n\n"
|
|
2274
2305
|
f"- **Release Tag:** `{release_tag}`\n"
|
|
@@ -2280,10 +2311,14 @@ def _dispatch_github_comment(
|
|
|
2280
2311
|
f"{package_source_line}"
|
|
2281
2312
|
f"{trigger_comments_line}"
|
|
2282
2313
|
f"- **Idempotency Key:** `{idempotency_key}`\n\n"
|
|
2283
|
-
f"
|
|
2314
|
+
f"Run this exact candidate qualification command:\n\n"
|
|
2315
|
+
f"```sh\n{qualify_command}\n```\n\n"
|
|
2316
|
+
f"Then reply with a comment containing a `CODE_MOWER_ADOPTION_RESULT` "
|
|
2284
2317
|
f"marker wrapping schema `{RESULT_MARKER_SCHEMA}` with matching "
|
|
2285
2318
|
f"campaign_id, provider, release_tag, package_source, and idempotency_key, plus an "
|
|
2286
|
-
f"embedded `adoption_result
|
|
2319
|
+
f"embedded `adoption_result` equal to the complete JSON object written to "
|
|
2320
|
+
f"`adoption-result.json`; embed that object unchanged, without renaming, "
|
|
2321
|
+
f"dropping, or synthesizing fields. The marker must be a single-line HTML "
|
|
2287
2322
|
f"comment on a line of its own.{starting_version_requirement} "
|
|
2288
2323
|
f"See docs/release-qualification.md.\n\n"
|
|
2289
2324
|
f"<!-- CODE_MOWER_RELEASE_CAMPAIGN: {marker_str} -->\n"
|