code-mower 1.0.14__tar.gz → 1.1.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.0.14 → code_mower-1.1.0}/PKG-INFO +19 -5
- {code_mower-1.0.14 → code_mower-1.1.0}/README.md +18 -4
- {code_mower-1.0.14 → code_mower-1.1.0}/pyproject.toml +1 -1
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/__init__.py +1 -1
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/antigravity_cli_audit_pr.py +46 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/board.py +33 -4
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cli.py +3 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud.py +131 -3
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/__init__.py +58 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/bundle.py +1 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/events.py +165 -23
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/export.py +13 -1
- code_mower-1.1.0/src/code_mower/cloud_client/finding_outcomes.py +205 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/operations.py +670 -11
- code_mower-1.1.0/src/code_mower/cloud_client/pr_outcomes.py +958 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/productivity.py +2 -0
- code_mower-1.1.0/src/code_mower/cloud_client/productivity_windows.py +720 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/config.py +186 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/controller.py +78 -5
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/devin_api.py +130 -12
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor.py +20 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/__init__.py +12 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/adoption.py +162 -35
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/groups.py +1 -1
- code_mower-1.1.0/src/code_mower/doctor_checks/jira.py +914 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/runner.py +18 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/gemini_cli_audit_pr.py +49 -13
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/init.py +102 -1
- code_mower-1.1.0/src/code_mower/jira_cloud.py +1754 -0
- code_mower-1.1.0/src/code_mower/jira_mutations.py +2456 -0
- code_mower-1.1.0/src/code_mower/jira_pr_sync.py +741 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_status.py +82 -2
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/package_manifest.py +17 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/productivity_report.py +69 -11
- code_mower-1.1.0/src/code_mower/provider_credentials.py +628 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/release_campaigns.py +764 -145
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/release_qualify.py +33 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/reviewer_spend.py +42 -5
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/code-mower.example.yml +36 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
- code_mower-1.1.0/src/code_mower/tracker_contract.py +320 -0
- code_mower-1.1.0/src/code_mower/tracker_queue.py +329 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower.egg-info/PKG-INFO +19 -5
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower.egg-info/SOURCES.txt +21 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/builder-provenance.yml.j2 +1 -1
- code_mower-1.1.0/tests/test_antigravity_cli_audit_pr.py +395 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_campaign_retry_evidence_711.py +76 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_campaign_readiness.py +207 -0
- code_mower-1.1.0/tests/test_jira_adoption.py +785 -0
- code_mower-1.1.0/tests/test_jira_cloud.py +2103 -0
- code_mower-1.1.0/tests/test_jira_mutations.py +2725 -0
- code_mower-1.1.0/tests/test_jira_pr_sync.py +921 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_lane_status.py +164 -1
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_pr_outcome_contract.py +41 -0
- code_mower-1.1.0/tests/test_pr_outcome_coverage.py +3401 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_productivity_report.py +120 -2
- code_mower-1.1.0/tests/test_productivity_windows.py +1209 -0
- code_mower-1.1.0/tests/test_provider_credentials.py +864 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_release_campaigns.py +11588 -10287
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_release_hygiene.py +49 -46
- code_mower-1.1.0/tests/test_reviewer_finding_outcome_contract.py +488 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_reviewer_spend.py +205 -0
- code_mower-1.1.0/tests/test_tracker_config.py +181 -0
- code_mower-1.1.0/tests/test_tracker_contract.py +221 -0
- code_mower-1.1.0/tests/test_tracker_queue.py +681 -0
- code_mower-1.0.14/src/code_mower/cloud_client/pr_outcomes.py +0 -160
- {code_mower-1.0.14 → code_mower-1.1.0}/CODE_OF_CONDUCT.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/LICENSE +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/MANIFEST.in +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/NOTICE +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/SUPPORT.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/requirements/requirements.txt +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/setup.cfg +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/adapters/__init__.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/adapters/_base.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/adapters/cursor_bugbot.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/adapters/gitar.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/adapters/greptile.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/adapters/qodo.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/antigravity_sdk_probe.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/audit_handoff_log.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/audit_labeler_lib.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/audit_limits.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/audit_progress.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/blind_review_artifacts.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/blind_review_coordinator.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/board_store.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/bootstrap.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/builder_experiment.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/builder_runs.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/__init__.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/arms.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/auto_discovery.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/commands.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/context_inputs.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/corpus.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/effect_report.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/evidence.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/evidence_report.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/identity.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/metrics.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/overlap.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/planning.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/policy.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/results.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/run_results.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/run_status.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/runner.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/truth.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/calibration/value_report.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/campaign_adapters.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/campaign_discovery.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/checks.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/claude_audit_pr.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/claude_cli_bounce.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/claude_cli_environment.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/clear_stale.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/adoption_runs.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/doctor.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/dogfood.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/endpoints.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/errors.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/git_metadata.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/manifest.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/reports.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/setup.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/tokens.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/upload.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/cloud_client/work_types.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/code_mower_calibration.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/code_mower_context_packs.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/code_mower_merge.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/code_mower_telemetry.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/codex_audit_env_preflight.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/codex_audit_pr.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/codex_audit_schema_smoke.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/codex_audit_verdict.schema.json +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/decisions.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/devin_cli_audit_pr.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/audit_limits.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/campaign_auth.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/cloud.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/common.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_api.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_branch.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_config.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_human_token.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_provider.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_repo.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_trusted_authors.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/models.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/output.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/presets.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/privacy.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_env.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_probe.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/providers.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/registry.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/runtime.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/doctor_checks/supervised_pilot.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/file_locks.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/gate_health.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/git_identity.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/grok_build_audit_pr.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/hermes_cli_audit_pr.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/__init__.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/aider.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/claude.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/codex.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/devin.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/devin_cli.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/gemini_cli.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/grok_build.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/hermes_cli.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/local_llm.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_configs/muse_cli.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/lane_delivery.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/local_llm_audit_pr.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/local_llm_bakeoff.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/local_llm_calibration.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/local_llm_profiles.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/migration.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/migration_install.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/migration_mirror.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/migration_readiness.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/migration_rehearsal.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/muse_cli_audit_pr.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/next_steps.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/package.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/package_content.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/package_paths.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/package_rendering.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/package_static.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/participants.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/plan_context.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/prompts.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_registry.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/__init__.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/comments.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/exit_codes.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/git.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/github_auth.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/github_pr.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/pr_worktree.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/process.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/repo_paths.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/text_schema.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/provider_runners/workspace.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/providers/__init__.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/providers/local_cli.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/providers/provenance.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/release_readiness.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/reviewer_metrics.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/saas_reviewer_labeler.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/secrets.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/session.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/builder-experiment.example.json +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/calibration-corpus.example.json +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/calibration-corpus.json +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/context-packs.example.json +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/operability.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lanes/README.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lanes/claude.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lanes/codex.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lanes/cursor.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lanes/devin.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lanes/generic.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/product-support/code_mower +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/product-support/run_devin_cli_audit_pr.sh +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/product-support/status_report.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/providers.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/reviewer-spend.example.json +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/trailer_comment_labeler.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/versioning.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/work_orders.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower/workflow_actionlint.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower.egg-info/dependency_links.txt +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower.egg-info/entry_points.txt +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower.egg-info/requires.txt +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/src/code_mower.egg-info/top_level.txt +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/builder-experiment.example.json +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/calibration-corpus.example.json +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/calibration-corpus.json +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/code-mower.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/context-packs.example.json +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/cursor/BUGBOT.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/lanes/README.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/lanes/claude.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/lanes/codex.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/lanes/cursor.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/lanes/devin.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/lanes/generic.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/acp_bridge.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/aider.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/antigravity_cli.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/claude_audit.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/claude_review.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/coderabbit_cli.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/codex.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/cursor_bugbot.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/cursor_cloud_agent.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/devin.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/devin_cli.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/gemini_cli.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/gitar.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/greptile.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/hermes_cli.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/local_llm.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/muse_cli.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers/qodo.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/providers.yml +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/reviewer-spend.example.json +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/reviewer-value-report.example.md +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_adoption_diagnostics.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_adoption_result_semantics.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_adoption_run_contract.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_antigravity_sdk_probe.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_audit_comment_posture.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_audit_limits.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_board.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_builder_experiment.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_builder_identity.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_builder_runs.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_calibration_effect_report.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_calibration_truth.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_campaign_adapters.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_campaign_discovery.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_checks.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_claude_audit_pr.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_claude_cli_bounce.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_clear_stale.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_cloud_client.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_cloud_git_metadata.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_cloud_manifest.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_cloud_reports.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_coderabbit_cli_audit_pr.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_codex_audit_env_preflight.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_codex_audit_pr.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_controller.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_decision_audit_integration.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_decisions.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_devin_api.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_devin_builder_lane.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_devin_cli_audit_pr.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_devin_provider_contract.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_actions_cost_summary.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_actions_failure_selection.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_boundaries.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_campaign_auth.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_github_checks.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_output.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_privacy.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_provider_env_required.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_provider_env_tokens.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_provider_local_audit_setup.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_provider_probe.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_provider_review_hygiene.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_registry.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_runtime.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_self_hosted_runner.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_doctor_supervised_pilot.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_file_locks.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_fork_pr_guard.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_gate_automerge.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_gate_health.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_hosted_dispatch_profile.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_init_actionlint.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_init_build_loop.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_lane_delivery_contract.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_local_llm_github_helpers.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_migration_rehearsal.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_migration_setup_drift.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_next_steps.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_package_install_failure_taxonomy.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_participant_sessions.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_plan_context.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_productivity_metrics_contract.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_prompts.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_fixture_contracts.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_local_cli.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_runners_comments.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_runners_git.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_runners_github_pr.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_runners_pr_worktree.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_runners_process.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_runners_repo_paths.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_runners_text_schema.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_provider_runners_workspace.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_release_qualify.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_reviewer_metrics_core.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_supervised_pilot_contract.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_trailer_comment_labeler.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.0}/tests/test_work_orders.py +0 -0
- {code_mower-1.0.14 → code_mower-1.1.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.0
|
|
3
|
+
Version: 1.1.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
|
|
@@ -234,6 +234,10 @@ after reinstalling, especially when switching between pipx and uv.
|
|
|
234
234
|
| B. Build loop in 30 minutes | You want builders plus an orchestrator pattern after the reviewer gate works. | Complete path A, then add the automation token, require `code-mower/gate` from Any source, enable repository auto-merge, prove the self-hosted Mac lane runner with `doctor --runner`, run `init --builders`, and dispatch the first issue. | [Build Loop In 30 Minutes](docs/build-loop-in-30-minutes.md) |
|
|
235
235
|
| C. Builder experiment | You want to compare authoring loops before trusting them broadly. | Use a work order or experiment spec, run `code-mower builder-experiment run` around an explicit command, then review the source-free `authoringRun` artifact and normal audit evidence. | [Builder Experiments](docs/builder-experiments.md) |
|
|
236
236
|
|
|
237
|
+
For Jira Cloud work tracking instead of the default GitHub Issues path, see
|
|
238
|
+
[Jira Cloud Setup](docs/jira-cloud-setup.md) and
|
|
239
|
+
[Jira Adoption Rehearsal](docs/jira-adoption-rehearsal.md).
|
|
240
|
+
|
|
237
241
|
When you ask another agent to install, upgrade, orchestrate, build, or review,
|
|
238
242
|
start from the universal prompt in
|
|
239
243
|
[Orchestrator Prompt Pack](docs/orchestrator-prompt-pack.md). It makes the
|
|
@@ -241,7 +245,7 @@ agent report its actual host posture, exact installed version, doctor result,
|
|
|
241
245
|
Board URL, and any owner-only click-list before it mutates the repo.
|
|
242
246
|
|
|
243
247
|
The current package-index announcement entry point is the tagged
|
|
244
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.0
|
|
248
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.0/docs/try-in-10-minutes.md)
|
|
245
249
|
guide. The v1.0 supervised-pilot release includes the native Board, the
|
|
246
250
|
controller dry-run and policy contract, adoption and upgrade hardening from
|
|
247
251
|
recent install rehearsals, package-index release checks, provider-diversity
|
|
@@ -306,6 +310,12 @@ reports `running` / `waiting_for_user`, so a finished informational Devin
|
|
|
306
310
|
attempt is no longer recorded as owner-blocked. An explicit terminal API
|
|
307
311
|
failure and a `waiting_for_approval` session still take precedence over any
|
|
308
312
|
structured output.
|
|
313
|
+
The v1.1 release adds optional Jira Cloud work tracking while keeping GitHub
|
|
314
|
+
pull requests, checks, and merge gates authoritative. Jira setup starts
|
|
315
|
+
read-only; mutation requires both explicit configuration and an explicit
|
|
316
|
+
apply command. Controller queue visibility, Board, and PR-to-Jira milestones
|
|
317
|
+
share the same bounded metadata contract, and GitHub-only repositories keep
|
|
318
|
+
their existing behavior and generated workflows.
|
|
309
319
|
Package-only users can start from the public package rather than a source
|
|
310
320
|
checkout.
|
|
311
321
|
|
|
@@ -338,7 +348,7 @@ Provider-contract baseline for the next release train:
|
|
|
338
348
|
|
|
339
349
|
For release verification,
|
|
340
350
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
341
|
-
the package-index procedure for `v1.0
|
|
351
|
+
the package-index procedure for `v1.1.0` / `code-mower==1.1.0`. The
|
|
342
352
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
343
353
|
After publication, [Release Qualification](docs/release-qualification.md)
|
|
344
354
|
coordinates provider-specific install and operational checks without treating
|
|
@@ -532,8 +542,8 @@ measurement work.
|
|
|
532
542
|
|
|
533
543
|
## Installation Status
|
|
534
544
|
|
|
535
|
-
The current package-index release baseline is `v1.0
|
|
536
|
-
install spec `code-mower==1.0
|
|
545
|
+
The current package-index release baseline is `v1.1.0`, with pinned package
|
|
546
|
+
install spec `code-mower==1.1.0`. Release evidence is recorded on the GitHub
|
|
537
547
|
release and in the first-user install rehearsal. The public repository is
|
|
538
548
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
539
549
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -592,6 +602,8 @@ first so local work exercises the same package entrypoint users install.
|
|
|
592
602
|
- [Provider Matrix](docs/provider-matrix.md)
|
|
593
603
|
- [Provider Calibration Scorecard](docs/provider-calibration-scorecard.md)
|
|
594
604
|
- [GitHub Setup](docs/github-setup.md)
|
|
605
|
+
- [Jira Cloud Setup](docs/jira-cloud-setup.md)
|
|
606
|
+
- [Jira Adoption Rehearsal](docs/jira-adoption-rehearsal.md)
|
|
595
607
|
- [First Run Transcript](docs/first-run-transcript.md)
|
|
596
608
|
- [First-User Demo Transcript](docs/first-user-demo-transcript.md)
|
|
597
609
|
- [First-User Install Rehearsal](docs/first-user-install-rehearsal.md)
|
|
@@ -616,6 +628,8 @@ first so local work exercises the same package entrypoint users install.
|
|
|
616
628
|
- [v1.0.12 Release Notes](docs/v1012-release-notes.md)
|
|
617
629
|
- [v1.0.13 Release Notes](docs/v1013-release-notes.md)
|
|
618
630
|
- [v1.0.14 Release Notes](docs/v1014-release-notes.md)
|
|
631
|
+
- [v1.0.15 Release Notes](docs/v1015-release-notes.md)
|
|
632
|
+
- [v1.1 Release Notes](docs/v11-release-notes.md)
|
|
619
633
|
- [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
|
|
620
634
|
- [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
|
|
621
635
|
- [Demo Calibration Example](examples/demo-calibration/README.md)
|
|
@@ -204,6 +204,10 @@ after reinstalling, especially when switching between pipx and uv.
|
|
|
204
204
|
| B. Build loop in 30 minutes | You want builders plus an orchestrator pattern after the reviewer gate works. | Complete path A, then add the automation token, require `code-mower/gate` from Any source, enable repository auto-merge, prove the self-hosted Mac lane runner with `doctor --runner`, run `init --builders`, and dispatch the first issue. | [Build Loop In 30 Minutes](docs/build-loop-in-30-minutes.md) |
|
|
205
205
|
| C. Builder experiment | You want to compare authoring loops before trusting them broadly. | Use a work order or experiment spec, run `code-mower builder-experiment run` around an explicit command, then review the source-free `authoringRun` artifact and normal audit evidence. | [Builder Experiments](docs/builder-experiments.md) |
|
|
206
206
|
|
|
207
|
+
For Jira Cloud work tracking instead of the default GitHub Issues path, see
|
|
208
|
+
[Jira Cloud Setup](docs/jira-cloud-setup.md) and
|
|
209
|
+
[Jira Adoption Rehearsal](docs/jira-adoption-rehearsal.md).
|
|
210
|
+
|
|
207
211
|
When you ask another agent to install, upgrade, orchestrate, build, or review,
|
|
208
212
|
start from the universal prompt in
|
|
209
213
|
[Orchestrator Prompt Pack](docs/orchestrator-prompt-pack.md). It makes the
|
|
@@ -211,7 +215,7 @@ agent report its actual host posture, exact installed version, doctor result,
|
|
|
211
215
|
Board URL, and any owner-only click-list before it mutates the repo.
|
|
212
216
|
|
|
213
217
|
The current package-index announcement entry point is the tagged
|
|
214
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.0
|
|
218
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.0/docs/try-in-10-minutes.md)
|
|
215
219
|
guide. The v1.0 supervised-pilot release includes the native Board, the
|
|
216
220
|
controller dry-run and policy contract, adoption and upgrade hardening from
|
|
217
221
|
recent install rehearsals, package-index release checks, provider-diversity
|
|
@@ -276,6 +280,12 @@ reports `running` / `waiting_for_user`, so a finished informational Devin
|
|
|
276
280
|
attempt is no longer recorded as owner-blocked. An explicit terminal API
|
|
277
281
|
failure and a `waiting_for_approval` session still take precedence over any
|
|
278
282
|
structured output.
|
|
283
|
+
The v1.1 release adds optional Jira Cloud work tracking while keeping GitHub
|
|
284
|
+
pull requests, checks, and merge gates authoritative. Jira setup starts
|
|
285
|
+
read-only; mutation requires both explicit configuration and an explicit
|
|
286
|
+
apply command. Controller queue visibility, Board, and PR-to-Jira milestones
|
|
287
|
+
share the same bounded metadata contract, and GitHub-only repositories keep
|
|
288
|
+
their existing behavior and generated workflows.
|
|
279
289
|
Package-only users can start from the public package rather than a source
|
|
280
290
|
checkout.
|
|
281
291
|
|
|
@@ -308,7 +318,7 @@ Provider-contract baseline for the next release train:
|
|
|
308
318
|
|
|
309
319
|
For release verification,
|
|
310
320
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
311
|
-
the package-index procedure for `v1.0
|
|
321
|
+
the package-index procedure for `v1.1.0` / `code-mower==1.1.0`. The
|
|
312
322
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
313
323
|
After publication, [Release Qualification](docs/release-qualification.md)
|
|
314
324
|
coordinates provider-specific install and operational checks without treating
|
|
@@ -502,8 +512,8 @@ measurement work.
|
|
|
502
512
|
|
|
503
513
|
## Installation Status
|
|
504
514
|
|
|
505
|
-
The current package-index release baseline is `v1.0
|
|
506
|
-
install spec `code-mower==1.0
|
|
515
|
+
The current package-index release baseline is `v1.1.0`, with pinned package
|
|
516
|
+
install spec `code-mower==1.1.0`. Release evidence is recorded on the GitHub
|
|
507
517
|
release and in the first-user install rehearsal. The public repository is
|
|
508
518
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
509
519
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -562,6 +572,8 @@ first so local work exercises the same package entrypoint users install.
|
|
|
562
572
|
- [Provider Matrix](docs/provider-matrix.md)
|
|
563
573
|
- [Provider Calibration Scorecard](docs/provider-calibration-scorecard.md)
|
|
564
574
|
- [GitHub Setup](docs/github-setup.md)
|
|
575
|
+
- [Jira Cloud Setup](docs/jira-cloud-setup.md)
|
|
576
|
+
- [Jira Adoption Rehearsal](docs/jira-adoption-rehearsal.md)
|
|
565
577
|
- [First Run Transcript](docs/first-run-transcript.md)
|
|
566
578
|
- [First-User Demo Transcript](docs/first-user-demo-transcript.md)
|
|
567
579
|
- [First-User Install Rehearsal](docs/first-user-install-rehearsal.md)
|
|
@@ -586,6 +598,8 @@ first so local work exercises the same package entrypoint users install.
|
|
|
586
598
|
- [v1.0.12 Release Notes](docs/v1012-release-notes.md)
|
|
587
599
|
- [v1.0.13 Release Notes](docs/v1013-release-notes.md)
|
|
588
600
|
- [v1.0.14 Release Notes](docs/v1014-release-notes.md)
|
|
601
|
+
- [v1.0.15 Release Notes](docs/v1015-release-notes.md)
|
|
602
|
+
- [v1.1 Release Notes](docs/v11-release-notes.md)
|
|
589
603
|
- [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
|
|
590
604
|
- [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
|
|
591
605
|
- [Demo Calibration Example](examples/demo-calibration/README.md)
|
|
@@ -12,6 +12,8 @@ import sys
|
|
|
12
12
|
import urllib.error
|
|
13
13
|
from pathlib import Path
|
|
14
14
|
|
|
15
|
+
from typing import Mapping
|
|
16
|
+
|
|
15
17
|
if __package__ in {None, ""}:
|
|
16
18
|
module_dir = Path(__file__).resolve().parent
|
|
17
19
|
sys.path.insert(0, str(module_dir.parent))
|
|
@@ -34,6 +36,11 @@ DEFAULT_ANTIGRAVITY_DISPLAY_NAME = "Antigravity CLI"
|
|
|
34
36
|
ANTIGRAVITY_SETTINGS_SUBDIRS = (".gemini", ".gemini/antigravity-cli")
|
|
35
37
|
ANTIGRAVITY_ALTERNATE_COMMANDS = ("antigravity",)
|
|
36
38
|
ANTIGRAVITY_AMBIENT_HOME_ENV = "ANTIGRAVITY_CLI_USE_AMBIENT_HOME"
|
|
39
|
+
ANTIGRAVITY_REQUIRED_FLAGS = ("--dangerously-skip-permissions",)
|
|
40
|
+
ANTIGRAVITY_HELP_SENTINELS = (
|
|
41
|
+
*gemini_cli_audit_pr.PROMPT_FILE_HELP_SENTINELS,
|
|
42
|
+
*ANTIGRAVITY_REQUIRED_FLAGS,
|
|
43
|
+
)
|
|
37
44
|
|
|
38
45
|
AntigravityCliHeadChangedError = gemini_cli_audit_pr.GeminiCliHeadChangedError
|
|
39
46
|
AntigravityCliUnsupportedError = gemini_cli_audit_pr.GeminiCliUnsupportedError
|
|
@@ -61,6 +68,43 @@ def resolve_antigravity_command(command: str) -> str:
|
|
|
61
68
|
return command
|
|
62
69
|
|
|
63
70
|
|
|
71
|
+
def build_antigravity_audit_argv(
|
|
72
|
+
*,
|
|
73
|
+
command: str = DEFAULT_ANTIGRAVITY_COMMAND,
|
|
74
|
+
workspace_dir: Path,
|
|
75
|
+
prompt_instruction: str,
|
|
76
|
+
timeout_seconds: int = gemini_cli_audit_pr.DEFAULT_TIMEOUT_SECONDS,
|
|
77
|
+
model: str = "",
|
|
78
|
+
) -> list[str]:
|
|
79
|
+
"""Build structured argv for headless Antigravity CLI audit inside sandbox."""
|
|
80
|
+
return gemini_cli_audit_pr.build_prompt_file_argv(
|
|
81
|
+
resolve_antigravity_command(command),
|
|
82
|
+
workspace_dir=workspace_dir,
|
|
83
|
+
prompt_instruction=prompt_instruction,
|
|
84
|
+
timeout_seconds=timeout_seconds,
|
|
85
|
+
model=model,
|
|
86
|
+
extra_args=ANTIGRAVITY_REQUIRED_FLAGS,
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def verify_antigravity_cli_contract(
|
|
91
|
+
command: str,
|
|
92
|
+
*,
|
|
93
|
+
cwd: Path,
|
|
94
|
+
env: Mapping[str, str] | None = None,
|
|
95
|
+
display_name: str = DEFAULT_ANTIGRAVITY_DISPLAY_NAME,
|
|
96
|
+
) -> None:
|
|
97
|
+
"""Verify that the Antigravity CLI supports required audit flags."""
|
|
98
|
+
resolved_env = env if env is not None else os.environ
|
|
99
|
+
gemini_cli_audit_pr.verify_prompt_file_contract(
|
|
100
|
+
resolve_antigravity_command(command),
|
|
101
|
+
cwd=cwd,
|
|
102
|
+
env=resolved_env,
|
|
103
|
+
display_name=display_name,
|
|
104
|
+
required_sentinels=ANTIGRAVITY_HELP_SENTINELS,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
|
|
64
108
|
def run_antigravity_cli_audit(
|
|
65
109
|
*,
|
|
66
110
|
repo: str,
|
|
@@ -120,6 +164,8 @@ def run_antigravity_cli_audit(
|
|
|
120
164
|
cli_transport="prompt_file",
|
|
121
165
|
preserve_ambient_home=use_ambient_home,
|
|
122
166
|
context_pack_text=context_pack_text,
|
|
167
|
+
extra_args=ANTIGRAVITY_REQUIRED_FLAGS,
|
|
168
|
+
required_help_sentinels=ANTIGRAVITY_HELP_SENTINELS,
|
|
123
169
|
)
|
|
124
170
|
|
|
125
171
|
|
|
@@ -212,6 +212,8 @@ def status_payload(
|
|
|
212
212
|
*,
|
|
213
213
|
gh_json_runner: lane_status.GitHubJsonRunner = lane_status.run_gh_json,
|
|
214
214
|
command_runner: lane_status.CommandRunner = lane_status.run_command,
|
|
215
|
+
jira_reader: controller.tracker_queue.JiraQueueReader | None = None,
|
|
216
|
+
tracker_links: Mapping[tuple[str, str, str], int] | None = None,
|
|
215
217
|
) -> dict[str, Any]:
|
|
216
218
|
payload = lane_status.collect_status(
|
|
217
219
|
repo=config.repo,
|
|
@@ -240,7 +242,11 @@ def status_payload(
|
|
|
240
242
|
config,
|
|
241
243
|
payload,
|
|
242
244
|
gh_json_runner=gh_json_runner,
|
|
245
|
+
jira_reader=jira_reader,
|
|
246
|
+
tracker_links=tracker_links,
|
|
243
247
|
)
|
|
248
|
+
if "tracker" in payload["supervised_pilot"]:
|
|
249
|
+
payload["tracker"] = payload["supervised_pilot"]["tracker"]
|
|
244
250
|
payload["productivity"] = productivity_report.board_payload(
|
|
245
251
|
repo=config.repo,
|
|
246
252
|
repo_path=config.repo_path,
|
|
@@ -771,6 +777,9 @@ def _supervised_pr_payload(pr: Mapping[str, Any]) -> dict[str, Any]:
|
|
|
771
777
|
|
|
772
778
|
|
|
773
779
|
def _supervised_issue_payload(issue: Mapping[str, Any]) -> dict[str, Any]:
|
|
780
|
+
if issue.get("source_kind") == "jira_cloud":
|
|
781
|
+
return {"source_kind": "jira_cloud", "work_item": issue["work_item"],
|
|
782
|
+
"builder_lane": _safe_text(issue.get("builder_lane"), limit=60)}
|
|
774
783
|
payload: dict[str, Any] = {
|
|
775
784
|
"number": _int(issue.get("number")) or 0,
|
|
776
785
|
"url": _http_url(issue.get("url")),
|
|
@@ -787,10 +796,13 @@ def _supervised_issue_payload(issue: Mapping[str, Any]) -> dict[str, Any]:
|
|
|
787
796
|
|
|
788
797
|
def supervised_pilot_payload(
|
|
789
798
|
config: BoardConfig,
|
|
790
|
-
status:
|
|
799
|
+
status: Mapping[str, Any],
|
|
791
800
|
*,
|
|
792
801
|
gh_json_runner: lane_status.GitHubJsonRunner = lane_status.run_gh_json,
|
|
802
|
+
jira_reader: controller.tracker_queue.JiraQueueReader | None = None,
|
|
803
|
+
tracker_links: Mapping[tuple[str, str, str], int] | None = None,
|
|
793
804
|
) -> dict[str, Any]:
|
|
805
|
+
"""Return pilot state and its optional tracker view without modifying status."""
|
|
794
806
|
config_path = Path(config.repo_path) / "code-mower.yml"
|
|
795
807
|
if not config_path.is_file():
|
|
796
808
|
return _supervised_disabled("code-mower.yml not found; supervised pilot state is unavailable")
|
|
@@ -803,12 +815,20 @@ def supervised_pilot_payload(
|
|
|
803
815
|
return _supervised_disabled("Code Mower config is invalid; run code-mower config validate")
|
|
804
816
|
|
|
805
817
|
remote = status.get("remote") if isinstance(status.get("remote"), Mapping) else {}
|
|
806
|
-
|
|
818
|
+
tracker_view = None
|
|
819
|
+
if controller.tracker_queue.jira_enabled(raw_config):
|
|
820
|
+
tracker_view = controller.tracker_queue.queue_view(
|
|
821
|
+
controller.tracker_queue.collect_queue(raw_config, reader=jira_reader),
|
|
822
|
+
config=raw_config, remote=remote, links=tracker_links,
|
|
823
|
+
stale_minutes=config.stale_minutes,
|
|
824
|
+
)
|
|
825
|
+
if remote.get("available") or controller.tracker_queue.jira_enabled(raw_config):
|
|
807
826
|
ready_issues = controller._collect_ready_issues( # noqa: SLF001 - shared package policy surface for Board.
|
|
808
827
|
repo=config.repo,
|
|
809
828
|
config=raw_config,
|
|
810
829
|
gh_json_runner=gh_json_runner,
|
|
811
830
|
issue_limit=min(config.pr_limit, 50),
|
|
831
|
+
tracker_view=tracker_view,
|
|
812
832
|
)
|
|
813
833
|
else:
|
|
814
834
|
ready_issues = {"available": False, "errors": ["remote unavailable"], "issues": []}
|
|
@@ -824,6 +844,7 @@ def supervised_pilot_payload(
|
|
|
824
844
|
raw_prs = remote.get("pull_requests") if isinstance(remote.get("pull_requests"), list) else []
|
|
825
845
|
issue_payload = ready_issues.get("issues") if isinstance(ready_issues.get("issues"), list) else []
|
|
826
846
|
return {
|
|
847
|
+
**({"tracker": report["tracker"]} if "tracker" in report else {}),
|
|
827
848
|
"schema": controller.SUPERVISED_PILOT_SCHEMA,
|
|
828
849
|
"enabled": True,
|
|
829
850
|
"cycle_state": _supervised_cycle_state(decision.get("decision_state")),
|
|
@@ -1396,10 +1417,11 @@ def render_board_html(config: BoardConfig) -> str:
|
|
|
1396
1417
|
supervisedDecision.pr_number ? `<div class="row"><div class="line"><a href="${{esc(href(supervisedDecision.pr_url))}}">Selected PR #${{esc(supervisedDecision.pr_number)}}</a>${{supervisedDecision.lane_id ? pill(supervisedDecision.lane_id) : ""}}${{supervisedDecision.gate_status ? pill(`gate ${{supervisedDecision.gate_status}}`) : ""}}${{supervisedDecision.author_lane_excluded ? pill("author excluded") : ""}}</div><div class="muted">${{esc(supervisedDecision.branch || "")}}${{supervisedDecision.head_sha_prefix ? ` @ ${{esc(supervisedDecision.head_sha_prefix)}}` : ""}}</div></div>` : "",
|
|
1397
1418
|
supervisedDecision.issue_number ? `<div class="row"><div class="line"><a href="${{esc(href(supervisedDecision.issue_url))}}">Selected issue #${{esc(supervisedDecision.issue_number)}}</a>${{supervisedDecision.lane_id ? pill(supervisedDecision.lane_id) : ""}}</div></div>` : "",
|
|
1398
1419
|
reviewerOutcomes.length ? `<div class="row"><b>Reviewer Evidence</b><div class="muted">${{reviewerOutcomes.map(outcome => `${{esc(outcome.lane_id || outcome.config_lane_id)}}=${{esc(outcome.verdict)}}`).join(", ")}}</div></div>` : "",
|
|
1399
|
-
supervisedIssues.length ? `<div class="row"><b>Ready Issues</b><div class="muted">${{supervisedIssues.slice(0, 5).map(issue =>
|
|
1420
|
+
supervisedIssues.length ? `<div class="row"><b>Ready Issues</b><div class="muted">${{supervisedIssues.slice(0, 5).map(issue => `${{esc(issue.work_item?.identity?.issue_key || `#${{issue.number}}`)}} ${{esc(issue.builder_lane || "")}}`).join(", ")}}</div></div>` : "",
|
|
1400
1421
|
supervisedPRs.length ? `<div class="row"><b>Active PRs</b><div class="muted">${{supervisedPRs.slice(0, 5).map(pr => `#${{esc(pr.number)}} ${{esc(pr.merge_state || "")}}${{pr.stale ? " stale" : ""}}${{pr.is_draft ? " draft" : ""}}`).join(", ")}}</div></div>` : ""
|
|
1401
1422
|
].filter(Boolean).join("") : empty(supervised.message || "Supervised pilot state unavailable.");
|
|
1402
|
-
|
|
1423
|
+
const trackerRows = data.tracker ? `<div class="row"><b>Tracker: ${{esc(data.tracker.source_kind)}}</b> ${{pill(data.tracker.freshness)}}<div>${{esc((data.tracker.errors || []).join(", "))}}</div></div>` + (data.tracker.items || []).map(row => `<div class="row"><a href="${{esc(href(row.work_item.url))}}">${{esc(row.work_item.identity.issue_key || row.work_item.identity.issue_id)}}</a> ${{pill(row.work_item.lifecycle_category)}} ${{pill(row.freshness)}} ${{pill(row.lane_id || "unassigned")}}<div>PR ${{esc(row.linked_pr_number || "-")}} gate=${{esc(row.gate_status)}} (${{esc(row.pr_freshness)}})</div><div>next: ${{esc(row.next_action)}}</div></div>`).join("") : "";
|
|
1424
|
+
put("supervised", trackerRows + supervisedRows || empty(supervised.message || "No supervised pilot activity."));
|
|
1403
1425
|
const productivityRows = [
|
|
1404
1426
|
`<div class="row"><div>next: <b>${{esc(productivity.next_action || "inspect")}}</b></div></div>`,
|
|
1405
1427
|
`<div class="row"><b>Current</b><div class="line">${{pill(`open PRs ${{display(productivityCurrent.open_pr_count)}}`)}}${{pill(`active lanes ${{display(productivityCurrent.active_lane_count)}}`)}}${{pill(`blocked ${{display(productivityCurrent.blocked_pr_count)}}`)}}${{pill(`owner actions ${{display(productivityCurrent.owner_action_count)}}`)}}</div></div>`,
|
|
@@ -1906,6 +1928,13 @@ def make_handler(
|
|
|
1906
1928
|
snapshot, cache_metadata = status_cache.get()
|
|
1907
1929
|
payload = copy.deepcopy(snapshot) if snapshot is not None else _pending_status_payload(config)
|
|
1908
1930
|
payload["board"]["cache"] = cache_metadata
|
|
1931
|
+
if "tracker" in payload and cache_metadata["state"] == "stale":
|
|
1932
|
+
payload["tracker"]["freshness"] = "historical"
|
|
1933
|
+
for row in payload["tracker"]["items"]:
|
|
1934
|
+
row["freshness"] = "historical"
|
|
1935
|
+
row["pr_freshness"] = "historical"
|
|
1936
|
+
row["eligible"] = False
|
|
1937
|
+
row["next_action"] = "refresh current state"
|
|
1909
1938
|
if config.record_events:
|
|
1910
1939
|
# Recording identity is the cache generation, not cache freshness.
|
|
1911
1940
|
# ``snapshot`` and ``generation`` are read together under the cache
|
|
@@ -66,6 +66,7 @@ from . import gate_health as code_mower_gate_health
|
|
|
66
66
|
from . import grok_build_audit_pr
|
|
67
67
|
from . import hermes_cli_audit_pr
|
|
68
68
|
from . import init as code_mower_init
|
|
69
|
+
from . import jira_mutations as code_mower_jira_mutations
|
|
69
70
|
from . import lane_delivery as code_mower_lane_delivery
|
|
70
71
|
from . import lane_status as code_mower_lane_status
|
|
71
72
|
from . import local_llm_audit_pr
|
|
@@ -478,6 +479,7 @@ COMMAND_DESCRIPTIONS: dict[str, str] = {
|
|
|
478
479
|
"saas-reviewer-labeler": "Apply labels from hosted reviewer comments.",
|
|
479
480
|
"telemetry": "Inspect benchmark telemetry/event helpers.",
|
|
480
481
|
"trailer-comment-labeler": "Apply labels from structured audit trailers.",
|
|
482
|
+
"tracker": "Plan or apply guarded, idempotent Jira Cloud work-tracker mutations.",
|
|
481
483
|
"work-order": "Draft implementation work orders and builder experiment seeds.",
|
|
482
484
|
}
|
|
483
485
|
|
|
@@ -626,6 +628,7 @@ COMMAND_HANDLERS: dict[str, CommandHandler] = {
|
|
|
626
628
|
"session": code_mower_session.main,
|
|
627
629
|
"telemetry": code_mower_telemetry.main,
|
|
628
630
|
"trailer-comment-labeler": trailer_comment_labeler.main,
|
|
631
|
+
"tracker": code_mower_jira_mutations.main,
|
|
629
632
|
"work-order": code_mower_work_orders.work_order_main,
|
|
630
633
|
}
|
|
631
634
|
|
|
@@ -32,6 +32,7 @@ if __package__ in {None, ""}:
|
|
|
32
32
|
default_setup_path as _default_setup_path,
|
|
33
33
|
build_upload_payload,
|
|
34
34
|
default_dogfood_reports as _default_dogfood_reports,
|
|
35
|
+
detect_repo_slug as _detect_repo_slug,
|
|
35
36
|
dogfood_upload as _dogfood_upload,
|
|
36
37
|
event_id_from_github_run as _event_id_from_github_run,
|
|
37
38
|
is_local_http_endpoint,
|
|
@@ -50,6 +51,7 @@ if __package__ in {None, ""}:
|
|
|
50
51
|
repo_slug_from_remote as _repo_slug_from_remote,
|
|
51
52
|
repo_sync_output_name as _repo_sync_output_name,
|
|
52
53
|
repo_sync_upload as _repo_sync_upload,
|
|
54
|
+
pr_outcomes_upload as _pr_outcomes_upload,
|
|
53
55
|
resolve_setup_token as _resolve_setup_token,
|
|
54
56
|
reviewer_runs_upload as _reviewer_runs_upload,
|
|
55
57
|
run_cloud_doctor,
|
|
@@ -86,6 +88,7 @@ else: # pragma: no cover - exercised after package extraction.
|
|
|
86
88
|
default_setup_path as _default_setup_path,
|
|
87
89
|
build_upload_payload,
|
|
88
90
|
default_dogfood_reports as _default_dogfood_reports,
|
|
91
|
+
detect_repo_slug as _detect_repo_slug,
|
|
89
92
|
dogfood_upload as _dogfood_upload,
|
|
90
93
|
event_id_from_github_run as _event_id_from_github_run,
|
|
91
94
|
is_local_http_endpoint,
|
|
@@ -104,6 +107,7 @@ else: # pragma: no cover - exercised after package extraction.
|
|
|
104
107
|
repo_slug_from_remote as _repo_slug_from_remote,
|
|
105
108
|
repo_sync_output_name as _repo_sync_output_name,
|
|
106
109
|
repo_sync_upload as _repo_sync_upload,
|
|
110
|
+
pr_outcomes_upload as _pr_outcomes_upload,
|
|
107
111
|
resolve_setup_token as _resolve_setup_token,
|
|
108
112
|
reviewer_runs_upload as _reviewer_runs_upload,
|
|
109
113
|
run_cloud_doctor,
|
|
@@ -125,6 +129,7 @@ DEFAULT_OUTPUT_DIR = ".code-mower/cloud-benchmark-bundle"
|
|
|
125
129
|
DEFAULT_CATCH_UP_OUTPUT_DIR = ".code-mower/cloud-catch-up-bundle"
|
|
126
130
|
DEFAULT_REVIEWER_RUNS_OUTPUT_DIR = ".code-mower/reviewer-run-bundle"
|
|
127
131
|
DEFAULT_REPO_SYNC_OUTPUT_DIR = ".code-mower/cloud-repo-sync"
|
|
132
|
+
DEFAULT_PR_OUTCOMES_OUTPUT_DIR = ".code-mower/cloud-pr-outcomes-bundle"
|
|
128
133
|
DEFAULT_BOARD_SNAPSHOT_OUTPUT_DIR = ".code-mower/cloud-board-snapshot-bundle"
|
|
129
134
|
|
|
130
135
|
# Keep the legacy cloud.py import surface intentional while implementation
|
|
@@ -143,6 +148,7 @@ __all__ = [
|
|
|
143
148
|
"DEFAULT_CATCH_UP_OUTPUT_DIR",
|
|
144
149
|
"DEFAULT_REVIEWER_RUNS_OUTPUT_DIR",
|
|
145
150
|
"DEFAULT_REPO_SYNC_OUTPUT_DIR",
|
|
151
|
+
"DEFAULT_PR_OUTCOMES_OUTPUT_DIR",
|
|
146
152
|
"DEFAULT_BOARD_SNAPSHOT_OUTPUT_DIR",
|
|
147
153
|
"build_cloud_bundle",
|
|
148
154
|
"build_upload_payload",
|
|
@@ -170,6 +176,7 @@ __all__ = [
|
|
|
170
176
|
"_repo_slug_from_remote",
|
|
171
177
|
"_repo_sync_output_name",
|
|
172
178
|
"_repo_sync_upload",
|
|
179
|
+
"_pr_outcomes_upload",
|
|
173
180
|
"_resolve_setup_token",
|
|
174
181
|
"_reviewer_runs_upload",
|
|
175
182
|
"_run_git",
|
|
@@ -468,6 +475,57 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
468
475
|
)
|
|
469
476
|
catch_up.add_argument("--timeout", type=float, default=20.0)
|
|
470
477
|
catch_up.add_argument("--json", action="store_true")
|
|
478
|
+
pr_outcomes = subparsers.add_parser("pr-outcomes")
|
|
479
|
+
pr_outcomes.add_argument("--repo-path", type=Path, default=Path.cwd())
|
|
480
|
+
pr_outcomes.add_argument(
|
|
481
|
+
"--output-dir",
|
|
482
|
+
type=Path,
|
|
483
|
+
default=Path(DEFAULT_PR_OUTCOMES_OUTPUT_DIR),
|
|
484
|
+
)
|
|
485
|
+
pr_outcomes.add_argument("--repo-slug", default="")
|
|
486
|
+
pr_outcomes.add_argument("--team-id", default="")
|
|
487
|
+
pr_outcomes.add_argument("--install-id", default="")
|
|
488
|
+
pr_outcomes.add_argument("--source", default="code-mower-pr-outcomes")
|
|
489
|
+
pr_outcomes.add_argument(
|
|
490
|
+
"--limit",
|
|
491
|
+
type=int,
|
|
492
|
+
default=MAX_EVENT_COUNT,
|
|
493
|
+
help=f"number of PRs to include; max {MAX_EVENT_COUNT}",
|
|
494
|
+
)
|
|
495
|
+
pr_outcomes.add_argument(
|
|
496
|
+
"--spend",
|
|
497
|
+
type=Path,
|
|
498
|
+
default=None,
|
|
499
|
+
help=(
|
|
500
|
+
"reviewer spend ledger to merge into coverage; defaults to "
|
|
501
|
+
".code-mower/reviewer-spend.json when present"
|
|
502
|
+
),
|
|
503
|
+
)
|
|
504
|
+
pr_outcomes.add_argument(
|
|
505
|
+
"--endpoint",
|
|
506
|
+
default=os.environ.get("CODE_MOWER_CLOUD_ENDPOINT", DEFAULT_UPLOAD_ENDPOINT),
|
|
507
|
+
)
|
|
508
|
+
pr_outcomes.add_argument("--token-env", default=DEFAULT_TOKEN_ENV)
|
|
509
|
+
pr_outcomes.add_argument(
|
|
510
|
+
"--token-file",
|
|
511
|
+
type=Path,
|
|
512
|
+
default=None,
|
|
513
|
+
help="token env file or raw token file to use when token env is not set",
|
|
514
|
+
)
|
|
515
|
+
pr_outcomes.add_argument(
|
|
516
|
+
"--token-dir",
|
|
517
|
+
type=Path,
|
|
518
|
+
default=None,
|
|
519
|
+
help="directory with Code Mower Cloud token profiles",
|
|
520
|
+
)
|
|
521
|
+
pr_outcomes.add_argument(
|
|
522
|
+
"--yes",
|
|
523
|
+
action="store_true",
|
|
524
|
+
help="perform the network upload; without this, pr-outcomes is a dry run",
|
|
525
|
+
)
|
|
526
|
+
pr_outcomes.add_argument("--timeout", type=float, default=20.0)
|
|
527
|
+
pr_outcomes.add_argument("--json", action="store_true")
|
|
528
|
+
|
|
471
529
|
board_snapshot = subparsers.add_parser("board-snapshot")
|
|
472
530
|
board_snapshot.add_argument("--repo-path", type=Path, default=Path.cwd())
|
|
473
531
|
board_snapshot.add_argument(
|
|
@@ -604,10 +662,21 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
604
662
|
repo_sync.add_argument(
|
|
605
663
|
"--mode",
|
|
606
664
|
action="append",
|
|
607
|
-
choices=("dogfood", "catch-up", "reviewer-runs"),
|
|
665
|
+
choices=("dogfood", "catch-up", "reviewer-runs", "pr-outcomes"),
|
|
608
666
|
default=[],
|
|
609
667
|
help="sync mode to run; repeatable, defaults to dogfood and reviewer-runs",
|
|
610
668
|
)
|
|
669
|
+
repo_sync.add_argument(
|
|
670
|
+
"--event",
|
|
671
|
+
action="append",
|
|
672
|
+
default=[],
|
|
673
|
+
metavar="EVENT_TYPE=PATH",
|
|
674
|
+
help=(
|
|
675
|
+
"include structured benchmark events from JSON/JSONL in each repo's "
|
|
676
|
+
"dogfood step; productivity_summary entries also accept "
|
|
677
|
+
"code_mower.productivityWindow.v1 window observations"
|
|
678
|
+
),
|
|
679
|
+
)
|
|
611
680
|
repo_sync.add_argument(
|
|
612
681
|
"--output-dir",
|
|
613
682
|
type=Path,
|
|
@@ -685,7 +754,12 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
685
754
|
return 0
|
|
686
755
|
if args.command == "export":
|
|
687
756
|
events = [
|
|
688
|
-
*_parse_event_args(
|
|
757
|
+
*_parse_event_args(
|
|
758
|
+
args.event,
|
|
759
|
+
repo_slug=args.repo_slug,
|
|
760
|
+
team_id=args.team_id,
|
|
761
|
+
install_id=args.install_id,
|
|
762
|
+
),
|
|
689
763
|
*_spend_events(
|
|
690
764
|
args.spend,
|
|
691
765
|
repo_slug=args.repo_slug,
|
|
@@ -781,11 +855,23 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
781
855
|
print(render_cloud_doctor_text(report), end="")
|
|
782
856
|
return 1 if report["failures"] else 0
|
|
783
857
|
if args.command == "dogfood":
|
|
858
|
+
# Resolve the slug before loading window events so a slugless
|
|
859
|
+
# observation is filled from --repo-slug or the detected repo,
|
|
860
|
+
# exactly as dogfood_upload and repo-sync resolve it below.
|
|
861
|
+
dogfood_repo_slug = args.repo_slug or _detect_repo_slug(
|
|
862
|
+
args.repo_path.expanduser().resolve()
|
|
863
|
+
)
|
|
784
864
|
result = _dogfood_upload(
|
|
785
865
|
repo_path=args.repo_path,
|
|
786
866
|
output_dir=args.output_dir,
|
|
787
867
|
reports=_parse_report_args(args.report),
|
|
788
|
-
events=_parse_event_args(
|
|
868
|
+
events=_parse_event_args(
|
|
869
|
+
args.event,
|
|
870
|
+
repo_slug=dogfood_repo_slug,
|
|
871
|
+
team_id=args.team_id,
|
|
872
|
+
install_id=args.install_id,
|
|
873
|
+
source=args.source,
|
|
874
|
+
),
|
|
789
875
|
spend_path=args.spend,
|
|
790
876
|
repo_slug=args.repo_slug,
|
|
791
877
|
team_id=args.team_id,
|
|
@@ -920,6 +1006,40 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
920
1006
|
elif result["status"] == "dry_run":
|
|
921
1007
|
print("Network: skipped (pass --yes to upload)")
|
|
922
1008
|
return 1 if result["status"] == "doctor_failed" else 0
|
|
1009
|
+
if args.command == "pr-outcomes":
|
|
1010
|
+
result = _pr_outcomes_upload(
|
|
1011
|
+
repo_path=args.repo_path,
|
|
1012
|
+
output_dir=args.output_dir,
|
|
1013
|
+
repo_slug=args.repo_slug,
|
|
1014
|
+
team_id=args.team_id,
|
|
1015
|
+
install_id=args.install_id,
|
|
1016
|
+
source=args.source,
|
|
1017
|
+
limit=args.limit,
|
|
1018
|
+
endpoint=args.endpoint,
|
|
1019
|
+
token_env=args.token_env,
|
|
1020
|
+
token_file=args.token_file,
|
|
1021
|
+
token_dir=args.token_dir,
|
|
1022
|
+
yes=args.yes,
|
|
1023
|
+
timeout=args.timeout,
|
|
1024
|
+
spend_path=args.spend,
|
|
1025
|
+
)
|
|
1026
|
+
if args.json:
|
|
1027
|
+
print(json.dumps(result, indent=2, sort_keys=True))
|
|
1028
|
+
else:
|
|
1029
|
+
print("Code Mower cloud PR outcomes")
|
|
1030
|
+
print(f"Status: {result['status']}")
|
|
1031
|
+
print(f"Repository: {result['repo_slug']}")
|
|
1032
|
+
print(f"PRs examined: {result.get('pr_count', 0)}")
|
|
1033
|
+
print(f"Events: {result['event_count']}")
|
|
1034
|
+
if result["status"] == "uploaded":
|
|
1035
|
+
print(f"Upload status: {result['upload']['status']}")
|
|
1036
|
+
elif result["status"] == "dry_run":
|
|
1037
|
+
print("Network: skipped (pass --yes to upload)")
|
|
1038
|
+
errors = result.get("errors") or []
|
|
1039
|
+
if errors:
|
|
1040
|
+
print(f"Validation errors: {len(errors)}")
|
|
1041
|
+
return 1 if result["status"] == "doctor_failed" else 0
|
|
1042
|
+
|
|
923
1043
|
if args.command == "repo-sync":
|
|
924
1044
|
result = _repo_sync_upload(
|
|
925
1045
|
repo_specs=args.repo,
|
|
@@ -937,6 +1057,7 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
937
1057
|
include_git_ref=args.include_git_ref,
|
|
938
1058
|
yes=args.yes,
|
|
939
1059
|
timeout=args.timeout,
|
|
1060
|
+
events=args.event,
|
|
940
1061
|
)
|
|
941
1062
|
if args.json:
|
|
942
1063
|
print(json.dumps(result, indent=2, sort_keys=True))
|
|
@@ -951,6 +1072,7 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
951
1072
|
current = summary.get("current_dogfood", {})
|
|
952
1073
|
history = summary.get("imported_history", {})
|
|
953
1074
|
reviewer = summary.get("reviewer_evidence", {})
|
|
1075
|
+
baseline = summary.get("productivity_baseline", {})
|
|
954
1076
|
print(
|
|
955
1077
|
"Current dogfood: "
|
|
956
1078
|
f"{current.get('steps', 0)} steps, "
|
|
@@ -967,6 +1089,12 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
967
1089
|
f"{reviewer.get('steps', 0)} steps, "
|
|
968
1090
|
f"{reviewer.get('events', 0)} events"
|
|
969
1091
|
)
|
|
1092
|
+
print(
|
|
1093
|
+
"Productivity baseline: "
|
|
1094
|
+
f"{baseline.get('steps', 0)} steps, "
|
|
1095
|
+
f"{baseline.get('events', 0)} events "
|
|
1096
|
+
"(correlation only, no causal claims)"
|
|
1097
|
+
)
|
|
970
1098
|
guidance = (
|
|
971
1099
|
history.get("trust_guidance", {})
|
|
972
1100
|
if isinstance(history, dict)
|