code-mower 1.0.15__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.15 → code_mower-1.1.0}/PKG-INFO +18 -12
- {code_mower-1.0.15 → code_mower-1.1.0}/README.md +17 -11
- {code_mower-1.0.15 → code_mower-1.1.0}/pyproject.toml +1 -1
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/__init__.py +1 -1
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/antigravity_cli_audit_pr.py +46 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/board.py +33 -4
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cli.py +3 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/config.py +186 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/controller.py +78 -5
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/__init__.py +12 -0
- {code_mower-1.0.15 → 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.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/runner.py +12 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/gemini_cli_audit_pr.py +49 -13
- {code_mower-1.0.15 → 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.15 → code_mower-1.1.0}/src/code_mower/lane_status.py +82 -2
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/package_manifest.py +10 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/provider_credentials.py +66 -6
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/code-mower.example.yml +36 -0
- {code_mower-1.0.15 → 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.15 → code_mower-1.1.0}/src/code_mower.egg-info/PKG-INFO +18 -12
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower.egg-info/SOURCES.txt +14 -0
- {code_mower-1.0.15 → 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.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.15 → code_mower-1.1.0}/tests/test_lane_status.py +164 -1
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_release_hygiene.py +48 -46
- 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.15 → code_mower-1.1.0}/CODE_OF_CONDUCT.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/LICENSE +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/MANIFEST.in +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/NOTICE +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/SUPPORT.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/requirements/requirements.txt +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/setup.cfg +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/adapters/__init__.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/adapters/_base.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/adapters/cursor_bugbot.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/adapters/gitar.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/adapters/greptile.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/adapters/qodo.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/antigravity_sdk_probe.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/audit_handoff_log.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/audit_labeler_lib.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/audit_limits.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/audit_progress.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/blind_review_artifacts.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/blind_review_coordinator.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/board_store.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/bootstrap.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/builder_experiment.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/builder_runs.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/__init__.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/arms.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/auto_discovery.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/commands.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/context_inputs.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/corpus.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/effect_report.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/evidence.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/evidence_report.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/identity.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/metrics.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/overlap.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/planning.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/policy.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/results.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/run_results.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/run_status.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/runner.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/truth.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/calibration/value_report.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/campaign_adapters.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/campaign_discovery.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/checks.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/claude_audit_pr.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/claude_cli_bounce.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/claude_cli_environment.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/clear_stale.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/__init__.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/adoption_runs.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/bundle.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/doctor.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/dogfood.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/endpoints.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/errors.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/events.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/export.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/finding_outcomes.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/git_metadata.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/manifest.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/operations.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/pr_outcomes.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/productivity.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/productivity_windows.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/reports.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/setup.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/tokens.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/upload.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/cloud_client/work_types.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/code_mower_calibration.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/code_mower_context_packs.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/code_mower_merge.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/code_mower_telemetry.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/codex_audit_env_preflight.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/codex_audit_pr.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/codex_audit_schema_smoke.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/codex_audit_verdict.schema.json +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/decisions.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/devin_api.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/devin_cli_audit_pr.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/adoption.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/audit_limits.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/campaign_auth.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/cloud.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/common.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/github.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_api.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_branch.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_config.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_human_token.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_provider.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_repo.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/github_trusted_authors.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/models.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/output.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/presets.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/privacy.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_env.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_probe.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/providers.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/registry.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/runtime.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/doctor_checks/supervised_pilot.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/file_locks.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/gate_health.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/git_identity.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/grok_build_audit_pr.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/hermes_cli_audit_pr.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/lane_configs/__init__.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/lane_configs/aider.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/lane_configs/claude.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/lane_configs/codex.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/lane_configs/devin.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/lane_configs/devin_cli.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/lane_configs/gemini_cli.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/lane_configs/grok_build.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/lane_configs/hermes_cli.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/lane_configs/local_llm.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/lane_configs/muse_cli.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/lane_delivery.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/local_llm_audit_pr.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/local_llm_bakeoff.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/local_llm_calibration.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/local_llm_profiles.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/migration.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/migration_install.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/migration_mirror.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/migration_readiness.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/migration_rehearsal.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/muse_cli_audit_pr.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/next_steps.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/package.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/package_content.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/package_paths.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/package_rendering.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/package_static.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/participants.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/plan_context.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/productivity_report.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/prompts.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/provider_registry.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/provider_runners/__init__.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/provider_runners/comments.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/provider_runners/exit_codes.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/provider_runners/git.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/provider_runners/github_auth.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/provider_runners/github_pr.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/provider_runners/pr_worktree.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/provider_runners/process.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/provider_runners/repo_paths.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/provider_runners/text_schema.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/provider_runners/workspace.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/providers/__init__.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/providers/local_cli.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/providers/provenance.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/release_campaigns.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/release_qualify.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/release_readiness.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/reviewer_metrics.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/reviewer_spend.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/saas_reviewer_labeler.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/secrets.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/session.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/builder-experiment.example.json +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/calibration-corpus.example.json +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/calibration-corpus.json +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/context-packs.example.json +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/operability.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/lanes/README.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/lanes/claude.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/lanes/codex.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/lanes/cursor.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/lanes/devin.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/lanes/generic.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/product-support/code_mower +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/product-support/run_devin_cli_audit_pr.sh +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/product-support/status_report.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/providers.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/reviewer-spend.example.json +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/trailer_comment_labeler.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/versioning.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/work_orders.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower/workflow_actionlint.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower.egg-info/dependency_links.txt +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower.egg-info/entry_points.txt +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower.egg-info/requires.txt +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/src/code_mower.egg-info/top_level.txt +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/builder-experiment.example.json +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/calibration-corpus.example.json +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/calibration-corpus.json +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/code-mower.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/context-packs.example.json +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/cursor/BUGBOT.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/lanes/README.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/lanes/claude.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/lanes/codex.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/lanes/cursor.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/lanes/devin.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/lanes/generic.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/providers/acp_bridge.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/providers/aider.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/providers/antigravity_cli.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/providers/claude_audit.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/providers/claude_review.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/providers/coderabbit_cli.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/providers/codex.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/providers/cursor_bugbot.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/providers/cursor_cloud_agent.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/providers/devin.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/providers/devin_cli.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/providers/gemini_cli.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/providers/gitar.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/providers/greptile.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/providers/hermes_cli.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/providers/local_llm.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/providers/muse_cli.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/providers/qodo.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/providers.yml +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/reviewer-spend.example.json +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/reviewer-value-report.example.md +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_adoption_diagnostics.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_adoption_result_semantics.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_adoption_run_contract.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_antigravity_sdk_probe.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_audit_comment_posture.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_audit_limits.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_board.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_builder_experiment.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_builder_identity.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_builder_runs.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_calibration_effect_report.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_calibration_truth.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_campaign_adapters.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_campaign_discovery.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_campaign_retry_evidence_711.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_checks.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_claude_audit_pr.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_claude_cli_bounce.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_clear_stale.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_cloud_client.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_cloud_git_metadata.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_cloud_manifest.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_cloud_reports.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_coderabbit_cli_audit_pr.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_codex_audit_env_preflight.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_codex_audit_pr.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_controller.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_decision_audit_integration.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_decisions.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_devin_api.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_devin_builder_lane.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_devin_cli_audit_pr.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_devin_provider_contract.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_doctor_actions_cost_summary.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_doctor_actions_failure_selection.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_doctor_boundaries.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_doctor_campaign_auth.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_doctor_campaign_readiness.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_doctor_github_checks.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_doctor_output.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_doctor_privacy.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_doctor_provider_env_required.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_doctor_provider_env_tokens.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_doctor_provider_local_audit_setup.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_doctor_provider_probe.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_doctor_provider_review_hygiene.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_doctor_registry.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_doctor_runtime.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_doctor_self_hosted_runner.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_doctor_supervised_pilot.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_file_locks.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_fork_pr_guard.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_gate_automerge.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_gate_health.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_hosted_dispatch_profile.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_init_actionlint.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_init_build_loop.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_lane_delivery_contract.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_local_llm_github_helpers.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_migration_rehearsal.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_migration_setup_drift.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_next_steps.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_package_install_failure_taxonomy.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_participant_sessions.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_plan_context.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_pr_outcome_contract.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_pr_outcome_coverage.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_productivity_metrics_contract.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_productivity_report.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_productivity_windows.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_prompts.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_provider_credentials.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_provider_fixture_contracts.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_provider_local_cli.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_provider_runners_comments.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_provider_runners_git.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_provider_runners_github_pr.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_provider_runners_pr_worktree.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_provider_runners_process.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_provider_runners_repo_paths.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_provider_runners_text_schema.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_provider_runners_workspace.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_release_campaigns.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_release_qualify.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_reviewer_finding_outcome_contract.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_reviewer_metrics_core.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_reviewer_spend.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_supervised_pilot_contract.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_trailer_comment_labeler.py +0 -0
- {code_mower-1.0.15 → code_mower-1.1.0}/tests/test_work_orders.py +0 -0
- {code_mower-1.0.15 → 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,13 +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.
|
|
309
|
-
The v1.
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
coverage.
|
|
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.
|
|
316
319
|
Package-only users can start from the public package rather than a source
|
|
317
320
|
checkout.
|
|
318
321
|
|
|
@@ -345,7 +348,7 @@ Provider-contract baseline for the next release train:
|
|
|
345
348
|
|
|
346
349
|
For release verification,
|
|
347
350
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
348
|
-
the package-index procedure for `v1.0
|
|
351
|
+
the package-index procedure for `v1.1.0` / `code-mower==1.1.0`. The
|
|
349
352
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
350
353
|
After publication, [Release Qualification](docs/release-qualification.md)
|
|
351
354
|
coordinates provider-specific install and operational checks without treating
|
|
@@ -539,8 +542,8 @@ measurement work.
|
|
|
539
542
|
|
|
540
543
|
## Installation Status
|
|
541
544
|
|
|
542
|
-
The current package-index release baseline is `v1.0
|
|
543
|
-
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
|
|
544
547
|
release and in the first-user install rehearsal. The public repository is
|
|
545
548
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
546
549
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -599,6 +602,8 @@ first so local work exercises the same package entrypoint users install.
|
|
|
599
602
|
- [Provider Matrix](docs/provider-matrix.md)
|
|
600
603
|
- [Provider Calibration Scorecard](docs/provider-calibration-scorecard.md)
|
|
601
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)
|
|
602
607
|
- [First Run Transcript](docs/first-run-transcript.md)
|
|
603
608
|
- [First-User Demo Transcript](docs/first-user-demo-transcript.md)
|
|
604
609
|
- [First-User Install Rehearsal](docs/first-user-install-rehearsal.md)
|
|
@@ -624,6 +629,7 @@ first so local work exercises the same package entrypoint users install.
|
|
|
624
629
|
- [v1.0.13 Release Notes](docs/v1013-release-notes.md)
|
|
625
630
|
- [v1.0.14 Release Notes](docs/v1014-release-notes.md)
|
|
626
631
|
- [v1.0.15 Release Notes](docs/v1015-release-notes.md)
|
|
632
|
+
- [v1.1 Release Notes](docs/v11-release-notes.md)
|
|
627
633
|
- [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
|
|
628
634
|
- [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
|
|
629
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,13 +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.
|
|
279
|
-
The v1.
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
coverage.
|
|
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.
|
|
286
289
|
Package-only users can start from the public package rather than a source
|
|
287
290
|
checkout.
|
|
288
291
|
|
|
@@ -315,7 +318,7 @@ Provider-contract baseline for the next release train:
|
|
|
315
318
|
|
|
316
319
|
For release verification,
|
|
317
320
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
318
|
-
the package-index procedure for `v1.0
|
|
321
|
+
the package-index procedure for `v1.1.0` / `code-mower==1.1.0`. The
|
|
319
322
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
320
323
|
After publication, [Release Qualification](docs/release-qualification.md)
|
|
321
324
|
coordinates provider-specific install and operational checks without treating
|
|
@@ -509,8 +512,8 @@ measurement work.
|
|
|
509
512
|
|
|
510
513
|
## Installation Status
|
|
511
514
|
|
|
512
|
-
The current package-index release baseline is `v1.0
|
|
513
|
-
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
|
|
514
517
|
release and in the first-user install rehearsal. The public repository is
|
|
515
518
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
516
519
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -569,6 +572,8 @@ first so local work exercises the same package entrypoint users install.
|
|
|
569
572
|
- [Provider Matrix](docs/provider-matrix.md)
|
|
570
573
|
- [Provider Calibration Scorecard](docs/provider-calibration-scorecard.md)
|
|
571
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)
|
|
572
577
|
- [First Run Transcript](docs/first-run-transcript.md)
|
|
573
578
|
- [First-User Demo Transcript](docs/first-user-demo-transcript.md)
|
|
574
579
|
- [First-User Install Rehearsal](docs/first-user-install-rehearsal.md)
|
|
@@ -594,6 +599,7 @@ first so local work exercises the same package entrypoint users install.
|
|
|
594
599
|
- [v1.0.13 Release Notes](docs/v1013-release-notes.md)
|
|
595
600
|
- [v1.0.14 Release Notes](docs/v1014-release-notes.md)
|
|
596
601
|
- [v1.0.15 Release Notes](docs/v1015-release-notes.md)
|
|
602
|
+
- [v1.1 Release Notes](docs/v11-release-notes.md)
|
|
597
603
|
- [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
|
|
598
604
|
- [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
|
|
599
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
|
|
|
@@ -21,8 +21,10 @@ if __package__ in {None, "", "tools"}:
|
|
|
21
21
|
from tools import audit_limits
|
|
22
22
|
except ImportError: # pragma: no cover - direct script execution fallback.
|
|
23
23
|
import audit_limits # type: ignore
|
|
24
|
+
import tracker_contract # type: ignore
|
|
24
25
|
else: # pragma: no cover - exercised after package extraction.
|
|
25
26
|
from . import audit_limits
|
|
27
|
+
from . import tracker_contract
|
|
26
28
|
|
|
27
29
|
|
|
28
30
|
ALLOWED_LANE_TYPES = {"audit", "review"}
|
|
@@ -513,6 +515,188 @@ def required_secret_entries_for_lane(lane: Mapping[str, Any]) -> tuple[str, ...]
|
|
|
513
515
|
return tuple(secrets)
|
|
514
516
|
|
|
515
517
|
|
|
518
|
+
def _validate_tracker_jira_cloud(
|
|
519
|
+
jira_cloud: Any,
|
|
520
|
+
issues: list[ConfigIssue],
|
|
521
|
+
) -> None:
|
|
522
|
+
path = "tracker.jira_cloud"
|
|
523
|
+
jira_map = _as_mapping(jira_cloud, path, issues)
|
|
524
|
+
site_url = _require_string(jira_map.get("site_url"), f"{path}.site_url", issues)
|
|
525
|
+
if site_url is not None and not site_url.startswith("https://"):
|
|
526
|
+
issues.append(ConfigIssue(f"{path}.site_url", "must be an HTTPS Jira Cloud site URL"))
|
|
527
|
+
_require_string(jira_map.get("cloud_id"), f"{path}.cloud_id", issues)
|
|
528
|
+
_require_string(jira_map.get("project_id"), f"{path}.project_id", issues)
|
|
529
|
+
if jira_map.get("project_key") is not None:
|
|
530
|
+
_require_identifier(jira_map.get("project_key"), f"{path}.project_key", issues)
|
|
531
|
+
if jira_map.get("issue_type_id") is not None:
|
|
532
|
+
_require_string(jira_map.get("issue_type_id"), f"{path}.issue_type_id", issues)
|
|
533
|
+
if jira_map.get("jql") is not None:
|
|
534
|
+
jql = _require_string(jira_map.get("jql"), f"{path}.jql", issues)
|
|
535
|
+
if jql is not None and (len(jql) > 2000 or "\n" in jql or "\r" in jql):
|
|
536
|
+
issues.append(ConfigIssue(f"{path}.jql", "must be a single line of at most 2000 characters"))
|
|
537
|
+
|
|
538
|
+
status_category_map = jira_map.get("status_category_map")
|
|
539
|
+
if status_category_map is not None:
|
|
540
|
+
category_path = f"{path}.status_category_map"
|
|
541
|
+
for category, status_ids in _as_mapping(status_category_map, category_path, issues).items():
|
|
542
|
+
if category not in tracker_contract.LIFECYCLE_CATEGORIES:
|
|
543
|
+
issues.append(
|
|
544
|
+
ConfigIssue(
|
|
545
|
+
f"{category_path}.{category}",
|
|
546
|
+
f"must be one of {sorted(tracker_contract.LIFECYCLE_CATEGORIES)}",
|
|
547
|
+
)
|
|
548
|
+
)
|
|
549
|
+
for index, status_id in enumerate(
|
|
550
|
+
_as_sequence(status_ids, f"{category_path}.{category}", issues)
|
|
551
|
+
):
|
|
552
|
+
if not isinstance(status_id, str) or not status_id:
|
|
553
|
+
issues.append(
|
|
554
|
+
ConfigIssue(
|
|
555
|
+
f"{category_path}.{category}[{index}]",
|
|
556
|
+
"must be a non-empty string status id",
|
|
557
|
+
)
|
|
558
|
+
)
|
|
559
|
+
|
|
560
|
+
field_mappings = jira_map.get("field_mappings")
|
|
561
|
+
if field_mappings is not None:
|
|
562
|
+
mapping_path = f"{path}.field_mappings"
|
|
563
|
+
for target, source_field_id in _as_mapping(field_mappings, mapping_path, issues).items():
|
|
564
|
+
if target not in tracker_contract.SAFE_FIELD_MAPPING_TARGETS:
|
|
565
|
+
issues.append(
|
|
566
|
+
ConfigIssue(
|
|
567
|
+
f"{mapping_path}.{target}",
|
|
568
|
+
"must map to a safe normalized contract field: "
|
|
569
|
+
f"{sorted(tracker_contract.SAFE_FIELD_MAPPING_TARGETS)}",
|
|
570
|
+
)
|
|
571
|
+
)
|
|
572
|
+
_require_string(source_field_id, f"{mapping_path}.{target}", issues)
|
|
573
|
+
|
|
574
|
+
mutations = jira_map.get("mutations")
|
|
575
|
+
if mutations is not None:
|
|
576
|
+
mutation_path = f"{path}.mutations"
|
|
577
|
+
mutation_map = _as_mapping(mutations, mutation_path, issues)
|
|
578
|
+
extra_mutation_keys = set(mutation_map) - {
|
|
579
|
+
"writes_enabled",
|
|
580
|
+
"allowed_operations",
|
|
581
|
+
"transitions",
|
|
582
|
+
}
|
|
583
|
+
for key in extra_mutation_keys:
|
|
584
|
+
issues.append(
|
|
585
|
+
ConfigIssue(
|
|
586
|
+
f"{mutation_path}.{key}",
|
|
587
|
+
"must be writes_enabled, allowed_operations, or transitions",
|
|
588
|
+
)
|
|
589
|
+
)
|
|
590
|
+
if "writes_enabled" in mutation_map and not isinstance(
|
|
591
|
+
mutation_map.get("writes_enabled"), bool
|
|
592
|
+
):
|
|
593
|
+
issues.append(ConfigIssue(f"{mutation_path}.writes_enabled", "must be true or false"))
|
|
594
|
+
allowed_operations = mutation_map.get("allowed_operations")
|
|
595
|
+
if allowed_operations is not None:
|
|
596
|
+
for index, operation in enumerate(
|
|
597
|
+
_as_sequence(allowed_operations, f"{mutation_path}.allowed_operations", issues)
|
|
598
|
+
):
|
|
599
|
+
if operation not in tracker_contract.ALLOWED_MUTATION_OPERATIONS:
|
|
600
|
+
issues.append(
|
|
601
|
+
ConfigIssue(
|
|
602
|
+
f"{mutation_path}.allowed_operations[{index}]",
|
|
603
|
+
"must be one of "
|
|
604
|
+
f"{sorted(tracker_contract.ALLOWED_MUTATION_OPERATIONS)}",
|
|
605
|
+
)
|
|
606
|
+
)
|
|
607
|
+
transitions = mutation_map.get("transitions")
|
|
608
|
+
if transitions is not None:
|
|
609
|
+
# Write transitions are configured by immutable transition id and
|
|
610
|
+
# re-verified against the live issue before any apply.
|
|
611
|
+
transition_path = f"{mutation_path}.transitions"
|
|
612
|
+
for category, transition_id in _as_mapping(
|
|
613
|
+
transitions, transition_path, issues
|
|
614
|
+
).items():
|
|
615
|
+
if category not in tracker_contract.LIFECYCLE_CATEGORIES:
|
|
616
|
+
issues.append(
|
|
617
|
+
ConfigIssue(
|
|
618
|
+
f"{transition_path}.{category}",
|
|
619
|
+
"must be one of "
|
|
620
|
+
f"{sorted(tracker_contract.LIFECYCLE_CATEGORIES)}",
|
|
621
|
+
)
|
|
622
|
+
)
|
|
623
|
+
continue
|
|
624
|
+
if not isinstance(transition_id, str) or not re.fullmatch(
|
|
625
|
+
r"[0-9]{1,32}", transition_id
|
|
626
|
+
):
|
|
627
|
+
issues.append(
|
|
628
|
+
ConfigIssue(
|
|
629
|
+
f"{transition_path}.{category}",
|
|
630
|
+
"must be a numeric Jira transition id string",
|
|
631
|
+
)
|
|
632
|
+
)
|
|
633
|
+
|
|
634
|
+
sync = jira_map.get("sync")
|
|
635
|
+
if sync is not None:
|
|
636
|
+
sync_path = f"{path}.sync"
|
|
637
|
+
sync_map = _as_mapping(sync, sync_path, issues)
|
|
638
|
+
for key in set(sync_map) - {"trusted_pr_authors"}:
|
|
639
|
+
issues.append(
|
|
640
|
+
ConfigIssue(
|
|
641
|
+
f"{sync_path}.{key}",
|
|
642
|
+
"must be trusted_pr_authors",
|
|
643
|
+
)
|
|
644
|
+
)
|
|
645
|
+
if "trusted_pr_authors" in sync_map:
|
|
646
|
+
_validate_github_login_items(
|
|
647
|
+
sync_map.get("trusted_pr_authors"),
|
|
648
|
+
f"{sync_path}.trusted_pr_authors",
|
|
649
|
+
issues,
|
|
650
|
+
)
|
|
651
|
+
|
|
652
|
+
extra_keys = set(jira_map) - {
|
|
653
|
+
"site_url",
|
|
654
|
+
"cloud_id",
|
|
655
|
+
"project_id",
|
|
656
|
+
"project_key",
|
|
657
|
+
"issue_type_id",
|
|
658
|
+
"jql",
|
|
659
|
+
"status_category_map",
|
|
660
|
+
"field_mappings",
|
|
661
|
+
"mutations",
|
|
662
|
+
"sync",
|
|
663
|
+
}
|
|
664
|
+
for key in extra_keys:
|
|
665
|
+
issues.append(ConfigIssue(f"{path}.{key}", "unknown tracker.jira_cloud configuration key"))
|
|
666
|
+
|
|
667
|
+
|
|
668
|
+
def _validate_tracker(tracker: Any, issues: list[ConfigIssue]) -> None:
|
|
669
|
+
if tracker is None:
|
|
670
|
+
return
|
|
671
|
+
tracker_map = _as_mapping(tracker, "tracker", issues)
|
|
672
|
+
extra_keys = set(tracker_map) - {"kind", "jira_cloud"}
|
|
673
|
+
for key in extra_keys:
|
|
674
|
+
issues.append(ConfigIssue(f"tracker.{key}", "unknown tracker configuration key"))
|
|
675
|
+
|
|
676
|
+
kind = tracker_map.get("kind", "github")
|
|
677
|
+
if kind not in tracker_contract.TRACKER_KINDS:
|
|
678
|
+
issues.append(
|
|
679
|
+
ConfigIssue("tracker.kind", f"must be one of {sorted(tracker_contract.TRACKER_KINDS)}")
|
|
680
|
+
)
|
|
681
|
+
return
|
|
682
|
+
|
|
683
|
+
jira_cloud = tracker_map.get("jira_cloud")
|
|
684
|
+
if kind == "jira_cloud":
|
|
685
|
+
if jira_cloud is None:
|
|
686
|
+
issues.append(
|
|
687
|
+
ConfigIssue(
|
|
688
|
+
"tracker.jira_cloud",
|
|
689
|
+
"jira_cloud kind requires a tracker.jira_cloud block",
|
|
690
|
+
)
|
|
691
|
+
)
|
|
692
|
+
else:
|
|
693
|
+
_validate_tracker_jira_cloud(jira_cloud, issues)
|
|
694
|
+
elif jira_cloud is not None:
|
|
695
|
+
issues.append(
|
|
696
|
+
ConfigIssue("tracker.jira_cloud", "must be omitted unless tracker.kind is jira_cloud")
|
|
697
|
+
)
|
|
698
|
+
|
|
699
|
+
|
|
516
700
|
def validate_config(config: Mapping[str, Any]) -> list[ConfigIssue]:
|
|
517
701
|
issues: list[ConfigIssue] = []
|
|
518
702
|
if config.get("version") not in {1, "1"}:
|
|
@@ -568,6 +752,8 @@ def validate_config(config: Mapping[str, Any]) -> list[ConfigIssue]:
|
|
|
568
752
|
_require_string(str(key), f"{section_path}.{key}", issues)
|
|
569
753
|
_require_identifier(lane_name, f"{section_path}.{key}", issues)
|
|
570
754
|
|
|
755
|
+
_validate_tracker(config.get("tracker"), issues)
|
|
756
|
+
|
|
571
757
|
owner_surface = config.get("owner_surface")
|
|
572
758
|
if owner_surface is not None:
|
|
573
759
|
owner_surface_map = _as_mapping(owner_surface, "owner_surface", issues)
|